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

📄 mac-802_16.cc

📁 802.16 Qos仿真平台的c++实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
	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);
	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;
	} 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;
	}
	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;
	} 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;
	}
	downtarget_->recv(p,this);
	return;
}

void 
Mac802_16::sendDSAACK(Packet *pkt)
{ 
	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);
	struct hdr_mac802_16 *mac16_tmp = HDR_MAC802_16(pkt);
	p->allocdata (sizeof (struct DsaAckMsg));
	
	if (NodeID == BsID) {
		printf("bs  send DSX-ACK to ss%d\n",BsSearchSsInfo(-1, mac16_tmp->generic_hdr.CID)->MacAddr);
		mac->macDA() = BsSearchSsInfo(-1, mac16_tmp->generic_hdr.CID)->MacAddr;
		mac->macSA() = NodeID;
	} else {
		printf("ss%d send DSX-ACK\n", NodeID);
		mac->macDA() = NodeID;
		mac->macSA() = BsID;
	}
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
	hdr->ptype() = PT_DSAACK;
	hdr->size() = sizeof(GenericHdr) + sizeof(DsxRvdMsg);;
	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 = mac16_tmp->generic_hdr.CID;
	mac16->generic_hdr.HCS = 0;
	
	DsaAckMsg *dsaack = (DsaAckMsg*) p->accessdata();
	DsaRspMsg *dsarsp = (DsaRspMsg*) pkt->accessdata();
	dsaack->Management_Message_Type = 16;
	dsaack->Transaction_ID = dsarsp->Transaction_ID;
	dsaack->Confirmation_Code = 0x00;

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

void
Mac802_16::sendDSXRVD(Packet *pkt)
{
	Packet *p = Packet::alloc();
	struct hdr_cmn *hdr = HDR_CMN(p);
	struct hdr_mac *mac = HDR_MAC(p); 
	struct hdr_mac *mac_tmp = HDR_MAC(pkt);
	struct hdr_mac802_16 *mac16 = HDR_MAC802_16(p);
	struct hdr_mac802_16 *mac16_tmp = HDR_MAC802_16(pkt);

⌨️ 快捷键说明

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