INET Framework for OMNeT++/OMNEST
inet::ospfv2::Ospfv2PacketSerializer Class Reference

Converts between Ospfv2Packet and binary (network byte order) OSPF data. More...

#include <Ospfv2PacketSerializer.h>

Inheritance diagram for inet::ospfv2::Ospfv2PacketSerializer:
inet::FieldsChunkSerializer inet::ChunkSerializer

Public Member Functions

 Ospfv2PacketSerializer ()
 
- 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...
 

Static Public Member Functions

static void serializeLsa (MemoryOutputStream &stream, const Ospfv2Lsa &routerLsa)
 
static void deserializeLsa (MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, int i)
 
static void serializeLsaHeader (MemoryOutputStream &stream, const Ospfv2LsaHeader &lsaHeader)
 
static void deserializeLsaHeader (MemoryInputStream &stream, Ospfv2LsaHeader &lsaHeader)
 

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...
 

Static Private Member Functions

static void serializeOspfHeader (MemoryOutputStream &stream, const Ptr< const Ospfv2Packet > &ospfPacket)
 
static uint16_t deserializeOspfHeader (MemoryInputStream &stream, Ptr< Ospfv2Packet > &ospfPacket)
 
static void serializeRouterLsa (MemoryOutputStream &stream, const Ospfv2RouterLsa &routerLsa)
 
static void deserializeRouterLsa (MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2RouterLsa &routerLsa)
 
static void serializeNetworkLsa (MemoryOutputStream &stream, const Ospfv2NetworkLsa &networkLsa)
 
static void deserializeNetworkLsa (MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2NetworkLsa &networkLsa)
 
static void serializeSummaryLsa (MemoryOutputStream &stream, const Ospfv2SummaryLsa &summaryLsa)
 
static void deserializeSummaryLsa (MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2SummaryLsa &summaryLsa)
 
static void serializeAsExternalLsa (MemoryOutputStream &stream, const Ospfv2AsExternalLsa &asExternalLsa)
 
static void deserializeAsExternalLsa (MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2AsExternalLsa &asExternalLsa)
 
static void serializeOspfOptions (MemoryOutputStream &stream, const Ospfv2Options &options)
 
static void deserializeOspfOptions (MemoryInputStream &stream, Ospfv2Options &options)
 
static void copyHeaderFields (const Ptr< Ospfv2Packet > from, Ptr< Ospfv2Packet > to)
 

Friends

class inet::ospf::OspfPacketSerializer
 

Additional Inherited Members

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

Detailed Description

Converts between Ospfv2Packet and binary (network byte order) OSPF data.

Constructor & Destructor Documentation

◆ Ospfv2PacketSerializer()

inet::ospfv2::Ospfv2PacketSerializer::Ospfv2PacketSerializer ( )
inline
53 : FieldsChunkSerializer() {}

Member Function Documentation

◆ copyHeaderFields()

void inet::ospfv2::Ospfv2PacketSerializer::copyHeaderFields ( const Ptr< Ospfv2Packet from,
Ptr< Ospfv2Packet to 
)
staticprivate
499 {
500  to->setVersion(from->getVersion());
501  to->setType(from->getType());
502  to->setPacketLengthField(from->getPacketLengthField());
503  to->setChunkLength(from->getChunkLength());
504  to->setRouterID(from->getRouterID());
505  to->setAreaID(from->getAreaID());
506  to->setCrc(from->getCrc());
507  to->setCrcMode(from->getCrcMode());
508  to->setAuthenticationType(from->getAuthenticationType());
509  for (int i = 0; i < 8; ++i) {
510  to->setAuthentication(i, from->getAuthentication(i));
511  }
512 }

◆ deserialize()

const Ptr< Chunk > inet::ospfv2::Ospfv2PacketSerializer::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.

