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

This module classifies and assigns User Priority to packets. More...

#include <QosClassifier.h>

Inheritance diagram for inet::QosClassifier:
inet::DefaultProtocolRegistrationListener inet::IProtocolRegistrationListener

Public Member Functions

 QosClassifier ()
 
virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *msg) override
 
- Public Member Functions inherited from inet::DefaultProtocolRegistrationListener
virtual void handleRegisterServiceGroup (const ProtocolGroup &protocolGroup, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterProtocolGroup (const ProtocolGroup &protocolGroup, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterAnyService (cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterAnyProtocol (cGate *gate, ServicePrimitive servicePrimitive) override
 

Protected Member Functions

virtual int parseUserPriority (const char *text)
 
virtual void parseUserPriorityMap (const char *text, std::map< int, int > &upMap)
 
virtual int getUserPriority (cMessage *msg)
 
virtual void handleRegisterService (const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive) override
 
virtual void handleRegisterProtocol (const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive) override
 

Protected Attributes

int defaultUp
 
std::map< int, int > ipProtocolUpMap
 
std::map< int, int > udpPortUpMap
 
std::map< int, int > tcpPortUpMap
 

Detailed Description

This module classifies and assigns User Priority to packets.

Constructor & Destructor Documentation

◆ QosClassifier()

inet::QosClassifier::QosClassifier ( )
inline
35 {}

Member Function Documentation

◆ getUserPriority()

int inet::QosClassifier::getUserPriority ( cMessage *  msg)
protectedvirtual
93 {
94  int ipProtocol = -1;
95 
96 #if defined(INET_WITH_ETHERNET) || defined(INET_WITH_IPv4) || defined(INET_WITH_IPv6) || defined(INET_WITH_UDP) || defined(INET_WITH_TCP_COMMON)
97  auto packet = check_and_cast<Packet *>(msg);
98  auto packetProtocol = packet->getTag<PacketProtocolTag>()->getProtocol();
99  int ethernetMacProtocol = -1;
100  b ethernetMacHeaderLength = b(0);
101  b ipHeaderLength = b(-1);
102 #endif
103 
104 #ifdef INET_WITH_ETHERNET
105  if (packetProtocol == &Protocol::ethernetMac) {
106  const auto& ethernetMacHeader = packet->peekAtFront<EthernetMacHeader>();
107  ethernetMacProtocol = ethernetMacHeader->getTypeOrLength();
108  ethernetMacHeaderLength = ethernetMacHeader->getChunkLength();
109  }
110 #endif
111 
112 #ifdef INET_WITH_IPv4
113  if (ethernetMacProtocol == ETHERTYPE_IPv4 || packetProtocol == &Protocol::ipv4) {
114  const auto& ipv4Header = packet->peekDataAt<Ipv4Header>(ethernetMacHeaderLength);
115  ipProtocol = ipv4Header->getProtocolId();
116  ipHeaderLength = ipv4Header->getChunkLength();
117  }
118 #endif
119 
120 #ifdef INET_WITH_IPv6
121  if (ethernetMacProtocol == ETHERTYPE_IPv6 || packetProtocol == &Protocol::ipv6) {
122  const auto& ipv6Header = packet->peekDataAt<Ipv6Header>(ethernetMacHeaderLength);
123  ipProtocol = ipv6Header->getProtocolId();
124  ipHeaderLength = ipv6Header->getChunkLength();
125  }
126 #endif
127 
128  if (ipProtocol == -1)
129  return defaultUp;
130  auto it = ipProtocolUpMap.find(ipProtocol);
131  if (it != ipProtocolUpMap.end())
132  return it->second;
133 
134 #ifdef INET_WITH_UDP
135  if (ipProtocol == IP_PROT_UDP) {
136  const auto& udpHeader = packet->peekDataAt<UdpHeader>(ethernetMacHeaderLength + ipHeaderLength);
137  unsigned int srcPort = udpHeader->getSourcePort();
138  unsigned int destPort = udpHeader->getDestinationPort();
139  auto it = udpPortUpMap.find(destPort);
140  if (it != udpPortUpMap.end())
141  return it->second;
142  it = udpPortUpMap.find(srcPort);
143  if (it != udpPortUpMap.end())
144  return it->second;
145  }
146 #endif
147 
148 #ifdef INET_WITH_TCP_COMMON
149  if (ipProtocol == IP_PROT_TCP) {
150  const auto& tcpHeader = packet->peekDataAt<tcp::TcpHeader>(ethernetMacHeaderLength + ipHeaderLength);
151  unsigned int srcPort = tcpHeader->getSourcePort();
152  unsigned int destPort = tcpHeader->getDestinationPort();
153  auto it = tcpPortUpMap.find(destPort);
154  if (it != tcpPortUpMap.end())
155  return it->second;
156  it = tcpPortUpMap.find(srcPort);
157  if (it != tcpPortUpMap.end())
158  return it->second;
159  }
160 #endif
161 
162  return defaultUp;
163 }

Referenced by handleMessage().

◆ handleMessage()

void inet::QosClassifier::handleMessage ( cMessage *  msg)
overridevirtual
50 {
51  auto packet = check_and_cast<Packet *>(msg);
52  packet->addTagIfAbsent<UserPriorityReq>()->setUserPriority(getUserPriority(msg));
53  send(msg, "out");
54 }

◆ handleRegisterProtocol()

void inet::QosClassifier::handleRegisterProtocol ( const Protocol protocol,
cGate *  gate,
ServicePrimitive  servicePrimitive 
)
overrideprotectedvirtual

Reimplemented from inet::DefaultProtocolRegistrationListener.

177 {
178  Enter_Method("handleRegisterProtocol");
179  if (!strcmp("in", g->getName()))
180  registerProtocol(protocol, gate("out"), servicePrimitive);
181  else if (!strcmp("out", g->getName()))
182  registerService(protocol, gate("in"), servicePrimitive);
183  else
184  throw cRuntimeError("Unknown gate: %s", g->getName());
185 }

◆ handleRegisterService()

void inet::QosClassifier::handleRegisterService ( const Protocol protocol,
cGate *  gate,
ServicePrimitive  servicePrimitive 
)
overrideprotectedvirtual

Reimplemented from inet::DefaultProtocolRegistrationListener.

166 {
167  Enter_Method("handleRegisterService");
168  if (!strcmp("in", g->getName()))
169  registerService(protocol, gate("out"), servicePrimitive);
170  else if (!strcmp("out", g->getName()))
171  registerService(protocol, gate("in"), servicePrimitive);
172  else
173  throw cRuntimeError("Unknown gate: %s", g->getName());
174 }

◆ initialize()

void inet::QosClassifier::initialize ( int  stage)
overridevirtual
40 {
41  if (stage == INITSTAGE_LOCAL) {
42  defaultUp = parseUserPriority(par("defaultUp"));
43  parseUserPriorityMap(par("ipProtocolUpMap"), ipProtocolUpMap);
44  parseUserPriorityMap(par("udpPortUpMap"), udpPortUpMap);
45  parseUserPriorityMap(par("tcpPortUpMap"), tcpPortUpMap);
46  }
47 }

◆ numInitStages()

virtual int inet::QosClassifier::numInitStages ( ) const
inlineoverridevirtual
37 { return NUM_INIT_STAGES; }

◆ parseUserPriority()

int inet::QosClassifier::parseUserPriority ( const char *  text)
protectedvirtual
57 {
58  if (!strcmp(text, "BE"))
59  return UP_BE;
60  else if (!strcmp(text, "BK"))
61  return UP_BK;
62  else if (!strcmp(text, "BK2"))
63  return UP_BK2;
64  else if (!strcmp(text, "EE"))
65  return UP_EE;
66  else if (!strcmp(text, "CL"))
67  return UP_CL;
68  else if (!strcmp(text, "VI"))
69  return UP_VI;
70  else if (!strcmp(text, "VO"))
71  return UP_VO;
72  else if (!strcmp(text, "NC"))
73  return UP_NC;
74  else
75  throw cRuntimeError("Unknown user priority: '%s'", text);
76 }

Referenced by initialize(), and parseUserPriorityMap().

◆ parseUserPriorityMap()

void inet::QosClassifier::parseUserPriorityMap ( const char *  text,
std::map< int, int > &  upMap 
)
protectedvirtual
79 {
80  cStringTokenizer tokenizer(text);
81  while (tokenizer.hasMoreTokens()) {
82  const char *keyString = tokenizer.nextToken();
83  const char *upString = tokenizer.nextToken();
84  if (!keyString || !upString)
85  throw cRuntimeError("Insufficient number of values in: '%s'", text);
86  int key = std::atoi(keyString);
87  int up = parseUserPriority(upString);
88  upMap.insert(std::pair<int, int>(key, up));
89  }
90 }

Referenced by initialize().

Member Data Documentation

◆ defaultUp

int inet::QosClassifier::defaultUp
protected

Referenced by getUserPriority(), and initialize().

◆ ipProtocolUpMap

std::map<int, int> inet::QosClassifier::ipProtocolUpMap
protected

Referenced by getUserPriority(), and initialize().

◆ tcpPortUpMap

std::map<int, int> inet::QosClassifier::tcpPortUpMap
protected

Referenced by getUserPriority(), and initialize().

◆ udpPortUpMap

std::map<int, int> inet::QosClassifier::udpPortUpMap
protected

Referenced by getUserPriority(), and initialize().


The documentation for this class was generated from the following files:
inet::QosClassifier::tcpPortUpMap
std::map< int, int > tcpPortUpMap
Definition: QosClassifier.h:24
protocol
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down protocol
Definition: IUdp-gates.txt:25
inet::QosClassifier::defaultUp
int defaultUp
Definition: QosClassifier.h:21
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::UP_BE
@ UP_BE
Definition: UserPriority.h:21
inet::Protocol::ipv6
static const Protocol ipv6
Definition: Protocol.h:94
inet::UP_BK
@ UP_BK
Definition: UserPriority.h:19
inet::UP_CL
@ UP_CL
Definition: UserPriority.h:23
inet::registerService
void registerService(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a service primitive (SDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:14
inet::QosClassifier::parseUserPriority
virtual int parseUserPriority(const char *text)
Definition: QosClassifier.cc:56
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::units::units::g
milli< kg >::type g
Definition: Units.h:1071
inet::IP_PROT_UDP
@ IP_PROT_UDP
Definition: IpProtocolId_m.h:97
if
if(cwndVector) cwndVector -> record(state->snd_cwnd)
inet::Protocol::ethernetMac
static const Protocol ethernetMac
Definition: Protocol.h:65
INET_WITH_UDP
#define INET_WITH_UDP
Definition: features.h:193
inet::UP_EE
@ UP_EE
Definition: UserPriority.h:22
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::units::values::b
value< int64_t, units::b > b
Definition: Units.h:1241
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::UP_VI
@ UP_VI
Definition: UserPriority.h:24
inet::IP_PROT_TCP
@ IP_PROT_TCP
Definition: IpProtocolId_m.h:94
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::QosClassifier::getUserPriority
virtual int getUserPriority(cMessage *msg)
Definition: QosClassifier.cc:92
inet::UP_NC
@ UP_NC
Definition: UserPriority.h:26
inet::ETHERTYPE_IPv4
@ ETHERTYPE_IPv4
Definition: EtherType_m.h:77
inet::UP_BK2
@ UP_BK2
Definition: UserPriority.h:20
inet::registerProtocol
void registerProtocol(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a protocol primitive (PDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:83
inet::QosClassifier::parseUserPriorityMap
virtual void parseUserPriorityMap(const char *text, std::map< int, int > &upMap)
Definition: QosClassifier.cc:78
inet::QosClassifier::udpPortUpMap
std::map< int, int > udpPortUpMap
Definition: QosClassifier.h:23
inet::UP_VO
@ UP_VO
Definition: UserPriority.h:25
inet::QosClassifier::ipProtocolUpMap
std::map< int, int > ipProtocolUpMap
Definition: QosClassifier.h:22
up
removed DscpReq Ipv4ControlInfo up
Definition: IUdp-gates.txt:14
inet::ETHERTYPE_IPv6
@ ETHERTYPE_IPv6
Definition: EtherType_m.h:87