📄 mac-802_16.cc
字号:
//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 + -