51 void MM_psDQ_Out::initialize() {
52 defaultPriority = par(
"defPriority").longValue();
53 if(defaultPriority < 0) { error(
"Error at eDL_Out. defPriority must be >=0!"); }
55 int rateUnit = par(
"rateUnit").longValue();
56 if(defaultPriority < 0) { error(
"Error at eDL_Out. defPriority must be >=0!"); }
58 maxPriority = defaultPriority;
60 cXMLElement* Xml = NULL;
61 if (par(
"data").xmlValue() != NULL && par(
"data").xmlValue()->hasChildren()){
62 Xml = par(
"data").xmlValue();
65 cXMLElementList queues = Xml->getChildrenByTagName(
"queue");
66 for(
auto queue : queues){
67 if (!queue->getAttribute(
"id")) { error(
"Error parsing DQ_Out Queue. Its ID is missing!"); }
68 std::string
id = queue->getAttribute(
"id");
69 if (
id==
"") { error(
"Error parsing DQ_Out Queue. Queue ID cannot be empty!"); }
71 if (!queue->getAttribute(
"defPriority")) { error(
"Error parsing DQ_Out Queue. Its default Priority is missing!"); }
72 int defPriority = atoi(queue->getAttribute(
"defPriority"));
73 if (defPriority<0) { error(
"Error parsing DQ_Out Queue. Queue default Priority must be >=0!"); }
74 if(maxPriority<defPriority) { maxPriority = defPriority ; }
78 if(queue->getAttribute(
"rate")) {
79 double rate = atof(queue->getAttribute(
"rate"));
80 if(rate <= 0) { error(
"Error parsing DQ_Out Queue. Queue Rate cannot be <= 0"); }
86 cXMLElementList degradLists = queue->getChildrenByTagName(
"degradList");
87 for(
auto degrad : degradLists){
88 if (!degrad->getAttribute(
"s")) { error(
"Error parsing degradList. Its t is missing!"); }
89 int s = atoi(degrad->getAttribute(
"s"));
90 if (s<0) { error(
"Error parsing degradList. t cannot be <0!"); }
94 cXMLElementList PPs = degrad->getChildrenByTagName(
"PP");
96 if(PPs.size() <= 0) { error(
"Error parsing degradList. At least one PP must be defined!"); }
98 if(!PP->getAttribute(
"priority")) { error(
"Error parsing PP. priority must be defined!"); }
99 int priority = atoi(PP->getAttribute(
"priority"));
100 if(priority<0) { error(
"Error parsing PP. priority must be >=0!"); }
101 if(maxPriority<priority) { maxPriority = priority ; }
103 if(!PP->getAttribute(
"probability")) { error(
"Error parsing PP. probability must be defined!"); }
104 double probability = atof(PP->getAttribute(
"probability"));
105 if(probability<=0 || probability>1) { error(
"Error parsing PP. probability must be in (0,1]!"); }
107 sumProb += probability;
112 if(sumProb > 1) { error(
"Error parsing degradList. probability of PPs cannot surpass 1!"); }
121 MM_psDQ_Out::~MM_psDQ_Out(){}
123 void MM_psDQ_Out::finish() {
144 simtime_t t = simTime();
148 int pC = ++portCount[p];
150 if (qc->
rate > 0.0) {
165 if(dl == NULL) { dl = &pdl; }
166 else if( dl->
start < pdl.
start) { dl = &pdl; }
175 double r = uniform(0,1);
178 if(ul.
prob < r) { cPrio = ul.
urg; }
198 }
else { error(
"PDU dropped from empty queue!??"); }
204 }
else { error(
"Multiple PDUs dropped at same time!??"); }
210 if(queuesConf.find(q->getName()) != queuesConf.end()) {
211 queueConf[q] = &queuesConf[q->getName()];
217 portQueues[p].insert(q);
223 simtime_t minT, now=simTime();
229 if(qd->
count <= 0) {
continue; }
231 int qP = maxPriority;
233 if(qpc.second > 0 && qpc.first < qP) { qP = qpc.first; }
245 }
else if(mpriority < 0 || mpriority > qP) {
249 }
else if(mpriority == qP && minT > qd->
cOutTimes.front()) {
254 if(mpriority < 0 || mpriority > qP) {
258 }
else if(mpriority == qP && minT > qd->
cOutTimes.front()) {
265 if(ret==NULL) {
return NULL; }
276 simtime_t MM_psDQ_Out::getnextTime(
RMTPort * p) {
vector< DegradList > degradLists
const cPacket * getLastPDU() const
list< simtime_t > cOutTimes
Define_Module(MM_psDQ_Out)
map< int, int > countUrgstats
vector< UrgProb > urgList