📄 mac-802_16.cc
字号:
}
sendDSAACK(p);
}
}
} else if (hdr->ptype() == PT_DSAACK) {
if (dsaack->Transaction_ID >= 0x8000)
if (mac16->generic_hdr.CID == PrimaryCID)
mac_log(p);
} else {
sendUp(p);
return;
}
return;
}
} else {
callback_ = h;
if (NodeID == BsID) {
if (hdr->ptype() == PT_UGS) {
if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1))
BsCreateServiceFlow(p, DL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->SduQueue.length() == 0)
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_UGS, DL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_ertPS) {
if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1))
BsCreateServiceFlow(p, DL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->SduQueue.length() == 0)
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_ertPS, DL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_rtPS) {
if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1))
BsCreateServiceFlow(p, DL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->SduQueue.length() == 0)
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_rtPS, DL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_nrtPS) {
if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1))
BsCreateServiceFlow(p, DL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->SduQueue.length() == 0)
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->QueueTime = Scheduler::instance().clock();
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_nrtPS, DL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_BE) {
if (!BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1))
BsCreateServiceFlow(p, DL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->SduQueue.length() == 0)
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->QueueTime = Scheduler::instance().clock();
BsSearchServiceFlow(mac->macSA(), mac->macDA(), PT_BE, DL, -1, -1)->SduQueue.enque(p);
} else {
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
sendDown(p);
return;
}
resume (NULL);
if (BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1)->Status == Provisioned) {
sendDSAREQ(NULL, BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1));
BsSearchServiceFlow(mac->macSA(), mac->macDA(), hdr->ptype(), DL, -1, -1)->Status = Admitted;
}
} else {
if (hdr->ptype() == PT_UGS) {
if (!SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1))
SsCreateServiceFlow(p, UL);
if (SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->SduQueue.length() == 0)
SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
SsSearchServiceFlow(mac->macDA(), PT_UGS, UL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_ertPS) {
if (!SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1))
SsCreateServiceFlow(p, UL);
if (SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->SduQueue.length() == 0)
SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
SsSearchServiceFlow(mac->macDA(), PT_ertPS, UL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_rtPS) {
if (!SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1))
SsCreateServiceFlow(p, UL);
if (SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->SduQueue.length() == 0)
SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
SsSearchServiceFlow(mac->macDA(), PT_rtPS, UL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_nrtPS) {
if (!SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1))
SsCreateServiceFlow(p, UL);
if (SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->SduQueue.length() == 0)
SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
SsSearchServiceFlow(mac->macDA(), PT_nrtPS, UL, -1, -1)->SduQueue.enque(p);
} else if (hdr->ptype() == PT_BE) {
if (!SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1))
SsCreateServiceFlow(p, UL);
if (SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->SduQueue.length() == 0)
SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->QueueTime = Scheduler::instance().clock();
SsSearchServiceFlow(mac->macDA(), PT_BE, UL, -1, -1)->SduQueue.enque(p);
} else {
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
sendDown(p);
return;
}
resume (NULL);
if (RangingStatus && SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1)->Status == Provisioned) {
sendDSAREQ(SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1), NULL);
SsSearchServiceFlow(mac->macDA(), hdr->ptype(), UL, -1, -1)->Status = Admitted;
}
}
}
}
void
Mac802_16::sendUCD()
{
printf("bs send UCD\n");
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);
p->allocdata (sizeof (struct UcdMsg));
mac->macDA() = -1;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_UCD;
hdr->size() = sizeof(GenericHdr) + sizeof(UcdMsg) + MaxProfileNum*sizeof(UplinkBurstProfile)/2;
hdr->iface() = -2;
hdr->error() = 0;
hdr->txtime() = 2*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 = 0xFFFF;
mac16->generic_hdr.HCS = 0;
UcdMsg *ucd = (UcdMsg*) p->accessdata();
ucd->Management_Message_Type = 0x00;
ucd->Config_Change_Count = 0x01;
ucd->Rng_Backoff_Start = 0x00;
ucd->Rng_Backoff_End = 0x0F;
ucd->Req_Backoff_Start = 0x00;
ucd->Req_Backoff_End = 0x0F;
for (int i = 0; i < MaxProfileNum; i++) {
UplinkBurstProfile *tmp = new UplinkBurstProfile;
tmp->Type = 0x01;
tmp->Length = sizeof(UplinkBurstProfile);
tmp->UIUC = i+1;
tmp->FEC_Code_and_modulation_type.Value = i;
if (UlBurstProfile_head == NULL) {
UlBurstProfile_head = UlBurstProfile_tail = tmp;
tmp->next = NULL;
} else {
UlBurstProfile_tail->next = tmp;
UlBurstProfile_tail = tmp;
tmp->next = NULL;
}
}
/*Number of UL-MAPs to receive before contention-based reservation is attempted again for the same connection.*/
ucd->Contention_based_reservation_timeout.Value = 0x00;
/*Size (in units of PS) of PHY payload that SS may use to format and transmit a bandwidth request message in a contention request opportunity.
The value includes all PHY overhead as well as allowance for the MAC data the message may hold.*/
ucd->Bandwidth_request_opportunity_size.Value = 0x00;
/*Size (in units of PS) of PHY bursts that an SS may use to transmit a RNG-REQ message in a contention ranging request opportunity.
The value includes all PHY overhead as well as the maximum SS/BS round trip propagation delay.*/
ucd->Ranging_request_opportunity_size.Value = 0x00;
downtarget_->recv(p,this);
return;
}
void
Mac802_16::sendDCD()
{
printf("bs send DCD\n");
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);
p->allocdata (sizeof (struct DcdMsg));
mac->macDA() = -1;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DCD;
hdr->size() = sizeof(GenericHdr) + sizeof(DcdMsg) + MaxProfileNum*sizeof(DownlinkBurstProfile)/2;
hdr->iface() = -2;
hdr->error() = 0;
hdr->txtime() = 2*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 = 0xFFFF;
mac16->generic_hdr.HCS = 0;
DcdMsg *dcd = (DcdMsg*) p->accessdata();
dcd->Management_Message_Type = 0x00;
dcd->Config_Change_Count = 0x01;
for (int i = 0; i < MaxProfileNum; i++) {
DownlinkBurstProfile *tmp = new DownlinkBurstProfile;
tmp->DIUC = i+1;
tmp->FEC_Code_type.Value = i;
if (DlBurstProfile_head == NULL) {
DlBurstProfile_head = DlBurstProfile_tail = tmp;
tmp->next = NULL;
} else {
DlBurstProfile_tail->next = tmp;
DlBurstProfile_tail = tmp;
tmp->next = NULL;
}
}
/*Base Station ID.*/
dcd->BS_ID.Value = NodeID;
/*See 11.1.3.*/
dcd->MAC_version.Value = 0x04;
downtarget_->recv(p,this);
return;
}
void
Mac802_16::sendDLMAP()
{
printf("bs send DL-MAP\n");
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);
p->allocdata (sizeof (struct DlMapMsg));
mac->macDA() = -1;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DLMAP;
hdr->size() = sizeof(GenericHdr) + sizeof(DlMapMsg) + DlMapIeNum*sizeof(DlMapIe)/2;
hdr->iface() = -2;
hdr->error() = 0;
hdr->txtime() = 2*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 = 0xFFFF;
mac16->generic_hdr.HCS = 0;
DlMapMsg *dlmap = (DlMapMsg*) p->accessdata();
dlmap->Management_Message_Type = 2;
dlmap->DCD_Count = DCD_Counter;
dlmap->BS_ID = BsID;
dlmap->No_OFDMA_Symbols = DlSymbolNum;
dlmap->Frame_duration_code = 0x04;
dlmap->Frame_number = FrameNumber_Counter;
downtarget_->recv(p,this);
return;
}
void
Mac802_16::sendULMAP()
{
printf("bs send UL-MAP\n");
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);
p->allocdata (sizeof (struct UlMapMsg));
mac->macDA() = -1;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_ULMAP;
hdr->size() = sizeof(GenericHdr) + sizeof(UlMapMsg) + UlMapIeNum*sizeof(UlMapIe)/2;
hdr->iface() = -2;
hdr->error() = 0;
hdr->txtime() = 2*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 = 0xFFFF;
mac16->generic_hdr.HCS = 0;
UlMapMsg *ulmap = (UlMapMsg*) p->accessdata();
ulmap->Management_Message_Type = 0x03;
ulmap->UCD_Count = UCD_Counter;
ulmap->Allocation_Start_Time = (u_int32_t)Scheduler::instance().clock();
AllocationStartTime = Scheduler::instance().clock() //Current time
+ SymbolLength //Preamble interval
+ DlSymbolNum*SymbolLength //Downlink interval
+ TtgLength; //TTG interval
downtarget_->recv(p,this);
return;
}
void
Mac802_16::sendRNGREQ(UlMapIe *IE)
{
printf("ss%d send RNG-REQ\n", NodeID);
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);
p->allocdata (sizeof (struct RngReqMsg));
//ModulCoding = CalMod->search(NodeID)->ToMod(CalMod->search(0)->x,CalMod->search(0)->y);
mac->macDA() = BsID;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_RNGREQ;
hdr->size() = sizeof(GenericHdr) + sizeof(RngReqMsg);
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 = 0x0000;
mac16->generic_hdr.HCS = 0;
RngReqMsg *rngreq = (RngReqMsg*) p->accessdata();
rngreq->Management_Message_Type = 0x04;
rngreq->Requested_Downlink_Burst_Profile = DownlinkBurstProfileTable.DIUC;
rngreq->SS_MAC_Address = NodeID;
rngreq->Ranging_Anomalies = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -