INET Framework for OMNeT++/OMNEST
inet::IgmpHeaderSerializer Class Reference

Converts between IgmpMessage and binary (network byte order) IGMP message. More...

#include <IgmpHeaderSerializer.h>

Inheritance diagram for inet::IgmpHeaderSerializer:
inet::FieldsChunkSerializer inet::ChunkSerializer

Public Member Functions

 IgmpHeaderSerializer ()
 
- Public Member Functions inherited from inet::FieldsChunkSerializer
virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset, b length) const override
 Serializes a chunk into a stream by writing the bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream, const std::type_info &typeInfo) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Protected Member Functions

virtual void serialize (MemoryOutputStream &stream, const Ptr< const Chunk > &chunk) const override
 Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream. More...
 
virtual const Ptr< Chunkdeserialize (MemoryInputStream &stream) const override
 Deserializes a chunk from a stream by reading the bytes at the current position of the stream. More...
 

Additional Inherited Members

- Static Public Attributes inherited from inet::ChunkSerializer
static b totalSerializedLength = b(0)
 
static b totalDeserializedLength = b(0)
 

Detailed Description

Converts between IgmpMessage and binary (network byte order) IGMP message.

Constructor & Destructor Documentation

◆ IgmpHeaderSerializer()

inet::IgmpHeaderSerializer::IgmpHeaderSerializer ( )
inline
25 : FieldsChunkSerializer() {}

Member Function Documentation

◆ deserialize()

const Ptr< Chunk > inet::IgmpHeaderSerializer::deserialize ( MemoryInputStream stream) const
overrideprotectedvirtual

Deserializes a chunk from a stream by reading the bytes at the current position of the stream.

The current stream position is updated according to the length of the returned chunk.

Implements inet::FieldsChunkSerializer.

