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

📄 mac-802_16.cc

📁 802.16 Qos仿真平台的c++实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
					}		
					if (mac16->generic_hdr.CID == PrimaryCID) {
						//printf("ss%d recv DSA-REQ\n",NodeID);
						mac_log(p->copy());
						if (!SsSearchServiceFlow(dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value, ptype, DL, -1, -1))
							sendDSARSP(SsCreateServiceFlow(p, DL), NULL);
					}		
				}			
			} else if (hdr->ptype() == PT_DSXRVD) {			
				if (mac16->generic_hdr.CID == PrimaryCID)				
					mac_log(p);			
			} else if (hdr->ptype() == PT_DSARSP) {				
				if (dsarsp->Transaction_ID <= 0x7FFF) {
					if (mac16->generic_hdr.CID == PrimaryCID) {					
						mac_log(p->copy());
						if (dsarsp->Confirmation_Code == 0x00) {
							SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->Status = Active;
							SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->TransportCID = dsarsp->Service_Flow_Parameters.CID.Value;
							SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->SFID = dsarsp->Service_Flow_Parameters.SFID.Value;
						}
						sendDSAACK(p);
					}
				}			
			} else if (hdr->ptype() == PT_DSAACK) {			
				if (dsaack->Transaction_ID >= 0x8000)
					if (mac16->generic_hdr.CID == PrimaryCID)
						mac_log(p);
			} else {
			//	if(hdr->ptype()==PT_AODV)
					//printf("Node%d 接受来自上层的AODV信息\n",NodeID);
				sendUp(p);
				return;			
			}
			return;
		}
	} else {
		callback_ = h;
		if (NodeID == BsID) {					
			if (hdr->ptype() == PT_UGS) {
				if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1))
					BsCreateServiceFlow(p, DL);
				if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->SduQueue.length() == 0)
					BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_ertPS) {
				if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1))
					BsCreateServiceFlow(p, DL);
				if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->SduQueue.length() == 0)
					BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_rtPS) { 
				if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1))
					BsCreateServiceFlow(p, DL);
				if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->SduQueue.length() == 0)
					BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_nrtPS) {
				if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1))
					BsCreateServiceFlow(p, DL);
				if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->SduQueue.length() == 0)
					BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_BE) {	
				if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1))
					BsCreateServiceFlow(p, DL);
				if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->SduQueue.length() == 0)
					BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->SduQueue.enque(p);
			} else {
			//	if(hdr->ptype()==PT_AODV)
					//printf("Node%d 接受来自下层的AODV信息\n",NodeID);
				mac->set(MF_DATA, NodeID);
				state(MAC_SEND);
				sendDown(p);
				return;
			}
			resume (NULL);	
			if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1)->Status == Provisioned) {
				sendDSAREQ(NULL, BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1));
				BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1)->Status = Admitted;
			}
		} else {
			if (hdr->ptype() == PT_UGS) {
				if (!SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1))
					SsCreateServiceFlow(p, UL);
				if (SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->SduQueue.length() == 0)
					SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();	
				SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_ertPS) {
				if (!SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1))
					SsCreateServiceFlow(p, UL);
				if (SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->SduQueue.length() == 0)
					SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
				SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_rtPS) { 
				if (!SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1))
					SsCreateServiceFlow(p, UL);
				if (SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->SduQueue.length() == 0)
					SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
				SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_nrtPS) {
				if (!SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1))
					SsCreateServiceFlow(p, UL);
				if (SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->SduQueue.length() == 0)
					SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
				SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->SduQueue.enque(p);
			} else if (hdr->ptype() == PT_BE) {	
				if (!SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1))
					SsCreateServiceFlow(p, UL);
				if (SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->SduQueue.length() == 0)
					SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
				SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->SduQueue.enque(p);
			} else {
			//	if(hdr->ptype()==PT_AODV)
					//printf("Node%d 接受来自下层的AODV信息\n",NodeID);
				mac->set(MF_DATA, NodeID);
				state(MAC_SEND);
				sendDown(p);
				return;
			}
			resume (NULL);
			if (RangingStatus && SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1)->Status == Provisioned) {
				sendDSAREQ(SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1), NULL);
				SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1)->Status = Admitted;
			}
		}
	}
}

