23 #include "ns3/simulator.h"
25 #include "ns3/packet-burst.h"
70 std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst> > > *downlinkBursts =
m_downlinkBursts;
71 std::pair<OfdmDlMapIe*, Ptr<PacketBurst> > pair;
72 while (downlinkBursts->size ())
74 pair = downlinkBursts->front ();
84 std::list<std::pair<OfdmDlMapIe*, Ptr<PacketBurst> > >*
97 dlMapIe->
SetCid (connection->GetCid ());
101 <<
", connection: " << connection->GetTypeStr () <<
", CID: "
102 << connection->GetCid ());
105 NS_LOG_INFO (
", SFID: " << connection->GetServiceFlow ()->GetSfid () <<
", service: "
106 << connection->GetServiceFlow ()->GetSchedulingTypeStr ());
108 NS_LOG_INFO (
", modulation: " << modulationType <<
", DIUC: " << (uint32_t) diuc);
152 << availableSymbols << std::endl <<
"BS scheduler, queues:" <<
" IR "
168 uint32_t availableSymbols)
174 uint32_t nrSymbolsRequired = 0;
188 availableSymbols = 0;
192 packet = connection->
Dequeue ();
193 availableSymbols -= nrSymbolsRequired;
196 if (availableSymbols <= 0)
217 uint32_t nrSymbolsRequired = 0;
229 if (availableSymbols < nrSymbolsRequired
234 else if (availableSymbols < nrSymbolsRequired
238 GetNrBytes (availableSymbols, modulationType);
244 packet = connection->
Dequeue ();
248 "Base station: Error while scheduling broadcast connection: header CID != connection CID");
250 availableSymbols -= nrSymbolsRequired;
264 uint32_t nrSymbolsRequired = 0;
277 if (availableSymbols < nrSymbolsRequired
282 else if (availableSymbols < nrSymbolsRequired
286 GetNrBytes (availableSymbols, modulationType);
292 packet = connection->
Dequeue ();
296 "Base station: Error while scheduling initial ranging connection: header CID != connection CID");
298 availableSymbols -= nrSymbolsRequired;
312 uint32_t nrSymbolsRequired = 0;
317 std::vector<Ptr<WimaxConnection> >::const_iterator iter;
318 std::vector<Ptr<WimaxConnection> > connections;
321 for (iter = connections.begin (); iter != connections.end (); ++iter)
323 while ((*iter)->HasPackets () && availableSymbols > 0)
335 if (availableSymbols < nrSymbolsRequired
340 else if (availableSymbols < nrSymbolsRequired
344 GetNrBytes (availableSymbols, modulationType);
349 packet = connection->
Dequeue ();
353 "Base station: Error while scheduling basic connection: header CID != connection CID");
355 availableSymbols -= nrSymbolsRequired;
360 burst = Create<PacketBurst> ();
371 uint32_t nrSymbolsRequired = 0;
376 std::vector<Ptr<WimaxConnection> >::const_iterator iter;
377 std::vector<Ptr<WimaxConnection> > connections;
380 for (iter = connections.begin (); iter != connections.end (); ++iter)
382 while ((*iter)->HasPackets () && availableSymbols > 0)
394 if (availableSymbols < nrSymbolsRequired
399 else if (availableSymbols < nrSymbolsRequired
403 GetNrBytes (availableSymbols, modulationType);
408 packet = connection->
Dequeue ();
412 "Base station: Error while scheduling primary connection: header CID != connection CID");
414 availableSymbols -= nrSymbolsRequired;
429 uint32_t nrSymbolsRequired = 0;
436 std::vector<ServiceFlow*>::iterator iter;
438 std::vector<ServiceFlow*> serviceFlows;
441 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
443 serviceFlowRecord = (*iter)->GetRecord ();
445 if ((*iter)->HasPackets () && ((currentTime - serviceFlowRecord->
GetDlTimeStamp ())
448 connection = (*iter)->GetConnection ();
463 if (availableSymbols > nrSymbolsRequired)
465 availableSymbols -= nrSymbolsRequired;
472 burst = Create<PacketBurst> ();
491 std::vector<Ptr<WimaxConnection> >::const_iterator iter;
492 std::vector<Ptr<WimaxConnection> > connections;
493 std::vector<ServiceFlow*>::iterator iter2;
495 std::vector<ServiceFlow*> serviceFlows;
497 uint32_t symbolsRequired[100];
502 uint32_t totSymbolsRequired = 0;
503 int nbConnection = 0;
505 NS_LOG_INFO (
"\tDL Scheduler for rtPS flows \n" <<
"\t\tavailableSymbols = " << availableSymbols);
509 for (iter2 = serviceFlows.begin (); iter2 != serviceFlows.end (); ++iter2)
512 serviceFlowRecord = (*iter2)->GetRecord ();
514 if ((*iter2)->HasPackets ())
518 rtPSConnection[nbConnection] = (*iter2)->GetConnection ();
525 modulationType_[nbConnection]
533 NS_LOG_INFO (
"\t\tRTPS DL Scheduler for CID = " << rtPSConnection[nbConnection]->GetCid ()
534 <<
"\n\t\t\t dataToSend = " << dataToSend);
537 modulationType_[nbConnection]);
539 totSymbolsRequired += symbolsRequired[nbConnection];
544 NS_LOG_INFO (
"\t\ttotSymbolsRequired = " << totSymbolsRequired);
547 while (totSymbolsRequired > availableSymbols)
549 NS_LOG_INFO (
"\tDL Channel Saturation: totSymbolsRequired > availableSymbols_rtPS");
550 double delta = double(availableSymbols) / double(totSymbolsRequired);
552 totSymbolsRequired = 0;
553 for (
int i = 0; i < nbConnection; i++)
555 NS_LOG_INFO (
"\t\tprevious symbolsRequired[" << i <<
"] = " << symbolsRequired[i]);
556 symbolsRequired[i] = (uint32_t) floor (symbolsRequired[i] * delta);
557 totSymbolsRequired += symbolsRequired[i];
558 NS_LOG_INFO (
"\t\tnew symbolsRequired[" << i <<
"] = " << symbolsRequired[i]);
560 NS_LOG_INFO (
"\t\ttotSymbolsRequired = " << totSymbolsRequired);
564 for (
int i = 0; i < nbConnection; i++)
568 uint32_t symbolsForPacketTransmission = 0;
569 burst = Create<PacketBurst> ();
570 NS_LOG_INFO (
"\t\tCID = " << rtPSConnection[i]->GetCid () <<
" assignedSymbols = " << symbolsRequired[i]);
572 while (symbolsRequired[i] > 0)
580 if (symbolsForPacketTransmission > symbolsRequired[i]
587 else if (symbolsForPacketTransmission > symbolsRequired[i]
593 GetNrBytes (symbolsRequired[i], modulationType_[i]);
595 symbolsRequired[i] = 0;
599 packet = rtPSConnection[i]->
Dequeue ();
600 symbolsRequired[i] -= symbolsForPacketTransmission;
604 "Base station: Error while scheduling RTPs connection: header CID != connection CID");
614 availableSymbols -= totSymbolsRequired;
623 uint32_t nrSymbolsRequired = 0;
628 std::vector<ServiceFlow*>::iterator iter;
629 std::vector<ServiceFlow*> serviceFlows;
632 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
634 connection = (*iter)->GetConnection ();
636 while ((*iter)->HasPackets () && availableSymbols > 0)
653 if (availableSymbols < nrSymbolsRequired)
658 packet = connection->
Dequeue ();
660 "Base station: Error while scheduling NRTPs connection: header CID != connection CID");
662 availableSymbols -= nrSymbolsRequired;
667 burst = Create<PacketBurst> ();
678 uint32_t nrSymbolsRequired = 0;
683 std::vector<ServiceFlow*>::iterator iter;
684 std::vector<ServiceFlow*> serviceFlows;
687 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
689 connection = (*iter)->GetConnection ();
691 while ((*iter)->HasPackets () && availableSymbols > 0)
707 if (availableSymbols < nrSymbolsRequired)
712 packet = connection->
Dequeue ();
714 "Base station: Error while scheduling BE connection: header CID != connection CID");
716 availableSymbols -= nrSymbolsRequired;
721 burst = Create<PacketBurst> ();