A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
bs-service-flow-manager.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007,2008, 2009 INRIA, UDcast
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Authors: Jahanzeb Farooq <jahanzeb.farooq@sophia.inria.fr>
18 * Mohamed Amine Ismail <amine.ismail@sophia.inria.fr>
19 */
20
21#include "bs-net-device.h"
22#include "bs-uplink-scheduler.h"
23#include "connection-manager.h"
25#include "service-flow-record.h"
26#include "service-flow.h"
27#include "ss-manager.h"
28#include "ss-record.h"
29#include "ss-scheduler.h"
30#include "wimax-connection.h"
31
32#include "ns3/buffer.h"
33#include "ns3/enum.h"
34#include "ns3/log.h"
35#include "ns3/node.h"
36#include "ns3/packet.h"
37#include "ns3/pointer.h"
38#include "ns3/simulator.h"
39
40#include <stdint.h>
41
42namespace ns3
43{
44
45NS_LOG_COMPONENT_DEFINE("BsServiceFlowManager");
46
48 : m_device(device),
49 m_sfidIndex(100),
50 m_maxDsaRspRetries(100) // default value
51{
53}
54
56{
57}
58
59/* static */
62{
63 static TypeId tid =
64 TypeId("ns3::BsServiceFlowManager").SetParent<ServiceFlowManager>().SetGroupName("Wifi")
65 // No AddConstructor because this class has no default constructor.
66 ;
67 return tid;
68}
69
70void
72{
74}
75
76void
78{
79 m_maxDsaRspRetries = maxDsaRspRetries;
80}
81
82uint8_t
84{
85 return m_maxDsaRspRetries;
86}
87
90{
92}
93
94void
96{
98}
99
102{
104}
105
108{
110}
111
112std::vector<ServiceFlow*>
114{
115 return ServiceFlowManager::GetServiceFlows(schedulingType);
116}
117
118DsaRsp
119BsServiceFlowManager::CreateDsaRsp(const ServiceFlow* serviceFlow, uint16_t transactionId)
120{
121 DsaRsp dsaRsp;
122 dsaRsp.SetTransactionId(transactionId);
123 dsaRsp.SetServiceFlow(*serviceFlow);
124 // assuming SS can supports all of the service flow parameters
126
127 return dsaRsp;
128}
129
130void
132{
134
135 SSRecord* ssRecord = bs->GetSSManager()->GetSSRecord(cid);
136 if (ssRecord == nullptr)
137 {
138 NS_LOG_INFO("SS not registered with the BS CID:" << cid);
139 return;
140 }
141
142 serviceFlow->SetIsEnabled(true);
144 ssRecord->AddServiceFlow(serviceFlow);
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
199 dsaReq.GetTransactionId() == ssRecord->GetSfTransactionId(),
200 "Error while processing DSA request:the received transaction ID is not expected");
201 serviceFlow = GetServiceFlow(ssRecord->GetDsaRsp().GetSfid());
202 }
203 else
204 {
205 ServiceFlow sf = dsaReq.GetServiceFlow();
206 Ptr<WimaxConnection> transportConnection;
207 Ptr<ConnectionManager> BsConManager = bs->GetConnectionManager();
208 transportConnection = BsConManager->CreateConnection(Cid::TRANSPORT);
209 serviceFlow = new ServiceFlow(m_sfidIndex++, sf.GetDirection(), transportConnection);
210 transportConnection->SetServiceFlow(serviceFlow);
211 serviceFlow->CopyParametersFrom(sf);
212 serviceFlow->SetUnsolicitedGrantInterval(1);
213 serviceFlow->SetUnsolicitedPollingInterval(1);
215 AddServiceFlow(serviceFlow);
216 ssRecord->SetSfTransactionId(dsaReq.GetTransactionId());
217 NS_LOG_INFO("BsServiceFlowManager: Creating a new Service flow: SFID = "
218 << serviceFlow->GetSfid() << " CID = " << serviceFlow->GetCid());
219 }
220 return serviceFlow;
221}
222
223void
225{
226 auto serviceFlow = new ServiceFlow();
227 serviceFlow->CopyParametersFrom(sf);
229 Ptr<WimaxConnection> multicastConnection =
230 bs->GetConnectionManager()->CreateConnection(Cid::MULTICAST);
231 serviceFlow->SetConnection(multicastConnection);
232 AddServiceFlow(serviceFlow);
233 serviceFlow->SetIsEnabled(true);
234 serviceFlow->SetType(ServiceFlow::SF_TYPE_ACTIVE);
235 serviceFlow->SetIsMulticast(true);
236 serviceFlow->SetModulation(modulation);
237 bs->GetUplinkScheduler()->SetupServiceFlow(nullptr, serviceFlow);
238}
239
240void
242{
243 ServiceFlow* serviceFlow = ProcessDsaReq(dsaReq, cid);
244 if (serviceFlow)
245 {
246 ScheduleDsaRsp(serviceFlow, cid);
247 }
248 else
249 {
250 NS_LOG_INFO("No service Flow. Could not connect.");
251 }
252}
253
254void
256{
258 SSRecord* ssRecord = bs->GetSSManager()->GetSSRecord(cid);
259
260 if (dsaAck.GetTransactionId() != ssRecord->GetSfTransactionId())
261 {
262 return;
263 }
264
265 ssRecord->SetDsaRspRetries(0);
266 ssRecord->SetSfTransactionId(0);
267
268 // check if all service flow have been initiated
269 if (AreServiceFlowsAllocated(ssRecord->GetServiceFlows(ServiceFlow::SF_TYPE_ALL)))
270 {
271 ssRecord->SetAreServiceFlowsAllocated(true);
272 }
273}
274} // namespace ns3
BaseStation NetDevice.
Definition: bs-net-device.h:54
ServiceFlow * GetServiceFlow(uint32_t sfid) const
uint8_t m_maxDsaRspRetries
maximum number of DSA response retries
void AllocateServiceFlows(const DsaReq &dsaReq, Cid cid)
allocate service flows
void DoDispose() override
Destructor implementation.
Cid m_inuseScheduleDsaRspCid
in use schedule DSA response CID
void AddMulticastServiceFlow(ServiceFlow sf, WimaxPhy::ModulationType modulation)
add a multicast service flow
Ptr< WimaxNetDevice > m_device
the device
void ScheduleDsaRsp(ServiceFlow *serviceFlow, Cid cid)
Create DSA response function.
void ProcessDsaAck(const DsaAck &dsaAck, Cid cid)
process a DSA-ACK message
std::vector< ServiceFlow * > GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const
static TypeId GetTypeId()
Register this type.
void AddServiceFlow(ServiceFlow *serviceFlow)
Add a new service flow.
void SetMaxDsaRspRetries(uint8_t maxDsaRspRetries)
set the maximum Dynamic ServiceFlow Add (DSA) retries
DsaRsp CreateDsaRsp(const ServiceFlow *serviceFlow, uint16_t transactionId)
Create DSA response function.
EventId m_dsaAckTimeoutEvent
DSA ack timeout event.
BsServiceFlowManager(Ptr< BaseStationNetDevice > device)
Constructor.
ServiceFlow * ProcessDsaReq(const DsaReq &dsaReq, Cid cid)
process a DSA-Req message
Cid class.
Definition: cid.h:37
@ TRANSPORT
Definition: cid.h:46
@ MULTICAST
Definition: cid.h:47
static Cid InitialRanging()
Definition: cid.cc:87
This class implements the DSA-ACK message described by "IEEE Standard for Local and metropolitan area...
Definition: mac-messages.h:590
uint16_t GetTransactionId() const
Get transaction ID field.
This class implements the DSA-REQ message described by "IEEE Standard for Local and metropolitan area...
Definition: mac-messages.h:386
ServiceFlow GetServiceFlow() const
uint16_t GetTransactionId() const
This class implements the DSA-RSP message described by "IEEE Standard for Local and metropolitan ar...
Definition: mac-messages.h:490
void SetConfirmationCode(uint16_t confirmationCode)
set the confirmation code
void SetServiceFlow(ServiceFlow sf)
specify a service flow to be requested by this message
void SetTransactionId(uint16_t transactionId)
set the transaction ID
An identifier for simulation events.
Definition: event-id.h:55
bool IsRunning() const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:76
This class Represents the HT (Header Type) field of generic MAC and bandwidth request headers.
Mac Management messages Section 6.3.2.3 MAC Management messages page 42, Table 14 page 43.
Definition: mac-messages.h:44
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
This class is used by the base station to store some information related to subscriber station in the...
Definition: ss-record.h:46
This class implements service flows as described by the IEEE-802.16 standard.
Definition: service-flow.h:43
uint32_t GetSfid() const
Get SFID.
SchedulingType
section 11.13.11 Service flow scheduling type, page 701
Definition: service-flow.h:62
void SetConvergenceSublayerParam(CsParameters csparam)
Set convergence sublayer parameters.
uint16_t GetCid() const
Get CID.
void CopyParametersFrom(ServiceFlow sf)
Copy parameters from another service flow.
void SetUnsolicitedGrantInterval(uint16_t unsolicitedGrantInterval)
Set unsolicited grant interval.
void SetUnsolicitedPollingInterval(uint16_t unsolicitedPollingInterval)
Set unsolicited polling interval.
void SetType(Type type)
Set type of service flow.
Direction GetDirection() const
Get direction.
CsParameters GetConvergenceSublayerParam() const
Get convergence sublayer.
void SetIsEnabled(bool isEnabled)
Set is enabled flag.
The same service flow manager class serves both for BS and SS though some functions are exclusive to ...
void AddServiceFlow(ServiceFlow *serviceFlow)
Add service flow function.
ServiceFlow * GetServiceFlow(uint32_t sfid) const
Get service flow by flow id.
std::vector< ServiceFlow * > GetServiceFlows(ServiceFlow::SchedulingType schedulingType) const
Get service flows function.
void DoDispose() override
Destructor implementation.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:571
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:285
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:932
ModulationType
ModulationType enumeration.
Definition: wimax-phy.h:54
#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:86
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:268
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
Every class exported by the ns3 library is enclosed in the ns3 namespace.