91 {
92  auto ospfPacket = makeShared<Ospfv2Packet>();
93  uint16_t packetLength = deserializeOspfHeader(stream, ospfPacket);
94  switch (ospfPacket->getType()) {
95  case HELLO_PACKET: {
96  auto helloPacket = makeShared<Ospfv2HelloPacket>();
97  copyHeaderFields(ospfPacket, helloPacket);
98  helloPacket->setNetworkMask(stream.readIpv4Address());
99  helloPacket->setHelloInterval(stream.readUint16Be());
100  deserializeOspfOptions(stream, helloPacket->getOptionsForUpdate());
101  helloPacket->setRouterPriority(stream.readByte());
102  helloPacket->setRouterDeadInterval(stream.readUint32Be());
103  helloPacket->setDesignatedRouter(stream.readIpv4Address());
104  helloPacket->setBackupDesignatedRouter(stream.readIpv4Address());
105  int numNeighbors = (B(packetLength) - OSPFv2_HEADER_LENGTH - OSPFv2_HELLO_HEADER_LENGTH).get() / 4;
106  if (numNeighbors < 0)
107  helloPacket->markIncorrect();
108  helloPacket->setNeighborArraySize(numNeighbors);
109  for (int i = 0; i < numNeighbors; i++) {
110  helloPacket->setNeighbor(i, stream.readIpv4Address());
111  }
112  return helloPacket;
113  }
115  auto ddPacket = makeShared<Ospfv2DatabaseDescriptionPacket>();
116  copyHeaderFields(ospfPacket, ddPacket);
117  ddPacket->setInterfaceMTU(stream.readUint16Be());
118  deserializeOspfOptions(stream, ddPacket->getOptionsForUpdate());
119  auto& ddOptions = ddPacket->getDdOptionsForUpdate();
120  ddOptions.unused = stream.readNBitsToUint64Be(5);
121  ddOptions.I_Init = stream.readBit();
122  ddOptions.M_More = stream.readBit();
123  ddOptions.MS_MasterSlave = stream.readBit();
124  ddPacket->setDdSequenceNumber(stream.readUint32Be());
125  int numLsaHeaders = ((B(packetLength) - OSPFv2_HEADER_LENGTH - OSPFv2_DD_HEADER_LENGTH) / OSPFv2_LSA_HEADER_LENGTH).get();
126  if (numLsaHeaders < 0)
127  ddPacket->markIncorrect();
128  ddPacket->setLsaHeadersArraySize(numLsaHeaders);
129  for (int i = 0; i < numLsaHeaders; i++) {
130  Ospfv2LsaHeader *lsaHeader = new Ospfv2LsaHeader();
131  deserializeLsaHeader(stream, *lsaHeader);
132  ddPacket->setLsaHeaders(i, *lsaHeader);
133  }
134  return ddPacket;
135  }
137  auto requestPacket = makeShared<Ospfv2LinkStateRequestPacket>();
138  copyHeaderFields(ospfPacket, requestPacket);
139  int numReq = (B(packetLength) - OSPFv2_HEADER_LENGTH).get() / OSPFv2_REQUEST_LENGTH.get();
140  if (numReq < 0)
141  requestPacket->markIncorrect();
142  requestPacket->setRequestsArraySize(numReq);
143  for (int i = 0; i < numReq; i++) {
144  auto *req = new Ospfv2LsaRequest();
145  req->lsType = stream.readUint32Be();
146  req->linkStateID = stream.readIpv4Address();
147  req->advertisingRouter = stream.readIpv4Address();
148  requestPacket->setRequests(i, *req);
149  }
150  return requestPacket;
151  }
153  auto updatePacket = makeShared<Ospfv2LinkStateUpdatePacket>();
154  copyHeaderFields(ospfPacket, updatePacket);
155  uint32_t numLSAs = stream.readUint32Be();
156  updatePacket->setOspfLSAsArraySize(numLSAs);
157  for (uint32_t i = 0; i < numLSAs; i++) {
158  deserializeLsa(stream, updatePacket, i);
159  }
160  return updatePacket;
161  }
163  auto ackPacket = makeShared<Ospfv2LinkStateAcknowledgementPacket>();
164  copyHeaderFields(ospfPacket, ackPacket);
165  int numHeaders = (B(packetLength) - OSPFv2_HEADER_LENGTH).get() / OSPFv2_LSA_HEADER_LENGTH.get();
166  if (numHeaders < 0)
167  ackPacket->markIncorrect();
168  ackPacket->setLsaHeadersArraySize(numHeaders);
169  for (int i = 0; i < numHeaders; i++) {
170  Ospfv2LsaHeader *lsaHeader = new Ospfv2LsaHeader();
171  deserializeLsaHeader(stream, *lsaHeader);
172  ackPacket->setLsaHeaders(i, *lsaHeader);
173  }
174  return ackPacket;
175  }
176  default: {
177  ospfPacket->markIncorrect();
178  return ospfPacket;
179  }
180  }
181 }

Referenced by inet::ospf::OspfPacketSerializer::deserialize().

◆ deserializeAsExternalLsa()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeAsExternalLsa ( MemoryInputStream stream,
const Ptr< Ospfv2LinkStateUpdatePacket updatePacket,
Ospfv2AsExternalLsa asExternalLsa 
)
staticprivate
380 {
381  auto& contents = asExternalLsa.getContentsForUpdate();
382  contents.setNetworkMask(stream.readIpv4Address());
383 
384  int numExternalTos = (B(asExternalLsa.getHeader().getLsaLength()) -
386  if (numExternalTos < 0)
387  updatePacket->markIncorrect();
388  else
389  contents.setExternalTOSInfoArraySize(numExternalTos);
390  for (int i = 0; i < numExternalTos; i++) {
391  auto *extTos = new Ospfv2ExternalTosInfo();
392  extTos->E_ExternalMetricType = stream.readBit();
393  extTos->tos = stream.readNBitsToUint64Be(7);
394  extTos->routeCost = stream.readUint24Be();
395  extTos->forwardingAddress = stream.readIpv4Address();
396  extTos->externalRouteTag = stream.readUint32Be();
397  contents.setExternalTOSInfo(i, *extTos);
398  delete extTos;
399  }
400 }

◆ deserializeLsa()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeLsa ( MemoryInputStream stream,
const Ptr< Ospfv2LinkStateUpdatePacket updatePacket,
int  i 
)
static
435 {
436  Ospfv2LsaHeader *lsaHeader = new Ospfv2LsaHeader();
437  deserializeLsaHeader(stream, *lsaHeader);
438  Ospfv2LsaType type = lsaHeader->getLsType();
439  switch (type) {
440  case ROUTERLSA_TYPE: {
441  Ospfv2RouterLsa *routerLsa = new Ospfv2RouterLsa();
442  routerLsa->setHeader(*lsaHeader);
443  deserializeRouterLsa(stream, updatePacket, *routerLsa);
444  updatePacket->setOspfLSAs(i, routerLsa);
445  break;
446  }
447  case NETWORKLSA_TYPE: {
448  Ospfv2NetworkLsa *networkLsa = new Ospfv2NetworkLsa();
449  networkLsa->setHeader(*lsaHeader);
450  deserializeNetworkLsa(stream, updatePacket, *networkLsa);
451  updatePacket->setOspfLSAs(i, networkLsa);
452  break;
453  }
456  Ospfv2SummaryLsa *summaryLsa = new Ospfv2SummaryLsa();
457  summaryLsa->setHeader(*lsaHeader);
458  deserializeSummaryLsa(stream, updatePacket, *summaryLsa);
459  updatePacket->setOspfLSAs(i, summaryLsa);
460  break;
461  }
462  case AS_EXTERNAL_LSA_TYPE: {
463  Ospfv2AsExternalLsa *asExternalLsa = new Ospfv2AsExternalLsa();
464  asExternalLsa->setHeader(*lsaHeader);
465  deserializeAsExternalLsa(stream, updatePacket, *asExternalLsa);
466  updatePacket->setOspfLSAs(i, asExternalLsa);
467  break;
468  }
469  default:
470  updatePacket->markIncorrect();
471  }
472 }

◆ deserializeLsaHeader()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeLsaHeader ( MemoryInputStream stream,
Ospfv2LsaHeader lsaHeader 
)
static
240 {
241  lsaHeader.setLsAge(stream.readUint16Be());
242  deserializeOspfOptions(stream, lsaHeader.getLsOptionsForUpdate());
243  lsaHeader.setLsType(static_cast<Ospfv2LsaType>(stream.readByte()));
244  lsaHeader.setLinkStateID(stream.readIpv4Address());
245  lsaHeader.setAdvertisingRouter(stream.readIpv4Address());
246  lsaHeader.setLsSequenceNumber(stream.readUint32Be());
247  lsaHeader.setLsCrc(stream.readUint16Be());
248  lsaHeader.setLsaLength(stream.readUint16Be());
249  lsaHeader.setLsCrcMode(CRC_COMPUTED);
250 }

◆ deserializeNetworkLsa()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeNetworkLsa ( MemoryInputStream stream,
const Ptr< Ospfv2LinkStateUpdatePacket updatePacket,
Ospfv2NetworkLsa networkLsa 
)
staticprivate
319 {
320  networkLsa.setNetworkMask(stream.readIpv4Address());
321  int numAttachedRouters = (B(networkLsa.getHeader().getLsaLength()) -
323  if (numAttachedRouters < 0)
324  updatePacket->markIncorrect();
325  else
326  networkLsa.setAttachedRoutersArraySize(numAttachedRouters);
327  for (int i = 0; i < numAttachedRouters; ++i) {
328  networkLsa.setAttachedRouters(i, stream.readIpv4Address());
329  }
330 }

◆ deserializeOspfHeader()

uint16_t inet::ospfv2::Ospfv2PacketSerializer::deserializeOspfHeader ( MemoryInputStream stream,
Ptr< Ospfv2Packet > &  ospfPacket 
)
staticprivate
201 {
202  int ospfVer = stream.readUint8();
203  if (ospfVer != 2)
204  ospfPacket->markIncorrect();
205  ospfPacket->setVersion(ospfVer);
206  int ospfType = stream.readUint8();
207  if (ospfType > LINKSTATE_ACKNOWLEDGEMENT_PACKET)
208  ospfPacket->markIncorrect();
209  ospfPacket->setType(static_cast<OspfPacketType>(ospfType));
210  uint16_t packetLength = stream.readUint16Be();
211  ospfPacket->setPacketLengthField(packetLength);
212  ospfPacket->setChunkLength(B(packetLength));
213  ospfPacket->setRouterID(stream.readIpv4Address());
214  ospfPacket->setAreaID(stream.readIpv4Address());
215  ospfPacket->setCrc(stream.readUint16Be());
216  ospfPacket->setCrcMode(CRC_COMPUTED);
217  ospfPacket->setAuthenticationType(stream.readUint16Be());
218  for (int i = 0; i < 8; ++i) {
219  ospfPacket->setAuthentication(i, stream.readUint8());
220  }
221  return packetLength;
222 }

◆ deserializeOspfOptions()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeOspfOptions ( MemoryInputStream stream,
Ospfv2Options options 
)
staticprivate
487 {
488  options.unused_1 = stream.readBit();
489  options.unused_2 = stream.readBit();
490  options.DC_DemandCircuits = stream.readBit();
491  options.EA_ForwardExternalLSAs = stream.readBit();
492  options.NP_Type7LSA = stream.readBit();
493  options.MC_MulticastForwarding = stream.readBit();
494  options.E_ExternalRoutingCapability = stream.readBit();
495  options.unused_3 = stream.readBit();
496 }

◆ deserializeRouterLsa()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeRouterLsa ( MemoryInputStream stream,
const Ptr< Ospfv2LinkStateUpdatePacket updatePacket,
Ospfv2RouterLsa routerLsa 
)
staticprivate
279 {
280  routerLsa.setReserved1(stream.readNBitsToUint64Be(5));
281  routerLsa.setV_VirtualLinkEndpoint(stream.readBit());
282  routerLsa.setE_ASBoundaryRouter(stream.readBit());
283  routerLsa.setB_AreaBorderRouter(stream.readBit());
284  routerLsa.setReserved2(stream.readByte());
285  uint16_t numLinks = stream.readUint16Be();
286  routerLsa.setNumberOfLinks(numLinks);
287  routerLsa.setLinksArraySize(numLinks);
288  for (int32_t i = 0; i < numLinks; ++i) {
289  auto *link = new Ospfv2Link();
290  link->setLinkID(stream.readIpv4Address());
291  link->setLinkData(stream.readUint32Be());
292  link->setType(static_cast<LinkType>(stream.readByte()));
293  link->setNumberOfTOS(stream.readByte());
294  link->setLinkCost(stream.readUint16Be());
295  uint32_t numTos = link->getNumberOfTOS();
296  link->setTosDataArraySize(numTos);
297  for (uint32_t j = 0; j < numTos; ++j) {
298  auto *tos = new Ospfv2TosData();
299  tos->tos = stream.readByte();
300  if (stream.readByte() != 0)
301  updatePacket->markIncorrect();
302  tos->tosMetric = stream.readUint16Be();
303  link->setTosData(j, *tos);
304  }
305  routerLsa.setLinks(i, *link);
306  delete link;
307  }
308 }

◆ deserializeSummaryLsa()

void inet::ospfv2::Ospfv2PacketSerializer::deserializeSummaryLsa ( MemoryInputStream stream,
const Ptr< Ospfv2LinkStateUpdatePacket updatePacket,
Ospfv2SummaryLsa summaryLsa 
)
staticprivate
345 {
346  summaryLsa.setNetworkMask(stream.readIpv4Address());
347  if (stream.readByte() != 0)
348  updatePacket->markIncorrect();
349  summaryLsa.setRouteCost(stream.readUint24Be());
350  int numTos = (B(summaryLsa.getHeader().getLsaLength()) -
352  if (numTos < 0)
353  updatePacket->markIncorrect();
354  else
355  summaryLsa.setTosDataArraySize(numTos);
356  for (int i = 0; i < numTos; i++) {
357  auto *tos = new Ospfv2TosData();
358  tos->tos = stream.readUint8();
359  tos->tosMetric = stream.readUint24Be();
360  summaryLsa.setTosData(i, *tos);
361  }
362 }

◆ serialize()

void inet::ospfv2::Ospfv2PacketSerializer::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.

27 {
28  const auto& ospfPacket = staticPtrCast<const Ospfv2Packet>(chunk);
29  serializeOspfHeader(stream, ospfPacket);
30  switch (ospfPacket->getType()) {
31  case HELLO_PACKET: {
32  const auto& helloPacket = staticPtrCast<const Ospfv2HelloPacket>(ospfPacket);
33  stream.writeIpv4Address(helloPacket->getNetworkMask());
34  stream.writeUint16Be(helloPacket->getHelloInterval());
35  serializeOspfOptions(stream, helloPacket->getOptions());
36  stream.writeByte(helloPacket->getRouterPriority());
37  stream.writeUint32Be(helloPacket->getRouterDeadInterval());
38  stream.writeIpv4Address(helloPacket->getDesignatedRouter());
39  stream.writeIpv4Address(helloPacket->getBackupDesignatedRouter());
40  for (size_t i = 0; i < helloPacket->getNeighborArraySize(); ++i) {
41  stream.writeIpv4Address(helloPacket->getNeighbor(i));
42  }
43  break;
44  }
46  const auto& ddPacket = staticPtrCast<const Ospfv2DatabaseDescriptionPacket>(ospfPacket);
47  stream.writeUint16Be(ddPacket->getInterfaceMTU());
48  serializeOspfOptions(stream, ddPacket->getOptions());
49  auto& options = ddPacket->getDdOptions();
50  stream.writeNBitsOfUint64Be(options.unused, 5);
51  stream.writeBit(options.I_Init);
52  stream.writeBit(options.M_More);
53  stream.writeBit(options.MS_MasterSlave);
54  stream.writeUint32Be(ddPacket->getDdSequenceNumber());
55  for (unsigned int i = 0; i < ddPacket->getLsaHeadersArraySize(); ++i) {
56  serializeLsaHeader(stream, ddPacket->getLsaHeaders(i));
57  }
58  break;
59  }
61  const auto& requestPacket = staticPtrCast<const Ospfv2LinkStateRequestPacket>(ospfPacket);
62  for (size_t i = 0; i < requestPacket->getRequestsArraySize(); ++i) {
63  auto& req = requestPacket->getRequests(i);
64  stream.writeUint32Be(req.lsType);
65  stream.writeIpv4Address(req.linkStateID);
66  stream.writeIpv4Address(req.advertisingRouter);
67  }
68  break;
69  }
71  const auto& updatePacket = staticPtrCast<const Ospfv2LinkStateUpdatePacket>(ospfPacket);
72  stream.writeUint32Be(updatePacket->getOspfLSAsArraySize());
73  for (size_t i = 0; i < updatePacket->getOspfLSAsArraySize(); ++i) {
74  serializeLsa(stream, *updatePacket->getOspfLSAs(i));
75  }
76  break;
77  }
79  const auto& ackPacket = staticPtrCast<const Ospfv2LinkStateAcknowledgementPacket>(ospfPacket);
80  for (size_t i = 0; i < ackPacket->getLsaHeadersArraySize(); ++i) {
81  serializeLsaHeader(stream, ackPacket->getLsaHeaders(i));
82  }
83  break;
84  }
85  default:
86  throw cRuntimeError("Unknown OSPF message type in Ospfv2PacketSerializer");
87  }
88 }

