Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <omnetpp.h>
00020 #include "BasicDSCPClassifier.h"
00021 #include "IPDatagram.h"
00022 #ifndef WITHOUT_IPv6
00023 #include "IPv6Datagram.h"
00024 #endif
00025
00026 Register_Class(BasicDSCPClassifier);
00027
00028 #define BEST_EFFORT 1
00029
00030 int BasicDSCPClassifier::getNumQueues()
00031 {
00032 return 2;
00033 }
00034
00035 int BasicDSCPClassifier::classifyPacket(cMessage *msg)
00036 {
00037 if (dynamic_cast<IPDatagram *>(msg))
00038 {
00039
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
00048 IPv6Datagram *datagram = (IPv6Datagram *)msg;
00049 int dscp = datagram->getTrafficClass();
00050 return classifyByDSCP(dscp);
00051 }
00052 #endif
00053 else
00054 {
00055 return BEST_EFFORT;
00056 }
00057 }
00058
00059 int BasicDSCPClassifier::classifyByDSCP(int dscp)
00060 {
00061
00062 dscp = (dscp & 0x3f);
00063
00064
00065
00066
00067
00068
00069
00070 if (dscp==0)
00071 return BEST_EFFORT;
00072
00073
00074 if (dscp & 1)
00075 return BEST_EFFORT;
00076
00077
00078 int upper3bits = (dscp & 0x3c) >> 3;
00079
00080
00081
00082 if (upper3bits & 0x04)
00083 return 0;
00084 else
00085 return 1;
00086 }
00087