24 void MM_maxDelayLimited_Out::initialize() {
25 defaultMaxDel = par(
"defDelay").longValue();
26 if(defaultMaxDel < 0) { error(
"Error at DL_Out. defDelay must be >=0!"); }
29 cXMLElement* Xml = NULL;
30 if (par(
"data").xmlValue() != NULL && par(
"data").xmlValue()->hasChildren()){
31 Xml = par(
"data").xmlValue();
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!"); }
41 if (!queue->getAttribute(
"delay")) { error(
"Error parsing DL_Out Queue. Its delay is missing!"); }
42 double delay = atof(queue->getAttribute(
"delay"));
43 if (delay<0) { error(
"Error parsing DL_Out Queue. Queue delay must be >=0!"); }
46 if (queue->getAttribute(
"multip")) {
47 multip = atof(queue->getAttribute(
"multip"));
48 if (multip<=0) { error(
"Error parsing DL_Out Queue. Queue multip must be >0!"); }
51 double burstTime = 0.0;
52 unsigned int burstSize = 1500;
53 if (queue->getAttribute(
"burstTime")) {
54 burstTime = atof(queue->getAttribute(
"burstTime"));
55 if (burstTime<=0) { error(
"Error parsing DL_Out Queue. Queue burstTime must be >0!"); }
57 if (queue->getAttribute(
"burstSize")) {
58 burstSize = atoi(queue->getAttribute(
"burstSize"));
59 if (burstSize<=0) { error(
"Error parsing DL_Out Queue. Queue burstSize must be >0!"); }
60 }
else { error(
"Error parsing DL_Out Queue. Queue burstSize must be initialized!"); }
64 queueName2Delay[id] = delay;
65 queueName2Multip[id] = multip;
66 queueName2BurstTime[id] = burstTime;
67 queueName2BurstSize[id] = burstSize;
71 MM_maxDelayLimited_Out::~MM_maxDelayLimited_Out(){}
73 void MM_maxDelayLimited_Out::finish() {}
76 queueInTime[q].push_back(simTime());
79 void MM_maxDelayLimited_Out::pduDropped(
RMTQueue * q,
const cPacket * s,
RMTPort * p) {
80 queueInTime[q].pop_back();
86 portQueues[p].insert(q);
87 if(queueName2Delay.find(q->getName()) != queueName2Delay.end()) {
88 queueDelay[q] = queueName2Delay[q->getName()];
90 queueDelay[q] = defaultMaxDel;
94 if(queueName2BurstTime.find(q->getName()) != queueName2BurstTime.end() && queueName2BurstSize.find(q->getName()) != queueName2BurstSize.end() ) {
95 queueBurstCount[q].set(queueName2BurstTime[q->getName()], queueName2BurstSize[q->getName()]);
102 simtime_t min = SimTime::getMaxTime();
103 simtime_t now = simTime();
108 for(
auto & q : portQueues[p]) {
109 if(!queueInTime[q].empty()) {
110 tic = queueBurstCount[q].tic(q->getFirstPDU()->getByteLength());
112 simtime_t temp = queueDelay[q] - now + queueInTime[q].front();
113 if(temp < 0) { temp *= queueMultip[q]; }
124 queueInTime[ret].pop_front();
125 queueBurstCount[ret].in(ret->
getFirstPDU()->getByteLength());
130 simtime_t MM_maxDelayLimited_Out::getnextTime(
RMTPort * p) {
131 simtime_t time = SimTime::getMaxTime();
132 for(
auto & q : portQueues[p]) {
133 if(!queueInTime[q].empty()) {
134 simtime_t t = queueBurstCount[q].getTime(q->getFirstPDU()->getByteLength());
135 if(t < time) { time = t; }
138 if(time < SimTime::getMaxTime()) {
const cPacket * getFirstPDU() const
Define_Module(MM_maxDelayLimited_Out)