◆ serializeAsExternalLsa()

void inet::ospfv2::Ospfv2PacketSerializer::serializeAsExternalLsa ( MemoryOutputStream stream,
const Ospfv2AsExternalLsa asExternalLsa 
)
staticprivate
365 {
366  auto& contents = asExternalLsa.getContents();
367  stream.writeIpv4Address(contents.getNetworkMask());
368 
369  for (size_t i = 0; i < asExternalLsa.getContents().getExternalTOSInfoArraySize(); ++i) {
370  const auto& exTos = contents.getExternalTOSInfo(i);
371  stream.writeBit(exTos.E_ExternalMetricType);
372  stream.writeNBitsOfUint64Be(exTos.tos, 7);
373  stream.writeUint24Be(exTos.routeCost);
374  stream.writeIpv4Address(exTos.forwardingAddress);
375  stream.writeUint32Be(exTos.externalRouteTag);
376  }
377 }

◆ serializeLsa()

void inet::ospfv2::Ospfv2PacketSerializer::serializeLsa ( MemoryOutputStream stream,
const Ospfv2Lsa routerLsa 
)
static
403 {
404  auto& lsaHeader = lsa.getHeader();
405  serializeLsaHeader(stream, lsaHeader);
406  Ospfv2LsaType type = lsaHeader.getLsType();
407  switch (type) {
408  case ROUTERLSA_TYPE: {
409  const Ospfv2RouterLsa *routerLsa = static_cast<const Ospfv2RouterLsa *>(&lsa);
410  serializeRouterLsa(stream, *routerLsa);
411  break;
412  }
413  case NETWORKLSA_TYPE: {
414  const Ospfv2NetworkLsa *networkLsa = static_cast<const Ospfv2NetworkLsa *>(&lsa);
415  serializeNetworkLsa(stream, *networkLsa);
416  break;
417  }
420  const Ospfv2SummaryLsa *summaryLsa = static_cast<const Ospfv2SummaryLsa *>(&lsa);
421  serializeSummaryLsa(stream, *summaryLsa);
422  break;
423  }
424  case AS_EXTERNAL_LSA_TYPE: {
425  const Ospfv2AsExternalLsa *asExternalLsa = static_cast<const Ospfv2AsExternalLsa *>(&lsa);
426  serializeAsExternalLsa(stream, *asExternalLsa);
427  break;
428  }
429  default:
430  throw cRuntimeError("Cannot serialize BGP packet: type %d not supported.", type);
431  }
432 }

