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 
160  static bool isDataValid(const IDataContainer* data, size_t dataLen)
161  {
162  return data && dataLen >= sizeof(someipsdhdroptionsipv4);
163  }
164 
165  private:
168 #pragma pack(push, 1)
169  struct someipsdhdroptionsipv4 : someipsdhdroptionsbase
170  {
172  uint32_t ipv4Address;
173  // cppcheck-suppress duplInheritedMember
175  uint8_t reserved;
177  SomeIpSdProtocolType l4Protocol;
179  uint16_t portNumber;
180  };
181 #pragma pack(pop)
182  static_assert(sizeof(someipsdhdroptionsipv4) == 12, "someipsdhdroptionsipv4 size is not 12 bytes");
183  };
184 
188  {
189  public:
190  friend class SomeIpSdLayer;
191 
194  {
201  };
202 
208  SomeIpSdIPv6Option(IPv6OptionType type, IPv6Address ipAddress, uint16_t port, SomeIpSdProtocolType l4Protocol);
209 
213  SomeIpSdIPv6Option(const IDataContainer* dataContainer, size_t offset);
214 
218 
221  uint16_t getPort() const;
222 
226 
229  static bool isDataValid(const IDataContainer* data, size_t dataLen)
230  {
231  return data && dataLen >= sizeof(someipsdhdroptionsipv6);
232  }
233 
234  private:
237 #pragma pack(push, 1)
238  struct someipsdhdroptionsipv6 : someipsdhdroptionsbase
239  {
241  uint8_t ipv6Address[16];
242  // cppcheck-suppress duplInheritedMember
244  uint8_t reserved;
246  SomeIpSdProtocolType l4Protocol;
248  uint16_t portNumber;
249  };
250 #pragma pack(pop)
251  static_assert(sizeof(someipsdhdroptionsipv6) == 24, "someipsdhdroptionsipv6 size is not 24 bytes");
252  };
253 
257  {
258  public:
259  friend class SomeIpSdLayer;
260 
263  explicit SomeIpSdConfigurationOption(const std::string& configurationString);
264 
268  SomeIpSdConfigurationOption(const IDataContainer* dataContainer, size_t offset);
269 
272  std::string getConfigurationString() const;
273 
276  static bool isDataValid(const IDataContainer* data, size_t dataLen)
277  {
278  return data && dataLen >= (sizeof(someipsdhdroptionsbase) - 1);
279  }
280  };
281 
285  {
286  public:
287  friend class SomeIpSdLayer;
288 
292  SomeIpSdLoadBalancingOption(uint16_t priority, uint16_t weight);
293 
297  SomeIpSdLoadBalancingOption(const IDataContainer* dataContainer, size_t offset);
298 
301  uint16_t getPriority() const;
302 
305  uint16_t getWeight() const;
306 
309  static bool isDataValid(const IDataContainer* data, size_t dataLen)
310  {
311  return data && dataLen >= sizeof(someipsdhdroptionsload);
312  }
313 
314  private:
317 #pragma pack(push, 1)
318  struct someipsdhdroptionsload : someipsdhdroptionsbase
319  {
321  uint16_t priority;
323  uint16_t weight;
324  };
325 #pragma pack(pop)
326  static_assert(sizeof(someipsdhdroptionsload) == 8, "someipsdhdroptionsload size is not 8 bytes");
327  };
328 
332  {
333  public:
334  friend class SomeIpSdLayer;
335 
337  enum class EntryType : uint8_t
338  {
340  FindService,
342  OfferService,
355  };
356 
359 #pragma pack(push, 1)
361  {
363  uint8_t type;
368 #if (BYTE_ORDER == LITTLE_ENDIAN)
369  uint8_t
371  nrOpt2 : 4,
373  nrOpt1 : 4;
374 #else
375  uint8_t
377  nrOpt1 : 4,
379  nrOpt2 : 4;
380 #endif
382  uint16_t serviceID;
384  uint16_t instanceID;
388  uint32_t data;
389  };
390 #pragma pack(pop)
391  static_assert(sizeof(someipsdhdrentry) == 16, "someipsdhdrentry size is not 16 bytes");
392 
400  SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL,
401  uint32_t minorVersion);
402 
411  SomeIpSdEntry(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL,
412  uint8_t counter, uint16_t eventGroupID);
413 
417  SomeIpSdEntry(const SomeIpSdLayer* pSomeIpSdLayer, size_t offset);
418 
421 
424  uint8_t* getDataPtr() const;
425 
429 
433  {
434  return m_EntryType;
435  }
436 
439  size_t getLength() const
440  {
441  return sizeof(someipsdhdrentry);
442  }
443 
446  uint32_t getNumOptions() const;
447 
450  uint16_t getServiceId() const;
451 
454  void setServiceId(uint16_t serviceId);
455 
458  uint16_t getInstanceId() const;
459 
462  void setInstanceId(uint16_t instanceId);
463 
466  uint8_t getMajorVersion() const;
467 
470  void setMajorVersion(uint8_t majorVersion);
471 
474  uint32_t getTtl() const;
475 
478  void setTtl(uint32_t ttl);
479 
482  uint32_t getMinorVersion() const;
483 
486  void setMinorVersion(uint32_t minorVersion);
487 
490  uint8_t getCounter() const;
491 
494  void setCounter(uint8_t counter);
495 
498  uint16_t getEventgroupId() const;
499 
502  void setEventgroupId(uint16_t eventgroupID);
503 
504  private:
507  enum class TypeInternal : uint8_t
508  {
510  FindService_Internal = 0x00,
512  OfferService_Internal = 0x01,
514  SubscribeEventgroup_Internal = 0x06,
516  SubscribeEventgroupAck_Internal = 0x07,
517  };
518 
519  EntryType m_EntryType;
520  const SomeIpSdLayer* m_Layer;
521  size_t m_Offset;
522  uint8_t* m_ShadowData;
523 
524  void initStdFields(EntryType type, uint16_t serviceID, uint16_t instanceID, uint8_t majorVersion, uint32_t TTL);
525 
526  SomeIpSdEntry(const SomeIpSdEntry&) = delete;
527  SomeIpSdEntry& operator=(const SomeIpSdEntry&) = delete;
528 
529  static const uint32_t SOMEIPSD_HDR_ENTRY_MASK_TTL = 0x00FFFFFF;
530  };
531 
534  class SomeIpSdLayer : public SomeIpLayer
535  {
536  public:
537  friend class SomeIpSdEntry;
538 
539  using EntryPtr = SomeIpSdEntry*;
540  using EntriesVec = std::vector<EntryPtr>;
541  using OptionPtr = SomeIpSdOption*;
542  using OptionsVec = std::vector<OptionPtr>;
543 
549  SomeIpSdLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
550 
560  SomeIpSdLayer(uint16_t serviceID, uint16_t methodID, uint16_t clientID, uint16_t sessionID,
561  uint8_t interfaceVersion, MsgType type, uint8_t returnCode, uint8_t flags);
562 
564  ~SomeIpSdLayer() override = default;
565 
569  static bool isSomeIpSdPort(uint16_t port)
570  {
571  return port == 30490;
572  }
573 
578  static bool isDataValid(const uint8_t* data, size_t dataLen);
579 
582  uint8_t getFlags() const;
583 
586  void setFlags(uint8_t flags);
587 
590  uint32_t getNumEntries() const;
591 
594  uint32_t getNumOptions() const;
595 
598  const EntriesVec getEntries() const;
599 
602  const OptionsVec getOptions() const;
603 
607  const OptionsVec getOptionsFromEntry(uint32_t index) const;
608 
612  uint32_t addEntry(const SomeIpSdEntry& entry);
613 
620  bool addOptionTo(uint32_t indexEntry, const SomeIpSdOption& option);
621 
623  void computeCalculateFields() override {};
624 
626  std::string toString() const override;
627 
628  private:
631 #pragma pack(push, 1)
632  struct someipsdhdr : someiphdr
633  {
635  uint8_t flags;
637  uint8_t reserved1;
639  uint8_t reserved2;
641  uint8_t reserved3;
642  };
643 #pragma pack(pop)
644  static_assert(sizeof(someipsdhdr) == 20, "someipsdhdr size is not 20 bytes");
645 
646  uint32_t m_NumOptions;
647 
648  static bool countOptions(uint32_t& count, const uint8_t* data);
649  uint32_t findOption(const SomeIpSdOption& option);
650  void addOption(const SomeIpSdOption& option);
651  bool addOptionIndex(uint32_t indexEntry, uint32_t indexOffset);
652  OptionPtr parseOption(SomeIpSdOption::OptionType type, size_t offset, size_t remainingLength) const;
653 
654  static size_t getLenEntries(const uint8_t* data);
655  size_t getLenEntries() const;
656  static size_t getLenOptions(const uint8_t* data);
657  size_t getLenOptions() const;
658  void setLenEntries(uint32_t length);
659  void setLenOptions(uint32_t length);
660  };
661 } // namespace pcpp
Definition: Layer.h:22
Definition: IpAddress.h:30
Definition: IpAddress.h:165
Definition: Layer.h:116
Definition: Packet.h:48
Definition: SomeIpLayer.h:15
MsgType
SOME/IP message types.
Definition: SomeIpLayer.h:19
Definition: SomeIpSdLayer.h:257
SomeIpSdConfigurationOption(const std::string &configurationString)
SomeIpSdConfigurationOption(const IDataContainer *dataContainer, size_t offset)
static bool isDataValid(const IDataContainer *data, size_t dataLen)
Definition: SomeIpSdLayer.h:276
std::string getConfigurationString() const
Definition: SomeIpSdLayer.h:332
EntryType getType() const
Definition: SomeIpSdLayer.h:432
uint16_t getEventgroupId() const
size_t getLength() const
Definition: SomeIpSdLayer.h:439
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:338
@ 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
static bool isDataValid(const IDataContainer *data, size_t dataLen)
Definition: SomeIpSdLayer.h:160
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:188
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)
static bool isDataValid(const IDataContainer *data, size_t dataLen)
Definition: SomeIpSdLayer.h:229
IPv6OptionType
Types of options which are implemented with this class.
Definition: SomeIpSdLayer.h:194
@ IPv6Multicast
IPv6 Multicast Option.
Definition: SomeIpSdLayer.h:198
@ IPv6SdEndpoint
IPv6 SD Endpoint Option.
Definition: SomeIpSdLayer.h:200
@ IPv6Endpoint
IPv6 Endpoint Option.
Definition: SomeIpSdLayer.h:196
Definition: SomeIpSdLayer.h:535
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:569
SomeIpSdLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
void computeCalculateFields() override
Does nothing for this layer.
Definition: SomeIpSdLayer.h:623
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:285
SomeIpSdLoadBalancingOption(const IDataContainer *dataContainer, size_t offset)
static bool isDataValid(const IDataContainer *data, size_t dataLen)
Definition: SomeIpSdLayer.h:309
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.
Definition: AssertionUtils.h:19
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:361
uint32_t data
Minor Version (Service Entry Type) or Counter + Eventgroup ID (Eventgroup Entry Type)
Definition: SomeIpSdLayer.h:388
uint8_t nrOpt2
Numbers of Option #2 (4bit)
Definition: SomeIpSdLayer.h:371
uint32_t majorVersion_ttl
Major Version (8 bit) + TTL (24 bit)
Definition: SomeIpSdLayer.h:386
uint8_t type
Type.
Definition: SomeIpSdLayer.h:363
uint8_t indexFirstOption
Index 1st option.
Definition: SomeIpSdLayer.h:365
uint8_t nrOpt1
Numbers of Option #1 (4bit)
Definition: SomeIpSdLayer.h:373
uint16_t serviceID
Service ID.
Definition: SomeIpSdLayer.h:382
uint8_t indexSecondOption
Index 2nd option.
Definition: SomeIpSdLayer.h:367
uint16_t instanceID
Instance ID.
Definition: SomeIpSdLayer.h:384
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