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

📄 mac-802_16.cc

📁 802.16 Qos仿真平台的c++实现
💻 CC
📖 第 1 页 / 共 5 页
字号:
		
		//BW Request IE
		ulmapie = UlMapIe_head;
		while (ulmapie) {
			if (ulmapie->UIUC == 0xC && ulmapie->CID == BasicCID)
				sendBWREQ(ulmapie);
			ulmapie = ulmapie->next;
		}
	}
	SsBurstTransmit();
	return;
}

void 
Mac802_16::BsFragOrPack(BsServiceFlow *BsSF, int Size)
{	
	//printf("[1]BS SDU num=%d PDU num=%d\n",BsSF->SduQueue.length(),BsSF->PduQueue.length());
	static int32_t tmp_size = PDUSIZE;	
	Packet* frag;
	Packet* sdu;
BsStart:	
	while (Size) {				
		sdu = BsSF->SduQueue.deque();		
		struct hdr_cmn* sdu_hdr = HDR_CMN(sdu);
	    struct hdr_mac802_16* sdu_mac16 = HDR_MAC802_16(sdu);	
		
		if (sdu_hdr->size() <= tmp_size) {
			//need to pack
			sdu_mac16->generic_hdr.Type = 0x01;	
			sdu->type_ = 1;	
			struct subhdr_pack* psh = SUBHDR_Pack(sdu);
			//printf("Add packing subheader FSN:%d\n",psh->FSN);
			psh->FSN = (psh->FSN + 1)%8;				
			if (sdu_hdr->size() < tmp_size) {
				//Add PACKing subheader; add SDU or SDU fragment					
				psh->FC = 0x0;
				psh->Length = sdu_hdr->size();
				tmp_size -= sdu_hdr->size();
				//printf("Need to Pack:\n");	
				Packet::free(sdu);
			} else {
				//add PACKing subheader; add fragment					
				psh->FC = 0x2;
				frag = sdu;   
				BsSF->PduQueue.enque(sdu);	
				//printf("[1]Complete a MPDU\nPacking with fragmetation; The remaining fragment is stored in queue\n");					
				tmp_size = PDUSIZE;								
			}
			Size--;
			goto BsStart;				
		} else {
			//Need fragmetation
        	sdu_mac16->generic_hdr.Type = 0x04; 
			sdu->type_ = 2;		
			if (BsSF->FragQueue.length() != 0) { 		
BsFragQueue:	
				//Fragment-queue is not empty;
				Packet::free(sdu);				
				frag = BsSF->FragQueue.deque();
				struct hdr_cmn* frag_hdr = HDR_CMN(frag);
				struct subhdr_frag* fsh = SUBHDR_Frag(frag);				
				//printf("Add fragmentation subheader FSN:%d\n",fsh->FSN);
				fsh->FSN = (fsh->FSN + 1)%8;				
				if (frag_hdr->size() <= tmp_size) {
					//Add SDU to payload
					//printf("Add SDU to payload\nLast Fragment\n");						
					if (frag_hdr->size() < tmp_size) {
						// last fragment  need pack
						fsh->FC = 0x1;
						tmp_size -= frag_hdr->size();
						Packet::free(frag);
					} else {
						// last fragment
						fsh->FC = 0x1;
						// printf("Complete a MPDU\n\n");							 
						tmp_size = PDUSIZE;	
						BsSF->PduQueue.enque(frag);					
					}	
				} else {
					// continue fragment	
					fsh->FC = 0x3;		
					//printf("Continue Fragment\n");
					int i = frag_hdr->size();
					frag_hdr->size() = tmp_size;
					BsSF->PduQueue.enque(frag->copy());
					frag_hdr->size() = i - tmp_size;
					BsSF->FragQueue.enque(frag);
					//printf("[2]Complete a MPDU\n The remaining fragment is stored in queue\n");					
					tmp_size = PDUSIZE;
					goto BsFragQueue;	
				}
			} else {
				//there're no fragments in fragment-queue
				struct hdr_cmn* sdu_hdr = HDR_CMN(sdu);
				struct subhdr_frag* fsh = SUBHDR_Frag(sdu);
				//printf("Add fragmentation subheader FSN:%d\n",fsh->FSN);
				fsh->FSN = (fsh->FSN + 1)%8;
				if (sdu_hdr->size() > tmp_size) {
					//need to fragmentation
					int i = sdu_hdr->size();
					sdu_hdr->size() = PDUSIZE;
					//printf("First Fragmentaton\n");					 					
					fsh->FC = 0x2;  //first fragment
					BsSF->PduQueue.enque(sdu->copy());
					sdu_hdr->size() = i - tmp_size;
					BsSF->FragQueue.enque(sdu);
					//printf("[3]Complete a MPDU\n The remaining fragment is stored in queue\n");					
					tmp_size = PDUSIZE;					
					goto BsFragQueue;
				}
			}
		}
		Size--;
	}
	//printf("[2]BS SDU num=%d PDU num=%d\n",BsSF->SduQueue.length(),BsSF->PduQueue.length());
	return;
}

