24 void MM_eDL_Out::initialize() {
25 defaultPriority = par(
"defPriority").longValue();
26 if(defaultPriority < 0) { error(
"Error at eDL_Out. defPriority must be >=0!"); }
28 maxPriority = defaultPriority;
30 cXMLElement* Xml = NULL;
31 if (par(
"data").xmlValue() != NULL && par(
"data").xmlValue()->hasChildren()){
32 Xml = par(
"data").xmlValue();
36 cXMLElementList queues = Xml->getChildrenByTagName(
"queue");
37 for(
auto queue : queues){
38 if (!queue->getAttribute(
"id")) { error(
"Error parsing eDL_Out Queue. Its ID is missing!"); }
39 std::string
id = queue->getAttribute(
"id");
40 if (
id==
"") { error(
"Error parsing eDL_Out Queue. Queue ID cannot be empty!"); }
42 if (!queue->getAttribute(
"priority")) { error(
"Error parsing eDL_Out Queue. Its Priority is missing!"); }
43 int priority = atoi(queue->getAttribute(
"priority"));
44 if (priority<0) { error(
"Error parsing eDL_Out Queue. Queue Priority must be >=0!"); }
46 queueName2Priority[id] = priority;
48 if(maxPriority<priority) { maxPriority = priority ; }
53 if (par(
"data2").xmlValue() != NULL && par(
"data2").xmlValue()->hasChildren()){
54 Xml = par(
"data2").xmlValue();
58 cXMLElementList priorities = Xml->getChildrenByTagName(
"priority");
59 for(
auto priority : priorities){
60 if (!priority->getAttribute(
"val")) { error(
"Error parsing eDL_Out Priority. Its val is missing!"); }
61 int id = atoi(priority->getAttribute(
"val"));
62 if (
id<=0) { error(
"Error parsing eDL_Out Priority. Priority val cannot be <=0!"); }
64 if (!priority->getAttribute(
"prob")) { error(
"Error parsing eDL_Out Priority. Its prob is missing!"); }
65 double prob = atof(priority->getAttribute(
"prob"));
66 if (prob<0 || prob >1) { error(
"Error parsing eDL_Out Priority. Priority prob must be between 0 and 1!"); }
68 prioritySkip[maxPriority-id] = prob;
72 MM_eDL_Out::~MM_eDL_Out(){}
74 void MM_eDL_Out::finish() {}
77 portQueues[p][queuePriority[q]].push_back(q);
81 portQueues[p][queuePriority[q]].pop_back();
87 if(queueName2Priority.find(q->getName()) != queueName2Priority.end()) {
88 queuePriority[q] = maxPriority-queueName2Priority[q->getName()];
90 queuePriority[q] = maxPriority-defaultPriority;
97 for(
auto &pQ : portQueues[p]) {
98 if(!pQ.second.empty()) {
102 if(uniform(0.0, 1.0) >= prioritySkip[selP]) {
break; }
106 if(selP < 0) {
return NULL; }
108 RMTQueue * q = portQueues[p][selP].front();
109 portQueues[p][selP].pop_front();
113 simtime_t MM_eDL_Out::getnextTime(
RMTPort * p) {
Define_Module(MM_eDL_Out)