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

📄 mac-802_16.cc

📁 802.16 Qos仿真平台的c++实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
	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);原补丁中的内容	if (NodeID == BsID) {		BsMsgQueue.enque(p);//如果是BS发送DSAACK回复,将p添加到BsMsgQueue	} else {		SsMsgQueue.enque(p);//如果是SS发送DSAACK回复,将p添加到SsMsgQueue	}
	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);
	p->allocdata (sizeof (struct DsxRvdMsg));
	printf("bs  send DSX-RVD to ss%d\n", mac_tmp->macSA());
	
	mac->macDA() = mac_tmp->macSA();
	mac->macSA() = NodeID;
	mac->set(MF_DATA, NodeID);
	state(MAC_SEND);
	
	hdr->uid() = 0;
	hdr->ptype() = PT_DSXRVD;
	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;
	
	DsxRvdMsg *dsxrvd = (DsxRvdMsg*) p->accessdata();
	DsaReqMsg *dsareq = (DsaReqMsg*) pkt->accessdata();
	dsxrvd->Management_Message_Type = 30;
	dsxrvd->Transaction_ID = dsareq->Transaction_ID;
	dsxrvd->Confirmation_Code = 0x00;
	
	//downtarget_->recv(p,this);原补丁的内容 	BsMsgQueue.enque(p);//只有BS才发送sendDSXRVD
	return;
}

bool
Mac802_16::CallAdmissionControl(Packet *p)
{
	return true;
}

void
Mac802_16::BandwidthManagement()
{
	//printf("----- %d -----\n",FrameNumber_Counter);
	DlAvailSymbol = (DlSymbolNum-2)*DlSubchanNum;
	UlAvailSymbol = UlSymbolNum*UlSubchanNum;
	//printf("[1] Dl %d Ul %d\n",DlAvailSymbol,UlAvailSymbol);
	int OFDMA_Symbol_offset = 0;
	int Subchannel_offset = 0;
	int BytePerSuchan = 0;
	int UIUC = 0;
	int DIUC = 0;
	UlMapIe *ulmapie = NULL;
	DlMapIe *dlmapie = NULL;
	BsServiceFlow *bssf;
	BsSsInfo *ssinfo;
	ModulCodingType modulcoding = QPSK_12;
	DlMapIeNum = 0;
	UlMapIeNum = 0;
	
	//Create Data Grant IE
	bssf = BsSF_head;
	while (bssf) {
		if (bssf->Direction == DL && bssf->ScheduleType == 6)
			BsSearchSsInfo(bssf->MacAddr, -1)->DownlinkBandwidth += bssf->MaxTrafficRate/8/200;
		if (bssf->Direction == DL && bssf->ScheduleType == 5)	
			if (Scheduler::instance().clock() - bssf->QueueTime >= (double)bssf->ToleratedJitter/1000 ) {
				BsSearchSsInfo(bssf->MacAddr, -1)->DownlinkBandwidth += bssf->SduQueue.byteLength();
				bssf->BwReqSize = bssf->SduQueue.byteLength();
			}
		if (bssf->Direction == DL && bssf->ScheduleType >= 3 && bssf->ScheduleType <= 4)
			if (Scheduler::instance().clock() - bssf->QueueTime >= (double)bssf->MaxLatency/1000 ) {
				BsSearchSsInfo(bssf->MacAddr, -1)->DownlinkBandwidth += bssf->SduQueue.byteLength(); 
				bssf->BwReqSize = bssf->SduQueue.byteLength();
			}
		if (bssf->Direction == DL && bssf->ScheduleType == 2)
			if (Scheduler::instance().clock() - bssf->QueueTime >= (double)bssf->MaxLatency/1000) {
				BsSearchSsInfo(bssf->MacAddr, -1)->DownlinkBandwidth += bssf->MaxTrafficRate/8/200;
				bssf->BwReqSize = bssf->MaxTrafficRate/8/200;
			}
		bssf = bssf->next;
	}
	
	OFDMA_Symbol_offset = 2;
	modulcoding = QPSK_12;
	BytePerSuchan = 6;
	DIUC = 1;
	ssinfo = BsSsInfo_head;
	while (ssinfo) {
		if (ssinfo->ModulCoding == modulcoding && ssinfo->DownlinkBandwidth != 0 && DlAvailSymbol != 0){
			dlmapie = CreateDlMapIe();
			dlmapie->CID = ssinfo->BasicCID;
			dlmapie->DIUC = DIUC;			
			dlmapie->No_OFDMA_Symbols = ssinfo->DownlinkBandwidth/BytePerSuchan/DlSubchanNum/2;
			if ((double)ssinfo->DownlinkBandwidth/BytePerSuchan/DlSubchanNum/2 - dlmapie->No_OFDMA_Symbols > 0)
				dlmapie->No_OFDMA_Symbols += 1;
			dlmapie->No_Subchannels = DlSubchanNum;
			if (DlAvailSymbol < dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*2)
				dlmapie->No_OFDMA_Symbols = DlAvailSymbol/DlSubchanNum/2;
			if (dlmapie->No_OFDMA_Symbols == 0)
				dlmapie->No_OFDMA_Symbols = 1;
			DlAvailSymbol -= dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*2;
			dlmapie->OFDMA_Symbol_offset = OFDMA_Symbol_offset;
			dlmapie->Subchannel_offset = 0;
			dlmapie->Boosting = 0;
			dlmapie->Repetition_Coding_Indication = 0;
			OFDMA_Symbol_offset += dlmapie->No_OFDMA_Symbols;
			DlMapIeNum++;		
		}
		ssinfo = ssinfo->next;
		if (!ssinfo) {
			switch (modulcoding) {
				case QPSK_12: ssinfo = BsSsInfo_head; modulcoding = QPSK_34; BytePerSuchan = 9; DIUC = 2; break;
				case QPSK_34: ssinfo = BsSsInfo_head; modulcoding = QAM16_12; BytePerSuchan = 12; DIUC = 3; break;
				case QAM16_12:ssinfo = BsSsInfo_head; modulcoding = QAM16_34; BytePerSuchan = 18; DIUC = 4; break;
				case QAM16_34:ssinfo = BsSsInfo_head; modulcoding = QAM64_23; BytePerSuchan = 24; DIUC = 5; break;
				case QAM64_23:ssinfo = BsSsInfo_head; modulcoding = QAM64_34; BytePerSuchan = 27; DIUC = 6; break;
				case QAM64_34:break;	
			}
		}
	}
	
	//Create Initial Ranging IE
	Subchannel_offset = 0;
	ulmapie = CreateUlMapIe();
	ulmapie->CID = 0xFFFF;
	ulmapie->UIUC = 0xC;
	ulmapie->No_OFDMA_Symbols = UlSymbolNum;
	ulmapie->No_Subchannels = 0x01;
	ulmapie->Ranging_Method = 0x00;
	ulmapie->OFDMA_Symbol_offset = 0x00;
	ulmapie->Subchannel_offset = 0x00;
	UlAvailSymbol -= ulmapie->No_OFDMA_Symbols;
	Subchannel_offset += ulmapie->No_Subchannels;
	UlMapIeNum++;
	
	//Create BW Request IE
	OFDMA_Symbol_offset = 0;
	bssf = BsSF_head;
	while (bssf) {
		if (bssf->Direction == UL && bssf->ScheduleType >= 3 && bssf->ScheduleType <= 5) {
			if (!BsSearchSsInfo(bssf->MacAddr, -1)->PollingStatus && Scheduler::instance().clock() - bssf->LastPollingTime >= (double)bssf->PollingInterval/1000) {
				bssf->LastPollingTime = Scheduler::instance().clock();
				BsSearchSsInfo(bssf->MacAddr, -1)->PollingStatus = true;
				ulmapie = CreateUlMapIe();
				ulmapie->CID = BsSearchSsInfo(bssf->MacAddr, -1)->BasicCID;
				ulmapie->UIUC = 0xC;
				ulmapie->No_OFDMA_Symbols = 0x02;
				ulmapie->No_Subchannels = 0x01;	
				ulmapie->Ranging_Method = 0x00;
				UlAvailSymbol -= ulmapie->No_OFDMA_Symbols;
				if (OFDMA_Symbol_offset < UlSymbolNum) {
					ulmapie->OFDMA_Symbol_offset = OFDMA_Symbol_offset;
					ulmapie->Subchannel_offset = Subchannel_offset;
					OFDMA_Symbol_offset += ulmapie->No_OFDMA_Symbols;
				} else {
					ulmapie->OFDMA_Symbol_offset = 0x00;	
					ulmapie->Subchannel_offset = ++Subchannel_offset;
					OFDMA_Symbol_offset = 0;
				}				
				UlMapIeNum++;
			}
		}
		bssf = bssf->next;
	}
	
	//Create Data Grant IE
	bssf = BsSF_head;
	while (bssf) {
		if (bssf->Direction == UL && bssf->ScheduleType == 6)
			BsSearchSsInfo(bssf->MacAddr, -1)->UplinkBandwidth += bssf->MaxTrafficRate/8/200;
		if (bssf->Direction == UL && bssf->ScheduleType == 2)
			if (Scheduler::instance().clock() - bssf->LastPollingTime >= (double)bssf->PollingInterval/1000) {
				BsSearchSsInfo(bssf->MacAddr, -1)->UplinkBandwidth += bssf->MaxTrafficRate/8/200;
				bssf->BwReqSize = bssf->MaxTrafficRate/8/200;
				bssf->LastPollingTime = Scheduler::instance().clock();
			}
		bssf = bssf->next;
	}
	
	modulcoding = QPSK_12;
	BytePerSuchan = 6;
	UIUC = 1;
	ssinfo = BsSsInfo_head;
	while (ssinfo) {
		if (ssinfo->ModulCoding == modulcoding && ssinfo->UplinkBandwidth != 0 && UlAvailSymbol != 0){
			ulmapie = CreateUlMapIe();
			ulmapie->CID = ssinfo->BasicCID;
			ulmapie->UIUC = UIUC;
			ulmapie->Duration = ssinfo->UplinkBandwidth/BytePerSuchan/3;
			if ((double)ssinfo->UplinkBandwidth/BytePerSuchan/BytePerSuchan/3 - ulmapie->Duration > 0)
				ulmapie->Duration += 1;
			if (UlAvailSymbol < ulmapie->Duration*3)
				ulmapie->Duration = UlAvailSymbol/3;
			if (ulmapie->Duration == 0)
				ulmapie->Duration = 1;
			UlAvailSymbol -= ulmapie->Duration*3;
			ulmapie->Repetition_Coding_Indication = 0;
			UlMapIeNum++;
		}
		ssinfo = ssinfo->next;
		if (!ssinfo) {
			switch (modulcoding) {
				case QPSK_12: ssinfo = BsSsInfo_head; modulcoding = QPSK_34; BytePerSuchan = 9; UIUC = 2; break;
				case QPSK_34: ssinfo = BsSsInfo_head; modulcoding = QAM16_12; BytePerSuchan = 12; UIUC = 3; break;
				case QAM16_12:ssinfo = BsSsInfo_head; modulcoding = QAM16_34; BytePerSuchan = 18; UIUC = 4; break;
				case QAM16_34:ssinfo = BsSsInfo_head; modulcoding = QAM64_23; BytePerSuchan = 24; UIUC = 5; break;
				case QAM64_23:ssinfo = BsSsInfo_head; modulcoding = QAM64_34; BytePerSuchan = 27; UIUC = 6; break;
				case QAM64_34:break;	
			}
		}
	}
	
	ssinfo = BsSsInfo_head;
	while (ssinfo) {
		ssinfo->PollingStatus = false;
		ssinfo->DownlinkBandwidth = 0;
		ssinfo->UplinkBandwidth = 0;
		ssinfo = ssinfo->next;
	}
	//printf("[2] Dl %d Ul %d\n",DlAvailSymbol,UlAvailSymbol);
	sendDLMAP();
	sendULMAP();
	if (FrameNumber_Counter%100 == 0) {
		DCD_Counter++;
		sendDCD();
		UCD_Counter++;
		sendUCD();
	}
	dlmapTimer.start(2*SymbolLength);
	return;
}