103 {
104  B start = stream.getRemainingLength();
105  unsigned char type = stream.readByte();
106  unsigned char code = stream.readByte();
107  uint16_t chksum = stream.readUint16Be();
108  switch (type) {
109  case IGMP_MEMBERSHIP_QUERY: {
110  if (start == B(8)) {
111  if (code == 0) {
112  auto igmpv1Query = makeShared<Igmpv1Query>();
113  igmpv1Query->setUnused(code);
114  igmpv1Query->setCrc(chksum);
115  igmpv1Query->setCrcMode(CRC_COMPUTED);
116  igmpv1Query->setGroupAddress(stream.readIpv4Address());
117  return igmpv1Query;
118  }
119  else {
120  auto igmpv2Query = makeShared<Igmpv2Query>();
121  igmpv2Query->setMaxRespTimeCode(code);
122  igmpv2Query->setCrc(chksum);
123  igmpv2Query->setCrcMode(CRC_COMPUTED);
124  igmpv2Query->setGroupAddress(stream.readIpv4Address());
125  return igmpv2Query;
126  }
127  }
128  else {
129  auto igmpv3Query = makeShared<Igmpv3Query>();
130  igmpv3Query->setMaxRespTimeCode(code);
131  igmpv3Query->setCrc(chksum);
132  igmpv3Query->setCrcMode(CRC_COMPUTED);
133  igmpv3Query->setGroupAddress(stream.readIpv4Address());
134  igmpv3Query->setResv(stream.readNBitsToUint64Be(4));
135  igmpv3Query->setSuppressRouterProc(stream.readBit());
136  igmpv3Query->setRobustnessVariable(stream.readNBitsToUint64Be(3));
137  igmpv3Query->setQueryIntervalCode(stream.readByte());
138  uint16_t numOfSources = stream.readUint16Be();
139  igmpv3Query->setChunkLength(B(12) + B(numOfSources * 4));
140  for (uint16_t i = 0; i < numOfSources; ++i)
141  igmpv3Query->getSourceListForUpdate().push_back(stream.readIpv4Address());
142  return igmpv3Query;
143  }
144  }
146  auto igmpv1Report = makeShared<Igmpv1Report>();
147  igmpv1Report->setUnused(code);
148  igmpv1Report->setCrc(chksum);
149  igmpv1Report->setCrcMode(CRC_COMPUTED);
150  igmpv1Report->setGroupAddress(stream.readIpv4Address());
151  return igmpv1Report;
152  }
154  auto igmpv2Report = makeShared<Igmpv2Report>();
155  igmpv2Report->setMaxRespTime(code);
156  igmpv2Report->setCrc(chksum);
157  igmpv2Report->setCrcMode(CRC_COMPUTED);
158  igmpv2Report->setGroupAddress(stream.readIpv4Address());
159  return igmpv2Report;
160  }
161  case IGMPV2_LEAVE_GROUP: {
162  auto igmpv2Leave = makeShared<Igmpv2Leave>();
163  igmpv2Leave->setMaxRespTime(code);
164  igmpv2Leave->setCrc(chksum);
165  igmpv2Leave->setCrcMode(CRC_COMPUTED);
166  igmpv2Leave->setGroupAddress(stream.readIpv4Address());
167  return igmpv2Leave;
168  }
170  auto igmpv3Report = makeShared<Igmpv3Report>();
171  igmpv3Report->setResv1(code);
172  igmpv3Report->setChunkLength(start);
173  igmpv3Report->setCrc(chksum);
174  igmpv3Report->setCrcMode(CRC_COMPUTED);
175  igmpv3Report->setResv2(stream.readUint16Be());
176  uint8_t numOfRecords = stream.readUint16Be();
177  igmpv3Report->setGroupRecordArraySize(numOfRecords);
178  for (uint16_t i = 0; i < numOfRecords; ++i) {
179  GroupRecord groupRecord;
180  groupRecord.setRecordType(stream.readByte());
181  uint8_t auxDataLen = stream.readByte();
182  groupRecord.setAuxDataArraySize(auxDataLen);
183  uint8_t numOfSources = stream.readUint16Be();
184  groupRecord.setGroupAddress(stream.readIpv4Address());
185  for (uint8_t j = 0; j < numOfSources; j++) {
186  groupRecord.getSourceListForUpdate().push_back(stream.readIpv4Address());
187  }
188  for (size_t k = 0; k < auxDataLen; ++k) {
189  groupRecord.setAuxData(k, stream.readUint32Be());
190  }
191  igmpv3Report->setGroupRecord(i, groupRecord);
192  }
193  while (stream.getRemainingLength() > B(0))
194  stream.readByte();
195  return igmpv3Report;
196  }
197  default: {
198  EV_ERROR << "IGMPSerializer: can not create IGMP packet: type " << type << " not supported\n";
199  auto igmpMessage = makeShared<IgmpMessage>();
200  igmpMessage->markIncorrect();
201  return igmpMessage;
202  }
203  }
204 }

◆ serialize()

void inet::IgmpHeaderSerializer::serialize ( MemoryOutputStream stream,
const Ptr< const Chunk > &  chunk 
) const
overrideprotectedvirtual

Serializes a chunk into a stream by writing all bytes representing the chunk at the end of the stream.

Implements inet::FieldsChunkSerializer.