void 
Mac802_16::sendUCD()
{
	printf("bs  send UCD\n");
	Packet *p = Packet::alloc();
	struct hdr_cmn *hdr = HDR_CMN(p);
	struct hdr_mac *mac = HDR_MAC(p); 
	struct hdr_mac802_16 *mac16 = HDR_MAC802_16(p);
	p->allocdata (sizeof (struct UcdMsg));	
	
	mac->macDA() = -1;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
    hdr->ptype() = PT_UCD;
    hdr->size() = sizeof(GenericHdr) + sizeof(UcdMsg) + MaxProfileNum*sizeof(UplinkBurstProfile)/2;
    hdr->iface() = -2;
    hdr->error() = 0; 
	hdr->txtime() = 2*SymbolLength;
	
	mac16->generic_hdr.HT = 0;
	mac16->generic_hdr.EC = 1;
	mac16->generic_hdr.Type = 1;
	mac16->generic_hdr.CI = 1; 
	mac16->generic_hdr.EKS = 1;
	mac16->generic_hdr.LEN = 3;
	mac16->generic_hdr.CID = 0xFFFF;
	mac16->generic_hdr.HCS = 0;
	
	UcdMsg *ucd = (UcdMsg*) p->accessdata();
	ucd->Management_Message_Type = 0x00;
	ucd->Config_Change_Count = 0x01;
	ucd->Rng_Backoff_Start = 0x00;
	ucd->Rng_Backoff_End = 0x0F;
	ucd->Req_Backoff_Start = 0x00;
	ucd->Req_Backoff_End = 0x0F;
	for (int i = 0; i < MaxProfileNum; i++) {
		UplinkBurstProfile *tmp = new UplinkBurstProfile;
		tmp->Type = 0x01;
		tmp->Length = sizeof(UplinkBurstProfile);
		tmp->UIUC = i+1;
		tmp->FEC_Code_and_modulation_type.Value = i;
		if (UlBurstProfile_head == NULL) {
			UlBurstProfile_head = UlBurstProfile_tail = tmp;
			tmp->next = NULL;
		} else {
			UlBurstProfile_tail->next = tmp;
			UlBurstProfile_tail = tmp;
			tmp->next = NULL;
		}
	}
	/*Number of UL-MAPs to receive before contention-based reservation is attempted again for the same connection.*/
	ucd->Contention_based_reservation_timeout.Value = 0x00;
	/*Size (in units of PS) of PHY payload that SS may use to format and transmit a bandwidth request message in a contention request opportunity.
	    The value includes all PHY overhead as well as allowance for the MAC data the message may hold.*/
	ucd->Bandwidth_request_opportunity_size.Value = 0x00;
	/*Size (in units of PS) of PHY bursts that an SS may use to transmit a RNG-REQ message in a contention ranging request opportunity.
	    The value includes all PHY overhead as well as the maximum SS/BS round trip propagation delay.*/
	ucd->Ranging_request_opportunity_size.Value = 0x00;
	
	downtarget_->recv(p,this);
	return;
}

void 
Mac802_16::sendDCD()
{
	printf("bs  send DCD\n");
	Packet *p = Packet::alloc();
	struct hdr_cmn *hdr = HDR_CMN(p);
	struct hdr_mac *mac = HDR_MAC(p); 
	struct hdr_mac802_16 *mac16 = HDR_MAC802_16(p);
	p->allocdata (sizeof (struct DcdMsg));	
	
	mac->macDA() = -1;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
    hdr->ptype() = PT_DCD;
    hdr->size() = sizeof(GenericHdr) + sizeof(DcdMsg) + MaxProfileNum*sizeof(DownlinkBurstProfile)/2;
    hdr->iface() = -2;
    hdr->error() = 0; 
	hdr->txtime() = 2*SymbolLength;
	
	mac16->generic_hdr.HT = 0;
	mac16->generic_hdr.EC = 1;
	mac16->generic_hdr.Type = 1;
	mac16->generic_hdr.CI = 1; 
	mac16->generic_hdr.EKS = 1;
	mac16->generic_hdr.LEN = 3;
	mac16->generic_hdr.CID = 0xFFFF;
	mac16->generic_hdr.HCS = 0;
	
	DcdMsg *dcd = (DcdMsg*) p->accessdata();
	dcd->Management_Message_Type = 0x00;
	dcd->Config_Change_Count = 0x01;

	for (int i = 0; i < MaxProfileNum; i++) {
		DownlinkBurstProfile *tmp = new DownlinkBurstProfile;
		tmp->DIUC = i+1;
		tmp->FEC_Code_type.Value = i;
		if (DlBurstProfile_head == NULL) {
			DlBurstProfile_head = DlBurstProfile_tail = tmp;
			tmp->next = NULL;
		} else {
			DlBurstProfile_tail->next = tmp;
			DlBurstProfile_tail = tmp;
			tmp->next = NULL;
		}
	}
	/*Base Station ID.*/
	dcd->BS_ID.Value = NodeID;
	/*See 11.1.3.*/
	dcd->MAC_version.Value = 0x04;
	
	downtarget_->recv(p,this);
	return;
}

