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  };
239 
243  class IgmpV2Layer : public IgmpLayer
244  {
245  public:
251  IgmpV2Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
252  : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv2)
253  {}
254 
261  explicit IgmpV2Layer(IgmpType type, const IPv4Address& groupAddr = IPv4Address(), uint8_t maxResponseTime = 0)
262  : IgmpLayer(type, groupAddr, maxResponseTime, IGMPv2)
263  {}
264 
266  ~IgmpV2Layer() override = default;
267 
268  // implement abstract methods
269 
271  void computeCalculateFields() override;
272  };
273 
277  {
278  public:
284  IgmpV3QueryLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
285 
294  explicit IgmpV3QueryLayer(const IPv4Address& multicastAddr = IPv4Address(), uint8_t maxResponseTime = 0,
295  uint8_t s_qrv = 0);
296 
301  {
302  return reinterpret_cast<igmpv3_query_header*>(m_Data);
303  }
304 
307  uint16_t getSourceAddressCount() const;
308 
314 
320  bool addSourceAddress(const IPv4Address& addr);
321 
328  bool addSourceAddressAtIndex(const IPv4Address& addr, int index);
329 
335  bool removeSourceAddressAtIndex(int index);
336 
341 
342  // implement abstract methods
343 
345  void computeCalculateFields() override;
346 
349  size_t getHeaderLen() const override;
350  };
351 
355  {
356  private:
357  igmpv3_group_record* addGroupRecordAt(uint8_t recordType, const IPv4Address& multicastAddress,
358  const std::vector<IPv4Address>& sourceAddresses, int offset);
359 
360  public:
366  IgmpV3ReportLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
367  : IgmpLayer(data, dataLen, prevLayer, packet, IGMPv3)
368  {}
369 
372  {}
373 
378  {
379  return reinterpret_cast<igmpv3_report_header*>(m_Data);
380  }
381 
384  uint16_t getGroupRecordCount() const;
385 
389 
397 
406  igmpv3_group_record* addGroupRecord(uint8_t recordType, const IPv4Address& multicastAddress,
407  const std::vector<IPv4Address>& sourceAddresses);
408 
418  igmpv3_group_record* addGroupRecordAtIndex(uint8_t recordType, const IPv4Address& multicastAddress,
419  const std::vector<IPv4Address>& sourceAddresses, int index);
420 
426  bool removeGroupRecordAtIndex(int index);
427 
432 
433  // implement abstract methods
434 
436  void computeCalculateFields() override;
437 
440  size_t getHeaderLen() const override
441  {
442  return m_DataLen;
443  }
444  };
445 
446 } // 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
~IgmpV1Layer() override=default
A destructor for this layer (does nothing)
IgmpV1Layer(IgmpType type, const IPv4Address &groupAddr=IPv4Address())
Definition: IgmpLayer.h:227
Definition: IgmpLayer.h:244
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:251
IgmpV2Layer(IgmpType type, const IPv4Address &groupAddr=IPv4Address(), uint8_t maxResponseTime=0)
Definition: IgmpLayer.h:261
Definition: IgmpLayer.h:277
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:300
Definition: IgmpLayer.h:355
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:366
size_t getHeaderLen() const override
Definition: IgmpLayer.h:440
bool removeGroupRecordAtIndex(int index)
igmpv3_report_header * getReportHeader() const
Definition: IgmpLayer.h:377
uint16_t getGroupRecordCount() const
void computeCalculateFields() override
Calculate the IGMP checksum.
IgmpV3ReportLayer()
A constructor that allocates a new IGMPv3 membership report with 0 group addresses.
Definition: IgmpLayer.h:371
igmpv3_group_record * getFirstGroupRecord() const
igmpv3_group_record * getNextGroupRecord(igmpv3_group_record *groupRecord) const
Definition: Layer.h:60
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