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

📄 wimaxctrlagent.cc

📁 This documentation is based on the following versions:- pre-release of the wimax model developed by
💻 CC
📖 第 1 页 / 共 2 页
字号:
  memcpy (ucdframe, data+sizeof (mac802_16_dcd_frame), sizeof (mac802_16_ucd_frame));  debug ("\tframe number=%d ccc=%d\n", dcdframe->frame_number,ucdframe->config_change_count);  mac802_16_dcd_frame *dcdtmp = entry->getDCD();  if (dcdtmp)    free(dcdtmp);  mac802_16_ucd_frame *ucdtmp = entry->getUCD();  if (ucdtmp)    free(ucdtmp);  entry->setDCD (dcdframe);  entry->setUCD (ucdframe);  //free (p);}/** * Process scanning request * @param p The request */void WimaxCtrlAgent::process_scan_request (Packet *req){  hdr_mac802_16 *wimaxHdr_req = HDR_MAC802_16(req);  gen_mac_header_t header_req = wimaxHdr_req->header;  mac802_16_mob_scn_req_frame *req_frame;  req_frame = (mac802_16_mob_scn_req_frame*) req->accessdata();  mac_->debug ("At %f in Mac %d received scanning request from %d\n", NOW, mac_->addr(), header_req.cid);    //for first implementation we disregard the information   //sent by MN. Just use default association mechanisms  //should check if there is already pending request: TBD  Scan_req *entry = new Scan_req (this, synch_frame_delay_*mac_->getFrameDuration(), header_req.cid, req_frame);  entry->insert_entry (&scan_req_head_);  entry->start_frame()=mac_->getFrameNumber();  switch (defaultlevel_){  case 0: //Scan without association    entry->response()->scan_duration = req_frame->scan_duration;    entry->response()->start_frame = 2;    entry->response()->report_mode = 0; //no report for now    entry->response()->interleaving_interval = req_frame->interleaving_interval;    entry->response()->scan_iteration = req_frame->scan_iteration;    entry->response()->n_recommended_bs_index = 0;    entry->response()->n_recommended_bs_full = nbmapentry_;    for (int i = 0; i < nbmapentry_ ; i++) {      entry->response()->rec_bs_full[i].recommended_bs_id = maptable_[i][0];      entry->response()->rec_bs_full[i].scanning_type = SCAN_WITHOUT_ASSOC;    }    //send response    ((BSScheduler*)mac_->getScheduler())->send_scan_response (entry->response(), header_req.cid);    //clean data    entry->remove_entry();    delete entry;    break;  case 1: //Association without coordination    entry->response()->scan_duration = req_frame->scan_duration;    entry->response()->start_frame = 2;    entry->response()->report_mode = 0; //no report for now    entry->response()->interleaving_interval = req_frame->interleaving_interval;    entry->response()->scan_iteration = req_frame->scan_iteration;    entry->response()->n_recommended_bs_index = 0;    entry->response()->n_recommended_bs_full = nbmapentry_;    for (int i = 0; i < nbmapentry_ ; i++) {      entry->response()->rec_bs_full[i].recommended_bs_id = maptable_[i][0];      entry->response()->rec_bs_full[i].scanning_type = SCAN_ASSOC_LVL0;    }    //send response    ((BSScheduler*)mac_->getScheduler())->send_scan_response (entry->response(), header_req.cid);    //clean data    entry->remove_entry();    delete entry;    break;  case 2: //Association with coordination    //init data    entry->response()->n_recommended_bs_index = 0;    entry->response()->n_recommended_bs_full = 0;    entry->pending_rsp () = 0;     //send request to neighbors    for (int i = 0; i < nbmapentry_ ; i++) {      Packet *p = allocpkt();      hdr_ip *iph = HDR_IP(p);      hdr_wimaxbs *rh = HDR_WIMAXBS(p);      hdr_cmn *hdrc = HDR_CMN(p);            rh->getType() = WIMAX_BS_SYNCH_REQ;       hdrc->size() = 30; //We need to define proper size      //set content      iph = HDR_IP(p);      iph->daddr() = maptable_[i][1];      iph->dport() = port();            rh->macAddr() = mac_->getCManager()->get_connection(header_req.cid, true)->getPeerNode()->getPeerNode();      rh->cid = header_req.cid;      rh->scanning_type = (wimax_scanning_type) defaultlevel_;      //we suggest a rendez-vous time at the beginning of each       //scan iteration      rh->current_frame = mac_->getFrameNumber();      //if we want to start scanning 2 frames after, then add one (i.e 3) because       //the message will be sent on the next frame      printf ("scan_duration=%d, scan_interval=%d\n", req_frame->scan_duration,	      req_frame->interleaving_interval);      rh->rdvt = (i+1)*(req_frame->scan_duration+req_frame->interleaving_interval)+synch_frame_delay_+START_FRAME_OFFSET+1;      rh->rendezvous_time = NOW+rh->rdvt*mac_->getFrameDuration();           printf ("Request: current frame=%d, rdv frame=%d, rdv time=%f\n",	      rh->current_frame, rh->rdvt, rh->rendezvous_time);       entry->pending_rsp ()++;      send (p,0);            entry->response()->n_recommended_bs_full = i + 1;      entry->response()->rec_bs_full[i].recommended_bs_id = maptable_[i][0];      entry->response()->rec_bs_full[i].scanning_type = rh->scanning_type;      entry->response()->rec_bs_full[i].rdv_time = rh->rdvt-synch_frame_delay_;      }    //continue initializing response    entry->response()->scan_duration = req_frame->scan_duration;    entry->response()->start_frame = START_FRAME_OFFSET;    entry->response()->report_mode = 0; //no report for now    entry->response()->interleaving_interval = entry->request()->interleaving_interval;    entry->response()->scan_iteration = entry->request()->scan_iteration;    entry->response()->n_recommended_bs_index = 0;        //printf ("Response: current frame=%d (now=%f), start in %d frame (t=%f)\n",    //	    mac_->getFrameNumber (), NOW, entry->response()->start_frame, NOW+(entry->response()->start_frame*mac_->getFrameDuration()));    //send response    //((BSScheduler*)mac_->getScheduler())->send_scan_response (entry->response(), entry->cid());    break;  case 3: //Network Assisted Association reporting    break;  default:    break;  }}/** * Process synchronization request * @param req The request */void WimaxCtrlAgent::process_synch_request (Packet *req){  debug ("At %f in node %s, WimaxCtrlAgent received synch request from %s\n", NOW, MYNUM,	 Address::instance().print_nodeaddr(HDR_IP(req)->saddr()));  //schedule rendez-vous time  //schedule sending of Fast-ranging-IE  ((BSScheduler*)mac_->getScheduler())->addNewFastRanging (HDR_WIMAXBS(req)->rendezvous_time, HDR_WIMAXBS(req)->macAddr());    //send response  Packet *p = allocpkt();  hdr_ip *iph = HDR_IP(p);  hdr_wimaxbs *rh = HDR_WIMAXBS(p);  hdr_cmn *hdrc = HDR_CMN(p);    rh->getType() = WIMAX_BS_SYNCH_RSP;   hdrc->size() = 30; //We need to define proper size  //set content  iph = HDR_IP(p);  iph->daddr() = HDR_IP(req)->saddr();  iph->dport() = port();    //we accept what the serving BS sent  rh->cid = HDR_WIMAXBS(req)->cid;  rh->scanning_type = HDR_WIMAXBS(req)->scanning_type;  rh->current_frame = HDR_WIMAXBS(req)->current_frame;  rh->rdvt = HDR_WIMAXBS(req)->rdvt;  rh->rendezvous_time = HDR_WIMAXBS(req)->rendezvous_time;   //send (p,0);}/** * Process synchronization response * @param p The response */void WimaxCtrlAgent::process_synch_response (Packet *p){  debug ("At %f in node %s, WimaxCtrlAgent received synch response from %s\n", NOW, MYNUM,	 Address::instance().print_nodeaddr(HDR_IP(p)->saddr()));  hdr_wimaxbs *rh = HDR_WIMAXBS(p);  int i;  //update information  Scan_req *entry;  for (entry = scan_req_head_.lh_first ; entry && (entry->cid() != rh->cid); entry=entry->next_entry());  assert (entry);  i = entry->response()->n_recommended_bs_full;  entry->response()->n_recommended_bs_full = i + 1;  entry->response()->rec_bs_full[i].recommended_bs_id = maptable_[i][0];  entry->response()->rec_bs_full[i].scanning_type = rh->scanning_type;  entry->response()->rec_bs_full[i].rdv_time = rh->rdvt;}/** * Send a scan response to the MN that has the given CID * @param cid The CID of the MN */void WimaxCtrlAgent::send_scan_response (int cid){  Scan_req *entry;  for (entry = scan_req_head_.lh_first ; entry && (entry->cid() != cid); entry=entry->next_entry());    assert (entry);    entry->response()->scan_duration = entry->request()->scan_duration;  printf ("Response: current frame=%d, start frame=%d diff=%d\n", 	  mac_->getFrameNumber(), entry->start_frame(), 100-(mac_->getFrameNumber()-entry->start_frame()));  printf ("Response: current frame=%d (now=%f), start in %d frame (t=%f)\n",	  mac_->getFrameNumber (), NOW, entry->response()->start_frame, NOW+(entry->response()->start_frame*mac_->getFrameDuration()));  //send response  ((BSScheduler*)mac_->getScheduler())->send_scan_response (entry->response(), entry->cid());  //clean data  entry->remove_entry();  delete entry;}

⌨️ 快捷键说明

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