#include <Ipv4ProtocolDissector.h>
◆ 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.
20 auto trailerPopOffset = packet->getBackOffset();
21 auto ipv4EndOffset = packet->getFrontOffset();
22 const auto& header = packet->popAtFront<Ipv4Header>();
23 ipv4EndOffset +=
B(header->getTotalLengthField());
25 bool incorrect = (ipv4EndOffset > trailerPopOffset || header->getTotalLengthField() <= header->getHeaderLength());
27 callback.markIncorrect();
28 ipv4EndOffset = trailerPopOffset;
31 packet->setBackOffset(ipv4EndOffset);
32 if (header->getFragmentOffset() == 0 && !header->getMoreFragments()) {
33 callback.dissectPacket(packet, header->getProtocol());
37 callback.dissectPacket(packet,
nullptr);
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);
The documentation for this class was generated from the following files: