📄 mac-802_16.cc
字号:
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;
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); BsMsgQueue.enque(p);//如果这是SS发送的测距请求,将p保存在SS的控制包队列
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; BsMsgQueue.enque(p);//如果这是BS发送的服务流添加请求,将p保存在BS的控制包队列
} 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; SsMsgQueue.enque(p);//如果是SS发送的服务流添加请求,将p保存在SS的控制包队列
}//原补丁中被注释掉的以下代码是不符合协议要求的/*
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; BsMsgQueue.enque(p);//如果这是BS发送的服务流添加回复,将p保存在BS的控制包队列
} 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; SsMsgQueue.enque(p);//如果这是SS发送的服务流添加回复,将p保存在SS的控制包队列
}
//downtarget_->recv(p,this);这是原补丁的内容
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -