PcapPlusPlus  Next
IgmpLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "IpAddress.h"
5 #include <vector>
6 
8 
11 namespace pcpp
12 {
15  struct igmp_header
16  {
18  uint8_t type;
20  uint8_t maxResponseTime;
22  uint16_t checksum;
24  uint32_t groupAddress;
25  };
26  static_assert(sizeof(igmp_header) == 8, "igmp_header size is not 8 bytes");
27 
31  {
33  uint8_t type;
35  uint8_t maxResponseTime;
37  uint16_t checksum;
39  uint32_t groupAddress;
41  uint8_t s_qrv;
43  uint8_t qqic;
45  uint16_t numOfSources;
46  };
47  static_assert(sizeof(igmpv3_query_header) == 12, "igmpv3_query_header size is not 12 bytes");
48 
52  {
54  uint8_t type;
56  uint8_t reserved1;
58  uint16_t checksum;
60  uint16_t reserved2;
63  };
64  static_assert(sizeof(igmpv3_report_header) == 8, "igmpv3_report_header size is not 8 bytes");
65 
70  {
72  uint8_t recordType;
74  uint8_t auxDataLen;
76  uint16_t numOfSources;
78  uint32_t multicastAddress;
80  uint8_t sourceAddresses[];
81 
84  {
85  return multicastAddress;
86  }
87 
89  uint16_t getSourceAddressCount() const;
90 
96 
98  size_t getRecordLen() const;
99  };
100 
102  enum IgmpType
103  {
132  };
133 
138  class IgmpLayer : public Layer
139  {
140  protected:
141  IgmpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ProtocolType igmpVer)
142  : Layer(data, dataLen, prevLayer, packet, igmpVer)
143  {}
144 
145  IgmpLayer(IgmpType type, const IPv4Address& groupAddr, uint8_t maxResponseTime, ProtocolType igmpVer);
146 
147  uint16_t calculateChecksum();
148 
149  size_t getHeaderSizeByVerAndType(ProtocolType igmpVer, IgmpType igmpType) const;
150 
151  public:
152  ~IgmpLayer() override = default;
153 
158  {
159  return reinterpret_cast<igmp_header*>(m_Data);
160  }
161 
164  {
165  return getIgmpHeader()->groupAddress;
166  }
167 
170  void setGroupAddress(const IPv4Address& groupAddr);
171 
174  IgmpType getType() const;
175 
178  void setType(IgmpType type);
179 
186  static ProtocolType getIGMPVerFromData(uint8_t* data, size_t dataLen, bool& isQuery);
187 
188  // implement abstract methods
189 
191  void parseNextLayer() override
192  {}
193 
195  size_t getHeaderLen() const override
196  {
197  return sizeof(igmp_header);
198  }
199 
200  std::string toString() const override;
201 
203  {
204  return OsiModelNetworkLayer;
205  }
206  };
207 
211  class IgmpV1Layer : public IgmpLayer
212  {
213  public:
219  IgmpV1Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
220  : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv1)
221  {}
222 
227  explicit IgmpV1Layer(IgmpType type, const IPv4Address& groupAddr = IPv4Address())
228  : IgmpLayer(type, groupAddr, 0, IGMPv1)
229  {}
230 
232  ~IgmpV1Layer() override = default;
233 
234  // implement abstract methods
235 
237  void computeCalculateFields() override;
238 
243  static bool isDataValid(uint8_t const* data, size_t dataLen)
244  {
245  return canReinterpretAs<igmp_header>(data, dataLen);
246  }
247  };
248 
252  class IgmpV2Layer : public IgmpLayer
253  {
254  public:
260  IgmpV2Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
261  : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv2)
262  {}
263 
270  explicit IgmpV2Layer(IgmpType type, const IPv4Address& groupAddr = IPv4Address(), uint8_t maxResponseTime = 0)
271  : IgmpLayer(type, groupAddr, maxResponseTime, IGMPv2)
272  {}
273 
275  ~IgmpV2Layer() override = default;
276 
277  // implement abstract methods
278 
280  void computeCalculateFields() override;
281 
286  static bool isDataValid(uint8_t const* data, size_t dataLen)
287  {
288  return canReinterpretAs<igmp_header>(data, dataLen);
289  }
290  };
291 
295  {
296  public:
302  IgmpV3QueryLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
303 
312  explicit IgmpV3QueryLayer(const IPv4Address& multicastAddr = IPv4Address(), uint8_t maxResponseTime = 0,
313  uint8_t s_qrv = 0);
314 
319  {
320  return reinterpret_cast<igmpv3_query_header*>(m_Data);
321  }
322 
325  uint16_t getSourceAddressCount() const;
326 
332 
338  bool addSourceAddress(const IPv4Address& addr);
339 
346  bool addSourceAddressAtIndex(const IPv4Address& addr, int index);
347 
353  bool removeSourceAddressAtIndex(int index);
354 
359 
360  // implement abstract methods
361 
363  void computeCalculateFields() override;
364 
367  size_t getHeaderLen() const override;
368 
373  static bool isDataValid(uint8_t const* data, size_t dataLen)
374  {
375  return canReinterpretAs<igmpv3_query_header>(data, dataLen);
376  }
377  };
378 
382  {
383  private:
384  igmpv3_group_record* addGroupRecordAt(uint8_t recordType, const IPv4Address& multicastAddress,
385  const std::vector<IPv4Address>& sourceAddresses, int offset);
386 
387  public:
393  IgmpV3ReportLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
394  : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv3)
395  {}
396 
399  {}
400 
405  {
406  return reinterpret_cast<igmpv3_report_header*>(m_Data);
407  }
408 
411  uint16_t getGroupRecordCount() const;
412 
416 
424 
433  igmpv3_group_record* addGroupRecord(uint8_t recordType, const IPv4Address& multicastAddress,
434  const std::vector<IPv4Address>& sourceAddresses);
435 
445  igmpv3_group_record* addGroupRecordAtIndex(uint8_t recordType, const IPv4Address& multicastAddress,
446  const std::vector<IPv4Address>& sourceAddresses, int index);
447 
453  bool removeGroupRecordAtIndex(int index);
454 
459 
460  // implement abstract methods
461 
463  void computeCalculateFields() override;
464 
467  size_t getHeaderLen() const override
468  {
469  return m_DataLen;
470  }
471 
476  static bool isDataValid(uint8_t const* data, size_t dataLen)
477  {
478  return canReinterpretAs<igmpv3_report_header>(data, dataLen);
479  }
480  };
481 
482 } // namespace pcpp
Definition: IpAddress.h:28
Definition: IgmpLayer.h:139
IPv4Address getGroupAddress() const
Definition: IgmpLayer.h:163
std::string toString() const override
void setGroupAddress(const IPv4Address &groupAddr)
igmp_header * getIgmpHeader() const
Definition: IgmpLayer.h:157
static ProtocolType getIGMPVerFromData(uint8_t *data, size_t dataLen, bool &isQuery)
size_t getHeaderLen() const override
Definition: IgmpLayer.h:195
void parseNextLayer() override
Does nothing for this layer (IGMP layer is always last)
Definition: IgmpLayer.h:191
IgmpType getType() const
void setType(IgmpType type)
OsiModelLayer getOsiModelLayer() const override
Definition: IgmpLayer.h:202
Definition: IgmpLayer.h:212
void computeCalculateFields() override
Calculate the IGMP checksum and set igmp_header::maxResponseTime to 0 (this field is unused in IGMPv1...
IgmpV1Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IgmpLayer.h:219
static bool isDataValid(uint8_t const *data, size_t dataLen)
Definition: IgmpLayer.h:243
~IgmpV1Layer() override=default
A destructor for this layer (does nothing)
IgmpV1Layer(IgmpType type, const IPv4Address &groupAddr=IPv4Address())
Definition: IgmpLayer.h:227
Definition: IgmpLayer.h:253
void computeCalculateFields() override
Calculate the IGMP checksum.
~IgmpV2Layer() override=default
A destructor for this layer (does nothing)
IgmpV2Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IgmpLayer.h:260
IgmpV2Layer(IgmpType type, const IPv4Address &groupAddr=IPv4Address(), uint8_t maxResponseTime=0)
Definition: IgmpLayer.h:270
static bool isDataValid(uint8_t const *data, size_t dataLen)
Definition: IgmpLayer.h:286
Definition: IgmpLayer.h:295
static bool isDataValid(uint8_t const *data, size_t dataLen)
Definition: IgmpLayer.h:373
uint16_t getSourceAddressCount() const
bool addSourceAddressAtIndex(const IPv4Address &addr, int index)
bool addSourceAddress(const IPv4Address &addr)
size_t getHeaderLen() const override
IgmpV3QueryLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
bool removeSourceAddressAtIndex(int index)
IPv4Address getSourceAddressAtIndex(int index) const
IgmpV3QueryLayer(const IPv4Address &multicastAddr=IPv4Address(), uint8_t maxResponseTime=0, uint8_t s_qrv=0)
void computeCalculateFields() override
Calculate the IGMP checksum.
igmpv3_query_header * getIgmpV3QueryHeader() const
Definition: IgmpLayer.h:318
Definition: IgmpLayer.h:382
igmpv3_group_record * addGroupRecord(uint8_t recordType, const IPv4Address &multicastAddress, const std::vector< IPv4Address > &sourceAddresses)
igmpv3_group_record * addGroupRecordAtIndex(uint8_t recordType, const IPv4Address &multicastAddress, const std::vector< IPv4Address > &sourceAddresses, int index)
IgmpV3ReportLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IgmpLayer.h:393
size_t getHeaderLen() const override
Definition: IgmpLayer.h:467
bool removeGroupRecordAtIndex(int index)
igmpv3_report_header * getReportHeader() const
Definition: IgmpLayer.h:404
uint16_t getGroupRecordCount() const
static bool isDataValid(uint8_t const *data, size_t dataLen)
Definition: IgmpLayer.h:476
void computeCalculateFields() override
Calculate the IGMP checksum.
IgmpV3ReportLayer()
A constructor that allocates a new IGMPv3 membership report with 0 group addresses.
Definition: IgmpLayer.h:398
igmpv3_group_record * getFirstGroupRecord() const
igmpv3_group_record * getNextGroupRecord(igmpv3_group_record *groupRecord) const
Definition: Layer.h:62
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
uint8_t ProtocolType
Definition: ProtocolType.h:13
const ProtocolType IGMPv2
IGMPv2 protocol.
Definition: ProtocolType.h:101
const ProtocolType IGMPv3
IGMPv3 protocol.
Definition: ProtocolType.h:104
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:231
const ProtocolType IGMPv1
IGMPv1 protocol.
Definition: ProtocolType.h:98
IgmpType
IGMP message types.
Definition: IgmpLayer.h:103
@ IgmpType_MulticastRouterTermination
MRD, Multicast Router Termination.
Definition: IgmpLayer.h:131
@ IgmpType_Unknown
Unknown message type.
Definition: IgmpLayer.h:105
@ IgmpType_MembershipReportV2
IGMPv2 Membership Report.
Definition: IgmpLayer.h:117
@ IgmpType_DVMRP
DVMRP.
Definition: IgmpLayer.h:111
@ IgmpType_MembershipReportV3
IGMPv3 Membership Report.
Definition: IgmpLayer.h:125
@ IgmpType_MulticastTraceroute
Multicast Traceroute.
Definition: IgmpLayer.h:123
@ IgmpType_P1Mv1
PIM version 1.
Definition: IgmpLayer.h:113
@ IgmpType_LeaveGroup
IGMPv2 Leave Group.
Definition: IgmpLayer.h:119
@ IgmpType_MembershipReportV1
IGMPv1 Membership Report.
Definition: IgmpLayer.h:109
@ IgmpType_MulticastRouterAdvertisement
MRD, Multicast Router Advertisement.
Definition: IgmpLayer.h:127
@ IgmpType_MulticastRouterSolicitation
MRD, Multicast Router Solicitation.
Definition: IgmpLayer.h:129
@ IgmpType_CiscoTrace
Cisco Trace Messages.
Definition: IgmpLayer.h:115
@ IgmpType_MembershipQuery
IGMP Membership Query.
Definition: IgmpLayer.h:107
@ IgmpType_MulticastTracerouteResponse
Multicast Traceroute Response.
Definition: IgmpLayer.h:121
Definition: IgmpLayer.h:16
uint8_t type
Indicates the message type. The enum for message type is pcpp::IgmpType.
Definition: IgmpLayer.h:18
uint16_t checksum
This is the 16-bit one's complement of the one's complement sum of the entire IGMP message.
Definition: IgmpLayer.h:22
uint32_t groupAddress
This is the multicast address being queried when sending a Group-Specific or Group-and-Source-Specifi...
Definition: IgmpLayer.h:24
uint8_t maxResponseTime
Specifies the time limit for the corresponding report. The field has a resolution of 100 milliseconds...
Definition: IgmpLayer.h:20
Definition: IgmpLayer.h:70
uint8_t sourceAddresses[]
A vector of n IP unicast addresses, where n is the value in this record's Number of Sources field.
Definition: IgmpLayer.h:80
size_t getRecordLen() const
uint32_t multicastAddress
Contains the IP multicast address to which this Group Record pertains.
Definition: IgmpLayer.h:78
uint8_t auxDataLen
Contains the length of the Auxiliary Data field in this Group Record. A value other than 0 isn't supp...
Definition: IgmpLayer.h:74
uint8_t recordType
Group record type.
Definition: IgmpLayer.h:72
IPv4Address getMulticastAddress() const
Definition: IgmpLayer.h:83
uint16_t numOfSources
Specifies how many source addresses are present in this Group Record.
Definition: IgmpLayer.h:76
IPv4Address getSourceAddressAtIndex(int index) const
uint16_t getSourceAddressCount() const
Definition: IgmpLayer.h:31
uint8_t type
IGMP message type. Should always have value of membership query (IgmpType_MembershipQuery)
Definition: IgmpLayer.h:33
uint32_t groupAddress
This is the multicast address being queried when sending a Group-Specific or Group-and-Source-Specifi...
Definition: IgmpLayer.h:39
uint8_t qqic
Querier's Query Interval Code.
Definition: IgmpLayer.h:43
uint16_t numOfSources
This field specifies the number of source addresses present in the Query.
Definition: IgmpLayer.h:45
uint8_t s_qrv
Suppress Router-side Processing Flag + Querier's Robustness Variable.
Definition: IgmpLayer.h:41
uint16_t checksum
This is the 16-bit one's complement of the one's complement sum of the entire IGMP message.
Definition: IgmpLayer.h:37
uint8_t maxResponseTime
This field specifies the maximum time (in 1/10 second) allowed before sending a responding report.
Definition: IgmpLayer.h:35
Definition: IgmpLayer.h:52
uint16_t numOfGroupRecords
This field specifies the number of group records present in the Report.
Definition: IgmpLayer.h:62
uint8_t type
IGMP message type. Should always have value of IGMPv3 membership report (IgmpType_MembershipReportV3)
Definition: IgmpLayer.h:54
uint8_t reserved1
Unused byte.
Definition: IgmpLayer.h:56
uint16_t reserved2
Unused bytes.
Definition: IgmpLayer.h:60
uint16_t checksum
This is the 16-bit one's complement of the one's complement sum of the entire IGMP message.
Definition: IgmpLayer.h:58