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

This class provides efficient general purpose packet dissection. More...

#include <PacketDissector.h>

Classes

class  ChunkBuilder
 
class  ICallback
 
class  PduTreeBuilder
 
class  ProtocolDataUnit
 
class  ProtocolDissectorCallback
 

Public Member Functions

 PacketDissector (const ProtocolDissectorRegistry &protocolDissectorRegistry, ICallback &callback)
 
void dissectPacket (Packet *packet) const
 Dissects the given packet according to the attached PacketProtocolTag. More...
 
void dissectPacket (Packet *packet, const Protocol *protocol, b extraFrontOffset=b(0), b extraBackOffset=b(0)) const
 Dissects the given packet of the provided protocol. More...
 

Protected Member Functions

void doDissectPacket (Packet *packet, const Protocol *protocol) const
 

Protected Attributes

const ProtocolDissectorRegistryprotocolDissectorRegistry
 
ICallbackcallback
 

Detailed Description

This class provides efficient general purpose packet dissection.

Packet dissection may be useful for printing packet details, filter packets, finding information in a packet deep down.

The supported protocols are provided by a ProtocolDissectorRegistry. The packet dissection algorithm calls the visitChunk() method of the provided PacketDissector::ICallback for each protocol specific chunk found in the packet. The chunks are passed to the method in the order they appear in the packet from left to right using their most specific protocol dependent form.

Constructor & Destructor Documentation

◆ PacketDissector()

inet::PacketDissector::PacketDissector ( const ProtocolDissectorRegistry protocolDissectorRegistry,
ICallback callback 
)

Member Function Documentation

◆ dissectPacket() [1/2]

void inet::PacketDissector::dissectPacket ( Packet packet) const

Dissects the given packet according to the attached PacketProtocolTag.

140 {
141  const auto& packetProtocolTag = packet->findTag<PacketProtocolTag>();
142  auto protocol = packetProtocolTag != nullptr ? packetProtocolTag->getProtocol() : nullptr;
143  if (packetProtocolTag != nullptr)
144  dissectPacket(packet, protocol, packetProtocolTag->getFrontOffset(), packetProtocolTag->getBackOffset());
145  else
146  dissectPacket(packet, protocol);
147 }

Referenced by inet::Packet::getDissection(), inet::BehaviorAggregateClassifier::PacketDissectorCallback::matches(), inet::MultiFieldClassifier::PacketDissectorCallback::matches(), inet::PacketFilter::matches(), inet::PacketPrinter::printPacket(), and inet::PacketDeserializer::processPacket().

◆ dissectPacket() [2/2]

void inet::PacketDissector::dissectPacket ( Packet packet,
const Protocol protocol,
b  extraFrontOffset = b(0),
b  extraBackOffset = b(0) 
) const

Dissects the given packet of the provided protocol.

The packet dissection algorithm calls the visitChunk() method of the provided callback for each protocol specific chunk found in the packet.

150 {
151  auto frontOffset = packet->getFrontOffset();
152  auto backOffset = packet->getBackOffset();
153  packet->setFrontOffset(frontOffset + extraFrontOffset);
154  packet->setBackOffset(backOffset + extraBackOffset);
155  // dissect packet data part according to protocol
156  doDissectPacket(packet, protocol);
157  // dissect remaining junk in packet without protocol (e.g. ethernet padding at IP level)
158  if (packet->getDataLength() != b(0))
159  doDissectPacket(packet, nullptr);
160  ASSERT(packet->getDataLength() == b(0));
161  packet->setFrontOffset(frontOffset);
162  packet->setBackOffset(backOffset);
163 }

◆ doDissectPacket()

void inet::PacketDissector::doDissectPacket ( Packet packet,
const Protocol protocol 
) const
protected
131 {
133  if (protocolDissector == nullptr)
134  protocolDissector = protocolDissectorRegistry.getProtocolDissector(nullptr);
135  ProtocolDissectorCallback callback(*this);
136  protocolDissector->dissect(packet, protocol, callback);
137 }

Referenced by dissectPacket().

Member Data Documentation

◆ callback

ICallback& inet::PacketDissector::callback
protected

Referenced by doDissectPacket().

◆ protocolDissectorRegistry

const ProtocolDissectorRegistry& inet::PacketDissector::protocolDissectorRegistry
protected

Referenced by doDissectPacket().


The documentation for this class was generated from the following files:
inet::ProtocolDissectorRegistry::getProtocolDissector
const ProtocolDissector * getProtocolDissector(const Protocol *protocol) const
Definition: ProtocolDissectorRegistry.cc:31
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::ProtocolDissectorRegistry::findProtocolDissector
const ProtocolDissector * findProtocolDissector(const Protocol *protocol) const
Definition: ProtocolDissectorRegistry.cc:25
inet::PacketDissector::ICallback::shouldDissectProtocolDataUnit
virtual bool shouldDissectProtocolDataUnit(const Protocol *protocol)=0
True means the packet dissector should recursively process the PDU.
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::PacketDissector::doDissectPacket
void doDissectPacket(Packet *packet, const Protocol *protocol) const
Definition: PacketDissector.cc:130
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
inet::PacketDissector::protocolDissectorRegistry
const ProtocolDissectorRegistry & protocolDissectorRegistry
Definition: PacketDissector.h:137
inet::PacketDissector::dissectPacket
void dissectPacket(Packet *packet) const
Dissects the given packet according to the attached PacketProtocolTag.
Definition: PacketDissector.cc:139
inet::PacketDissector::callback
ICallback & callback
Definition: PacketDissector.h:138