void 
Mac802_16::SsFragOrPack(SsServiceFlow *SsSF, int Size)
{	
	//printf("[1]SS SDU num=%d PDU num=%d\n",SsSF->SduQueue.length(),SsSF->PduQueue.length());
	static int32_t tmp_size = PDUSIZE;	
	Packet* frag;
	Packet* sdu;
SsStart:	
	while (Size) {				
		sdu = SsSF->SduQueue.deque();		
		struct hdr_cmn* sdu_hdr = HDR_CMN(sdu);
	    struct hdr_mac802_16* sdu_mac16 = HDR_MAC802_16(sdu);		
		if (sdu_hdr->size() <= tmp_size) {
			//need to pack
			sdu_mac16->generic_hdr.Type = 0x01;	
			sdu->type_ = 1;	
			struct subhdr_pack* psh = SUBHDR_Pack(sdu);
			//printf("Add packing subheader FSN:%d\n",psh->FSN);
			psh->FSN = (psh->FSN + 1)%8;				
			if (sdu_hdr->size() < tmp_size) {
				//Add PACKing subheader; add SDU or SDU fragment					
				psh->FC = 0x0;
				psh->Length = sdu_hdr->size();
				tmp_size -= sdu_hdr->size();
				//printf("Need to Pack:\n");	
				Packet::free(sdu);
			} else {
				//add PACKing subheader; add fragment					
				psh->FC = 0x2;
				frag = sdu;
				SsSF->PduQueue.enque(sdu);	
				//printf("[1]Complete a MPDU\nPacking with fragmetation; The remaining fragment is stored in queue\n");					
				tmp_size = PDUSIZE;								
			}
			Size--;
			goto SsStart;				
		} else {
			//Need fragmetation
        	sdu_mac16->generic_hdr.Type = 0x04; 
			sdu->type_ = 2;		
			if (SsSF->FragQueue.length() != 0) { 		
SsFragQueue:	
				//Fragment-queue is not empty;
				Packet::free(sdu);		
				frag = SsSF->FragQueue.deque();
				struct hdr_cmn* frag_hdr = HDR_CMN(frag);
				struct subhdr_frag* fsh = SUBHDR_Frag(frag);				
				//printf("Add fragmentation subheader FSN:%d\n",fsh->FSN);
				fsh->FSN = (fsh->FSN + 1)%8;				
				if (frag_hdr->size() <= tmp_size) {
					//Add SDU to payload
					//printf("Add SDU to payload\nLast Fragment\n");						
					if (frag_hdr->size() < tmp_size) {
						// last fragment  need pack
						fsh->FC = 0x1;
						tmp_size -= frag_hdr->size();
						Packet::free(frag);
					} else {
						// last fragment
						fsh->FC = 0x1;
						// printf("Complete a MPDU\n\n");							 
						tmp_size = PDUSIZE;	
						SsSF->PduQueue.enque(frag);					
					}	
				} else {
					// continue fragment	
					fsh->FC = 0x3;		
					//printf("Continue Fragment\n");
					int i = frag_hdr->size();
					frag_hdr->size() = tmp_size;
					SsSF->PduQueue.enque(frag->copy());
					frag_hdr->size() = i - tmp_size;
					SsSF->FragQueue.enque(frag);
					//printf("[2]Complete a MPDU\n The remaining fragment is stored in queue\n");					
					tmp_size = PDUSIZE;
					goto SsFragQueue;	
				}
			} else {
				//there're no fragments in fragment-queue
				struct hdr_cmn* sdu_hdr = HDR_CMN(sdu);
				struct subhdr_frag* fsh = SUBHDR_Frag(sdu);
				//printf("Add fragmentation subheader FSN:%d\n",fsh->FSN);
				fsh->FSN = (fsh->FSN + 1)%8;
				if (sdu_hdr->size() > tmp_size) {
					//need to fragmentation
					int i = sdu_hdr->size();
					sdu_hdr->size() = PDUSIZE;
					//printf("First Fragmentaton\n");					 					
					fsh->FC = 0x2;  //first fragment
					SsSF->PduQueue.enque(sdu->copy());
					sdu_hdr->size() = i - tmp_size;
					SsSF->FragQueue.enque(sdu);
					//printf("[3]Complete a MPDU\n The remaining fragment is stored in queue\n");					
					tmp_size = PDUSIZE;					
					goto SsFragQueue;
				}
			}
		}
		Size--;
	}
	//printf("[2]SS SDU num=%d PDU num=%d\n",SsSF->SduQueue.length(),SsSF->PduQueue.length());*/
	return;
}

void
Mac802_16::BsBurstTransmit()
{
	BsServiceFlow *bssf = NULL;
	bssf = BsSF_head;
	while (bssf) {
		while (bssf->Direction == DL && bssf->PduQueue.length() != 0) {
			Packet *p = bssf->PduQueue.deque();
			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() = bssf->MacAddr;
			mac->macSA() = BsID;
			mac->set(MF_DATA, NodeID);
			state(MAC_SEND);
	
			hdr->uid() = 0;
			hdr->size() += sizeof(GenericHdr);
			hdr->iface() = -2;
			hdr->error() = 0; 
			hdr->txtime() = 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 = bssf->TransportCID;
			mac16->generic_hdr.HCS = 0;
			
			//printf("bs  send pkt\n");
			downtarget_->recv(p, this);
			bssf->QueueTime = Scheduler::instance().clock();			
		}		
		//printf("bs  SFID=%d\tSduQ=%d\tPduQ=%d\tFragQ=%d\n",bssf->SFID,bssf->SduQueue.length(),bssf->PduQueue.length(),bssf->FragQueue.length());
		bssf = bssf->next;
	}
	return;
}

void
Mac802_16::SsBurstTransmit()
{
	SsServiceFlow *sssf = NULL;
	sssf = SsSF_head;
	while (sssf) {
		while (sssf->PduQueue.length() != 0) {
			Packet *p = sssf->PduQueue.deque();
			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->size() += sizeof(GenericHdr);
			hdr->iface() = -2;
			hdr->error() = 0; 
			hdr->txtime() = 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 = sssf->TransportCID;
			mac16->generic_hdr.HCS = 0;
			
			//printf("  ss%d sendpkt\n",NodeID);
			downtarget_->recv(p, this);
			sssf->QueueTime = Scheduler::instance().clock();
		}	
		//printf("ss%d SFID=%d\tSduQ=%d\tPduQ=%d\tFragQ=%d\n",NodeID,sssf->SFID,sssf->SduQueue.length(),sssf->PduQueue.length(),sssf->FragQueue.length());
		sssf = sssf->next;
	}
	return;
}

BsSsInfo*
Mac802_16::BsSearchSsInfo(int MacAddr, int CID)
{
	BsSsInfo *ssinfo = NULL;
	ssinfo = BsSsInfo_head;

	if (CID != -1) {
		while (ssinfo) {
			if (ssinfo->BasicCID == CID || ssinfo->PrimaryCID == CID)
				return ssinfo; 
			else
				ssinfo = ssinfo->next;
		}
	} else {
		while (ssinfo) {
			if (ssinfo->MacAddr == MacAddr)
				return ssinfo; 
			else
				ssinfo = ssinfo->next;
		}		
	}
	return NULL;
}

BsSsInfo*
Mac802_16::BsCreateSsInfo(Packet *p)
{	
	struct hdr_mac *mac = HDR_MAC(p);
	RngReqMsg *rngreq = (RngReqMsg*) p->accessdata(); 
	printf("\tbs  create ss%d info\n", mac->macSA());
	
	BsSsInfo *ssinfo = new BsSsInfo;
	ssinfo->MacAddr = rngreq->SS_MAC_Address;
	ssinfo->BasicCID = BasicCID_Counter++;
	ssinfo->PrimaryCID = PrimaryCID_Counter++;
	
	switch (rngreq->Requested_Downlink_Burst_Profile - 1) {
		case 0:ssinfo->ModulCoding = QPSK_12; break;
		case 1:ssinfo->ModulCoding = QPSK_34; break;
		case 2:ssinfo->ModulCoding = QAM16_12; break;
		case 3:ssinfo->ModulCoding = QAM16_34; break;
		case 4:ssinfo->Modu

⌨️ 快捷键说明

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