📄 mac-802_16.cc
字号:
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);
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;
while (bssf) {
if (bssf->Direction == DL && bssf->Status == Active && bssf->ScheduleType == 2 && BsSearchSsInfo(bssf->MacAddr, -1)->BasicCID == dlmapie->CID) {
//printf("Downlink Bandwidth %d CID %d BE SFID=%d req size %d[%d]\n",Bandwidth,dlmapie->CID,bssf->SFID,Bandwidth*bssf->TrafficPriority/TrafficPriority,bssf->SduQueue.count(Bandwidth*bssf->TrafficPriority/TrafficPriority));
BsFragOrPack(bssf, bssf->SduQueue.count(Bandwidth*bssf->TrafficPriority/TrafficPriority));
//printf("\tbs SduQ=%d\tPduQ=%d\n",bssf->SduQueue.byteLength(),bssf->PduQueue.byteLength());
}
bssf = bssf->next;
}
}
}
dlmapie = dlmapie->next;
}
BsBurstTransmit();
return;
}
void
Mac802_16::SsScheduler()
{
UlMapIe *ulmapie;
if (!RangingStatus) {
//Initial Ranging IE
ulmapie = UlMapIe_head;
while (ulmapie) {
if (ulmapie->UIUC == 0xC && ulmapie->CID == 0xFFFF)
sendRNGREQ(ulmapie);
ulmapie = ulmapie->next;
}
} else {
//Data Grant IE
ulmapie = UlMapIe_head;
while (ulmapie) {
if (ulmapie->UIUC != 0xC && ulmapie->CID == BasicCID) {
int Bandwidth = 0;
int TrafficPriority = 0;
switch (ModulCoding) {
case QPSK_12: Bandwidth = ulmapie->Duration*6*3; break;
case QPSK_34: Bandwidth = ulmapie->Duration*9*3; break;
case QAM16_12:Bandwidth = ulmapie->Duration*12*3; break;
case QAM16_34:Bandwidth = ulmapie->Duration*18*3; break;
case QAM64_23:Bandwidth = ulmapie->Duration*24*3; break;
case QAM64_34:Bandwidth = ulmapie->Duration*27*3; break;
}
SsServiceFlow *sssf;
sssf = SsSF_head;
while (sssf) {
if (sssf->Status == Active && sssf->ScheduleType == 6) {
//printf("Uplink Bandwidth %d UGS SFID=%d req size %d[%d]\n",Bandwidth,sssf->SFID,sssf->SduQueue.byteLength(),sssf->SduQueue.count(sssf->SduQueue.byteLength()));
SsFragOrPack(sssf, sssf->SduQueue.count(sssf->SduQueue.byteLength()));
Bandwidth -= sssf->PduQueue.byteLength();
//printf("\tss SduQ=%d\tPduQ=%d\n",sssf->SduQueue.byteLength(),sssf->PduQueue.byteLength());
}
if (sssf->Status == Active && sssf->BwReqSize != 0 && sssf->ScheduleType >= 3 && sssf->ScheduleType <= 5 ) {
//printf("Uplink Bandwidth %d Polling SFID=%d req size %d[%d]\n",Bandwidth,sssf->SFID,sssf->BwReqSize,sssf->SduQueue.count(sssf->BwReqSize));
SsFragOrPack(sssf, sssf->SduQueue.count(sssf->BwReqSize));
sssf->BwReqSize = 0;
Bandwidth -= sssf->PduQueue.byteLength();
//printf("\tss SduQ=%d\tPduQ=%d\n",sssf->SduQueue.byteLength(),sssf->PduQueue.byteLength());
}
if (sssf->Status == Active && sssf->ScheduleType == 2) {
TrafficPriority += sssf->TrafficPriority;
}
sssf = sssf->next;
}
if (Bandwidth > 0 && TrafficPriority > 0) {
sssf = SsSF_head;
while (sssf) {
if (sssf->Status == Active && sssf->ScheduleType == 2) {
//printf("Uplink Bandwidth %d BE SFID=%d req size %d[%d]\n",Bandwidth,sssf->SFID,Bandwidth*sssf->TrafficPriority/TrafficPriority,sssf->SduQueue.count(Bandwidth*sssf->TrafficPriority/TrafficPriority));
SsFragOrPack(sssf, sssf->SduQueue.count(Bandwidth*sssf->TrafficPriority/TrafficPriority));
//printf("\tss SduQ=%d\tPduQ=%d\n",sssf->SduQueue.byteLength(),sssf->PduQueue.byteLength());
}
sssf = sssf->next;
}
}
}
ulmapie = ulmapie->next;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -