00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "rraa-wifi-manager.h"
00022 #include "ns3/assert.h"
00023 #include "ns3/log.h"
00024 #include "ns3/boolean.h"
00025 #include "ns3/double.h"
00026 #include "ns3/uinteger.h"
00027 #include "ns3/simulator.h"
00028
00029 NS_LOG_COMPONENT_DEFINE ("RraaWifiManager");
00030
00031 namespace ns3 {
00032
00033 RraaWifiRemoteStation::RraaWifiRemoteStation (Ptr<RraaWifiManager> stations)
00034 : m_stations (stations)
00035 {
00036 m_initialized = false;
00037 m_rtsWnd = 0;
00038 m_rtsCounter = 0;
00039 m_rtsOn = false;
00040 m_lastFrameFail = false;
00041 }
00042
00043 RraaWifiRemoteStation::~RraaWifiRemoteStation ()
00044 {}
00045
00046 void
00047 RraaWifiRemoteStation::ResetCountersBasic (void)
00048 {
00049 if (!m_initialized) {
00050 m_rate = GetMaxRate ();
00051 m_initialized = true;
00052 }
00053 m_failed = 0;
00054 m_counter = GetThresholds (m_rate).ewnd;
00055 m_lastReset = Simulator::Now ();
00056 }
00057
00058 Ptr<WifiRemoteStationManager>
00059 RraaWifiRemoteStation::GetManager (void) const
00060 {
00061 return m_stations;
00062 }
00063
00064 uint32_t
00065 RraaWifiRemoteStation::GetMaxRate (void)
00066 {
00067 return GetNSupportedModes () - 1;
00068 }
00069 uint32_t
00070 RraaWifiRemoteStation::GetMinRate (void)
00071 {
00072 return 0;
00073 }
00074
00075 ThresholdsItem
00076 RraaWifiRemoteStation::GetThresholds (uint32_t rate)
00077 {
00078 WifiMode mode = GetSupportedMode (rate);
00079 return m_stations->GetThresholds (mode);
00080 }
00081
00082
00083 void
00084 RraaWifiRemoteStation::DoReportRtsFailed (void)
00085 {}
00086
00087 void
00088 RraaWifiRemoteStation::DoReportDataFailed (void)
00089 {
00090 m_lastFrameFail = true;
00091 CheckTimeout ();
00092 m_counter--;
00093 m_failed++;
00094 RunBasicAlgorithm ();
00095 }
00096 void
00097 RraaWifiRemoteStation::DoReportRxOk (double rxSnr, WifiMode txMode)
00098 {}
00099 void
00100 RraaWifiRemoteStation::DoReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr)
00101 {
00102 NS_LOG_DEBUG ("self="<<this<<" rts ok");
00103 }
00104 void
00105 RraaWifiRemoteStation::DoReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr)
00106 {
00107 m_lastFrameFail = false;
00108 CheckTimeout ();
00109 m_counter--;
00110 RunBasicAlgorithm ();
00111 }
00112 void
00113 RraaWifiRemoteStation::DoReportFinalRtsFailed (void)
00114 {}
00115 void
00116 RraaWifiRemoteStation::DoReportFinalDataFailed (void)
00117 {}
00118
00119 WifiMode
00120 RraaWifiRemoteStation::DoGetDataMode (uint32_t size)
00121 {
00122 if (!m_initialized)
00123 ResetCountersBasic ();
00124 return GetSupportedMode (m_rate);
00125 }
00126 WifiMode
00127 RraaWifiRemoteStation::DoGetRtsMode (void)
00128 {
00129 return GetSupportedMode (0);
00130 }
00131
00132 bool
00133 RraaWifiRemoteStation::NeedRts (Ptr<const Packet> packet)
00134 {
00135 if (m_stations->OnlyBasic ())
00136 return WifiRemoteStation::NeedRts (packet);
00137 ARts ();
00138 return m_rtsOn;
00139 }
00140
00141 void
00142 RraaWifiRemoteStation::CheckTimeout (void)
00143 {
00144 Time d = Simulator::Now () - m_lastReset;
00145 if (m_counter == 0 || d > m_stations->GetTimeout ()) {
00146 ResetCountersBasic ();
00147 }
00148 }
00149
00150 void
00151 RraaWifiRemoteStation::RunBasicAlgorithm (void)
00152 {
00153 ThresholdsItem thresholds = GetThresholds (m_rate);
00154 double ploss = (double) m_failed / (double) thresholds.ewnd;
00155 if (m_counter == 0 || ploss > thresholds.pmtl) {
00156 if (m_rate > GetMinRate () && ploss > thresholds.pmtl) {
00157 m_rate--;
00158 }
00159 else if (m_rate < GetMaxRate () && ploss < thresholds.pori) {
00160 m_rate++;
00161 }
00162 ResetCountersBasic ();
00163 }
00164 }
00165
00166 void
00167 RraaWifiRemoteStation::ARts (void)
00168 {
00169 if (!m_rtsOn && m_lastFrameFail) {
00170 m_rtsWnd++;
00171 m_rtsCounter = m_rtsWnd;
00172 }
00173 else if ((m_rtsOn && m_lastFrameFail) ||
00174 (!m_rtsOn && !m_lastFrameFail)) {
00175 m_rtsWnd = m_rtsWnd / 2;
00176 m_rtsCounter = m_rtsWnd;
00177 }
00178 if (m_rtsCounter > 0) {
00179 m_rtsOn = true;
00180 m_rtsCounter--;
00181 }
00182 else {
00183 m_rtsOn = false;
00184 }
00185 }
00186
00187
00188 TypeId
00189 RraaWifiManager::GetTypeId (void)
00190 {
00191 static TypeId tid = TypeId ("RraaWifiManager")
00192 .SetParent<WifiRemoteStationManager> ()
00193 .AddConstructor<RraaWifiManager> ()
00194 .AddAttribute ("Basic",
00195 "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA wil be used",
00196 BooleanValue (false),
00197 MakeBooleanAccessor (&RraaWifiManager::m_basic),
00198 MakeBooleanChecker ())
00199 .AddAttribute ("Timeout",
00200 "Timeout for the RRAA BASIC loss estimaton block (s)",
00201 TimeValue (Seconds (0.05)),
00202 MakeTimeAccessor (&RraaWifiManager::m_timeout),
00203 MakeTimeChecker ())
00204 .AddAttribute ("ewndFor54mbps",
00205 "ewnd parameter for 54 Mbs data mode",
00206 UintegerValue (40),
00207 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor54),
00208 MakeUintegerChecker<uint32_t> ())
00209 .AddAttribute ("ewndFor48mbps",
00210 "ewnd parameter for 48 Mbs data mode",
00211 UintegerValue (40),
00212 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor48),
00213 MakeUintegerChecker<uint32_t> ())
00214 .AddAttribute ("ewndFor36mbps",
00215 "ewnd parameter for 36 Mbs data mode",
00216 UintegerValue (40),
00217 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor36),
00218 MakeUintegerChecker<uint32_t> ())
00219 .AddAttribute ("ewndFor24mbps",
00220 "ewnd parameter for 24 Mbs data mode",
00221 UintegerValue (40),
00222 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor24),
00223 MakeUintegerChecker<uint32_t> ())
00224 .AddAttribute ("ewndFor18mbps",
00225 "ewnd parameter for 18 Mbs data mode",
00226 UintegerValue (20),
00227 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor18),
00228 MakeUintegerChecker<uint32_t> ())
00229 .AddAttribute ("ewndFor12mbps",
00230 "ewnd parameter for 12 Mbs data mode",
00231 UintegerValue (20),
00232 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor12),
00233 MakeUintegerChecker<uint32_t> ())
00234 .AddAttribute ("ewndFor9mbps",
00235 "ewnd parameter for 9 Mbs data mode",
00236 UintegerValue (10),
00237 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor9),
00238 MakeUintegerChecker<uint32_t> ())
00239 .AddAttribute ("ewndFor6mbps",
00240 "ewnd parameter for 6 Mbs data mode",
00241 UintegerValue (6),
00242 MakeUintegerAccessor (&RraaWifiManager::m_ewndfor6),
00243 MakeUintegerChecker<uint32_t> ())
00244 .AddAttribute ("poriFor48mbps",
00245 "Pori parameter for 48 Mbs data mode",
00246 DoubleValue (0.047),
00247 MakeDoubleAccessor (&RraaWifiManager::m_porifor48),
00248 MakeDoubleChecker<double> ())
00249 .AddAttribute ("poriFor36mbps",
00250 "Pori parameter for 36 Mbs data mode",
00251 DoubleValue (0.115),
00252 MakeDoubleAccessor (&RraaWifiManager::m_porifor36),
00253 MakeDoubleChecker<double> ())
00254 .AddAttribute ("poriFor24mbps",
00255 "Pori parameter for 24 Mbs data mode",
00256 DoubleValue (0.1681),
00257 MakeDoubleAccessor (&RraaWifiManager::m_porifor24),
00258 MakeDoubleChecker<double> ())
00259 .AddAttribute ("poriFor18mbps",
00260 "Pori parameter for 18 Mbs data mode",
00261 DoubleValue (0.1325),
00262 MakeDoubleAccessor (&RraaWifiManager::m_porifor18),
00263 MakeDoubleChecker<double> ())
00264 .AddAttribute ("poriFor12mbps",
00265 "Pori parameter for 12 Mbs data mode",
00266 DoubleValue (0.1861),
00267 MakeDoubleAccessor (&RraaWifiManager::m_porifor12),
00268 MakeDoubleChecker<double> ())
00269 .AddAttribute ("poriFor9mbps",
00270 "Pori parameter for 9 Mbs data mode",
00271 DoubleValue (0.1434),
00272 MakeDoubleAccessor (&RraaWifiManager::m_porifor9),
00273 MakeDoubleChecker<double> ())
00274 .AddAttribute ("poriFor6mbps",
00275 "Pori parameter for 6 Mbs data mode",
00276 DoubleValue (0.5),
00277 MakeDoubleAccessor (&RraaWifiManager::m_porifor6),
00278 MakeDoubleChecker<double> ())
00279 .AddAttribute ("pmtlFor54mbps",
00280 "Pmtl parameter for 54 Mbs data mode",
00281 DoubleValue (0.094),
00282 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor54),
00283 MakeDoubleChecker<double> ())
00284 .AddAttribute ("pmtlFor48mbps",
00285 "Pmtl parameter for 48 Mbs data mode",
00286 DoubleValue (0.23),
00287 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor48),
00288 MakeDoubleChecker<double> ())
00289 .AddAttribute ("pmtlFor36mbps",
00290 "Pmtl parameter for 36 Mbs data mode",
00291 DoubleValue (0.3363),
00292 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor36),
00293 MakeDoubleChecker<double> ())
00294 .AddAttribute ("pmtlFor24mbps",
00295 "Pmtl parameter for 24 Mbs data mode",
00296 DoubleValue (0.265),
00297 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor24),
00298 MakeDoubleChecker<double> ())
00299 .AddAttribute ("pmtlFor18mbps",
00300 "Pmtl parameter for 18 Mbs data mode",
00301 DoubleValue (0.3722),
00302 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor18),
00303 MakeDoubleChecker<double> ())
00304 .AddAttribute ("pmtlFor12mbps",
00305 "Pmtl parameter for 12 Mbs data mode",
00306 DoubleValue (0.2868),
00307 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor12),
00308 MakeDoubleChecker<double> ())
00309 .AddAttribute ("pmtlFor9mbps",
00310 "Pmtl parameter for 9 Mbs data mode",
00311 DoubleValue (0.3932),
00312 MakeDoubleAccessor (&RraaWifiManager::m_pmtlfor9),
00313 MakeDoubleChecker<double> ())
00314 ;
00315 return tid;
00316 }
00317
00318
00319 RraaWifiManager::RraaWifiManager ()
00320 {}
00321 RraaWifiManager::~RraaWifiManager ()
00322 {}
00323
00324 WifiRemoteStation *
00325 RraaWifiManager::CreateStation (void)
00326 {
00327 return new RraaWifiRemoteStation (this);
00328 }
00329
00330 bool
00331 RraaWifiManager::OnlyBasic (void)
00332 {
00333 return m_basic;
00334 }
00335
00336 Time
00337 RraaWifiManager::GetTimeout (void) const
00338 {
00339 return m_timeout;
00340 }
00341
00342 ThresholdsItem
00343 RraaWifiManager::GetThresholds (WifiMode mode) const
00344 {
00345 switch (mode.GetDataRate () / 1000000) {
00346 case 54: {
00347 ThresholdsItem mode54 = {54000000,
00348 0.0,
00349 m_pmtlfor54,
00350 m_ewndfor54};
00351 return mode54;
00352 } break;
00353 case 48: {
00354 ThresholdsItem mode48 = {48000000,
00355 m_porifor48,
00356 m_pmtlfor48,
00357 m_ewndfor48};
00358 return mode48;
00359 } break;
00360 case 36: {
00361 ThresholdsItem mode36 = {36000000,
00362 m_porifor36,
00363 m_pmtlfor36,
00364 m_ewndfor36};
00365 return mode36;
00366 } break;
00367 case 24: {
00368 ThresholdsItem mode24 = {24000000,
00369 m_porifor24,
00370 m_pmtlfor24,
00371 m_ewndfor24};
00372 return mode24;
00373 } break;
00374 case 18: {
00375 ThresholdsItem mode18 = {18000000,
00376 m_porifor18,
00377 m_pmtlfor18,
00378 m_ewndfor18};
00379 return mode18;
00380 } break;
00381 case 12: {
00382 ThresholdsItem mode12 = {12000000,
00383 m_porifor12,
00384 m_pmtlfor12,
00385 m_ewndfor12};
00386 return mode12;
00387 } break;
00388 case 9: {
00389 ThresholdsItem mode9 = {9000000,
00390 m_porifor9,
00391 m_pmtlfor9,
00392 m_ewndfor9};
00393 return mode9;
00394 } break;
00395 case 6: {
00396 ThresholdsItem mode6 = {6000000,
00397 m_porifor6,
00398 1.0,
00399 m_ewndfor6};
00400 return mode6;
00401 } break;
00402 }
00403 NS_ASSERT("Thresholds for an unknown mode are asked");
00404 return ThresholdsItem ();
00405 }
00406
00407 }