void
Mac802_16::sendDLMAP()
{
	printf("bs  send DL-MAP\n");
	Packet *p = Packet::alloc();
	struct hdr_cmn *hdr = HDR_CMN(p);
	struct hdr_mac *mac = HDR_MAC(p); 
	struct hdr_mac802_16 *mac16 = HDR_MAC802_16(p);
	p->allocdata (sizeof (struct DlMapMsg));
	
	mac->macDA() = -1;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
	hdr->ptype() = PT_DLMAP;
	hdr->size() = sizeof(GenericHdr) + sizeof(DlMapMsg) + DlMapIeNum*sizeof(DlMapIe)/2;
	hdr->iface() = -2;
	hdr->error() = 0; 
	hdr->txtime() =  2*SymbolLength;
	
	mac16->generic_hdr.HT = 0;
	mac16->generic_hdr.EC = 1;
	mac16->generic_hdr.Type = 1;
	mac16->generic_hdr.CI = 1; 
	mac16->generic_hdr.EKS = 1;
	mac16->generic_hdr.LEN = 3;
	mac16->generic_hdr.CID = 0xFFFF;
	mac16->generic_hdr.HCS = 0;
	
	DlMapMsg *dlmap = (DlMapMsg*) p->accessdata();
	dlmap->Management_Message_Type = 2;
	dlmap->DCD_Count = DCD_Counter;
	dlmap->BS_ID = BsID;
	dlmap->No_OFDMA_Symbols = DlSymbolNum;
	dlmap->Frame_duration_code = 0x04;
	dlmap->Frame_number = FrameNumber_Counter;
	
	downtarget_->recv(p,this);
	return;
}

void
Mac802_16::sendULMAP()
{
	printf("bs  send UL-MAP\n");
	Packet *p = Packet::alloc();
	struct hdr_cmn *hdr = HDR_CMN(p);
	struct hdr_mac *mac = HDR_MAC(p); 
	struct hdr_mac802_16 *mac16 = HDR_MAC802_16(p);
	p->allocdata (sizeof (struct UlMapMsg));
	
	mac->macDA() = -1;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
	hdr->ptype() = PT_ULMAP;
	hdr->size() = sizeof(GenericHdr) + sizeof(UlMapMsg) + UlMapIeNum*sizeof(UlMapIe)/2;
	hdr->iface() = -2;
	hdr->error() = 0; 
	hdr->txtime() = 2*SymbolLength;
	
	mac16->generic_hdr.HT = 0;
	mac16->generic_hdr.EC = 1;
	mac16->generic_hdr.Type = 1;
	mac16->generic_hdr.CI = 1; 
	mac16->generic_hdr.EKS = 1;
	mac16->generic_hdr.LEN = 3;
	mac16->generic_hdr.CID = 0xFFFF;
	mac16->generic_hdr.HCS = 0;
	
	UlMapMsg *ulmap = (UlMapMsg*) p->accessdata();
	ulmap->Management_Message_Type = 0x03;
	ulmap->UCD_Count = UCD_Counter;
	ulmap->Allocation_Start_Time = (u_int32_t)Scheduler::instance().clock();
	AllocationStartTime = Scheduler::instance().clock() //Current time
							+ SymbolLength //Preamble interval
							+ DlSymbolNum*SymbolLength //Downlink interval
							+ TtgLength; //TTG interval

	downtarget_->recv(p,this);
	return;
}

⌨️ 快捷键说明

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