⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framemap.cc

📁 This documentation is based on the following versions:- pre-release of the wimax model developed by
💻 CC
字号:
/* This software was developed at the National Institute of Standards and * Technology by employees of the Federal Government in the course of * their official duties. Pursuant to title 17 Section 105 of the United * States Code this software is not subject to copyright protection and * is in the public domain. * NIST assumes no responsibility whatsoever for its use by other parties, File * and makes no guarantees, expressed or implied, about its quality, * reliability, or any other characteristic. * <BR> * We would appreciate acknowledgement if the software is used. * <BR> * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING * FROM THE USE OF THIS SOFTWARE. * </PRE></P> * @author  rouil */#include "framemap.h"#include "wimaxscheduler.h"#include "ulburst.h"#include "dlburst.h"/* * Creates a map of the frame * @param mac Pointer to the mac layer */FrameMap::FrameMap (Mac802_16 *mac): dlsubframe_(this), ulsubframe_(this){  assert (mac);  mac_ = mac;   //retreive information from mac  rtg_ = mac_->phymib_.rtg;  ttg_ = mac_->phymib_.ttg;  duration_ = mac_->getFrameDuration();}/** * Compute the DL_MAP packet based on the information contained in the structure */Packet* FrameMap::getDL_MAP( ){  Packet *p = mac_->getPacket();  hdr_cmn* ch = HDR_CMN(p);  //printf ("Creating DL_MAP:");  int nbies = dlsubframe_.getPdu()->getNbBurst();  //printf ("nbies=%d\n",nbies);  //allocate data for DL_MAP  p->allocdata (sizeof (struct mac802_16_dl_map_frame));  mac802_16_dl_map_frame *frame = (mac802_16_dl_map_frame*) p->accessdata();  frame->type = MAC_DL_MAP;  frame->bsid = mac_->addr();  frame->nb_ies = nbies;    //allocate IEs  mac802_16_dlmap_ie *ies = frame->ies;  for (int i = 0 ; i < nbies ; i++) {    Burst *b = dlsubframe_.getPdu()->getBurst(i);    ies[i].diuc = b->getIUC();    ies[i].start_time = b->getStarttime();    if (b->getIUC()!=DIUC_END_OF_MAP) {      ies[i].cid =  b->getCid();      if (i==0)	ies[i].preamble = dlsubframe_.getPdu()->getPreamble();      else	ies[i].preamble = 0;    }  }    ch->size() += GET_DL_MAP_SIZE(nbies);  return p;}/** * Compute and return the DCD frame */Packet* FrameMap::getDCD( ){  Packet *p = mac_->getPacket ();  hdr_cmn* ch = HDR_CMN(p);  //allocate data for DL_MAP  //printf ("getDCD...nbprofile=%d\n", dlsubframe_.getNbProfile());  p->allocdata (sizeof (struct mac802_16_dcd_frame));  mac802_16_dcd_frame *frame = (mac802_16_dcd_frame*) p->accessdata();  frame->type = MAC_DCD;  frame->dcid = mac_->addr(); //to check if needs to be different from ucid  frame->config_change_count = dlsubframe_.getCCC();   frame->frame_duration_code = mac_->getFrameDurationCode ();  frame->frame_number = mac_->frame_number_;  frame->nb_prof = dlsubframe_.getNbProfile();  frame->ttg = mac_->phymib_.ttg;  frame->rtg = mac_->phymib_.rtg;  frame->frequency = (int) (mac_->getPhy()->getFreq()/1000);   //allocate IEs  mac802_16_dcd_profile *profiles = frame->profiles;  int i=0;  for (Profile *p = dlsubframe_.getFirstProfile() ; p ; p=p->next_entry()) {    //set data for first burst    profiles[i].diuc = p->getIUC();     profiles[i].frequency = p->getFrequency();    profiles[i].fec = p->getEncoding();     i++;  }  //the end of map is already included in the frame length    ch->size() += GET_DCD_SIZE(dlsubframe_.getNbProfile());  return p;}/** * Compute and return the UL_MAP frame */Packet* FrameMap::getUL_MAP( ){  Packet *p = mac_->getPacket ();  hdr_cmn* ch = HDR_CMN(p);  int nbies = ulsubframe_.getNbPdu(); //there is one burst per UL phy PDU  //printf ("getUL_MAP, nbies=%d\n", nbies);  //allocate data for DL_MAP  p->allocdata (sizeof (struct mac802_16_ul_map_frame));  mac802_16_ul_map_frame *frame = (mac802_16_ul_map_frame*) p->accessdata();  frame->type = MAC_UL_MAP;  frame->ucid = mac_->addr();  //set channel ID to index_ to be unique  frame->ucd_count = ulsubframe_.getCCC();   frame->allocation_start = ulsubframe_.getStarttime(); //the subframe starts with the contention slot  frame->nb_ies = nbies;     //allocate IEs  mac802_16_ulmap_ie *ies = frame->ies;  int i=0;  for (PhyPdu *p = ulsubframe_.getFirstPdu(); p ; p= p ->next_entry()) {    UlBurst *b = (UlBurst*) p->getBurst(0);    ies[i].uiuc = b->getIUC(); //end of map    ies[i].start_time = b->getStarttime();    if (b->getIUC()!=UIUC_END_OF_MAP) {      ies[i].cid =  b->getCid();      ies[i].midamble_rep = b->getMidamble();      ies[i].duration = b->getDuration();      if (b->getIUC() == UIUC_EXT_UIUC) {	ies[i].extended_uiuc = b->getExtendedUIUC();	if (b->getExtendedUIUC ()== UIUC_FAST_RANGING) {	  ies[i].fast_ranging.mac_addr = b->getFastRangingMacAddr ();	  ies[i].fast_ranging.uiuc = b->getFastRangingUIUC ();	}      }    }    i++;  }  ch->size() += GET_UL_MAP_SIZE(nbies);  return p;}/** * Compute and return the UCD frame */Packet* FrameMap::getUCD( ){  Packet *p = mac_->getPacket ();  hdr_cmn* ch = HDR_CMN(p);  //allocate data for DL_MAP  p->allocdata (sizeof (struct mac802_16_ucd_frame));  mac802_16_ucd_frame *frame = (mac802_16_ucd_frame*) p->accessdata();  frame->type = MAC_UCD;  frame->config_change_count = 0; //changed by scheduler  frame->rng_backoff_start = ulsubframe_.getRanging()->getBackoff_start();  frame->rng_backoff_end = ulsubframe_.getRanging()->getBackoff_stop();  frame->rng_req_size = ulsubframe_.getRanging()->getSize();  frame->req_backoff_start = ulsubframe_.getBw_req()->getBackoff_start();  frame->req_backoff_end = ulsubframe_.getBw_req()->getBackoff_stop()+1;  frame->bw_req_size = ulsubframe_.getBw_req()->getSize();  frame->nb_prof = ulsubframe_.getNbProfile();  //allocate IEs  mac802_16_ucd_profile *profiles = frame->profiles;  int i=0;  for (Profile *p = ulsubframe_.getFirstProfile() ; p ; p=p->next_entry()) {    //set data for first burst    profiles[i].uiuc = p->getIUC();     profiles[i].fec = p->getEncoding();     i++;  }  //the end of map is already included in the frame length  ch->size() += GET_UCD_SIZE(ulsubframe_.getNbProfile());  return p;}/** * Parse a DL_MAP message and create the data structure * @param frame The DL frame information */void FrameMap::parseDLMAPframe (mac802_16_dl_map_frame *frame){  //printf ("parse DL-MAP in %d\n", mac_->addr());  // Clear previous information    while (dlsubframe_.getPdu()->getNbBurst()>0) {    Burst *b = dlsubframe_.getPdu()->getBurst (0);    dlsubframe_.getPdu()->removeBurst (b);    delete b;  }  int nbies = frame->nb_ies;  mac802_16_dlmap_ie *ies = frame->ies;  for (int i = 0 ; i < nbies ; i++) {    Burst *b = dlsubframe_.getPdu()->addBurst(i);    b->setIUC(ies[i].diuc);    b->setStarttime(ies[i].start_time);    if (b->getIUC()!=DIUC_END_OF_MAP) {      b->setCid(ies[i].cid);      if (i==0) //first burst contains preamble	dlsubframe_.getPdu()->setPreamble(ies[i].preamble);    }    //printf ("\t Adding burst %d: cid=%d, iuc=%d start=%d\n", i, b->getCid(), b->getIUC(),b->getStarttime());  }  //should we parse end of map too?}/** * Parse a DCD message and create the data structure * @param frame The DL frame information */void FrameMap::parseDCDframe (mac802_16_dcd_frame *frame){  //clear previous profiles  dlsubframe_.removeProfiles();  int nb_prof = frame->nb_prof;  mac_->frame_number_ = frame->frame_number;  mac802_16_dcd_profile *profiles = frame->profiles;  mac_->setFrameDurationCode (frame->frame_duration_code);  for (int i = 0 ; i < nb_prof ; i++) {    Profile *p = dlsubframe_.addProfile (profiles[i].frequency, (Ofdm_mod_rate)profiles[i].fec);    p->setIUC (profiles[i].diuc);    //printf ("\t Adding dl profile %i: f=%d, rate=%d, iuc=%d\n", i, p->getFrequency(), p->getEncoding(), p->getIUC());  }}/** * Parse a UL_MAP message and create the data structure * @param frame The UL frame information */void FrameMap::parseULMAPframe (mac802_16_ul_map_frame *frame){  //printf ("parse UL-MAP\n");  // Clear previous information  for (PhyPdu *p = ulsubframe_.getFirstPdu(); p ; p = ulsubframe_.getFirstPdu()) {    ulsubframe_.removePhyPdu(p);    delete (p);  }    int nbies = frame->nb_ies;  mac802_16_ulmap_ie *ies = frame->ies;  ulsubframe_.setStarttime(frame->allocation_start);  //mac_->debug ("\tul start time = %d %f\n", frame->allocation_start, frame->allocation_start*mac_->getPhy()->getPS());  for (int i = 0 ; i < nbies ; i++) {    UlBurst *b = (UlBurst*)(ulsubframe_.addPhyPdu(i,0))->addBurst(0);    b->setIUC(ies[i].uiuc);    b->setStarttime(ies[i].start_time);    if (b->getIUC()!=UIUC_END_OF_MAP) {      b->setCid(ies[i].cid);      b->setMidamble(ies[i].midamble_rep);      b->setDuration(ies[i].duration);      if (b->getIUC() == UIUC_EXT_UIUC) {	if(ies[i].extended_uiuc== UIUC_FAST_RANGING) {	  b->setFastRangingParam (ies[i].fast_ranging.mac_addr, ies[i].fast_ranging.uiuc);	}      }    }    /*mac_->debug ("\t Adding burst %d: cid=%d, iuc=%d start=%d (%f) duration=%d\n", \      i, b->getCid(), b->getIUC(),b->getStarttime(), starttime_+frame->allocation_start*mac_->getPhy()->getPS()+b->getStarttime()*mac_->getPhy()->getSymbolTime(), b->getDuration());*/  }}/** * Parse a UCD message and create the data structure * @param frame The DL frame information */void FrameMap::parseUCDframe (mac802_16_ucd_frame *frame){  assert (frame);  //clear previous profiles  ulsubframe_.removeProfiles();    /*printf ("parse UCD..rng_start=%d, rng_stop=%d, req_start=%d, req_stop=%d\n",\    frame->rng_backoff_start, frame->rng_backoff_end, frame->req_backoff_start,    frame->req_backoff_end);*/  ulsubframe_.getRanging()->setBackoff_start(frame->rng_backoff_start);  ulsubframe_.getRanging()->setBackoff_stop(frame->rng_backoff_end);  ulsubframe_.getRanging()->setSize(frame->rng_req_size);  ulsubframe_.getBw_req()->setBackoff_start(frame->req_backoff_start);  ulsubframe_.getBw_req()->setBackoff_stop(frame->req_backoff_end);    ulsubframe_.getBw_req()->setSize(frame->bw_req_size);  int nb_prof = frame->nb_prof;  mac802_16_ucd_profile *profiles = frame->profiles;  for (int i = 0 ; i < nb_prof ; i++) {    Profile *p = ulsubframe_.addProfile (0, (Ofdm_mod_rate)(profiles[i].fec));    p->setIUC (profiles[i].uiuc);    //printf ("\t Adding ul profile %i: f=%d, rate=%d, iuc=%d\n", i, p->getFrequency(), p->getEncoding(), p->getIUC());  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -