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

📄 mac-802_16.cc

📁 802.16 Qos仿真平台的c++实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
void 
Mac802_16::sendRNGREQ(UlMapIe *IE)
{ 
	printf("ss%d send RNG-REQ\n", NodeID);
	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 RngReqMsg));
	
	//ModulCoding = CalMod->search(NodeID)->ToMod(CalMod->search(0)->x,CalMod->search(0)->y);
	mac->macDA() = BsID;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
    hdr->ptype() = PT_RNGREQ;
    hdr->size() = sizeof(GenericHdr) + sizeof(RngReqMsg);
    hdr->iface() = -2;
    hdr->error() = 0; 
	hdr->txtime() = txtime(hdr->size());
	
	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 = 0x0000;
	mac16->generic_hdr.HCS = 0;

	RngReqMsg *rngreq = (RngReqMsg*) p->accessdata();
	rngreq->Management_Message_Type = 0x04;
	rngreq->Requested_Downlink_Burst_Profile = DownlinkBurstProfileTable.DIUC;
	rngreq->SS_MAC_Address = NodeID;
	rngreq->Ranging_Anomalies = 0;
	rngreq->AAS_broadcast_capability = 0;
	
	uplinkTimer.start(IE->OFDMA_Symbol_offset*SymbolLength, p);
	return;
}

void 
Mac802_16::sendBWREQ(UlMapIe *IE)
{
	printf("ss%d send BW-REQ\n", NodeID);
	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);
	
	mac->macDA() = BsID;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
    hdr->ptype() = PT_BWREQ;
    hdr->size() = sizeof(BwReqHdr);
    hdr->iface() = -2;
    hdr->error() = 0; 
	hdr->txtime() = txtime(hdr->size());
	
	mac16->bwreq_hdr.HT = 1;
	mac16->bwreq_hdr.EC = 1;
	mac16->bwreq_hdr.Type = 1;
	SsServiceFlow *sssf;

	sssf = SsSF_head;
	while (sssf) {
		//ertPS Bandwidth Request
		if (sssf->ScheduleType == 5)
			if (Scheduler::instance().clock() - sssf->QueueTime >= (double)sssf->ToleratedJitter/1000 ) {
				mac16->bwreq_hdr.BR += sssf->SduQueue.byteLength(); 
				sssf->BwReqSize = sssf->SduQueue.byteLength(); 
			}
		//rtPS and nrtPS Bandwidth Request
		if (sssf->ScheduleType >= 3 && sssf->ScheduleType <= 4)
			if (Scheduler::instance().clock() - sssf->QueueTime >= (double)sssf->MaxLatency/1000 ) {
				mac16->bwreq_hdr.BR += sssf->SduQueue.byteLength(); 
				sssf->BwReqSize = sssf->SduQueue.byteLength(); 
			}
		sssf = sssf->next;
	}
	mac16->bwreq_hdr.CID = BasicCID;
	mac16->bwreq_hdr.HCS = 0;
	uplinkTimer.start(IE->OFDMA_Symbol_offset*SymbolLength, p);
	return;
}

void
Mac802_16::sendRNGRSP(BsSsInfo *SsInfo)
{
	printf("bs  send RNG-RSP to ss%d\n", SsInfo->MacAddr);
	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 RngRspMsg));
	
	mac->macDA() = SsInfo->MacAddr;
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
    hdr->ptype() = PT_RNGRSP;
    hdr->size() = sizeof(GenericHdr) + sizeof(RngRspMsg);	
    hdr->iface() = -2;
    hdr->error() = 0; 
	hdr->txtime() = txtime(hdr->size());
	
	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 = 0x0000;
	mac16->generic_hdr.HCS = 0;
	
	RngRspMsg *rngrsp = (RngRspMsg*) p->accessdata();
	rngrsp->Timing_Adjust = 0;
	rngrsp->Power_Level_Adjust = 0;
	rngrsp->Offset_Frequency_Adjust = 0;
	rngrsp->Ranging_Status = 3;
	rngrsp->Downlink_frequency_override = 0;
	rngrsp->Uplink_channel_ID_override = 0;
	rngrsp->Downlink_Operational_Burst_Profile = 0;
	rngrsp->SS_MAC_Address = SsInfo->MacAddr;
	rngrsp->Basic_CID = SsInfo->BasicCID;
	rngrsp->Primary_Management_CID = SsInfo->PrimaryCID;
	rngrsp->AAS_broadcast_permission = 0;
	
	//downtarget_->recv(p,this);	BsMsgQueue.enque(p);//如果这是SS发送的测距请求,将p保存在SS的控制包队列
	return;
}

void 
Mac802_16::sendDSAREQ(SsServiceFlow *SsSF, BsServiceFlow *BsSF)
{ 
	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 DsaReqMsg));	
		
	if(NodeID == BsID) {
		printf("bs  send DSA-REQ to ss%d\n", BsSF->MacAddr);
		
		mac->macDA() = BsSF->MacAddr;
		mac->macSA() = NodeID;
		mac->set(MF_DATA, NodeID);
		state(MAC_SEND);
	
		hdr->uid() = 0;
		hdr->ptype() = PT_DSAREQ;
		hdr->size() = sizeof(GenericHdr) + sizeof(DsaReqMsg);
		hdr->iface() = -2;
		hdr->error() = 0; 
		hdr->txtime() = txtime(hdr->size());
	
		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 = BsSearchSsInfo(BsSF->MacAddr, -1)->PrimaryCID;
		mac16->generic_hdr.HCS = 0;
		
		DsaReqMsg *dsareq = (DsaReqMsg*) p->accessdata();	
		dsareq->Management_Message_Type = 11;
		dsareq->Transaction_ID = BsSF->TransactionID;
		dsareq->Service_Flow_Parameters.CID.Value = BsSF->TransportCID;
		dsareq->Service_Flow_Parameters.SFID.Value = BsSF->SFID;
		dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = BsSF->ScheduleType;
		if (BsSF->Status == Provisioned) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 1;
		} else if (BsSF->Status == Admitted) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 2;
		} else if (BsSF->Status == Active) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 4;
		}
		dsareq->Service_Flow_Parameters.Traffic_Priority.Value = BsSF->TrafficPriority;
		dsareq->Service_Flow_Parameters.Maximum_Sustained_Traffic_Rate.Value = BsSF->MaxTrafficRate;
		dsareq->Service_Flow_Parameters.Minimum_Reserved_Traffic_Rate.Value = BsSF->MinTrafficRate;
		dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = BsSF->ScheduleType;
		dsareq->Service_Flow_Parameters.Request_Transmission_Policy.Value = BsSF->ReqTxPolicy;
		dsareq->Service_Flow_Parameters.Tolerated_Jitter.Value = BsSF->ToleratedJitter;
		dsareq->Service_Flow_Parameters.Maximum_Latency.Value = BsSF->MaxLatency;
		dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value = BsSF->DstMacAddr;
		dsareq->Service_Flow_Parameters.Source_MAC_Address.Value = BsSF->SrcMacAddr;		BsMsgQueue.enque(p);//如果这是BS发送的服务流添加请求,将p保存在BS的控制包队列
	} else {
		printf("ss%d send DSA-REQ\n", NodeID);
		
		mac->macDA() = BsID;
		mac->macSA() = NodeID;
		mac->set(MF_DATA, NodeID);
		state(MAC_SEND);
	
		hdr->uid() = 0;
		hdr->ptype() = PT_DSAREQ;
		hdr->size() = sizeof(GenericHdr) + sizeof(DsaReqMsg);
		hdr->iface() = -2;
		hdr->error() = 0; 
		hdr->txtime() = txtime(hdr->size());
	
		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 = PrimaryCID;
		mac16->generic_hdr.HCS = 0;
		
		DsaReqMsg *dsareq = (DsaReqMsg*) p->accessdata();	
		dsareq->Management_Message_Type = 11;
		dsareq->Transaction_ID = SsSF->TransactionID;
		dsareq->Service_Flow_Parameters.SFID.Value = 0;
		if (SsSF->Status == Provisioned) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 1;
		} else if (SsSF->Status == Admitted) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 2;
		} else if (SsSF->Status == Active) {
			dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 4;
		}
		dsareq->Service_Flow_Parameters.Traffic_Priority.Value = SsSF->TrafficPriority;
		dsareq->Service_Flow_Parameters.Maximum_Sustained_Traffic_Rate.Value = SsSF->MaxTrafficRate;
		dsareq->Service_Flow_Parameters.Minimum_Reserved_Traffic_Rate.Value = SsSF->MinTrafficRate;
		dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = SsSF->ScheduleType;
		dsareq->Service_Flow_Parameters.Request_Transmission_Policy.Value = SsSF->ReqTxPolicy;
		dsareq->Service_Flow_Parameters.Tolerated_Jitter.Value = SsSF->ToleratedJitter;
		dsareq->Service_Flow_Parameters.Maximum_Latency.Value = SsSF->MaxLatency;
		dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value = SsSF->DstMacAddr;
		dsareq->Service_Flow_Parameters.Source_MAC_Address.Value = SsSF->SrcMacAddr;		SsMsgQueue.enque(p);//如果是SS发送的服务流添加请求,将p保存在SS的控制包队列
	}//原补丁中被注释掉的以下代码是不符合协议要求的/*
	if (Scheduler::instance().clock() >= AllocationStartTime && Scheduler::instance().clock() <= AllocationStartTime + UlSymbolNum*SymbolLength) {
		downtarget_->recv(p, this);
	} else {
		if (NodeID == BsID) {
			if (Scheduler::instance().clock() < AllocationStartTime)
				downlinkTimer.start(AllocationStartTime - Scheduler::instance().clock(), p);
			else
				downlinkTimer.start(Scheduler::instance().clock() - AllocationStartTime, p);
		} else {
			if (Scheduler::instance().clock() < AllocationStartTime)
				uplinkTimer.start(AllocationStartTime - Scheduler::instance().clock(), p);
			else
				uplinkTimer.start(Scheduler::instance().clock() - AllocationStartTime, p);
		}
	}*/
	return;
}

void
Mac802_16::sendDSARSP(SsServiceFlow *SsSF, BsServiceFlow *BsSF)
{
	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 DsaRspMsg));
	
	if(NodeID == BsID) {
		printf("bs  send DSA-RSP to ss%d\n", BsSF->MacAddr);
		
		mac->macDA() = BsSF->MacAddr;
		mac->macSA() = NodeID;
		mac->set(MF_DATA, NodeID);
		state(MAC_SEND);
	
		hdr->uid() = 0;
		hdr->ptype() = PT_DSARSP;
		hdr->size() = sizeof(GenericHdr) + sizeof(DsaRspMsg);
		hdr->iface() = -2;
		hdr->error() = 0; 
		hdr->txtime() = txtime(hdr->size());
	
		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 = BsSearchSsInfo(BsSF->MacAddr, -1)->PrimaryCID;
		mac16->generic_hdr.HCS = 0;
		
		DsaRspMsg *dsarsp = (DsaRspMsg*) p->accessdata();
		dsarsp->Management_Message_Type = 30;
		dsarsp->Transaction_ID = BsSF->TransactionID;
		dsarsp->Confirmation_Code = 0x00;	
		dsarsp->Service_Flow_Parameters.CID.Value = BsSF->TransportCID;
		dsarsp->Service_Flow_Parameters.SFID.Value = BsSF->SFID;		BsMsgQueue.enque(p);//如果这是BS发送的服务流添加回复,将p保存在BS的控制包队列
	} else {
		printf("ss%d send DSA-RSP\n", NodeID);
		
		mac->macDA() = BsID;
		mac->macSA() = NodeID;
		mac->set(MF_DATA, NodeID);
		state(MAC_SEND);
	
		hdr->uid() = 0;
		hdr->ptype() = PT_DSARSP;
		hdr->size() = sizeof(GenericHdr) + sizeof(DsaRspMsg);
		hdr->iface() = -2;
		hdr->error() = 0; 
		hdr->txtime() = txtime(hdr->size());
	
		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 = PrimaryCID;
		mac16->generic_hdr.HCS = 0;
		
		DsaRspMsg *dsarsp = (DsaRspMsg*) p->accessdata();
		dsarsp->Management_Message_Type = 30;
		dsarsp->Transaction_ID = SsSF->TransactionID;
		dsarsp->Confirmation_Code = 0x00;	
		dsarsp->Service_Flow_Parameters.CID.Value = SsSF->TransportCID;
		dsarsp->Service_Flow_Parameters.SFID.Value = SsSF->SFID;		SsMsgQueue.enque(p);//如果这是SS发送的服务流添加回复,将p保存在SS的控制包队列
	}
	//downtarget_->recv(p,this);这是原补丁的内容

⌨️ 快捷键说明

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