INET Framework for OMNeT++/OMNEST
inet::MultiFieldClassifier::PacketDissectorCallback Class Reference

#include <MultiFieldClassifier.h>

Inheritance diagram for inet::MultiFieldClassifier::PacketDissectorCallback:
inet::PacketDissector::ICallback

Public Member Functions

 PacketDissectorCallback ()
 
virtual ~PacketDissectorCallback ()
 
bool matches (Packet *packet)
 
virtual bool shouldDissectProtocolDataUnit (const Protocol *protocol) override
 True means the packet dissector should recursively process the PDU. More...
 
virtual void startProtocolDataUnit (const Protocol *protocol) override
 Notifies about the start of a new protocol data unit (PDU). More...
 
virtual void endProtocolDataUnit (const Protocol *protocol) override
 Notifies about the end of the current protocol data unit (PDU). More...
 
virtual void markIncorrect () override
 Marks the current protocol data unit as incorrect (e.g. More...
 
virtual void visitChunk (const Ptr< const Chunk > &chunk, const Protocol *protocol) override
 Notifies about a new chunk in the current protocol data unit (PDU). More...
 

Public Attributes

int gateIndex = -1
 
L3Address srcAddr
 
int srcPrefixLength = 0
 
L3Address destAddr
 
int destPrefixLength = 0
 
int protocolId = -1
 
int dscp = -1
 
int tos = -1
 
int tosMask = 0
 
int srcPortMin = -1
 
int srcPortMax = -1
 
int destPortMin = -1
 
int destPortMax = -1
 

Protected Attributes

bool dissect = true
 
bool matchesL3 = false
 
bool matchesL4 = false
 

Constructor & Destructor Documentation

◆ PacketDissectorCallback()

inet::MultiFieldClassifier::PacketDissectorCallback::PacketDissectorCallback ( )
inline
47 {}

◆ ~PacketDissectorCallback()

virtual inet::MultiFieldClassifier::PacketDissectorCallback::~PacketDissectorCallback ( )
inlinevirtual
48 {}

Member Function Documentation

◆ endProtocolDataUnit()

virtual void inet::MultiFieldClassifier::PacketDissectorCallback::endProtocolDataUnit ( const Protocol protocol)
inlineoverridevirtual

Notifies about the end of the current protocol data unit (PDU).

Implements inet::PacketDissector::ICallback.

54 {}

◆ markIncorrect()

virtual void inet::MultiFieldClassifier::PacketDissectorCallback::markIncorrect ( )
inlineoverridevirtual

Marks the current protocol data unit as incorrect (e.g.

bad CRC/FCS, incorrect length field, bit error).

Implements inet::PacketDissector::ICallback.

55 {}

◆ matches()

bool inet::MultiFieldClassifier::PacketDissectorCallback::matches ( Packet packet)
42 {
43  matchesL3 = matchesL4 = false;
44  dissect = true;
45  PacketDissector packetDissector(ProtocolDissectorRegistry::globalRegistry, *this);
46  packetDissector.dissectPacket(packet);
47  return matchesL3 && matchesL4;
48 }

◆ shouldDissectProtocolDataUnit()

bool inet::MultiFieldClassifier::PacketDissectorCallback::shouldDissectProtocolDataUnit ( const Protocol protocol)
overridevirtual

True means the packet dissector should recursively process the PDU.

When false, start and end notifications and one visit chunk are still generated.

Implements inet::PacketDissector::ICallback.

51 {
52  return dissect;
53 }

◆ startProtocolDataUnit()

virtual void inet::MultiFieldClassifier::PacketDissectorCallback::startProtocolDataUnit ( const Protocol protocol)
inlineoverridevirtual

Notifies about the start of a new protocol data unit (PDU).

Implements inet::PacketDissector::ICallback.

53 {}

◆ visitChunk()

void inet::MultiFieldClassifier::PacketDissectorCallback::visitChunk ( const Ptr< const Chunk > &  chunk,
const Protocol protocol 
)
overridevirtual

Notifies about a new chunk in the current protocol data unit (PDU).

Implements inet::PacketDissector::ICallback.

56 {
57  if (protocol == nullptr)
58  return;
59  if (*protocol == Protocol::ipv4) {
60  dissect = false;
61 #ifdef INET_WITH_IPv4
62  const auto& ipv4Header = dynamicPtrCast<const Ipv4Header>(chunk);
63  if (!ipv4Header)
64  return;
65  if (srcPrefixLength > 0 && (srcAddr.getType() != L3Address::IPv4 || !ipv4Header->getSrcAddress().prefixMatches(srcAddr.toIpv4(), srcPrefixLength)))
66  return;
67  if (destPrefixLength > 0 && (destAddr.getType() != L3Address::IPv4 || !ipv4Header->getDestAddress().prefixMatches(destAddr.toIpv4(), destPrefixLength)))
68  return;
69  if (protocolId >= 0 && protocolId != ipv4Header->getProtocolId())
70  return;
71  if (dscp != -1 && dscp != ipv4Header->getDscp())
72  return;
73  if (tos != -1 && tosMask != 0 && (tos & tosMask) != (ipv4Header->getTypeOfService() & tosMask))
74  return;
75 
76  matchesL3 = true;
77  if (srcPortMin < 0 && destPortMin < 0)
78  matchesL4 = true;
79  else
80  dissect = true;
81 #endif // ifdef INET_WITH_IPv4
82  }
83  else if (*protocol == Protocol::ipv6) {
84 #ifdef INET_WITH_IPv6
85  dissect = false;
86  const auto& ipv6Header = dynamicPtrCast<const Ipv6Header>(chunk);
87  if (!ipv6Header)
88  return;
89 
90  if (srcPrefixLength > 0 && (srcAddr.getType() != L3Address::IPv6 || !ipv6Header->getSrcAddress().matches(srcAddr.toIpv6(), srcPrefixLength)))
91  return;
92  if (destPrefixLength > 0 && (destAddr.getType() != L3Address::IPv6 || !ipv6Header->getDestAddress().matches(destAddr.toIpv6(), destPrefixLength)))
93  return;
94  if (protocolId >= 0 && protocolId != ipv6Header->getProtocolId())
95  return;
96  if (dscp != -1 && dscp != ipv6Header->getDscp())
97  return;
98  if (tos != -1 && tosMask != 0 && (tos & tosMask) != (ipv6Header->getTrafficClass() & tosMask))
99  return;
100 
101  matchesL3 = true;
102  if (srcPortMin < 0 && destPortMin < 0)
103  matchesL4 = true;
104  else
105  dissect = true;
106 #endif // ifdef INET_WITH_IPv6
107  }
108  else if (isTransportProtocol(*protocol)) {
109  const auto& transportHeader = dynamicPtrCast<const TransportHeaderBase>(chunk);
110  if (!transportHeader)
111  return;
112  dissect = false;
113  auto srcPort = transportHeader->getSourcePort();
114  auto destPort = transportHeader->getDestinationPort();
115 
116  if (srcPortMin != -1 && (srcPort < (unsigned int)srcPortMin))
117  return;
118  if (srcPortMax != -1 && (srcPort > (unsigned int)srcPortMax))
119  return;
120  if (destPortMin != -1 && (destPort < (unsigned int)destPortMin))
121  return;
122  if (destPortMax != -1 && (destPort > (unsigned int)destPortMax))
123  return;
124  matchesL4 = true;
125  }
126 }

Member Data Documentation

◆ destAddr

L3Address inet::MultiFieldClassifier::PacketDissectorCallback::destAddr

◆ destPortMax

int inet::MultiFieldClassifier::PacketDissectorCallback::destPortMax = -1

◆ destPortMin

int inet::MultiFieldClassifier::PacketDissectorCallback::destPortMin = -1

◆ destPrefixLength

int inet::MultiFieldClassifier::PacketDissectorCallback::destPrefixLength = 0

◆ dissect

bool inet::MultiFieldClassifier::PacketDissectorCallback::dissect = true
protected

◆ dscp

int inet::MultiFieldClassifier::PacketDissectorCallback::dscp = -1

◆ gateIndex

int inet::MultiFieldClassifier::PacketDissectorCallback::gateIndex = -1

◆ matchesL3

bool inet::MultiFieldClassifier::PacketDissectorCallback::matchesL3 = false
protected

◆ matchesL4

bool inet::MultiFieldClassifier::PacketDissectorCallback::matchesL4 = false
protected

◆ protocolId

int inet::MultiFieldClassifier::PacketDissectorCallback::protocolId = -1

◆ srcAddr

L3Address inet::MultiFieldClassifier::PacketDissectorCallback::srcAddr

◆ srcPortMax

int inet::MultiFieldClassifier::PacketDissectorCallback::srcPortMax = -1

◆ srcPortMin

int inet::MultiFieldClassifier::PacketDissectorCallback::srcPortMin = -1

◆ srcPrefixLength

int inet::MultiFieldClassifier::PacketDissectorCallback::srcPrefixLength = 0

◆ tos

int inet::MultiFieldClassifier::PacketDissectorCallback::tos = -1

◆ tosMask

int inet::MultiFieldClassifier::PacketDissectorCallback::tosMask = 0

The documentation for this class was generated from the following files:
inet::MultiFieldClassifier::PacketDissectorCallback::destPortMin
int destPortMin
Definition: MultiFieldClassifier.h:43
inet::MultiFieldClassifier::PacketDissectorCallback::destPrefixLength
int destPrefixLength
Definition: MultiFieldClassifier.h:36
inet::MultiFieldClassifier::PacketDissectorCallback::srcPortMax
int srcPortMax
Definition: MultiFieldClassifier.h:42
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::MultiFieldClassifier::PacketDissectorCallback::destPortMax
int destPortMax
Definition: MultiFieldClassifier.h:44
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::Protocol::ipv6
static const Protocol ipv6
Definition: Protocol.h:94
inet::MultiFieldClassifier::PacketDissectorCallback::dissect
bool dissect
Definition: MultiFieldClassifier.h:26
inet::L3Address::IPv4
@ IPv4
Definition: L3Address.h:35
inet::MultiFieldClassifier::PacketDissectorCallback::tosMask
int tosMask
Definition: MultiFieldClassifier.h:40
inet::isTransportProtocol
bool isTransportProtocol(const Protocol &protocol)
Definition: L4Tools.cc:54
inet::MultiFieldClassifier::PacketDissectorCallback::srcPortMin
int srcPortMin
Definition: MultiFieldClassifier.h:41
inet::L3Address::toIpv6
Ipv6Address toIpv6() const
Definition: L3Address.h:71
inet::MultiFieldClassifier::PacketDissectorCallback::srcAddr
L3Address srcAddr
Definition: MultiFieldClassifier.h:33
inet::MultiFieldClassifier::PacketDissectorCallback::matchesL3
bool matchesL3
Definition: MultiFieldClassifier.h:27
inet::L3Address::IPv6
@ IPv6
Definition: L3Address.h:36
inet::MultiFieldClassifier::PacketDissectorCallback::matchesL4
bool matchesL4
Definition: MultiFieldClassifier.h:28
inet::MultiFieldClassifier::PacketDissectorCallback::destAddr
L3Address destAddr
Definition: MultiFieldClassifier.h:35
inet::MultiFieldClassifier::PacketDissectorCallback::dscp
int dscp
Definition: MultiFieldClassifier.h:38
inet::MultiFieldClassifier::PacketDissectorCallback::tos
int tos
Definition: MultiFieldClassifier.h:39
inet::MultiFieldClassifier::PacketDissectorCallback::protocolId
int protocolId
Definition: MultiFieldClassifier.h:37
inet::L3Address::toIpv4
Ipv4Address toIpv4() const
Definition: L3Address.h:70
inet::MultiFieldClassifier::PacketDissectorCallback::srcPrefixLength
int srcPrefixLength
Definition: MultiFieldClassifier.h:34
inet::ProtocolDissectorRegistry::globalRegistry
static ProtocolDissectorRegistry globalRegistry
Definition: ProtocolDissectorRegistry.h:21
inet::L3Address::getType
AddressType getType() const
Definition: L3Address.cc:51