RINASim  October 2016
Documentation of framework for OMNeT++
MM_maxDelay_Out.cc
Go to the documentation of this file.
1 //
2 // Copyright © 2014 - 2015 PRISTINE Consortium (http://ict-pristine.eu)
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Lesser General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public License
15 // along with this program. If not, see http://www.gnu.org/licenses/.
16 //
17 
18 #include <MM_maxDelay_Out.h>
19 
20 namespace MM_maxDelay_Out {
21 
23 
24 void MM_maxDelay_Out::initialize() {
25  defaultMaxDel = par("defDelay").longValue();
26  if(defaultMaxDel < 0) { error("Error at DL_Out. defDelay must be >=0!"); }
27 
28 
29  cXMLElement* Xml = NULL;
30  if (par("data").xmlValue() != NULL && par("data").xmlValue()->hasChildren()){
31  Xml = par("data").xmlValue();
32  } else {
33  return;
34  }
35  cXMLElementList queues = Xml->getChildrenByTagName("queue");
36  for(auto queue : queues){
37  if (!queue->getAttribute("id")) { error("Error parsing DL_Out Queue. Its ID is missing!"); }
38  std::string id = queue->getAttribute("id");
39  if (id=="") { error("Error parsing DL_Out Queue. Queue ID cannot be empty!"); }
40 
41  if (!queue->getAttribute("delay")) { error("Error parsing DL_Out Queue. Its delay is missing!"); }
42  double delay = atof(queue->getAttribute("delay"))/1000.0;
43  if (delay<0) { error("Error parsing DL_Out Queue. Queue delay must be >=0!"); }
44 
45  double multip = 1.0;
46 
47  if (queue->getAttribute("multip")) {
48  multip = atof(queue->getAttribute("multip"));
49  if (multip<=0) { error("Error parsing DL_Out Queue. Queue multip must be >0!"); }
50  }
51 
52  queueName2Delay[id] = delay;
53  queueName2Multip[id] = multip;
54  }
55 }
56 
57 MM_maxDelay_Out::~MM_maxDelay_Out(){}
58 
59 void MM_maxDelay_Out::finish() {}
60 
61 void MM_maxDelay_Out::pduInsertered(RMTQueue * q, RMTPort * p) {
62  queueInTime[q].push_back(simTime());
63 }
64 
65 void MM_maxDelay_Out::pduDropped(RMTQueue * q, const cPacket * s, RMTPort * p) {
66  queueInTime[q].pop_back();
67 }
68 
69 void MM_maxDelay_Out::pduReleased(RMTQueue * q, RMTPort * p) {}
70 
71 void MM_maxDelay_Out::queueCreated(RMTQueue * q, RMTPort * p) {
72  portQueues[p].insert(q);
73  if(queueName2Delay.find(q->getName()) != queueName2Delay.end()) {
74  queueDelay[q] = queueName2Delay[q->getName()];
75  } else {
76  queueDelay[q] = defaultMaxDel;
77  }
78  if(queueName2Multip.find(q->getName()) != queueName2Multip.end()) {
79  queueMultip[q] = queueName2Multip[q->getName()];
80  } else {
81  queueMultip[q] = 1.0;
82  }
83 }
84 
85 RMTQueue * MM_maxDelay_Out::getnextQueue(RMTPort * p) {
86  RMTQueue * ret = NULL;
87  simtime_t min = SimTime::getMaxTime();
88  simtime_t now = simTime();
89 
90  for(auto & q : portQueues[p]) {
91  if(!queueInTime[q].empty()) {
92  simtime_t temp = queueDelay[q] - now + queueInTime[q].front();
93  if(temp < 0) {
94  // std::cout << "From "<< temp;
95  temp *= queueMultip[q];
96  // std::cout << " -> To "<< temp<< " --- Multiplier :: "<<queueMultip[q] <<endl;
97  }
98  if(temp < min) {
99  ret = q;
100  min = temp;
101  }
102  }
103  }
104 
105  if(ret != NULL) {
106  queueInTime[ret].pop_front();
107  }
108  return ret;
109 }
110 
111 simtime_t MM_maxDelay_Out::getnextTime(RMTPort * p) {
112  return 0;
113 }
114 
115 }
Define_Module(MM_maxDelay_Out)