Referenced by inet::ospfv2::setLsaCrc().

◆ serializeLsaHeader()

void inet::ospfv2::Ospfv2PacketSerializer::serializeLsaHeader ( MemoryOutputStream stream,
const Ospfv2LsaHeader lsaHeader 
)
static
225 {
226  stream.writeUint16Be(lsaHeader.getLsAge());
227  serializeOspfOptions(stream, lsaHeader.getLsOptions());
228  stream.writeByte(lsaHeader.getLsType());
229  stream.writeIpv4Address(lsaHeader.getLinkStateID());
230  stream.writeIpv4Address(lsaHeader.getAdvertisingRouter());
231  stream.writeUint32Be(lsaHeader.getLsSequenceNumber());
232  auto crcMode = lsaHeader.getLsCrcMode();
233  if (crcMode != CRC_COMPUTED)
234  throw cRuntimeError("Cannot serialize Ospf LSA header without properly computed CRC");
235  stream.writeUint16Be(lsaHeader.getLsCrc());
236  stream.writeUint16Be(lsaHeader.getLsaLength());
237 }

Referenced by inet::ospfv2::setLsaHeaderCrc().

◆ serializeNetworkLsa()

void inet::ospfv2::Ospfv2PacketSerializer::serializeNetworkLsa ( MemoryOutputStream stream,
const Ospfv2NetworkLsa networkLsa 
)
staticprivate
311 {
312  stream.writeIpv4Address(networkLsa.getNetworkMask());
313  for (size_t i = 0; i < networkLsa.getAttachedRoutersArraySize(); i++) {
314  stream.writeIpv4Address(networkLsa.getAttachedRouters(i));
315  }
316 }

◆ serializeOspfHeader()

void inet::ospfv2::Ospfv2PacketSerializer::serializeOspfHeader ( MemoryOutputStream stream,
const Ptr< const Ospfv2Packet > &  ospfPacket 
)
staticprivate
184 {
185  stream.writeByte(ospfPacket->getVersion());
186  stream.writeByte(ospfPacket->getType());
187  stream.writeUint16Be(ospfPacket->getPacketLengthField());
188  stream.writeIpv4Address(ospfPacket->getRouterID());
189  stream.writeIpv4Address(ospfPacket->getAreaID());
190  auto crcMode = ospfPacket->getCrcMode();
191  if (crcMode != CRC_COMPUTED)
192  throw cRuntimeError("Cannot serialize Ospf header without properly computed CRC");
193  stream.writeUint16Be(ospfPacket->getCrc());
194  stream.writeUint16Be(ospfPacket->getAuthenticationType());
195  for (unsigned int i = 0; i < 8; ++i) {
196  stream.writeByte(ospfPacket->getAuthentication(i));
197  }
198 }

◆ serializeOspfOptions()

void inet::ospfv2::Ospfv2PacketSerializer::serializeOspfOptions ( MemoryOutputStream stream,
const Ospfv2Options options 
)
staticprivate
475 {
476  stream.writeBit(options.unused_1);
477  stream.writeBit(options.unused_2);
478  stream.writeBit(options.DC_DemandCircuits);
479  stream.writeBit(options.EA_ForwardExternalLSAs);
480  stream.writeBit(options.NP_Type7LSA);
481  stream.writeBit(options.MC_MulticastForwarding);
482  stream.writeBit(options.E_ExternalRoutingCapability);
483  stream.writeBit(options.unused_3);
484 }

◆ serializeRouterLsa()

void inet::ospfv2::Ospfv2PacketSerializer::serializeRouterLsa ( MemoryOutputStream stream,
const Ospfv2RouterLsa routerLsa 
)
staticprivate
253 {
254  stream.writeNBitsOfUint64Be(routerLsa.getReserved1(), 5);
255  stream.writeBit(routerLsa.getV_VirtualLinkEndpoint());
256  stream.writeBit(routerLsa.getE_ASBoundaryRouter());
257  stream.writeBit(routerLsa.getB_AreaBorderRouter());
258  stream.writeByte(routerLsa.getReserved2());
259  uint16_t numLinks = routerLsa.getNumberOfLinks();
260  stream.writeUint16Be(numLinks);
261  for (int32_t i = 0; i < numLinks; ++i) {
262  const auto& link = routerLsa.getLinks(i);
263  stream.writeIpv4Address(link.getLinkID());
264  stream.writeUint32Be(link.getLinkData());
265  stream.writeByte(link.getType());
266  stream.writeByte(link.getNumberOfTOS());
267  stream.writeUint16Be(link.getLinkCost());
268  uint32_t numTos = link.getTosDataArraySize();
269  for (uint32_t j = 0; j < numTos; ++j) {
270  const auto& tos = link.getTosData(j);
271  stream.writeByte(tos.tos);
272  stream.writeByte(0);
273  stream.writeUint16Be(tos.tosMetric);
274  }
275  }
276 }

