#include <BasicDSCPClassifier.h>
Public Member Functions | |
virtual int | getNumQueues () |
virtual int | classifyPacket (cMessage *msg) |
Private Member Functions | |
virtual int | classifyByDSCP (int dscp) |
int BasicDSCPClassifier::classifyByDSCP | ( | int | dscp | ) | [private, virtual] |
Referenced by classifyPacket().
00060 { 00061 // DSCP is 6 bits, mask out all others 00062 dscp = (dscp & 0x3f); 00063 00064 // DSCP format: 00065 // xxxxx0: used by standards; see RFC 2474 00066 // xxxxx1: experimental or local use 00067 // source: Stallings, High-Speed Networks, 2nd Ed, p494 00068 00069 // all-zero DSCP maps to Best Effort (lowest priority) 00070 if (dscp==0) 00071 return BEST_EFFORT; 00072 00073 // assume Best Effort service for experimental or local DSCP's too 00074 if (dscp & 1) 00075 return BEST_EFFORT; 00076 00077 // from here on, we deal with non-zero standardized DSCP values only 00078 int upper3bits = (dscp & 0x3c) >> 3; 00079 //int lower3bits = (dscp & 0x07); -- we'll ignore this 00080 00081 // rfc 2474, section 4.2.2: at least two independently forwarded classes of traffic have to be created 00082 if (upper3bits & 0x04) 00083 return 0; // highest priority 00084 else 00085 return 1; // low priority (best effort) 00086 }
int BasicDSCPClassifier::getNumQueues | ( | ) | [virtual] |
int BasicDSCPClassifier::classifyPacket | ( | cMessage * | msg | ) | [virtual] |
The method should return the priority (the index of subqueue) for the given packet, a value between 0 and getNumQueues()-1 (inclusive).
Implements IQoSClassifier.
00036 { 00037 if (dynamic_cast<IPDatagram *>(msg)) 00038 { 00039 // IPv4 QoS: map DSCP to queue number 00040 IPDatagram *datagram = (IPDatagram *)msg; 00041 int dscp = datagram->getDiffServCodePoint(); 00042 return classifyByDSCP(dscp); 00043 } 00044 #ifndef WITHOUT_IPv6 00045 else if (dynamic_cast<IPv6Datagram *>(msg)) 00046 { 00047 // IPv6 QoS: map Traffic Class to queue number 00048 IPv6Datagram *datagram = (IPv6Datagram *)msg; 00049 int dscp = datagram->getTrafficClass(); 00050 return classifyByDSCP(dscp); 00051 } 00052 #endif 00053 else 00054 { 00055 return BEST_EFFORT; // lowest priority ("best effort") 00056 } 00057 }