23 #include "ns3/simulator.h"
24 #include "ns3/packet.h"
25 #include "service-flow.h"
26 #include "service-flow-manager.h"
28 #include "wimax-net-device.h"
29 #include "bs-net-device.h"
30 #include "ss-net-device.h"
31 #include "ss-record.h"
32 #include "ns3/pointer.h"
34 #include "wimax-connection.h"
35 #include "ss-manager.h"
36 #include "connection-manager.h"
37 #include "bs-uplink-scheduler.h"
38 #include "ss-scheduler.h"
39 #include "ns3/buffer.h"
40 #include "service-flow-record.h"
48 m_maxDsaReqRetries (100),
51 m_currentTransactionId (0),
52 m_transactionIdIndex (1),
54 m_pendingServiceFlow (0)
58 SsServiceFlowManager::~SsServiceFlowManager (
void)
71 m_maxDsaReqRetries = maxDsaReqRetries;
77 return m_maxDsaReqRetries;
81 SsServiceFlowManager::GetDsaRspTimeoutEvent (
void)
const
83 return m_dsaRspTimeoutEvent;
87 SsServiceFlowManager::GetDsaAckTimeoutEvent (
void)
const
89 return m_dsaAckTimeoutEvent;
96 sf->CopyParametersFrom (serviceFlow);
97 ServiceFlowManager::AddServiceFlow (sf);
103 ServiceFlowManager::AddServiceFlow (serviceFlow);
108 SsServiceFlowManager::InitiateServiceFlows (
void)
111 NS_ASSERT_MSG (serviceFlow != 0,
"Error while initiating a new service flow: All service flows have been initiated");
112 m_pendingServiceFlow = serviceFlow;
113 ScheduleDsaReq (m_pendingServiceFlow);
117 SsServiceFlowManager::CreateDsaReq (
const ServiceFlow *serviceFlow)
120 dsaReq.SetTransactionId (m_transactionIdIndex);
121 m_currentTransactionId = m_transactionIdIndex++;
125 dsaReq.SetServiceFlow (*serviceFlow);
131 SsServiceFlowManager::CreateDsaAck (
void)
134 dsaAck.SetTransactionId (m_dsaReq.GetTransactionId ());
135 dsaAck.SetConfirmationCode (CONFIRMATION_CODE_SUCCESS);
137 Ptr<Packet> p = Create<Packet> ();
138 p->AddHeader (dsaAck);
139 p->AddHeader (ManagementMessageType (ManagementMessageType::MESSAGE_TYPE_DSA_ACK));
144 SsServiceFlowManager::ScheduleDsaReq (
const ServiceFlow *serviceFlow)
146 Ptr<Packet> p = Create<Packet> ();
148 Ptr<SubscriberStationNetDevice> ss = m_device->GetObject<SubscriberStationNetDevice> ();
150 if (m_dsaReqRetries == 0)
152 dsaReq = CreateDsaReq (serviceFlow);
153 p->AddHeader (dsaReq);
158 if (m_dsaReqRetries <= m_maxDsaReqRetries)
160 p->AddHeader (m_dsaReq);
164 NS_LOG_DEBUG (
"Service flows could not be initialized!");
169 p->AddHeader (ManagementMessageType (ManagementMessageType::MESSAGE_TYPE_DSA_REQ));
177 &SsServiceFlowManager::ScheduleDsaReq,
181 m_device->Enqueue (p, MacHeaderType (), ss->GetPrimaryConnection ());
186 SsServiceFlowManager::ProcessDsaRsp (
const DsaRsp &dsaRsp)
189 Ptr<SubscriberStationNetDevice> ss = m_device->GetObject<SubscriberStationNetDevice> ();
192 if (dsaRsp.GetTransactionId () != m_currentTransactionId)
197 Ptr<Packet> dsaAck = CreateDsaAck ();
198 m_device->Enqueue (dsaAck, MacHeaderType (), ss->GetPrimaryConnection ());
201 if (m_pendingServiceFlow == NULL)
206 ServiceFlow sf = dsaRsp.GetServiceFlow ();
207 (*m_pendingServiceFlow) = sf;
208 m_pendingServiceFlow->SetUnsolicitedGrantInterval (1);
209 m_pendingServiceFlow->SetUnsolicitedPollingInterval (1);
210 Ptr<WimaxConnection> transportConnection = CreateObject<WimaxConnection> (sf.GetCid (),
213 m_pendingServiceFlow->SetConnection (transportConnection);
214 transportConnection->SetServiceFlow (m_pendingServiceFlow);
215 ss->GetConnectionManager ()->AddConnection (transportConnection,
217 m_pendingServiceFlow->SetIsEnabled (
true);
218 m_pendingServiceFlow = 0;
221 if (serviceFlow == 0)
223 ss->SetAreServiceFlowsAllocated (
true);
227 m_pendingServiceFlow = serviceFlow;
228 ScheduleDsaReq (m_pendingServiceFlow);
smart pointer class similar to boost::intrusive_ptr
#define NS_LOG_COMPONENT_DEFINE(name)
ServiceFlow * GetNextServiceFlowToAllocate()
static void Cancel(const EventId &id)
bool IsRunning(void) const
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
void AddServiceFlow(ServiceFlow *serviceFlow)
add a service flow to the list
void SetMaxDsaReqRetries(uint8_t maxDsaReqRetries)
sets the maximum retries on DSA request message
SsServiceFlowManager(Ptr< SubscriberStationNetDevice > device)
creates a service flow manager and attaches it to a device
uint8_t GetMaxDsaReqRetries(void) const
#define NS_ASSERT_MSG(condition, message)
an identifier for simulation events.
#define NS_LOG_DEBUG(msg)