◆ serializeSummaryLsa()

void inet::ospfv2::Ospfv2PacketSerializer::serializeSummaryLsa ( MemoryOutputStream stream,
const Ospfv2SummaryLsa summaryLsa 
)
staticprivate
333 {
334  stream.writeIpv4Address(summaryLsa.getNetworkMask());
335  stream.writeByte(0);
336  stream.writeUint24Be(summaryLsa.getRouteCost());
337  for (size_t i = 0; i < summaryLsa.getTosDataArraySize(); i++) {
338  const auto& tos = summaryLsa.getTosData(i);
339  stream.writeByte(tos.tos);
340  stream.writeUint24Be(tos.tosMetric);
341  }
342 }

Friends And Related Function Documentation

◆ inet::ospf::OspfPacketSerializer

friend class inet::ospf::OspfPacketSerializer
friend

The documentation for this class was generated from the following files:
inet::ospf::LINKSTATE_ACKNOWLEDGEMENT_PACKET
@ LINKSTATE_ACKNOWLEDGEMENT_PACKET
Definition: OspfPacketBase_m.h:69
inet::ospfv2::SUMMARYLSA_NETWORKS_TYPE
@ SUMMARYLSA_NETWORKS_TYPE
Definition: Ospfv2Packet_m.h:285
inet::ospf::LINKSTATE_REQUEST_PACKET
@ LINKSTATE_REQUEST_PACKET
Definition: OspfPacketBase_m.h:67
inet::ospfv2::Ospfv2PacketSerializer::serializeOspfOptions
static void serializeOspfOptions(MemoryOutputStream &stream, const Ospfv2Options &options)
Definition: Ospfv2PacketSerializer.cc:474
inet::ospfv2::Ospfv2PacketSerializer::deserializeNetworkLsa
static void deserializeNetworkLsa(MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2NetworkLsa &networkLsa)
Definition: Ospfv2PacketSerializer.cc:318
inet::ospfv2::Ospfv2LsaType
Ospfv2LsaType
Enum generated from inet/routing/ospfv2/Ospfv2Packet.msg:78 by opp_msgtool.
Definition: Ospfv2Packet_m.h:282
inet::ospfv2::Ospfv2PacketSerializer::serializeSummaryLsa
static void serializeSummaryLsa(MemoryOutputStream &stream, const Ospfv2SummaryLsa &summaryLsa)
Definition: Ospfv2PacketSerializer.cc:332
inet::ospfv2::Ospfv2PacketSerializer::serializeAsExternalLsa
static void serializeAsExternalLsa(MemoryOutputStream &stream, const Ospfv2AsExternalLsa &asExternalLsa)
Definition: Ospfv2PacketSerializer.cc:364
inet::CRC_COMPUTED
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
inet::ospfv2::Ospfv2PacketSerializer::serializeLsaHeader
static void serializeLsaHeader(MemoryOutputStream &stream, const Ospfv2LsaHeader &lsaHeader)
Definition: Ospfv2PacketSerializer.cc:224
inet::ospfv2::ROUTERLSA_TYPE
@ ROUTERLSA_TYPE
Definition: Ospfv2Packet_m.h:283
inet::ospfv2::Ospfv2PacketSerializer::serializeOspfHeader
static void serializeOspfHeader(MemoryOutputStream &stream, const Ptr< const Ospfv2Packet > &ospfPacket)
Definition: Ospfv2PacketSerializer.cc:183
inet::ospf::HELLO_PACKET
@ HELLO_PACKET
Definition: OspfPacketBase_m.h:65
inet::ospfv2::OSPFv2_ASEXTERNALLSA_HEADER_LENGTH
const B OSPFv2_ASEXTERNALLSA_HEADER_LENGTH
Definition: Ospfv2Common.h:50
inet::ospf::LINKSTATE_UPDATE_PACKET
@ LINKSTATE_UPDATE_PACKET
Definition: OspfPacketBase_m.h:68
inet::ospfv2::SUMMARYLSA_ASBOUNDARYROUTERS_TYPE
@ SUMMARYLSA_ASBOUNDARYROUTERS_TYPE
Definition: Ospfv2Packet_m.h:286
inet::ospfv2::OSPFv2_DD_HEADER_LENGTH
const B OSPFv2_DD_HEADER_LENGTH
Definition: Ospfv2Common.h:42
inet::ospfv2::Ospfv2PacketSerializer::copyHeaderFields
static void copyHeaderFields(const Ptr< Ospfv2Packet > from, Ptr< Ospfv2Packet > to)
Definition: Ospfv2PacketSerializer.cc:498
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::ospfv2::Ospfv2PacketSerializer::serializeLsa
static void serializeLsa(MemoryOutputStream &stream, const Ospfv2Lsa &routerLsa)
Definition: Ospfv2PacketSerializer.cc:402
inet::ospfv2::Ospfv2PacketSerializer::deserializeOspfHeader
static uint16_t deserializeOspfHeader(MemoryInputStream &stream, Ptr< Ospfv2Packet > &ospfPacket)
Definition: Ospfv2PacketSerializer.cc:200
inet::ospfv2::Ospfv2PacketSerializer::serializeRouterLsa
static void serializeRouterLsa(MemoryOutputStream &stream, const Ospfv2RouterLsa &routerLsa)
Definition: Ospfv2PacketSerializer.cc:252
inet::ospfv2::AS_EXTERNAL_LSA_TYPE
@ AS_EXTERNAL_LSA_TYPE
Definition: Ospfv2Packet_m.h:287
inet::ospf::DATABASE_DESCRIPTION_PACKET
@ DATABASE_DESCRIPTION_PACKET
Definition: OspfPacketBase_m.h:66
inet::ospfv2::OSPFv2_LSA_HEADER_LENGTH
const B OSPFv2_LSA_HEADER_LENGTH
Definition: Ospfv2Common.h:40
inet::ospf::OspfPacketType
OspfPacketType
Enum generated from inet/routing/ospf_common/OspfPacketBase.msg:15 by opp_msgtool.
Definition: OspfPacketBase_m.h:64
type
removed type
Definition: IUdp-gates.txt:7
inet::ospfv2::OSPFv2_HEADER_LENGTH
const B OSPFv2_HEADER_LENGTH
Definition: Ospfv2Common.h:39
inet::ospfv2::Ospfv2PacketSerializer::deserializeOspfOptions
static void deserializeOspfOptions(MemoryInputStream &stream, Ospfv2Options &options)
Definition: Ospfv2PacketSerializer.cc:486
inet::ospfv2::OSPFv2_NETWORKLSA_ADDRESS_LENGTH
const B OSPFv2_NETWORKLSA_ADDRESS_LENGTH
Definition: Ospfv2Common.h:48
inet::ospfv2::Ospfv2PacketSerializer::deserializeLsa
static void deserializeLsa(MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, int i)
Definition: Ospfv2PacketSerializer.cc:434
inet::ospfv2::OSPFv2_REQUEST_LENGTH
const B OSPFv2_REQUEST_LENGTH
Definition: Ospfv2Common.h:43
inet::units::value::get
const value_type & get() const
Definition: Units.h:108
inet::ospfv2::LinkType
LinkType
Enum generated from inet/routing/ospfv2/Ospfv2Packet.msg:113 by opp_msgtool.
Definition: Ospfv2Packet_m.h:429
inet::ospfv2::OSPFv2_NETWORKLSA_MASK_LENGTH
const B OSPFv2_NETWORKLSA_MASK_LENGTH
Definition: Ospfv2Common.h:47
inet::ospfv2::NETWORKLSA_TYPE
@ NETWORKLSA_TYPE
Definition: Ospfv2Packet_m.h:284
inet::ospfv2::Ospfv2PacketSerializer::deserializeRouterLsa
static void deserializeRouterLsa(MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2RouterLsa &routerLsa)
Definition: Ospfv2PacketSerializer.cc:278
inet::ospfv2::OSPFv2_ASEXTERNALLSA_TOS_INFO_LENGTH
const B OSPFv2_ASEXTERNALLSA_TOS_INFO_LENGTH
Definition: Ospfv2Common.h:51
inet::ospfv2::Ospfv2PacketSerializer::deserializeAsExternalLsa
static void deserializeAsExternalLsa(MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2AsExternalLsa &asExternalLsa)
Definition: Ospfv2PacketSerializer.cc:379
inet::ospfv2::OSPFv2_TOS_LENGTH
const B OSPFv2_TOS_LENGTH
Definition: Ospfv2Common.h:46
inet::ospfv2::Ospfv2PacketSerializer::deserializeLsaHeader
static void deserializeLsaHeader(MemoryInputStream &stream, Ospfv2LsaHeader &lsaHeader)
Definition: Ospfv2PacketSerializer.cc:239
inet::ospfv2::Ospfv2PacketSerializer::serializeNetworkLsa
static void serializeNetworkLsa(MemoryOutputStream &stream, const Ospfv2NetworkLsa &networkLsa)
Definition: Ospfv2PacketSerializer.cc:310
inet::ospfv2::OSPFv2_HELLO_HEADER_LENGTH
const B OSPFv2_HELLO_HEADER_LENGTH
Definition: Ospfv2Common.h:41
inet::ospfv2::Ospfv2PacketSerializer::deserializeSummaryLsa
static void deserializeSummaryLsa(MemoryInputStream &stream, const Ptr< Ospfv2LinkStateUpdatePacket > updatePacket, Ospfv2SummaryLsa &summaryLsa)
Definition: Ospfv2PacketSerializer.cc:344