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

网络

开发平台:

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.  File * 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 "framemap.h"
  19. #include "wimaxscheduler.h"
  20. #include "ulburst.h"
  21. #include "dlburst.h"
  22. /*
  23.  * Creates a map of the frame
  24.  * @param mac Pointer to the mac layer
  25.  */
  26. FrameMap::FrameMap (Mac802_16 *mac): dlsubframe_(this), ulsubframe_(this)
  27. {
  28.   assert (mac);
  29.   mac_ = mac; 
  30.   //retreive information from mac
  31.   rtg_ = mac_->phymib_.rtg;
  32.   ttg_ = mac_->phymib_.ttg;
  33.   duration_ = mac_->getFrameDuration();
  34. }
  35. /**
  36.  * Compute the DL_MAP packet based on the information contained in the structure
  37.  */
  38. Packet* FrameMap::getDL_MAP( )
  39. {
  40.   Packet *p = mac_->getPacket();
  41.   hdr_cmn* ch = HDR_CMN(p);
  42.   //printf ("Creating DL_MAP:");
  43.   int nbies = dlsubframe_.getPdu()->getNbBurst();
  44.   //printf ("nbies=%dn",nbies);
  45.   //allocate data for DL_MAP
  46.   p->allocdata (sizeof (struct mac802_16_dl_map_frame));
  47.   mac802_16_dl_map_frame *frame = (mac802_16_dl_map_frame*) p->accessdata();
  48.   frame->type = MAC_DL_MAP;
  49.   frame->bsid = mac_->addr();
  50.   frame->nb_ies = nbies;
  51.   
  52.   //allocate IEs
  53.   mac802_16_dlmap_ie *ies = frame->ies;
  54.   for (int i = 0 ; i < nbies ; i++) {
  55.     Burst *b = dlsubframe_.getPdu()->getBurst(i);
  56.     ies[i].diuc = b->getIUC();
  57.     ies[i].start_time = b->getStarttime();
  58.     if (b->getIUC()!=DIUC_END_OF_MAP) {
  59.       ies[i].cid =  b->getCid();
  60.       if (i==0)
  61. ies[i].preamble = dlsubframe_.getPdu()->getPreamble();
  62.       else
  63. ies[i].preamble = 0;
  64.     }
  65.   }
  66.   
  67.   ch->size() += GET_DL_MAP_SIZE(nbies);
  68.   return p;
  69. }
  70. /**
  71.  * Compute and return the DCD frame
  72.  */
  73. Packet* FrameMap::getDCD( )
  74. {
  75.   Packet *p = mac_->getPacket ();
  76.   hdr_cmn* ch = HDR_CMN(p);
  77.   //allocate data for DL_MAP
  78.   //printf ("getDCD...nbprofile=%dn", dlsubframe_.getNbProfile());
  79.   p->allocdata (sizeof (struct mac802_16_dcd_frame));
  80.   mac802_16_dcd_frame *frame = (mac802_16_dcd_frame*) p->accessdata();
  81.   frame->type = MAC_DCD;
  82.   frame->dcid = mac_->addr(); //to check if needs to be different from ucid
  83.   frame->config_change_count = dlsubframe_.getCCC(); 
  84.   frame->frame_duration_code = mac_->getFrameDurationCode ();
  85.   frame->frame_number = mac_->frame_number_;
  86.   frame->nb_prof = dlsubframe_.getNbProfile();
  87.   frame->ttg = mac_->phymib_.ttg;
  88.   frame->rtg = mac_->phymib_.rtg;
  89.   frame->frequency = (int) (mac_->getPhy()->getFreq()/1000); 
  90.   //allocate IEs
  91.   mac802_16_dcd_profile *profiles = frame->profiles;
  92.   int i=0;
  93.   for (Profile *p = dlsubframe_.getFirstProfile() ; p ; p=p->next_entry()) {
  94.     //set data for first burst
  95.     profiles[i].diuc = p->getIUC(); 
  96.     profiles[i].frequency = p->getFrequency();
  97.     profiles[i].fec = p->getEncoding(); 
  98.     i++;
  99.   }
  100.   //the end of map is already included in the frame length
  101.   
  102.   ch->size() += GET_DCD_SIZE(dlsubframe_.getNbProfile());
  103.   return p;
  104. }
  105. /**
  106.  * Compute and return the UL_MAP frame
  107.  */
  108. Packet* FrameMap::getUL_MAP( )
  109. {
  110.   Packet *p = mac_->getPacket ();
  111.   hdr_cmn* ch = HDR_CMN(p);
  112.   int nbies = ulsubframe_.getNbPdu(); //there is one burst per UL phy PDU
  113.   //printf ("getUL_MAP, nbies=%dn", nbies);
  114.   //allocate data for DL_MAP
  115.   p->allocdata (sizeof (struct mac802_16_ul_map_frame));
  116.   mac802_16_ul_map_frame *frame = (mac802_16_ul_map_frame*) p->accessdata();
  117.   frame->type = MAC_UL_MAP;
  118.   frame->ucid = mac_->addr();  //set channel ID to index_ to be unique
  119.   frame->ucd_count = ulsubframe_.getCCC(); 
  120.   frame->allocation_start = ulsubframe_.getStarttime(); //the subframe starts with the contention slot
  121.   frame->nb_ies = nbies; 
  122.   
  123.   //allocate IEs
  124.   mac802_16_ulmap_ie *ies = frame->ies;
  125.   int i=0;
  126.   for (PhyPdu *p = ulsubframe_.getFirstPdu(); p ; p= p ->next_entry()) {
  127.     UlBurst *b = (UlBurst*) p->getBurst(0);
  128.     ies[i].uiuc = b->getIUC(); //end of map
  129.     ies[i].start_time = b->getStarttime();
  130.     if (b->getIUC()!=UIUC_END_OF_MAP) {
  131.       ies[i].cid =  b->getCid();
  132.       ies[i].midamble_rep = b->getMidamble();
  133.       ies[i].duration = b->getDuration();
  134.       if (b->getIUC() == UIUC_EXT_UIUC) {
  135. ies[i].extended_uiuc = b->getExtendedUIUC();
  136. if (b->getExtendedUIUC ()== UIUC_FAST_RANGING) {
  137.   ies[i].fast_ranging.mac_addr = b->getFastRangingMacAddr ();
  138.   ies[i].fast_ranging.uiuc = b->getFastRangingUIUC ();
  139. }
  140.       }
  141.     }
  142.     i++;
  143.   }
  144.   ch->size() += GET_UL_MAP_SIZE(nbies);
  145.   return p;
  146. }
  147. /**
  148.  * Compute and return the UCD frame
  149.  */
  150. Packet* FrameMap::getUCD( )
  151. {
  152.   Packet *p = mac_->getPacket ();
  153.   hdr_cmn* ch = HDR_CMN(p);
  154.   //allocate data for DL_MAP
  155.   p->allocdata (sizeof (struct mac802_16_ucd_frame));
  156.   mac802_16_ucd_frame *frame = (mac802_16_ucd_frame*) p->accessdata();
  157.   frame->type = MAC_UCD;
  158.   frame->config_change_count = 0; //changed by scheduler
  159.   frame->rng_backoff_start = ulsubframe_.getRanging()->getBackoff_start();
  160.   frame->rng_backoff_end = ulsubframe_.getRanging()->getBackoff_stop();
  161.   frame->rng_req_size = ulsubframe_.getRanging()->getSize();
  162.   frame->req_backoff_start = ulsubframe_.getBw_req()->getBackoff_start();
  163.   frame->req_backoff_end = ulsubframe_.getBw_req()->getBackoff_stop()+1;
  164.   frame->bw_req_size = ulsubframe_.getBw_req()->getSize();
  165.   frame->nb_prof = ulsubframe_.getNbProfile();
  166.   //allocate IEs
  167.   mac802_16_ucd_profile *profiles = frame->profiles;
  168.   int i=0;
  169.   for (Profile *p = ulsubframe_.getFirstProfile() ; p ; p=p->next_entry()) {
  170.     //set data for first burst
  171.     profiles[i].uiuc = p->getIUC(); 
  172.     profiles[i].fec = p->getEncoding(); 
  173.     i++;
  174.   }
  175.   //the end of map is already included in the frame length
  176.   ch->size() += GET_UCD_SIZE(ulsubframe_.getNbProfile());
  177.   return p;
  178. }
  179. /**
  180.  * Parse a DL_MAP message and create the data structure
  181.  * @param frame The DL frame information
  182.  */
  183. void FrameMap::parseDLMAPframe (mac802_16_dl_map_frame *frame)
  184. {
  185.   //printf ("parse DL-MAP in %dn", mac_->addr());
  186.   // Clear previous information  
  187.   while (dlsubframe_.getPdu()->getNbBurst()>0) {
  188.     Burst *b = dlsubframe_.getPdu()->getBurst (0);
  189.     dlsubframe_.getPdu()->removeBurst (b);
  190.     delete b;
  191.   }
  192.   int nbies = frame->nb_ies;
  193.   mac802_16_dlmap_ie *ies = frame->ies;
  194.   for (int i = 0 ; i < nbies ; i++) {
  195.     Burst *b = dlsubframe_.getPdu()->addBurst(i);
  196.     b->setIUC(ies[i].diuc);
  197.     b->setStarttime(ies[i].start_time);
  198.     if (b->getIUC()!=DIUC_END_OF_MAP) {
  199.       b->setCid(ies[i].cid);
  200.       if (i==0) //first burst contains preamble
  201. dlsubframe_.getPdu()->setPreamble(ies[i].preamble);
  202.     }
  203.     //printf ("t Adding burst %d: cid=%d, iuc=%d start=%dn", i, b->getCid(), b->getIUC(),b->getStarttime());
  204.   }
  205.   //should we parse end of map too?
  206. }
  207. /**
  208.  * Parse a DCD message and create the data structure
  209.  * @param frame The DL frame information
  210.  */
  211. void FrameMap::parseDCDframe (mac802_16_dcd_frame *frame)
  212. {
  213.   //clear previous profiles
  214.   dlsubframe_.removeProfiles();
  215.   int nb_prof = frame->nb_prof;
  216.   mac_->frame_number_ = frame->frame_number;
  217.   mac802_16_dcd_profile *profiles = frame->profiles;
  218.   mac_->setFrameDurationCode (frame->frame_duration_code);
  219.   for (int i = 0 ; i < nb_prof ; i++) {
  220.     Profile *p = dlsubframe_.addProfile (profiles[i].frequency, (Ofdm_mod_rate)profiles[i].fec);
  221.     p->setIUC (profiles[i].diuc);
  222.     //printf ("t Adding dl profile %i: f=%d, rate=%d, iuc=%dn", i, p->getFrequency(), p->getEncoding(), p->getIUC());
  223.   }
  224. }
  225. /**
  226.  * Parse a UL_MAP message and create the data structure
  227.  * @param frame The UL frame information
  228.  */
  229. void FrameMap::parseULMAPframe (mac802_16_ul_map_frame *frame)
  230. {
  231.   //printf ("parse UL-MAPn");
  232.   // Clear previous information
  233.   for (PhyPdu *p = ulsubframe_.getFirstPdu(); p ; p = ulsubframe_.getFirstPdu()) {
  234.     ulsubframe_.removePhyPdu(p);
  235.     delete (p);
  236.   }
  237.   
  238.   int nbies = frame->nb_ies;
  239.   mac802_16_ulmap_ie *ies = frame->ies;
  240.   ulsubframe_.setStarttime(frame->allocation_start);
  241.   //mac_->debug ("tul start time = %d %fn", frame->allocation_start, frame->allocation_start*mac_->getPhy()->getPS());
  242.   for (int i = 0 ; i < nbies ; i++) {
  243.     UlBurst *b = (UlBurst*)(ulsubframe_.addPhyPdu(i,0))->addBurst(0);
  244.     b->setIUC(ies[i].uiuc);
  245.     b->setStarttime(ies[i].start_time);
  246.     if (b->getIUC()!=UIUC_END_OF_MAP) {
  247.       b->setCid(ies[i].cid);
  248.       b->setMidamble(ies[i].midamble_rep);
  249.       b->setDuration(ies[i].duration);
  250.       if (b->getIUC() == UIUC_EXT_UIUC) {
  251. if(ies[i].extended_uiuc== UIUC_FAST_RANGING) {
  252.   b->setFastRangingParam (ies[i].fast_ranging.mac_addr, ies[i].fast_ranging.uiuc);
  253. }
  254.       }
  255.     }
  256.     /*mac_->debug ("t Adding burst %d: cid=%d, iuc=%d start=%d (%f) duration=%dn", 
  257.       i, b->getCid(), b->getIUC(),b->getStarttime(), starttime_+frame->allocation_start*mac_->getPhy()->getPS()+b->getStarttime()*mac_->getPhy()->getSymbolTime(), b->getDuration());*/
  258.   }
  259. }
  260. /**
  261.  * Parse a UCD message and create the data structure
  262.  * @param frame The DL frame information
  263.  */
  264. void FrameMap::parseUCDframe (mac802_16_ucd_frame *frame)
  265. {
  266.   assert (frame);
  267.   //clear previous profiles
  268.   ulsubframe_.removeProfiles();
  269.   
  270.   /*printf ("parse UCD..rng_start=%d, rng_stop=%d, req_start=%d, req_stop=%dn",
  271.     frame->rng_backoff_start, frame->rng_backoff_end, frame->req_backoff_start,
  272.     frame->req_backoff_end);*/
  273.   ulsubframe_.getRanging()->setBackoff_start(frame->rng_backoff_start);
  274.   ulsubframe_.getRanging()->setBackoff_stop(frame->rng_backoff_end);
  275.   ulsubframe_.getRanging()->setSize(frame->rng_req_size);
  276.   ulsubframe_.getBw_req()->setBackoff_start(frame->req_backoff_start);
  277.   ulsubframe_.getBw_req()->setBackoff_stop(frame->req_backoff_end);  
  278.   ulsubframe_.getBw_req()->setSize(frame->bw_req_size);
  279.   int nb_prof = frame->nb_prof;
  280.   mac802_16_ucd_profile *profiles = frame->profiles;
  281.   for (int i = 0 ; i < nb_prof ; i++) {
  282.     Profile *p = ulsubframe_.addProfile (0, (Ofdm_mod_rate)(profiles[i].fec));
  283.     p->setIUC (profiles[i].uiuc);
  284.     //printf ("t Adding ul profile %i: f=%d, rate=%d, iuc=%dn", i, p->getFrequency(), p->getEncoding(), p->getIUC());
  285.   }
  286. }