📄 mac-802_16.cc
字号:
}
if (mac16->generic_hdr.CID == PrimaryCID) {
//printf("ss%d recv DSA-REQ\n",NodeID);
mac_log(p->copy());
if (!SsSearchServiceFlow(dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value, ptype, DL, -1, -1))
sendDSARSP(SsCreateServiceFlow(p, DL), NULL);
}
}
} else if (hdr->ptype() == PT_DSXRVD) {
if (mac16->generic_hdr.CID == PrimaryCID)
mac_log(p);
} else if (hdr->ptype() == PT_DSARSP) {
if (dsarsp->Transaction_ID <= 0x7FFF) {
if (mac16->generic_hdr.CID == PrimaryCID) {
mac_log(p->copy());
if (dsarsp->Confirmation_Code == 0x00) {
SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->Status = Active;
SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->TransportCID = dsarsp->Service_Flow_Parameters.CID.Value;
SsSearchServiceFlow(-1, PT_NTYPE, UL, dsarsp->Transaction_ID, -1)->SFID = dsarsp->Service_Flow_Parameters.SFID.Value;
}
sendDSAACK(p);
}
}
} else if (hdr->ptype() == PT_DSAACK) {
if (dsaack->Transaction_ID >= 0x8000)
if (mac16->generic_hdr.CID == PrimaryCID)
mac_log(p);
} else {
// if(hdr->ptype()==PT_AODV)
//printf("Node%d 接受来自上层的AODV信息\n",NodeID);
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 {
// if(hdr->ptype()==PT_AODV)
//printf("Node%d 接受来自下层的AODV信息\n",NodeID);
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 {
// if(hdr->ptype()==PT_AODV)
//printf("Node%d 接受来自下层的AODV信息\n",NodeID);
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -