23 #include "bs-link-manager.h"
26 #include "ns3/packet.h"
27 #include "ns3/simulator.h"
29 #include "burst-profile-manager.h"
30 #include "ss-record.h"
31 #include "ss-manager.h"
32 #include "bs-uplink-scheduler.h"
33 #include "connection-manager.h"
39 NS_OBJECT_ENSURE_REGISTERED (BSLinkManager);
41 TypeId BSLinkManager::GetTypeId (
void)
43 static TypeId tid = TypeId (
"ns3::BSLinkManager")
44 .SetParent<Object> ();
48 BSLinkManager::BSLinkManager (Ptr<BaseStationNetDevice> bs)
51 m_signalQualityThreshold (10)
56 BSLinkManager::~BSLinkManager (
void)
65 return rand () % 8 + 2;
74 NS_ASSERT_MSG (m_bs->GetState () == BaseStationNetDevice::BS_STATE_UL_SUB_FRAME,
75 "Base station: Error while processing ranging request: !BS_STATE_UL_SUB_FRAME");
79 if (m_bs->GetUplinkScheduler ()->GetIsInvIrIntrvlAllocated ())
81 if (m_bs->GetUplinkScheduler ()->GetIsIrIntrvlAllocated ())
83 irIntervalBoundary = m_bs->GetUlSubframeStartTime ()
84 +
Seconds ((m_bs->GetUplinkScheduler ()->GetNrIrOppsAllocated () + 1) * m_bs->GetRangReqOppSize ()
85 * m_bs->GetSymbolDuration ().GetSeconds ());
89 irIntervalBoundary = m_bs->GetUlSubframeStartTime () +
Seconds (m_bs->GetRangReqOppSize ()
90 * m_bs->GetSymbolDuration ().GetSeconds ());
95 NS_ASSERT_MSG (m_bs->GetUplinkScheduler ()->GetIsIrIntrvlAllocated (),
96 "Base station: Error while processing ranging request: IR interval not allocated");
98 irIntervalBoundary = m_bs->GetUlSubframeStartTime ()
99 +
Seconds (m_bs->GetUplinkScheduler ()->GetNrIrOppsAllocated () * m_bs->GetRangReqOppSize ()
100 * m_bs->GetSymbolDuration ().GetSeconds ());
107 PerformRanging (cid, rngreq);
112 BSLinkManager::PerformRanging (
Cid cid,
RngReq rngreq)
115 bool decodable =
false;
128 rngreq.PrintDebug ();
132 rngrsp.SetFrameNumber (m_bs->GetNrFrames ());
133 rngrsp.SetInitRangOppNumber (m_bs->GetRangingOppNumber ());
135 SetParametersToAdjust (&rngrsp);
136 rngrsp.SetRangStatus (WimaxNetDevice::RANGING_STATUS_CONTINUE);
137 ScheduleRngRspMessage (cid, &rngrsp);
143 PerformInitialRanging (cid, &rngreq, &rngrsp);
148 PerformInvitedRanging (cid, &rngrsp);
154 BSLinkManager::PerformInitialRanging (Cid cid, RngReq *rngreq, RngRsp *rngrsp)
157 SSRecord *ssRecord = 0;
158 bool isOldSS = m_bs->GetSSManager ()->IsInRecord (rngreq->GetMacAddress ());
161 ssRecord = m_bs->GetSSManager ()->GetSSRecord (rngreq->GetMacAddress ());
166 ssRecord = m_bs->GetSSManager ()->CreateSSRecord (rngreq->GetMacAddress ());
169 if (ChangeDlChannel ())
171 rngrsp->SetDlFreqOverride (GetNewDlChannel ());
172 AbortRanging (cid, rngrsp, ssRecord, isOldSS);
179 ssRecord->ResetRangingCorrectionRetries ();
180 ssRecord->ResetInvitedRangingRetries ();
184 m_bs->GetConnectionManager ()->AllocateManagementConnections (ssRecord, rngrsp);
186 WimaxPhy::ModulationType modulationType;
187 uint8_t diuc = m_bs->GetBurstProfileManager ()->GetBurstProfileForSS (ssRecord, rngreq, modulationType);
188 ssRecord->SetModulationType (modulationType);
191 if (rngreq->GetReqDlBurstProfile () != diuc)
193 rngrsp->SetDlOperBurstProfile (diuc);
197 ssRecord->EnablePollForRanging ();
200 rngrsp->SetMacAddress (rngreq->GetMacAddress ());
204 cid = ssRecord->GetBasicCid ();
207 if (IsRangingAcceptable ())
209 AcceptRanging (cid, rngrsp, ssRecord);
213 ContinueRanging (cid, rngrsp, ssRecord);
218 BSLinkManager::PerformInvitedRanging (Cid cid, RngRsp *rngrsp)
220 SSRecord *ssRecord = m_bs->GetSSManager ()->GetSSRecord (cid);
221 ssRecord->IncrementRangingCorrectionRetries ();
222 ssRecord->ResetInvitedRangingRetries ();
224 if (IsRangingAcceptable ())
226 AcceptRanging (cid, rngrsp, ssRecord);
230 if (ssRecord->GetRangingCorrectionRetries () == m_bs->GetMaxRangingCorrectionRetries ())
232 AbortRanging (cid, rngrsp, ssRecord,
true);
236 ContinueRanging (cid, rngrsp, ssRecord);
244 if (uiuc == OfdmUlBurstProfile::UIUC_INITIAL_RANGING)
246 SSRecord *ssRecord = m_bs->GetSSManager ()->GetSSRecord (cid);
247 if (ssRecord->GetInvitedRangRetries () > 0)
249 ssRecord->IncrementInvitedRangingRetries ();
251 if (ssRecord->GetInvitedRangRetries () == m_bs->GetMaxInvitedRangRetries ())
254 AbortRanging (ssRecord->GetBasicCid (), rngrsp, ssRecord,
true);
261 BSLinkManager::SetParametersToAdjust (
RngRsp *rngrsp)
270 BSLinkManager::AbortRanging (Cid cid, RngRsp *rngrsp, SSRecord *ssRecord,
bool isOldSS)
272 rngrsp->SetRangStatus (WimaxNetDevice::RANGING_STATUS_ABORT);
273 ScheduleRngRspMessage (cid, rngrsp);
277 ssRecord->SetRangingStatus (WimaxNetDevice::RANGING_STATUS_ABORT);
280 ssRecord->DisablePollForRanging ();
281 DeallocateCids (cid);
285 BSLinkManager::AcceptRanging (Cid cid, RngRsp *rngrsp, SSRecord *ssRecord)
287 rngrsp->SetRangStatus (WimaxNetDevice::RANGING_STATUS_SUCCESS);
288 ScheduleRngRspMessage (cid, rngrsp);
293 ssRecord->SetRangingStatus (WimaxNetDevice::RANGING_STATUS_SUCCESS);
295 ssRecord->DisablePollForRanging ();
299 BSLinkManager::ContinueRanging (Cid cid, RngRsp *rngrsp, SSRecord *ssRecord)
301 rngrsp->SetRangStatus (WimaxNetDevice::RANGING_STATUS_CONTINUE);
302 ScheduleRngRspMessage (cid, rngrsp);
303 ssRecord->SetRangingStatus (WimaxNetDevice::RANGING_STATUS_CONTINUE);
307 BSLinkManager::ScheduleRngRspMessage (Cid cid, RngRsp *rngrsp)
309 if (rngrsp->GetRangStatus () == WimaxNetDevice::RANGING_STATUS_SUCCESS || rngrsp->GetRangStatus ()
310 == WimaxNetDevice::RANGING_STATUS_CONTINUE)
312 SetParametersToAdjust (rngrsp);
315 Ptr<Packet> p = Create<Packet> ();
316 p->AddHeader (*rngrsp);
317 p->AddHeader (ManagementMessageType (ManagementMessageType::MESSAGE_TYPE_RNG_RSP));
319 m_bs->Enqueue (p, MacHeaderType (), m_bs->GetConnection (cid));
323 BSLinkManager::DeallocateCids (Cid cid)
336 return m_bs->GetChannel (1);
340 BSLinkManager::ChangeDlChannel (
void)
347 BSLinkManager::GetNewDlChannel (
void)
354 BSLinkManager::GetSignalQuality (
void)
357 uint8_t signalQuality = m_signalQuality;
359 return signalQuality;
363 BSLinkManager::IsRangingAcceptable (
void)
365 return GetSignalQuality () > m_signalQualityThreshold;
void SetPowerLevelAdjust(uint8_t powerLevelAdjust)
set the relative change in transmission power level that the SS should make in order that transmissio...
#define NS_LOG_COMPONENT_DEFINE(name)
void ProcessRangingRequest(Cid cid, RngReq rngreq)
process a ranging request message
uint64_t SelectDlChannel(void)
bool IsInitialRanging(void) const
void SetTimingAdjust(uint32_t timingAdjust)
set the Tx timing offset adjustment (signed 32-bit).
void SetOffsetFreqAdjust(uint32_t offsetFreqAdjust)
set the relative change in transmission frequency that the SS should take in order to better match th...
#define NS_ASSERT_MSG(condition, message)
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
#define NS_LOG_DEBUG(msg)
void VerifyInvitedRanging(Cid cid, uint8_t uiuc)
Verifies at the end of an invited ranging interval if SS sent ranging message in it or not...
This class is used by the base station to store some information related to subscriber station in the...
uint8_t CalculateRangingOppsToAllocate(void)