void
Mac802_16::BsScheduler()
{
	DlMapIe *dlmapie = NULL;
	dlmapie = DlMapIe_head;
	while (dlmapie) {
		if (BsSearchSsInfo(-1, dlmapie->CID)) {
			int Bandwidth = 0;
			int TrafficPriority = 0;
			switch (BsSearchSsInfo(-1, dlmapie->CID)->ModulCoding) {
				case QPSK_12: Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*6*2; break;
				case QPSK_34: Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*9*2; break;
				case QAM16_12:Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*12*2; break;
				case QAM16_34:Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*18*2; break;
				case QAM64_23:Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*24*2; break;
				case QAM64_34:Bandwidth = dlmapie->No_OFDMA_Symbols*dlmapie->No_Subchannels*27*2; break;	
			}
			BsServiceFlow *bssf = NULL;
			bssf = BsSF_head;
			while (bssf) {
				if (bssf->Direction == DL && bssf->Status == Active && bssf->ScheduleType == 6 && BsSearchSsInfo(bssf->MacAddr, -1)->BasicCID == dlmapie->CID) {
					//printf("Downlink Bandwidth %d CID %d UGS SFID=%d req size %d[%d]\n",Bandwidth,dlmapie->CID,bssf->SFID,bssf->SduQueue.byteLength(),bssf->SduQueue.count(bssf->SduQueue.byteLength()));
					BsFragOrPack(bssf, bssf->SduQueue.count(bssf->SduQueue.byteLength()));
					Bandwidth -= bssf->PduQueue.byteLength();
					//printf("\tbs SduQ=%d\tPduQ=%d\n",bssf->SduQueue.byteLength(),bssf->PduQueue.byteLength());
				}
				if (bssf->Direction == DL && bssf->Status == Active && bssf->BwReqSize != 0 && bssf->ScheduleType >= 3 && bssf->ScheduleType <= 5 && BsSearchSsInfo(bssf->MacAddr, -1)->BasicCID == dlmapie->CID) {
					//printf("Downlink Bandwidth %d CID %d Polling SFID=%d req size %d[%d]\n",Bandwidth,dlmapie->CID,bssf->SFID,bssf->BwReqSize,bssf->SduQueue.count(bssf->BwReqSize));
					BsFragOrPack(bssf, bssf->SduQueue.count(bssf->BwReqSize));
					bssf->BwReqSize = 0;
					Bandwidth -= bssf->PduQueue.byteLength();
					//printf("\tbs SduQ=%d\tPduQ=%d\n",bssf->SduQueue.byteLength(),bssf->PduQueue.byteLength());
				}
				if (bssf->Direction == DL && bssf->Status == Active && bssf->ScheduleType == 2 && BsSearchSsInfo(bssf->MacAddr, -1)->BasicCID == dlmapie->CID) {
					TrafficPriority += bssf->TrafficPriority;
				}
				bssf = bssf->next;
			}
			if (Bandwidth > 0 && TrafficPriority > 0) {
				bssf = BsSF_head;

⌨️ 快捷键说明

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