A Discrete-Event Network Simulator
API
bs-service-flow-manager.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007,2008, 2009 INRIA, UDcast
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Authors: Jahanzeb Farooq <jahanzeb.farooq@sophia.inria.fr>
19  * Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
20  */
21 
22 #include <stdint.h>
23 #include "ns3/node.h"
24 #include "ns3/simulator.h"
25 #include "ns3/packet.h"
26 #include "service-flow.h"
27 #include "service-flow-manager.h"
28 #include "ns3/log.h"
29 #include "bs-net-device.h"
30 #include "ss-record.h"
31 #include "ns3/pointer.h"
32 #include "ns3/enum.h"
33 #include "wimax-connection.h"
34 #include "ss-manager.h"
35 #include "connection-manager.h"
36 #include "bs-uplink-scheduler.h"
37 #include "ss-scheduler.h"
38 #include "ns3/buffer.h"
39 #include "service-flow-record.h"
40 
41 namespace ns3 {
42 
43 NS_LOG_COMPONENT_DEFINE ("BsServiceFlowManager");
44 
46  : m_device (device),
47  m_sfidIndex (100),
48  m_maxDsaRspRetries (100) // default value
49 {
51 }
52 
54 {
55 }
56 
57 /* static */
58 TypeId
60 {
61  static TypeId tid = TypeId ("ns3::BsServiceFlowManager")
63  .SetGroupName ("Wifi")
64  // No AddConstructor because this class has no default constructor.
65  ;
66  return tid;
67 }
68 
69 void
71 {
73 }
74 
75 void
77 {
78  m_maxDsaRspRetries = maxDsaRspRetries;
79 }
80 
81 uint8_t
83 {
84  return m_maxDsaRspRetries;
85 }
86 
87 EventId
89 {
90  return m_dsaAckTimeoutEvent;
91 }
92 
93 void
95 {
97 }
98 
101 {
103 }
104 
107 {
109 }
110 
111 std::vector<ServiceFlow*>
113 {
114  return ServiceFlowManager::GetServiceFlows (schedulingType);
115 }
116 
117 DsaRsp
118 BsServiceFlowManager::CreateDsaRsp (const ServiceFlow *serviceFlow, uint16_t transactionId)
119 {
120  DsaRsp dsaRsp;
121  dsaRsp.SetTransactionId (transactionId);
122  dsaRsp.SetServiceFlow (*serviceFlow);
123  // assuming SS can supports all of the service flow parameters
125 
126  return dsaRsp;
127 }
128 
129 void
131 {
133 
134  SSRecord *ssRecord = bs->GetSSManager ()->GetSSRecord (cid);
135  if (ssRecord == 0)
136  {
137  NS_LOG_INFO ("SS not registered with the BS CID:" << cid);
138  return;
139  }
140 
141  serviceFlow->SetIsEnabled (true);
142  serviceFlow->SetType (ServiceFlow::SF_TYPE_ACTIVE);
143  ssRecord->AddServiceFlow (serviceFlow);
144 
145 
146  bs->GetUplinkScheduler ()->SetupServiceFlow (ssRecord, serviceFlow);
147 
148  Ptr<Packet> p = Create<Packet> ();
149  DsaRsp dsaRsp;
150 
151  if (ssRecord->GetDsaRspRetries () == 0)
152  {
153  dsaRsp = CreateDsaRsp (serviceFlow, ssRecord->GetSfTransactionId ());
154  p->AddHeader (dsaRsp);
155  ssRecord->SetDsaRsp (dsaRsp);
156  }
157  else
158  {
159  if (ssRecord->GetDsaRspRetries () < m_maxDsaRspRetries)
160  {
161  p->AddHeader (ssRecord->GetDsaRsp ());
162  }
163  else
164  {
165  NS_LOG_DEBUG ("Service flows could not be initialized!");
166  }
167  }
168 
169  ssRecord->IncrementDsaRspRetries ();
171 
173  {
175  }
176 
178 
179  m_dsaAckTimeoutEvent = Simulator::Schedule (bs->GetIntervalT8 (),
181  this,
182  serviceFlow,
183  cid);
184  m_device->Enqueue (p, MacHeaderType (), bs->GetConnection (ssRecord->GetPrimaryCid ()));
185 }
186 
189 {
190  ServiceFlow * serviceFlow;
192  SSRecord *ssRecord = bs->GetSSManager ()->GetSSRecord (cid);
193 
194  NS_LOG_INFO ("BsServiceFlowManager: Processing DSA-REQ...");
195  if (ssRecord->GetSfTransactionId () != 0)
196  {
197  // had already received DSA-REQ. DSA-RSP was lost
198  NS_ASSERT_MSG (dsaReq.GetTransactionId () == ssRecord->GetSfTransactionId (),
199  "Error while processing DSA request:the received transaction ID is not expected");
200  serviceFlow = GetServiceFlow (ssRecord->GetDsaRsp ().GetSfid ());
201  }
202  else
203  {
204  ServiceFlow sf = dsaReq.GetServiceFlow ();
205  Ptr<WimaxConnection> transportConnection;
206  Ptr<ConnectionManager> BsConManager = bs->GetConnectionManager ();
207  transportConnection = BsConManager->CreateConnection (Cid::TRANSPORT);
208  serviceFlow = new ServiceFlow (m_sfidIndex++, sf.GetDirection (), transportConnection);
209  transportConnection->SetServiceFlow (serviceFlow);
210  serviceFlow->CopyParametersFrom (sf);
211  serviceFlow->SetUnsolicitedGrantInterval (1);
212  serviceFlow->SetUnsolicitedPollingInterval (1);
214  AddServiceFlow (serviceFlow);
215  ssRecord->SetSfTransactionId (dsaReq.GetTransactionId ());
216  NS_LOG_INFO ("BsServiceFlowManager: Creating a new Service flow: SFID = " << serviceFlow->GetSfid () << " CID = "
217  << serviceFlow->GetCid ());
218  }
219  return serviceFlow;
220 }
221 
222 void
224 {
225  ServiceFlow * serviceFlow = new ServiceFlow ();
226  serviceFlow->CopyParametersFrom (sf);
228  Ptr<WimaxConnection> multicastConnection = bs->GetConnectionManager ()->CreateConnection (Cid::MULTICAST);
229  serviceFlow->SetConnection (multicastConnection);
230  AddServiceFlow (serviceFlow);
231  serviceFlow->SetIsEnabled (true);
232  serviceFlow->SetType (ServiceFlow::SF_TYPE_ACTIVE);
233  serviceFlow->SetIsMulticast (true);
234  serviceFlow->SetModulation (modulation);
235  bs->GetUplinkScheduler ()->SetupServiceFlow (0, serviceFlow);
236 }
237 
238 void
240 {
241  ServiceFlow *serviceFlow = ProcessDsaReq (dsaReq, cid);
242  if (serviceFlow) {
243  ScheduleDsaRsp (serviceFlow, cid);
244  } else {
245  NS_LOG_INFO ("No service Flow. Could not connect.");
246  }
247 }
248 
249 void
251 {
253  SSRecord *ssRecord = bs->GetSSManager ()->GetSSRecord (cid);
254 
255  if (dsaAck.GetTransactionId () != ssRecord->GetSfTransactionId ())
256  {
257  return;
258  }
259 
260  ssRecord->SetDsaRspRetries (0);
261  ssRecord->SetSfTransactionId (0);
262 
263  // check if all service flow have been initiated
264  if (AreServiceFlowsAllocated (ssRecord->GetServiceFlows (ServiceFlow::SF_TYPE_ALL)))
265  {
266  ssRecord->SetAreServiceFlowsAllocated (true);
267  }
268 }
269 } // namespace ns3
Introspection did not find any typical Config paths.
Definition: mac-messages.h:344
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
Introspection did not find any typical Config paths.
Definition: mac-messages.h:430
ServiceFlow * GetServiceFlow(uint32_t sfid) const
void SetConnection(Ptr< WimaxConnection > connection)
Introspection did not find any typical Config paths.
Definition: mac-messages.h:41
void SetServiceFlow(ServiceFlow sf)
specify a service flow to be requested by this message
void AllocateServiceFlows(const DsaReq &dsaReq, Cid cid)
static TypeId GetTypeId(void)
Register this type.
ServiceFlow GetServiceFlow(void) const
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
BsServiceFlowManager(Ptr< BaseStationNetDevice > device)
uint8_t GetMaxDsaRspRetries(void) const
uint32_t GetSfid(void) const
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:244
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
Definition: simulator.cc:321
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:65
void DoDispose(void)
Destructor implementation.
void ScheduleDsaRsp(ServiceFlow *serviceFlow, Cid cid)
void SetTransactionId(uint16_t transactionId)
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
Definition: simulator.h:1238
static Cid InitialRanging(void)
Definition: cid.cc:82
void SetUnsolicitedPollingInterval(uint16_t)
void CopyParametersFrom(ServiceFlow sf)
ServiceFlow * GetServiceFlow(uint32_t sfid) const
void SetUnsolicitedGrantInterval(uint16_t)
EventId GetDsaAckTimeoutEvent(void) const
Represents the HT (Header Type) field of generic MAC and bandwidth request headers.
void DoDispose(void)
Destructor implementation.
void SetConvergenceSublayerParam(CsParameters)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Definition: cid.h:35
std::vector< ServiceFlow * > GetServiceFlows(enum ServiceFlow::SchedulingType schedulingType) const
ServiceFlow * ProcessDsaReq(const DsaReq &dsaReq, Cid cid)
process a DSA-Req message
This class implements service flows as described by the IEEE-802.16 standard.
Definition: service-flow.h:39
void SetConfirmationCode(uint16_t confirmationCode)
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:90
void SetModulation(enum WimaxPhy::ModulationType modulationType)
void SetMaxDsaRspRetries(uint8_t maxDsaRspRetries)
set the maximum Dynamic ServiceFlow Add (DSA) retries
void ProcessDsaAck(const DsaAck &dsaAck, Cid cid)
process a DSA-ACK message
enum Direction GetDirection(void) const
void SetIsEnabled(bool isEnabled)
void SetType(enum Type type)
An identifier for simulation events.
Definition: event-id.h:53
void AddServiceFlow(ServiceFlow *serviceFlow)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:236
uint16_t GetTransactionId(void) const
void AddServiceFlow(ServiceFlow *serviceFlow)
Add a new service flow.
void AddMulticastServiceFlow(ServiceFlow sf, enum WimaxPhy::ModulationType modulation)
add a multicast service flow
This class is used by the base station to store some information related to subscriber station in the...
Definition: ss-record.h:43
void SetIsMulticast(bool isMulticast)
CsParameters GetConvergenceSublayerParam(void) const
Introspection did not find any typical Config paths.
Definition: mac-messages.h:262
The same service flow manager class serves both for BS and SS though some functions are exclusive to ...
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:904
DsaRsp CreateDsaRsp(const ServiceFlow *serviceFlow, uint16_t transactionId)
void AddHeader(const Header &header)
Add header to this packet.
Definition: packet.cc:257
uint16_t GetTransactionId(void) const
uint16_t GetCid(void) const
std::vector< ServiceFlow * > GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const