📄 mac-802_16.cc
字号:
rngreq->AAS_broadcast_capability = 0;
uplinkTimer.start(IE->OFDMA_Symbol_offset*SymbolLength, p);
return;
}
void
Mac802_16::sendBWREQ(UlMapIe *IE)
{
printf("ss%d send BW-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);
mac->macDA() = BsID;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_BWREQ;
hdr->size() = sizeof(BwReqHdr);
hdr->iface() = -2;
hdr->error() = 0;
hdr->txtime() = txtime(hdr->size());
mac16->bwreq_hdr.HT = 1;
mac16->bwreq_hdr.EC = 1;
mac16->bwreq_hdr.Type = 1;
SsServiceFlow *sssf;
sssf = SsSF_head;
while (sssf) {
//ertPS Bandwidth Request
if (sssf->ScheduleType == 5)
if (Scheduler::instance().clock() - sssf->QueueTime >= (double)sssf->ToleratedJitter/1000 ) {
mac16->bwreq_hdr.BR += sssf->SduQueue.byteLength();
sssf->BwReqSize = sssf->SduQueue.byteLength();
}
//rtPS and nrtPS Bandwidth Request
if (sssf->ScheduleType >= 3 && sssf->ScheduleType <= 4)
if (Scheduler::instance().clock() - sssf->QueueTime >= (double)sssf->MaxLatency/1000 ) {
mac16->bwreq_hdr.BR += sssf->SduQueue.byteLength();
sssf->BwReqSize = sssf->SduQueue.byteLength();
}
sssf = sssf->next;
}
mac16->bwreq_hdr.CID = BasicCID;
mac16->bwreq_hdr.HCS = 0;
uplinkTimer.start(IE->OFDMA_Symbol_offset*SymbolLength, p);
return;
}
void
Mac802_16::sendRNGRSP(BsSsInfo *SsInfo)
{
printf("bs send RNG-RSP to ss%d\n", SsInfo->MacAddr);
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 RngRspMsg));
mac->macDA() = SsInfo->MacAddr;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_RNGRSP;
hdr->size() = sizeof(GenericHdr) + sizeof(RngRspMsg);
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;
RngRspMsg *rngrsp = (RngRspMsg*) p->accessdata();
rngrsp->Timing_Adjust = 0;
rngrsp->Power_Level_Adjust = 0;
rngrsp->Offset_Frequency_Adjust = 0;
rngrsp->Ranging_Status = 3;
rngrsp->Downlink_frequency_override = 0;
rngrsp->Uplink_channel_ID_override = 0;
rngrsp->Downlink_Operational_Burst_Profile = 0;
rngrsp->SS_MAC_Address = SsInfo->MacAddr;
rngrsp->Basic_CID = SsInfo->BasicCID;
rngrsp->Primary_Management_CID = SsInfo->PrimaryCID;
rngrsp->AAS_broadcast_permission = 0;
downtarget_->recv(p,this);
return;
}
void
Mac802_16::sendDSAREQ(SsServiceFlow *SsSF, BsServiceFlow *BsSF)
{
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 DsaReqMsg));
if(NodeID == BsID) {
printf("bs send DSA-REQ to ss%d\n", BsSF->MacAddr);
mac->macDA() = BsSF->MacAddr;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DSAREQ;
hdr->size() = sizeof(GenericHdr) + sizeof(DsaReqMsg);
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 = BsSearchSsInfo(BsSF->MacAddr, -1)->PrimaryCID;
mac16->generic_hdr.HCS = 0;
DsaReqMsg *dsareq = (DsaReqMsg*) p->accessdata();
dsareq->Management_Message_Type = 11;
dsareq->Transaction_ID = BsSF->TransactionID;
dsareq->Service_Flow_Parameters.CID.Value = BsSF->TransportCID;
dsareq->Service_Flow_Parameters.SFID.Value = BsSF->SFID;
dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = BsSF->ScheduleType;
if (BsSF->Status == Provisioned) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 1;
} else if (BsSF->Status == Admitted) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 2;
} else if (BsSF->Status == Active) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 4;
}
dsareq->Service_Flow_Parameters.Traffic_Priority.Value = BsSF->TrafficPriority;
dsareq->Service_Flow_Parameters.Maximum_Sustained_Traffic_Rate.Value = BsSF->MaxTrafficRate;
dsareq->Service_Flow_Parameters.Minimum_Reserved_Traffic_Rate.Value = BsSF->MinTrafficRate;
dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = BsSF->ScheduleType;
dsareq->Service_Flow_Parameters.Request_Transmission_Policy.Value = BsSF->ReqTxPolicy;
dsareq->Service_Flow_Parameters.Tolerated_Jitter.Value = BsSF->ToleratedJitter;
dsareq->Service_Flow_Parameters.Maximum_Latency.Value = BsSF->MaxLatency;
dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value = BsSF->DstMacAddr;
dsareq->Service_Flow_Parameters.Source_MAC_Address.Value = BsSF->SrcMacAddr;
} else {
printf("ss%d send DSA-REQ\n", NodeID);
mac->macDA() = BsID;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DSAREQ;
hdr->size() = sizeof(GenericHdr) + sizeof(DsaReqMsg);
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 = PrimaryCID;
mac16->generic_hdr.HCS = 0;
DsaReqMsg *dsareq = (DsaReqMsg*) p->accessdata();
dsareq->Management_Message_Type = 11;
dsareq->Transaction_ID = SsSF->TransactionID;
dsareq->Service_Flow_Parameters.SFID.Value = 0;
if (SsSF->Status == Provisioned) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 1;
} else if (SsSF->Status == Admitted) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 2;
} else if (SsSF->Status == Active) {
dsareq->Service_Flow_Parameters.QoS_Parameter_Set_Type.Value = 4;
}
dsareq->Service_Flow_Parameters.Traffic_Priority.Value = SsSF->TrafficPriority;
dsareq->Service_Flow_Parameters.Maximum_Sustained_Traffic_Rate.Value = SsSF->MaxTrafficRate;
dsareq->Service_Flow_Parameters.Minimum_Reserved_Traffic_Rate.Value = SsSF->MinTrafficRate;
dsareq->Service_Flow_Parameters.Service_Flow_Scheduling_Type.Value = SsSF->ScheduleType;
dsareq->Service_Flow_Parameters.Request_Transmission_Policy.Value = SsSF->ReqTxPolicy;
dsareq->Service_Flow_Parameters.Tolerated_Jitter.Value = SsSF->ToleratedJitter;
dsareq->Service_Flow_Parameters.Maximum_Latency.Value = SsSF->MaxLatency;
dsareq->Service_Flow_Parameters.Destination_MAC_Address.Value = SsSF->DstMacAddr;
dsareq->Service_Flow_Parameters.Source_MAC_Address.Value = SsSF->SrcMacAddr;
}
if (Scheduler::instance().clock() >= AllocationStartTime && Scheduler::instance().clock() <= AllocationStartTime + UlSymbolNum*SymbolLength) {
downtarget_->recv(p, this);
} else {
if (NodeID == BsID) {
if (Scheduler::instance().clock() < AllocationStartTime)
downlinkTimer.start(AllocationStartTime - Scheduler::instance().clock(), p);
else
downlinkTimer.start(Scheduler::instance().clock() - AllocationStartTime, p);
} else {
if (Scheduler::instance().clock() < AllocationStartTime)
uplinkTimer.start(AllocationStartTime - Scheduler::instance().clock(), p);
else
uplinkTimer.start(Scheduler::instance().clock() - AllocationStartTime, p);
}
}
return;
}
void
Mac802_16::sendDSARSP(SsServiceFlow *SsSF, BsServiceFlow *BsSF)
{
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 DsaRspMsg));
if(NodeID == BsID) {
printf("bs send DSA-RSP to ss%d\n", BsSF->MacAddr);
mac->macDA() = BsSF->MacAddr;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DSARSP;
hdr->size() = sizeof(GenericHdr) + sizeof(DsaRspMsg);
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 = BsSearchSsInfo(BsSF->MacAddr, -1)->PrimaryCID;
mac16->generic_hdr.HCS = 0;
DsaRspMsg *dsarsp = (DsaRspMsg*) p->accessdata();
dsarsp->Management_Message_Type = 30;
dsarsp->Transaction_ID = BsSF->TransactionID;
dsarsp->Confirmation_Code = 0x00;
dsarsp->Service_Flow_Parameters.CID.Value = BsSF->TransportCID;
dsarsp->Service_Flow_Parameters.SFID.Value = BsSF->SFID;
} else {
printf("ss%d send DSA-RSP\n", NodeID);
mac->macDA() = BsID;
mac->macSA() = NodeID;
mac->set(MF_DATA, NodeID);
state(MAC_SEND);
hdr->uid() = 0;
hdr->ptype() = PT_DSARSP;
hdr->size() = sizeof(GenericHdr) + sizeof(DsaRspMsg);
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 = PrimaryCID;
mac16->generic_hdr.HCS = 0;
DsaRspMsg *dsarsp = (DsaRspMsg*) p->accessdata();
dsarsp->Management_Message_Type = 30;
dsarsp->Transaction_ID = SsSF->TransactionID;
dsarsp->Confirmation_Code = 0x00;
dsarsp->Service_Flow_Parameters.CID.Value = SsSF->TransportCID;
dsarsp->Service_Flow_Parameters.SFID.Value = SsSF->SFID;
}
downtarget_->recv(p,this);
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);
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -