ulsubframetimer.cc
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:5k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #include "ulsubframetimer.h"
  19. #include "framemap.h"
  20. #include "subframe.h"
  21. #include "wimaxscheduler.h"
  22. #include "contentionslot.h"
  23. /**
  24.  * Creates a timer to handle the subframe transmission
  25.  * @param subframe The UlSubframe
  26.  */
  27. UlSubFrameTimer::UlSubFrameTimer (UlSubFrame *subframe): pdu_(0), newphy_(true), mac_(0)
  28. {
  29.   assert (subframe);
  30.   subframe_ = subframe;
  31. }
  32. /**
  33.  * Reset the timer
  34.  */
  35. void UlSubFrameTimer::reset ()
  36. {
  37.   pdu_= NULL;
  38.   newphy_ = true;
  39.   if (status()==TIMER_PENDING)
  40.     cancel();
  41. }
  42. /**
  43.  * When it expires, the timer will handle the next packet to send
  44.  * @param e not used
  45.  */
  46. void UlSubFrameTimer::expire( Event* e )
  47. {
  48.   if (!mac_) {
  49.     mac_= subframe_->map_->getMac();
  50.   }
  51.   //mac_->debug ("At %f in Mac %d UlsubFrameTimer expiresn", NOW, mac_->addr());
  52.   int iuc;
  53.   if (newphy_) {
  54.     if (pdu_==NULL){
  55.       //printf ("ttake first pdun");
  56.       //get the first pdu
  57.       pdu_ = subframe_->getFirstPdu();
  58.     } else {
  59.       //printf ("tcontinue pdun");
  60.       iuc = pdu_->getBurst(0)->getIUC();
  61.       //check if this is a contention slot
  62.       if (iuc == UIUC_INITIAL_RANGING) {
  63. //stop ranging timer
  64. //printf ("tpause rangingn");
  65. subframe_->ranging_.pauseTimers ();
  66.       } else if (iuc == UIUC_REQ_REGION_FULL) {
  67. //stop bw request timers
  68. //printf ("tpause bw requestsn");
  69. subframe_->bw_req_.pauseTimers();
  70.       }
  71.       pdu_ = pdu_->next_entry();
  72.     }  
  73.   
  74.     if (pdu_->getBurst(0)->getIUC()==UIUC_END_OF_MAP){
  75.       pdu_=NULL; //reset for next frame
  76.       //mac_->debug ("tend of mapn");
  77.       if (mac_->getScheduler()->getNodeType()==STA_BS) {
  78. mac_->getPhy()->setMode (OFDM_SEND);
  79.       } else {
  80. mac_->getPhy()->setMode (OFDM_RECV);
  81.       }
  82.       return; //end of subframe
  83.     }
  84.     
  85.     //change the modulation
  86.     UlBurst *burst =  (UlBurst*)pdu_->getBurst(0);
  87.     iuc = burst->getIUC();
  88.     //printf ("Searching for IUC=%dn", iuc);
  89.     if (iuc == UIUC_EXT_UIUC && burst->getExtendedUIUC()== UIUC_FAST_RANGING) {
  90.       iuc = burst->getFastRangingUIUC ();
  91.       //printf ("Searching for IUC=%dn", iuc);
  92.     }
  93.     Ofdm_mod_rate rate = subframe_->getProfile (iuc)->getEncoding();
  94.     mac_->getPhy()->setModulation (rate);
  95.     //check if this is a contention slot
  96.     if (iuc == UIUC_INITIAL_RANGING) {
  97.       //resume ranging timer
  98.       //printf ("tresume rangingn");
  99.       subframe_->ranging_.resumeTimers();
  100.     } else if (iuc == UIUC_REQ_REGION_FULL) {
  101.       //resume bw request timers
  102.       //printf ("tresume bw requestsn");
  103.       subframe_->bw_req_.resumeTimers();
  104.     }
  105.   }
  106.   //check if packet to send
  107.   Packet *p = pdu_->getBurst(0)->dequeue();
  108.   if (p) {
  109.     newphy_= false;
  110.     double txtime = HDR_CMN(p)->txtime();
  111.     //printf ("tPacket to sendn");
  112.     //schedule for next packet
  113.     mac_->transmit (p);
  114.     if (pdu_->getBurst(0)->getQueueLength()!=0) {
  115.       //mac_->debug ("treschedule in %f (%f)n", txtime, NOW+txtime);
  116.       resched (txtime); //wait transmition time
  117.       return;
  118.     }
  119.   }
  120.   newphy_= true;
  121.   double stime=0.0;
  122.   assert (pdu_->next_entry());
  123.   stime = subframe_->map_->getStarttime();
  124.   //mac_->debug("tstart frame=%fn", stime);
  125.   stime += subframe_->getStarttime()*mac_->getPhy()->getPS();
  126.   //mac_->debug ("tulstart = %fn", stime);
  127.   stime += pdu_->next_entry()->getBurst(0)->getStarttime()*mac_->getPhy()->getSymbolTime();
  128.   //mac_->debug ("tnext pdu start=%dn", pdu_->next_entry()->getBurst(0)->getStarttime());
  129.   //mac_->debug ("t%f Next burst %d at %fn", NOW, pdu_->next_entry()->getBurst(0)->getIUC(), stime);
  130.   resched (stime-NOW);
  131.   /*
  132.   if (!p) {
  133.     //no packet to send...schedule for next phypdu
  134.     newphy_= true;
  135.     double stime=0.0;
  136.     assert (pdu_->next_entry());
  137.     stime = subframe_->map_->getStarttime();
  138.     stime += subframe_->getStarttime()*mac_->getPhy()->getPS();
  139.     stime += pdu_->next_entry()->getBurst(0)->getStarttime()*mac_->getPhy()->getSymbolTime();
  140.     printf ("t%f Next burst %d at %fn", NOW, pdu_->next_entry()->getBurst(0)->getIUC(), stime);
  141.     resched (stime-NOW);
  142.     
  143.   } else {
  144.     newphy_= false;
  145.     double txtime = HDR_CMN(p)->txtime();
  146.     //printf ("tPacket to sendn");
  147.     //schedule for next packet
  148.     mac_->transmit (p);
  149.     resched (txtime); //wait transmition time
  150.     }*/  
  151. }