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