A Discrete-Event Network Simulator
API
ss-scheduler.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 INRIA
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 * Author: Jahanzeb Farooq <jahanzeb.farooq@sophia.inria.fr>
19 */
20
21#include "ns3/simulator.h"
22#include "ns3/node.h"
23#include "ns3/log.h"
24#include "ss-scheduler.h"
25#include "ss-net-device.h"
26#include "wimax-phy.h"
27#include "wimax-mac-queue.h"
28#include "wimax-connection.h"
29#include "connection-manager.h"
30#include "service-flow.h"
31#include "service-flow-record.h"
33
34namespace ns3 {
35
36NS_LOG_COMPONENT_DEFINE ("SSScheduler");
37
38NS_OBJECT_ENSURE_REGISTERED (SSScheduler);
39
41{
42 static TypeId tid = TypeId ("ns3::SSScheduler")
43 .SetParent<Object> ()
44 .SetGroupName("Wimax");
45 return tid;
46}
47
49 : m_ss (ss),
50 m_pollMe (false)
51{
52}
53
55{
56}
57
58void
60{
61 m_ss = 0;
62}
63
64void
66{
67 m_pollMe = pollMe;
68}
69
70bool
72{
73 return m_pollMe;
74}
75
77SSScheduler::Schedule (uint16_t availableSymbols,
78 WimaxPhy::ModulationType modulationType,
80 Ptr<WimaxConnection> &connection)
81{
82 Time timeStamp;
83 Ptr<PacketBurst> burst = Create<PacketBurst> ();
84 uint16_t nrSymbolsRequired = 0;
85
86 if (!connection)
87 {
88 connection = SelectConnection ();
89 }
90 else
91 {
92 NS_ASSERT_MSG (connection->HasPackets (),
93 "SS: Error while scheduling packets: The selected connection has no packets");
94 }
95
96 Ptr<Packet> packet;
97
98 while (connection && connection->HasPackets (packetType))
99 {
100 NS_LOG_INFO ("FRAG_DEBUG: SS Scheduler" << std::endl);
101
102 uint32_t availableByte = m_ss->GetPhy ()->
103 GetNrBytes (availableSymbols, modulationType);
104
105 uint32_t requiredByte = connection->GetQueue ()->GetFirstPacketRequiredByte (packetType);
106
107 NS_LOG_INFO ("\t availableByte = " << availableByte <<
108 ", requiredByte = " << requiredByte);
109
110 if (availableByte >= requiredByte)
111 {
112 // The SS could sent a packet without a other fragmentation
113 NS_LOG_INFO ("\t availableByte >= requiredByte"
114 "\n\t Send packet without other fragmentation" << std::endl);
115
116 packet = connection->Dequeue (packetType);
117 burst->AddPacket (packet);
118
119 nrSymbolsRequired = m_ss->GetPhy ()->
120 GetNrSymbols (packet->GetSize (), modulationType);
121 availableSymbols -= nrSymbolsRequired;
122 }
123 else
124 {
125 if (connection->GetType () == Cid::TRANSPORT)
126 {
127 NS_LOG_INFO ("\t availableByte < requiredByte"
128 "\n\t Check if the fragmentation is possible");
129
130 uint32_t headerSize = connection->GetQueue ()->GetFirstPacketHdrSize (packetType);
131 if (!connection->GetQueue ()->CheckForFragmentation (packetType))
132 {
133 NS_LOG_INFO ("\t Add fragmentSubhdrSize = 2");
134 headerSize += 2;
135 }
136 NS_LOG_INFO ("\t availableByte = " << availableByte <<
137 " headerSize = " << headerSize);
138
139 if (availableByte > headerSize)
140 {
141 NS_LOG_INFO ("\t Fragmentation IS possible");
142 packet = connection->Dequeue (packetType, availableByte);
143 burst->AddPacket (packet);
144
145 nrSymbolsRequired = m_ss->GetPhy ()->
146 GetNrSymbols (packet->GetSize (), modulationType);
147 availableSymbols -= nrSymbolsRequired;
148 }
149 else
150 {
151 NS_LOG_INFO ("\t Fragmentation IS NOT possible" << std::endl);
152 break;
153 }
154 }
155 else
156 {
157 NS_LOG_INFO ("\t no Transport Connection "
158 "\n\t Fragmentation IS NOT possible, " << std::endl);
159 break;
160 }
161 }
162 }
163 return burst;
164}
165
168{
169 Time currentTime = Simulator::Now ();
170 std::vector<ServiceFlow*>::const_iterator iter;
171 std::vector<ServiceFlow*> serviceFlows;
172
173 NS_LOG_INFO ("SS Scheduler: Selecting connection...");
174 if (m_ss->GetInitialRangingConnection ()->HasPackets ())
175 {
176 NS_LOG_INFO ("Return GetInitialRangingConnection");
177 return m_ss->GetInitialRangingConnection ();
178 }
179 if (m_ss->GetBasicConnection ()->HasPackets ())
180 {
181 NS_LOG_INFO ("Return GetBasicConnection");
182 return m_ss->GetBasicConnection ();
183 }
184 if (m_ss->GetPrimaryConnection ()->HasPackets ())
185 {
186 NS_LOG_INFO ("Return GetPrimaryConnection");
187 return m_ss->GetPrimaryConnection ();
188 }
189
190 serviceFlows = m_ss->GetServiceFlowManager ()->GetServiceFlows (ServiceFlow::SF_TYPE_UGS);
191 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
192 {
193 // making sure that this grant was actually intended for this UGS
194
195 if ((*iter)->HasPackets () && (currentTime
196 + m_ss->GetPhy ()->GetFrameDuration () > MilliSeconds (
197 (*iter)->GetUnsolicitedGrantInterval ())))
198 {
199 NS_LOG_INFO ("Return UGS SF: CID = " << (*iter)->GetCid () << "SFID = "
200 << (*iter)->GetSfid ());
201 return (*iter)->GetConnection ();
202 }
203 }
204
205 /* In the following cases (rtPS, nrtPS and BE flows) connection is seletected only for data packets, for bandwidth
206 request packets connection will itself be passed to Schedule () and hence this function will never be called. */
207
208 serviceFlows = m_ss->GetServiceFlowManager ()->GetServiceFlows (ServiceFlow::SF_TYPE_RTPS);
209 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
210 {
211 if ((*iter)->HasPackets (MacHeaderType::HEADER_TYPE_GENERIC)
212 && (currentTime + m_ss->GetPhy ()->GetFrameDuration ()
213 > MilliSeconds (
214 (*iter)->GetUnsolicitedPollingInterval ())))
215 {
216 NS_LOG_INFO ("Return RTPS SF: CID = " << (*iter)->GetCid () << "SFID = "
217 << (*iter)->GetSfid ());
218 return (*iter)->GetConnection ();
219 }
220 }
221
222 serviceFlows = m_ss->GetServiceFlowManager ()->GetServiceFlows (ServiceFlow::SF_TYPE_NRTPS);
223 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
224 {
225 if ((*iter)->HasPackets (MacHeaderType::HEADER_TYPE_GENERIC))
226 {
227 NS_LOG_INFO ("Return NRTPS SF: CID = " << (*iter)->GetCid () << "SFID = "
228 << (*iter)->GetSfid ());
229 return (*iter)->GetConnection ();
230 }
231 }
232
233 serviceFlows = m_ss->GetServiceFlowManager ()->GetServiceFlows (ServiceFlow::SF_TYPE_BE);
234 for (iter = serviceFlows.begin (); iter != serviceFlows.end (); ++iter)
235 {
236 if ((*iter)->HasPackets (MacHeaderType::HEADER_TYPE_GENERIC))
237 {
238 NS_LOG_INFO ("Return BE SF: CID = " << (*iter)->GetCid () << "SFID = "
239 << (*iter)->GetSfid ());
240 return (*iter)->GetConnection ();
241 }
242 }
243
244 if (m_ss->GetBroadcastConnection ()->HasPackets ())
245 {
246 return m_ss->GetBroadcastConnection ();
247 }
248 NS_LOG_INFO ("NO connection is selected!");
249 return 0;
250}
251
252} // namespace ns3
@ TRANSPORT
Definition: cid.h:47
HeaderType
Header type enumeration.
A base class which provides memory management and object aggregation.
Definition: object.h:88
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:856
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
SSScheduler(Ptr< SubscriberStationNetDevice > ss)
Constructor.
Definition: ss-scheduler.cc:48
static TypeId GetTypeId(void)
Get the type ID.
Definition: ss-scheduler.cc:40
bool m_pollMe
poll me flag
Definition: ss-scheduler.h:97
Ptr< PacketBurst > Schedule(uint16_t availableSymbols, WimaxPhy::ModulationType modulationType, MacHeaderType::HeaderType packetType, Ptr< WimaxConnection > &connection)
Definition: ss-scheduler.cc:77
bool GetPollMe(void) const
Get the poll me value.
Definition: ss-scheduler.cc:71
Ptr< SubscriberStationNetDevice > m_ss
the subscriber station
Definition: ss-scheduler.h:96
void SetPollMe(bool pollMe)
Set poll me value.
Definition: ss-scheduler.cc:65
Ptr< WimaxConnection > SelectConnection(void)
Select connection.
void DoDispose(void)
Destructor implementation.
Definition: ss-scheduler.cc:59
static Time Now(void)
Return the current simulation virtual time.
Definition: simulator.cc:195
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
ModulationType
ModulationType enumeration.
Definition: wimax-phy.h:52
#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:88
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1252
Every class exported by the ns3 library is enclosed in the ns3 namespace.