PcapPlusPlus  Next
SomeIpSdLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "IpAddress.h"
4 #include "Layer.h"
5 #include "SomeIpLayer.h"
6 #include <cstring>
7 #include <iterator>
8 #include <unordered_map>
9 #include <memory>
10 #include <stdexcept>
11 #include <vector>
12 
14 
17 namespace pcpp
18 {
20  enum SomeIpSdProtocolType : uint8_t
21  {
23  SD_TCP = 0x06,
25  SD_UDP = 0x11
26  };
27 
28  class SomeIpSdLayer;
29 
33  {
34  public:
35  friend class SomeIpSdLayer;
36 
38  enum class OptionType : uint8_t
39  {
41  Unknown = 0x00,
43  ConfigurationString = 0x01,
45  LoadBalancing = 0x02,
47  IPv4Endpoint = 0x04,
49  IPv6Endpoint = 0x06,
51  IPv4Multicast = 0x14,
53  IPv6Multicast = 0x16,
55  IPv4SdEndpoint = 0x24,
57  IPv6SdEndpoint = 0x26
58  };
59 
62 #pragma pack(push, 1)
64  {
66  uint16_t length;
68  uint8_t type;
70  uint8_t reserved;
71  };
72 #pragma pack(pop)
73  static_assert(sizeof(someipsdhdroptionsbase) == 4, "someipsdhdroptionsbase size is not 4 bytes");
74 
76  virtual ~SomeIpSdOption();
77 
81 
84  size_t getLength() const
85  {
86  return m_DataLen;
87  }
88 
91  uint8_t* getDataPtr() const;
92 
96 
97  protected:
98  const IDataContainer* m_DataContainer;
99  size_t m_Offset;
100  uint8_t* m_ShadowData;
101  size_t m_DataLen;
102 
103  SomeIpSdOption() : m_DataContainer(nullptr), m_Offset(0), m_ShadowData(nullptr), m_DataLen(0)
104  {}
105 
106  SomeIpSdOption(const IDataContainer* dataContainer, size_t offset)
107  : m_DataContainer(dataContainer), m_Offset(offset), m_ShadowData(nullptr), m_DataLen(0)
108  {}
109 
110  void initStdFields(OptionType type);
111 
112  SomeIpSdOption(const SomeIpSdOption&) = delete;
113  SomeIpSdOption& operator=(const SomeIpSdOption&) = delete;
114  };
115 
119  {
120  public:
121  friend class SomeIpSdLayer;
122 
125  {
132  };
133 
139  SomeIpSdIPv4Option(IPv4OptionType type, IPv4Address ipAddress, uint16_t port, SomeIpSdProtocolType l4Protocol);
140 
144  SomeIpSdIPv4Option(const IDataContainer* dataContainer, size_t offset);
145 
149 
152  uint16_t getPort() const;
153 
157 
158  private:
161 #pragma pack(push, 1)
162  struct someipsdhdroptionsipv4 : someipsdhdroptionsbase
163  {
165  uint32_t ipv4Address;
166  // cppcheck-suppress duplInheritedMember
168  uint8_t reserved;
170  SomeIpSdProtocolType l4Protocol;
172  uint16_t portNumber;
173  };
174 #pragma pack(pop)
175  static_assert(sizeof(someipsdhdroptionsipv4) == 12, "someipsdhdroptionsipv4 size is not 12 bytes");
176  };
177 
181  {
182  public:
183  friend class SomeIpSdLayer;
184 
187  {
194  };
195 
201  SomeIpSdIPv6Option(IPv6OptionType type, IPv6Address ipAddress, uint16_t port, SomeIpSdProtocolType l4Protocol);
202 
206  SomeIpSdIPv6Option(const IDataContainer* dataContainer, size_t offset);
207 
211 
214  uint16_t getPort() const;
215 
219 
220  private:
223 #pragma pack(push, 1)
224  struct someipsdhdroptionsipv6 : someipsdhdroptionsbase
225  {
227  uint8_t ipv6Address[16];
228  // cppcheck-suppress duplInheritedMember
230  uint8_t reserved;
232  SomeIpSdProtocolType l4Protocol;
234  uint16_t portNumber;
235  };
236 #pragma pack(pop)
237  static_assert(sizeof(someipsdhdroptionsipv6) == 24, "someipsdhdroptionsipv6 size is not 24 bytes");
238  };
239 
243  {
244  public:
245  friend class SomeIpSdLayer;
246 
249  explicit SomeIpSdConfigurationOption(const std::string& configurationString);
250 
254  SomeIpSdConfigurationOption(const IDataContainer* dataContainer, size_t offset);
255 
258  std::string getConfigurationString() const;
259  };
260 
264  {
265  public:
266  friend class SomeIpSdLayer;
267 
271  SomeIpSdLoadBalancingOption(uint16_t priority, uint16_t weight);
272 
276  SomeIpSdLoadBalancingOption(const IDataContainer* dataContainer, size_t offset);
277 
280  uint16_t getPriority() const;
281 
284  uint16_t getWeight() const;
285 
286  private:
289 #pragma pack(push, 1)
290  struct someipsdhdroptionsload : someipsdhdroptionsbase
291  {
293  uint16_t priority;
295  uint16_t weight;
296  };
297 #pragma pack(pop)
298  static_assert(sizeof(someipsdhdroptionsload) == 8, "someipsdhdroptionsload size is not 8 bytes");
299  };
300 
304  {
305  public:
306  friend class SomeIpSdLayer;
307 
309  enum class EntryType : uint8_t
310  {
312  FindService,
314  OfferService,
327  };
328 
331 #pragma pack(push, 1)
333  {
335  uint8_t type;
340 #if (BYTE_ORDER == LITTLE_ENDIAN)
341  uint8_t
343  nrOpt2 : 4,
345  nrOpt1 : 4;
346 #else
347  uint8_t
349  nrOpt1 : 4,
351  nrOpt2 : 4;
352 #endif
354  uint16_t serviceID;
356  uint16_t instanceID;
360  uint32_t data;
361  };
362 #pragma pack(pop)
363  static_assert(sizeof(someipsdhdrentry) == 16, "someipsdhdrentry size is not 16 bytes");
364 
372  SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL,
373  uint32_t minorVersion);
374 
383  SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL,
384  uint8_t counter, uint16_t eventGroupID);
385 
389  SomeIpSdEntry(const SomeIpSdLayer* pSomeIpSdLayer, size_t offset);
390 
393 
396  uint8_t* getDataPtr() const;
397 
401 
405  {
406  return m_EntryType;
407  }
408 
411  size_t getLength() const
412  {
413  return sizeof(someipsdhdrentry);
414  }
415 
418  uint32_t getNumOptions() const;
419 
422  uint16_t getServiceId() const;
423 
426  void setServiceId(uint16_t serviceId);
427 
430  uint16_t getInstanceId() const;
431 
434  void setInstanceId(uint16_t instanceId);
435 
438  uint8_t getMajorVersion() const;
439 
442  void setMajorVersion(uint8_t majorVersion);
443 
446  uint32_t getTtl() const;
447 
450  void setTtl(uint32_t ttl);
451 
454  uint32_t getMinorVersion() const;
455 
458  void setMinorVersion(uint32_t minorVersion);
459 
462  uint8_t getCounter() const;
463 
466  void setCounter(uint8_t counter);
467 
470  uint16_t getEventgroupId() const;
471 
474  void setEventgroupId(uint16_t eventgroupID);
475 
476  private:
479  enum class TypeInternal : uint8_t
480  {
482  FindService_Internal = 0x00,
484  OfferService_Internal = 0x01,
486  SubscribeEventgroup_Internal = 0x06,
488  SubscribeEventgroupAck_Internal = 0x07,
489  };
490 
491  EntryType m_EntryType;
492  const SomeIpSdLayer* m_Layer;
493  size_t m_Offset;
494  uint8_t* m_ShadowData;
495 
496  void initStdFields(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL);
497 
498  SomeIpSdEntry(const SomeIpSdEntry&) = delete;
499  SomeIpSdEntry& operator=(const SomeIpSdEntry&) = delete;
500 
501  static const uint32_t SOMEIPSD_HDR_ENTRY_MASK_TTL = 0x00FFFFFF;
502  };
503 
506  class SomeIpSdLayer : public SomeIpLayer
507  {
508  public:
509  friend class SomeIpSdEntry;
510 
511  typedef SomeIpSdEntry* EntryPtr;
512  typedef std::vector<EntryPtr> EntriesVec;
513  typedef SomeIpSdOption* OptionPtr;
514  typedef std::vector<OptionPtr> OptionsVec;
515 
521  SomeIpSdLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
522 
532  SomeIpSdLayer(uint16_t serviceID, uint16_t methodID, uint16_t clientID, uint16_t sessionID,
533  uint8_t interfaceVersion, MsgType type, uint8_t returnCode, uint8_t flags);
534 
536  ~SomeIpSdLayer() override = default;
537 
541  static bool isSomeIpSdPort(uint16_t port)
542  {
543  return port == 30490;
544  }
545 
550  static bool isDataValid(const uint8_t* data, size_t dataLen);
551 
554  uint8_t getFlags() const;
555 
558  void setFlags(uint8_t flags);
559 
562  uint32_t getNumEntries() const;
563 
566  uint32_t getNumOptions() const;
567 
570  const EntriesVec getEntries() const;
571 
574  const OptionsVec getOptions() const;
575 
579  const OptionsVec getOptionsFromEntry(uint32_t index) const;
580 
584  uint32_t addEntry(const SomeIpSdEntry& entry);
585 
592  bool addOptionTo(uint32_t indexEntry, const SomeIpSdOption& option);
593 
595  void computeCalculateFields() override {};
596 
598  std::string toString() const override;
599 
600  private:
603 #pragma pack(push, 1)
604  struct someipsdhdr : someiphdr
605  {
607  uint8_t flags;
609  uint8_t reserved1;
611  uint8_t reserved2;
613  uint8_t reserved3;
614  };
615 #pragma pack(pop)
616  static_assert(sizeof(someipsdhdr) == 20, "someipsdhdr size is not 20 bytes");
617 
618  uint32_t m_NumOptions;
619 
620  static bool countOptions(uint32_t& count, const uint8_t* data);
621  uint32_t findOption(const SomeIpSdOption& option);
622  void addOption(const SomeIpSdOption& option);
623  bool addOptionIndex(uint32_t indexEntry, uint32_t indexOffset);
624  OptionPtr parseOption(SomeIpSdOption::OptionType type, size_t offset) const;
625 
626  static size_t getLenEntries(const uint8_t* data);
627  size_t getLenEntries() const;
628  static size_t getLenOptions(const uint8_t* data);
629  size_t getLenOptions() const;
630  void setLenEntries(uint32_t length);
631  void setLenOptions(uint32_t length);
632  };
633 } // namespace pcpp
Definition: Layer.h:19
Definition: IpAddress.h:28
Definition: IpAddress.h:156
Definition: Layer.h:60
Definition: Packet.h:22
Definition: SomeIpLayer.h:15
MsgType
SOME/IP message types.
Definition: SomeIpLayer.h:19
Definition: SomeIpSdLayer.h:243
SomeIpSdConfigurationOption(const std::string &configurationString)
SomeIpSdConfigurationOption(const IDataContainer *dataContainer, size_t offset)
std::string getConfigurationString() const
Definition: SomeIpSdLayer.h:304
EntryType getType() const
Definition: SomeIpSdLayer.h:404
uint16_t getEventgroupId() const
size_t getLength() const
Definition: SomeIpSdLayer.h:411
uint8_t * getDataPtr() const
void setMajorVersion(uint8_t majorVersion)
uint32_t getTtl() const
void setCounter(uint8_t counter)
void setEventgroupId(uint16_t eventgroupID)
uint8_t getMajorVersion() const
uint32_t getNumOptions() const
EntryType
Types of entries that can occur in SOME/IP-SD.
Definition: SomeIpSdLayer.h:310
@ SubscribeEventgroupNack
Subscribe Eventgroup Negative Acknowledgement.
@ SubscribeEventgroup
Subscribe Eventgroup.
@ UnknownEntryType
Unknown Entry Type.
@ StopOfferService
Stop Offer Service.
@ StopSubscribeEventgroup
Stop Subscribe Eventgroup.
@ SubscribeEventgroupAck
Subscribe Eventgroup Acknowledgment.
@ OfferService
Offer Service.
@ FindService
Find Service.
SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL, uint8_t counter, uint16_t eventGroupID)
void setMinorVersion(uint32_t minorVersion)
~SomeIpSdEntry()
Destroy the SomeIpSd Entry object and delete allocated data if it has been allocated by a constructor...
uint16_t getInstanceId() const
void setInstanceId(uint16_t instanceId)
void setTtl(uint32_t ttl)
uint8_t getCounter() const
void setServiceId(uint16_t serviceId)
SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL, uint32_t minorVersion)
uint16_t getServiceId() const
SomeIpSdEntry(const SomeIpSdLayer *pSomeIpSdLayer, size_t offset)
uint32_t getMinorVersion() const
someipsdhdrentry * getSomeIpSdEntryHeader() const
Definition: SomeIpSdLayer.h:119
SomeIpSdIPv4Option(IPv4OptionType type, IPv4Address ipAddress, uint16_t port, SomeIpSdProtocolType l4Protocol)
IPv4Address getIpAddress() const
SomeIpSdIPv4Option(const IDataContainer *dataContainer, size_t offset)
IPv4OptionType
Types of options which are implemented with this class.
Definition: SomeIpSdLayer.h:125
@ IPv4Multicast
IPv4 Multicast Option.
Definition: SomeIpSdLayer.h:129
@ IPv4SdEndpoint
IPv4 SD Endpoint Option.
Definition: SomeIpSdLayer.h:131
@ IPv4Endpoint
IPv4 Endpoint Option.
Definition: SomeIpSdLayer.h:127
SomeIpSdProtocolType getProtocol() const
uint16_t getPort() const
Definition: SomeIpSdLayer.h:181
IPv6Address getIpAddress() const
SomeIpSdProtocolType getProtocol() const
uint16_t getPort() const
SomeIpSdIPv6Option(const IDataContainer *dataContainer, size_t offset)
SomeIpSdIPv6Option(IPv6OptionType type, IPv6Address ipAddress, uint16_t port, SomeIpSdProtocolType l4Protocol)
IPv6OptionType
Types of options which are implemented with this class.
Definition: SomeIpSdLayer.h:187
@ IPv6Multicast
IPv6 Multicast Option.
Definition: SomeIpSdLayer.h:191
@ IPv6SdEndpoint
IPv6 SD Endpoint Option.
Definition: SomeIpSdLayer.h:193
@ IPv6Endpoint
IPv6 Endpoint Option.
Definition: SomeIpSdLayer.h:189
Definition: SomeIpSdLayer.h:507
uint32_t addEntry(const SomeIpSdEntry &entry)
const OptionsVec getOptionsFromEntry(uint32_t index) const
std::string toString() const override
bool addOptionTo(uint32_t indexEntry, const SomeIpSdOption &option)
static bool isSomeIpSdPort(uint16_t port)
Definition: SomeIpSdLayer.h:541
SomeIpSdLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
void computeCalculateFields() override
Does nothing for this layer.
Definition: SomeIpSdLayer.h:595
uint8_t getFlags() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
uint32_t getNumEntries() const
~SomeIpSdLayer() override=default
Destroy the layer object.
const OptionsVec getOptions() const
SomeIpSdLayer(uint16_t serviceID, uint16_t methodID, uint16_t clientID, uint16_t sessionID, uint8_t interfaceVersion, MsgType type, uint8_t returnCode, uint8_t flags)
void setFlags(uint8_t flags)
uint32_t getNumOptions() const
const EntriesVec getEntries() const
Definition: SomeIpSdLayer.h:264
SomeIpSdLoadBalancingOption(const IDataContainer *dataContainer, size_t offset)
SomeIpSdLoadBalancingOption(uint16_t priority, uint16_t weight)
Definition: SomeIpSdLayer.h:33
OptionType
Types of options currently available for the SOME/IP-SD protocol.
Definition: SomeIpSdLayer.h:39
@ IPv6Endpoint
IPv6 Endpoint Option.
@ IPv4Endpoint
IPv4 Endpoint Option.
@ IPv6Multicast
IPv6 Multicast Option.
@ LoadBalancing
Load Balancing Option.
@ IPv4Multicast
IPv4 Multicast Option.
@ Unknown
Unknown Option Type.
@ IPv4SdEndpoint
IPv4 SD Endpoint Option.
@ IPv6SdEndpoint
IPv6 SD Endpoint Option.
@ ConfigurationString
Configuration Option.
someipsdhdroptionsbase * getSomeIpSdOptionHeader() const
uint8_t * getDataPtr() const
virtual ~SomeIpSdOption()
Destroy the SOME/IP-SD Option object and delete allocated data if it has been allocated by a construc...
OptionType getType() const
size_t getLength() const
Definition: SomeIpSdLayer.h:84
The main namespace for the PcapPlusPlus lib.
SomeIpSdProtocolType
Types of protocols that can be referenced in SOME/IP-SD.
Definition: SomeIpSdLayer.h:21
@ SD_UDP
UDP.
Definition: SomeIpSdLayer.h:25
@ SD_TCP
TCP.
Definition: SomeIpSdLayer.h:23
Definition: SomeIpLayer.h:56
Definition: SomeIpSdLayer.h:333
uint32_t data
Minor Version (Service Entry Type) or Counter + Eventgroup ID (Eventgroup Entry Type)
Definition: SomeIpSdLayer.h:360
uint8_t nrOpt2
Numbers of Option #2 (4bit)
Definition: SomeIpSdLayer.h:343
uint32_t majorVersion_ttl
Major Version (8 bit) + TTL (24 bit)
Definition: SomeIpSdLayer.h:358
uint8_t type
Type.
Definition: SomeIpSdLayer.h:335
uint8_t indexFirstOption
Index 1st option.
Definition: SomeIpSdLayer.h:337
uint8_t nrOpt1
Numbers of Option #1 (4bit)
Definition: SomeIpSdLayer.h:345
uint16_t serviceID
Service ID.
Definition: SomeIpSdLayer.h:354
uint8_t indexSecondOption
Index 2nd option.
Definition: SomeIpSdLayer.h:339
uint16_t instanceID
Instance ID.
Definition: SomeIpSdLayer.h:356
Definition: SomeIpSdLayer.h:64
uint8_t reserved
Reserved.
Definition: SomeIpSdLayer.h:70
uint16_t length
Length - excluding the 16 bit Length field and the 8 bit type flag.
Definition: SomeIpSdLayer.h:66
uint8_t type
Type.
Definition: SomeIpSdLayer.h:68