29 {
30  const auto& igmpMessage = staticPtrCast<const IgmpMessage>(chunk);
31  IgmpType type = igmpMessage->getType();
32  stream.writeByte(type);
33  switch (type) {
34  case IGMP_MEMBERSHIP_QUERY: {
35  if (auto igmpv1Query = dynamicPtrCast<const Igmpv1Query>(igmpMessage))
36  stream.writeByte(igmpv1Query->getUnused());
37  else if (auto igmpv2Query = dynamicPtrCast<const Igmpv2Query>(igmpMessage))
38  stream.writeByte(igmpv2Query->getMaxRespTimeCode());
39  stream.writeUint16Be(igmpMessage->getCrc());
40  stream.writeIpv4Address(check_and_cast<const IgmpQuery *>(igmpMessage.get())->getGroupAddress());
41  if (auto igmpv3Query = dynamicPtrCast<const Igmpv3Query>(igmpMessage)) {
42  ASSERT(igmpv3Query->getRobustnessVariable() <= 7);
43  stream.writeNBitsOfUint64Be(igmpv3Query->getResv(), 4);
44  stream.writeBit(igmpv3Query->getSuppressRouterProc());
45  stream.writeNBitsOfUint64Be(igmpv3Query->getRobustnessVariable(), 3);
46  stream.writeByte(igmpv3Query->getQueryIntervalCode());
47  uint16_t numOfSources = igmpv3Query->getSourceList().size();
48  stream.writeUint16Be(numOfSources);
49  for (uint16_t i = 0; i < numOfSources; ++i)
50  stream.writeIpv4Address(igmpv3Query->getSourceList()[i]);
51  }
52  break;
53  }
55  auto igmpv1Report = dynamicPtrCast<const Igmpv1Report>(igmpMessage);
56  stream.writeByte(igmpv1Report->getUnused());
57  stream.writeUint16Be(igmpv1Report->getCrc());
58  stream.writeIpv4Address(igmpv1Report->getGroupAddress());
59  break;
60  }
62  auto igmpv2Report = dynamicPtrCast<const Igmpv2Report>(igmpMessage);
63  stream.writeByte(igmpv2Report->getMaxRespTime());
64  stream.writeUint16Be(igmpv2Report->getCrc());
65  stream.writeIpv4Address(igmpv2Report->getGroupAddress());
66  break;
67  }
68  case IGMPV2_LEAVE_GROUP: {
69  auto igmpv2Leave = dynamicPtrCast<const Igmpv2Leave>(igmpMessage);
70  stream.writeByte(igmpv2Leave->getMaxRespTime());
71  stream.writeUint16Be(igmpv2Leave->getCrc());
72  stream.writeIpv4Address(igmpv2Leave->getGroupAddress());
73  break;
74  }
76  const Igmpv3Report *igmpv3Report = check_and_cast<const Igmpv3Report *>(igmpMessage.get());
77  stream.writeByte(igmpv3Report->getResv1());
78  stream.writeUint16Be(igmpv3Report->getCrc());
79  stream.writeUint16Be(igmpv3Report->getResv2());
80  unsigned int numOfRecords = igmpv3Report->getGroupRecordArraySize();
81  stream.writeUint16Be(numOfRecords);
82  for (unsigned int i = 0; i < numOfRecords; i++) {
83  const GroupRecord& groupRecord = igmpv3Report->getGroupRecord(i);
84  stream.writeByte(groupRecord.getRecordType());
85  stream.writeByte(groupRecord.getAuxDataArraySize());
86  stream.writeUint16Be(groupRecord.getSourceList().size());
87  stream.writeIpv4Address(groupRecord.getGroupAddress());
88  for (auto src : groupRecord.getSourceList()) {
89  stream.writeIpv4Address(src);
90  }
91  for (size_t i = 0; i < groupRecord.getAuxDataArraySize(); ++i) {
92  stream.writeUint32Be(groupRecord.getAuxData(i));
93  }
94  }
95  break;
96  }
97  default:
98  throw cRuntimeError("Can not serialize IGMP packet (%s): type %d not supported.", igmpMessage->getClassName(), type);
99  }
100 }

The documentation for this class was generated from the following files:
inet::IgmpType
IgmpType
Enum generated from inet/networklayer/ipv4/IgmpMessage.msg:16 by opp_msgtool.
Definition: IgmpMessage_m.h:70
inet::IGMPV3_MEMBERSHIP_REPORT
@ IGMPV3_MEMBERSHIP_REPORT
Definition: IgmpMessage_m.h:75
inet::CRC_COMPUTED
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
inet::IGMPV2_LEAVE_GROUP
@ IGMPV2_LEAVE_GROUP
Definition: IgmpMessage_m.h:74
inet::IGMP_MEMBERSHIP_QUERY
@ IGMP_MEMBERSHIP_QUERY
Definition: IgmpMessage_m.h:71
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
type
removed type
Definition: IUdp-gates.txt:7
inet::IGMPV2_MEMBERSHIP_REPORT
@ IGMPV2_MEMBERSHIP_REPORT
Definition: IgmpMessage_m.h:73
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::IGMPV1_MEMBERSHIP_REPORT
@ IGMPV1_MEMBERSHIP_REPORT
Definition: IgmpMessage_m.h:72