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

#include <Ipv4ProtocolDissector.h>

Inheritance diagram for inet::Ipv4ProtocolDissector:
inet::ProtocolDissector

Public Member Functions

virtual void dissect (Packet *packet, const Protocol *protocol, ICallback &callback) const override
 Dissects the packet according to the protocol implemented by this ProtocolDissector. More...
 

Member Function Documentation

◆ dissect()

void inet::Ipv4ProtocolDissector::dissect ( Packet packet,
const Protocol protocol,
ICallback callback 
) const
overridevirtual

Dissects the packet according to the protocol implemented by this ProtocolDissector.

Implements inet::ProtocolDissector.

19 {
20  auto trailerPopOffset = packet->getBackOffset();
21  auto ipv4EndOffset = packet->getFrontOffset();
22  const auto& header = packet->popAtFront<Ipv4Header>();
23  ipv4EndOffset += B(header->getTotalLengthField());
24  callback.startProtocolDataUnit(&Protocol::ipv4);
25  bool incorrect = (ipv4EndOffset > trailerPopOffset || header->getTotalLengthField() <= header->getHeaderLength());
26  if (incorrect) {
27  callback.markIncorrect();
28  ipv4EndOffset = trailerPopOffset;
29  }
30  callback.visitChunk(header, &Protocol::ipv4);
31  packet->setBackOffset(ipv4EndOffset);
32  if (header->getFragmentOffset() == 0 && !header->getMoreFragments()) {
33  callback.dissectPacket(packet, header->getProtocol());
34  }
35  else {
36  // TODO Fragmentation
37  callback.dissectPacket(packet, nullptr);
38  }
39  if (incorrect && packet->getDataLength() > b(0))
40  callback.dissectPacket(packet, nullptr);
41  ASSERT(incorrect || packet->getDataLength() == b(0));
42  packet->setFrontOffset(ipv4EndOffset);
43  packet->setBackOffset(trailerPopOffset);
44  callback.endProtocolDataUnit(&Protocol::ipv4);
45 }

The documentation for this class was generated from the following files:
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241