📄 wimaxctrlagent.cc
字号:
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 + -