A Discrete-Event Network Simulator
API
power-rate-adaptation-test.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014 Universidad de la República - Uruguay
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: Matías Richart <mrichart@fing.edu.uy>
19  */
20 
21 #include "ns3/node.h"
22 #include "ns3/wifi-net-device.h"
23 #include "ns3/yans-wifi-channel.h"
24 #include "ns3/yans-wifi-phy.h"
25 #include "ns3/adhoc-wifi-mac.h"
26 #include "ns3/constant-position-mobility-model.h"
27 #include "ns3/simulator.h"
28 #include "ns3/test.h"
29 
30 using namespace ns3;
31 
39 {
40 public:
42 
43  virtual void DoRun (void);
44 private:
46  void TestParf ();
48  void TestAparf ();
50  void TestRrpaa ();
55  Ptr<Node> ConfigureNode ();
56 
58 };
59 
61  : TestCase ("PowerRateAdaptation")
62 {
63 }
64 
67 {
68  /*
69  * Create channel model. Is is necessary to configure correctly the phy layer.
70  */
71  Ptr<YansWifiChannel> channel = CreateObject<YansWifiChannel> ();
72 
73  /*
74  * Create mac layer. We use Adhoc because association is not needed to get supported rates.
75  */
76  Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
77  Ptr<AdhocWifiMac> mac = CreateObject<AdhocWifiMac> ();
78  mac->SetDevice (dev);
79  mac->ConfigureStandard (WIFI_STANDARD_80211a);
80 
81  /*
82  * Create mobility model. Is needed by the phy layer for transmission.
83  */
84  Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel> ();
85 
86  /*
87  * Create and configure phy layer.
88  */
89  Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
90  phy->SetChannel (channel);
91  phy->SetDevice (dev);
92  phy->SetMobility (mobility);
93  phy->ConfigureStandardAndBand (WIFI_PHY_STANDARD_80211a, WIFI_PHY_BAND_5GHZ);
94 
95  /*
96  * Configure power control parameters.
97  */
98  phy->SetNTxPower (18);
99  phy->SetTxPowerStart (0);
100  phy->SetTxPowerEnd (17);
101 
102  /*
103  * Create manager.
104  */
106 
107  /*
108  * Create and configure node. Add mac and phy layer and the manager.
109  */
110  Ptr<Node> node = CreateObject<Node> ();
111  mac->SetAddress (Mac48Address::Allocate ());
112  dev->SetMac (mac);
113  dev->SetPhy (phy);
114  dev->SetRemoteStationManager (manager);
115  node->AddDevice (dev);
116 
117  return node;
118 }
119 
120 void
122 {
123  m_manager.SetTypeId ("ns3::ParfWifiManager");
124  Ptr<Node> node = ConfigureNode ();
125  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice (0));
127 
128  /*
129  * Configure thresholds for rate and power control.
130  */
131  manager->SetAttribute ("AttemptThreshold",UintegerValue (15));
132  manager->SetAttribute ("SuccessThreshold",UintegerValue (10));
133 
134  /*
135  * Create a dummy packet to simulate transmission.
136  */
137  Mac48Address remoteAddress = Mac48Address::Allocate ();
138  WifiMacHeader packetHeader;
139  packetHeader.SetAddr1 (remoteAddress);
140  packetHeader.SetType (WIFI_MAC_DATA);
141  packetHeader.SetQosTid (0);
142  Ptr<Packet> packet = Create<Packet> (10);
143  WifiMode ackMode;
144 
145  /*
146  * To initialize the manager we need to generate a transmission.
147  */
148  Ptr<Packet> p = Create<Packet> ();
149  dev->Send (p, remoteAddress, 1);
150 
151  //-----------------------------------------------------------------------------------------------------
152 
153  /*
154  * Parf initiates with maximal rate and power.
155  */
156  WifiTxVector txVector = manager->GetDataTxVector (packetHeader);
157  WifiMode mode = txVector.GetMode ();
158  int power = (int) txVector.GetTxPowerLevel ();
159 
160  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Initial data rate wrong");
161  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Initial power level wrong");
162 
163  //-----------------------------------------------------------------------------------------------------
164 
165  /*
166  * After 10 consecutive successful transmissions parf increase rate or decrease power.
167  * As we are at maximal rate, the power should be decreased. recoveryPower=true.
168  */
169  for (int i = 0; i < 10; i++)
170  {
171  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
172  }
173 
174  txVector = manager->GetDataTxVector (packetHeader);
175  mode = txVector.GetMode ();
176  power = (int) txVector.GetTxPowerLevel ();
177 
178  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
179  NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
180 
181  //-----------------------------------------------------------------------------------------------------
182 
183  /*
184  * As we are using recovery power, one failure make power increase.
185  *
186  */
187  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
188 
189  txVector = manager->GetDataTxVector (packetHeader);
190  mode = txVector.GetMode ();
191  power = (int) txVector.GetTxPowerLevel ();
192 
193  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
194  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
195 
196  //-----------------------------------------------------------------------------------------------------
197 
198  /*
199  * After 15 transmissions attempts parf increase rate or decrease power.
200  * As we are at maximal rate, the power should be decreased. recoveryPower=true.
201  */
202  for (int i = 0; i < 7; i++)
203  {
204  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
205  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
206  }
207  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
208 
209  txVector = manager->GetDataTxVector (packetHeader);
210  mode = txVector.GetMode ();
211  power = (int) txVector.GetTxPowerLevel ();
212 
213  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
214  NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
215 
216  //-----------------------------------------------------------------------------------------------------
217 
218  /*
219  * As we are using recovery power, one failure make power increase. recoveryPower=false.
220  */
221 
222  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
223 
224  txVector = manager->GetDataTxVector (packetHeader);
225  mode = txVector.GetMode ();
226  power = (int) txVector.GetTxPowerLevel ();
227 
228  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
229  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
230 
231  //-----------------------------------------------------------------------------------------------------
232 
233  /*
234  * After two consecutive fails the rate is decreased or the power increased.
235  * As we are at maximal power, the rate should be decreased.
236  */
237  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
238  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
239 
240  txVector = manager->GetDataTxVector (packetHeader);
241  mode = txVector.GetMode ();
242  power = (int) txVector.GetTxPowerLevel ();
243 
244  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 48000000, "PARF: Incorrect vale of data rate");
245  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
246 
247  //-----------------------------------------------------------------------------------------------------
248 
249  /*
250  * After 10 consecutive successful transmissions parf increase rate or decrease power.
251  * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
252  */
253  for (int i = 0; i < 10; i++)
254  {
255  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
256  }
257 
258  txVector = manager->GetDataTxVector (packetHeader);
259  mode = txVector.GetMode ();
260  power = (int) txVector.GetTxPowerLevel ();
261 
262  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
263  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
264 
265  //-----------------------------------------------------------------------------------------------------
266 
267  /*
268  * As we are using recovery rate, one failure make rate decrease. recoveryRate=false.
269  */
270 
271  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
272 
273  txVector = manager->GetDataTxVector (packetHeader);
274  mode = txVector.GetMode ();
275  power = (int) txVector.GetTxPowerLevel ();
276 
277  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 48000000, "PARF: Incorrect vale of data rate");
278  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
279 
280  //-----------------------------------------------------------------------------------------------------
281 
282  /*
283  * After 10 consecutive successful transmissions parf increase rate or decrease power.
284  * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
285  */
286  for (int i = 0; i < 10; i++)
287  {
288  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
289  }
290 
291  txVector = manager->GetDataTxVector (packetHeader);
292  mode = txVector.GetMode ();
293  power = (int) txVector.GetTxPowerLevel ();
294 
295  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
296  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
297 
298  //-----------------------------------------------------------------------------------------------------
299 
300  /*
301  * After 10 consecutive successful transmissions parf increase rate or decrease power.
302  * As we are at maximal rate, the power is decreased. recoveryRate=false, recoveryPower=true.
303  */
304  for (int i = 0; i < 10; i++)
305  {
306  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
307  }
308 
309  txVector = manager->GetDataTxVector (packetHeader);
310  mode = txVector.GetMode ();
311  power = (int) txVector.GetTxPowerLevel ();
312 
313  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
314  NS_TEST_ASSERT_MSG_EQ (power, 16, "PARF: Incorrect value of power level");
315 
316  //-----------------------------------------------------------------------------------------------------
317 
318  /*
319  * One successful transmissions after a power decrease make recoverPower=false.
320  * So we need two consecutive failures to increase power again.
321  */
322  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
323 
324  for (int i = 0; i < 2; i++)
325  {
326  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
327  }
328 
329  txVector = manager->GetDataTxVector (packetHeader);
330  mode = txVector.GetMode ();
331  power = (int) txVector.GetTxPowerLevel ();
332 
333  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "PARF: Incorrect vale of data rate");
334  NS_TEST_ASSERT_MSG_EQ (power, 17, "PARF: Incorrect value of power level");
335 
336  Simulator::Destroy ();
337 }
338 
339 void
341 {
342  m_manager.SetTypeId ("ns3::AparfWifiManager");
343  Ptr<Node> node = ConfigureNode ();
344  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice (0));
346 
347  /*
348  * Configure thresholds for rate and power control.
349  */
350  manager->SetAttribute ("SuccessThreshold1",UintegerValue (3));
351  manager->SetAttribute ("SuccessThreshold2",UintegerValue (10));
352  manager->SetAttribute ("FailThreshold",UintegerValue (1));
353  manager->SetAttribute ("PowerThreshold",UintegerValue (10));
354 
355  /*
356  * Create a dummy packet to simulate transmission.
357  */
358  Mac48Address remoteAddress = Mac48Address::Allocate ();
359  WifiMacHeader packetHeader;
360  packetHeader.SetAddr1 (remoteAddress);
361  packetHeader.SetType (WIFI_MAC_DATA);
362  packetHeader.SetQosTid (0);
363  Ptr<Packet> packet = Create<Packet> (10);
364  WifiMode ackMode;
365 
366  /*
367  * To initialize the manager we need to generate a transmission.
368  */
369  Ptr<Packet> p = Create<Packet> ();
370  dev->Send (p, remoteAddress, 1);
371 
372  //-----------------------------------------------------------------------------------------------------
373 
374  /*
375  * Aparf initiates with maximal rate and power.
376  */
377  WifiTxVector txVector = manager->GetDataTxVector (packetHeader);
378  WifiMode mode = txVector.GetMode ();
379  int power = (int) txVector.GetTxPowerLevel ();
380 
381  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Initial data rate wrong");
382  NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Initial power level wrong");
383 
384  //-----------------------------------------------------------------------------------------------------
385 
386  /*
387  * As Aparf starts in state High, after 3 consecutive successful transmissions aparf increase rate or decrease power.
388  * As we are at maximal rate, the power should be decreased.
389  * Change to state Spread.
390  */
391  for (int i = 0; i < 3; i++)
392  {
393  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
394  }
395 
396  txVector = manager->GetDataTxVector (packetHeader);
397  mode = txVector.GetMode ();
398  power = (int) txVector.GetTxPowerLevel ();
399 
400  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
401  NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
402 
403  //-----------------------------------------------------------------------------------------------------
404 
405  /*
406  * One failure make the power to be increased again.
407  * Change to state Low.
408  */
409  manager->ReportDataFailed (remoteAddress, &packetHeader, packet->GetSize ());
410 
411  txVector = manager->GetDataTxVector (packetHeader);
412  mode = txVector.GetMode ();
413  power = (int) txVector.GetTxPowerLevel ();
414 
415  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
416  NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
417 
418  //-----------------------------------------------------------------------------------------------------
419 
420  /*
421  * As we are in state Low we need 10 successful transmissions to increase rate or decrease power.
422  * As we are at maximal rate, the power should be decreased.
423  * Change to state Spread.
424  */
425  for (int i = 0; i < 10; i++)
426  {
427  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
428  }
429 
430  txVector = manager->GetDataTxVector (packetHeader);
431  mode = txVector.GetMode ();
432  power = (int) txVector.GetTxPowerLevel ();
433 
434  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
435  NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
436 
437  //-----------------------------------------------------------------------------------------------------
438 
439  /*
440  * One more successful transmission make to change to state High.
441  * Two more successful transmissions make power decrease.
442  */
443 
444  for (int i = 0; i < 3; i++)
445  {
446  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
447  }
448 
449  txVector = manager->GetDataTxVector (packetHeader);
450  mode = txVector.GetMode ();
451  power = (int) txVector.GetTxPowerLevel ();
452 
453  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
454  NS_TEST_ASSERT_MSG_EQ (power, 15, "APARF: Incorrect value of power level");
455 
456  //-----------------------------------------------------------------------------------------------------
457 
458  /*
459  * As we are in state High we need 3 successful transmissions to increase rate or decrease power.
460  * After 16*3 successful transmissions power is decreased to zero.
461  */
462  for (int i = 0; i < 16 * 3; i++)
463  {
464  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
465  }
466 
467  txVector = manager->GetDataTxVector (packetHeader);
468  mode = txVector.GetMode ();
469  power = (int) txVector.GetTxPowerLevel ();
470 
471  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
472  NS_TEST_ASSERT_MSG_EQ (power, 0, "APARF: Incorrect value of power level");
473 
474  //-----------------------------------------------------------------------------------------------------
475 
476  /*
477  * After one fail the rate is decreased or the power increased.
478  * As we are at minimal power, the power should be increased.
479  */
480  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
481 
482  txVector = manager->GetDataTxVector (packetHeader);
483  mode = txVector.GetMode ();
484  power = (int) txVector.GetTxPowerLevel ();
485 
486  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "Incorrect vale of data rate");
487  NS_TEST_ASSERT_MSG_EQ (power, 1, "Incorrect value of power level");
488 
489  //-----------------------------------------------------------------------------------------------------
490 
491  /*
492  * After one fail the rate is decreased or the power increased.
493  * After 16 failed transmissions power is increase to 17.
494  */
495  for (int i = 0; i < 16; i++)
496  {
497  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
498  }
499 
500  txVector = manager->GetDataTxVector (packetHeader);
501  mode = txVector.GetMode ();
502  power = (int) txVector.GetTxPowerLevel ();
503 
504  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
505  NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
506 
507  //-----------------------------------------------------------------------------------------------------
508 
509  /*
510  * After one fail the rate is decreased or the power increased.
511  * As we are at maximal power, the rate should be decreased.
512  * Set critical rate to 54 Mbps.
513  */
514  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
515 
516  txVector = manager->GetDataTxVector (packetHeader);
517  mode = txVector.GetMode ();
518  power = (int) txVector.GetTxPowerLevel ();
519 
520  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 48000000, "Incorrect vale of data rate");
521  NS_TEST_ASSERT_MSG_EQ (power, 17, "Incorrect value of power level");
522 
523  //-----------------------------------------------------------------------------------------------------
524 
525  /*
526  * As we are in state High we need 3 successful transmissions to increase rate or decrease power.
527  * As rate critical is set, after 3 successful transmissions power is decreased.
528  */
529  for (int i = 0; i < 3; i++)
530  {
531  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
532  }
533 
534  txVector = manager->GetDataTxVector (packetHeader);
535  mode = txVector.GetMode ();
536  power = (int) txVector.GetTxPowerLevel ();
537 
538  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 48000000, "APARF: Incorrect vale of data rate");
539  NS_TEST_ASSERT_MSG_EQ (power, 16, "APARF: Incorrect value of power level");
540 
541  //-----------------------------------------------------------------------------------------------------
542 
543  /*
544  * As we are in state High we need 3 successful transmissions to increase rate or decrease power.
545  * After 10 power changes critical rate is reset.
546  * So after 10*3 successful transmissions critical rate is set to 0.
547  * And 3 successful transmissions more will make power increase to maximum and rate increase to the critical rate.
548  */
549  for (int i = 0; i < 9 * 3; i++)
550  {
551  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
552  }
553 
554  txVector = manager->GetDataTxVector (packetHeader);
555  mode = txVector.GetMode ();
556  power = (int) txVector.GetTxPowerLevel ();
557 
558  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 48000000, "APARF: Incorrect vale of data rate");
559  NS_TEST_ASSERT_MSG_EQ (power, 7, "APARF: Incorrect value of power level");
560 
561  for (int i = 0; i < 3; i++)
562  {
563  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
564  }
565 
566  txVector = manager->GetDataTxVector (packetHeader);
567  mode = txVector.GetMode ();
568  power = (int) txVector.GetTxPowerLevel ();
569 
570  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth ()), 54000000, "APARF: Incorrect vale of data rate");
571  NS_TEST_ASSERT_MSG_EQ (power, 17, "APARF: Incorrect value of power level");
572 
573  Simulator::Destroy ();
574 }
575 
576 void
578 {
579  m_manager.SetTypeId ("ns3::RrpaaWifiManager");
580  Ptr<Node> node = ConfigureNode ();
581  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice> (node->GetDevice (0));
583 
584  /*
585  * Configure constants for rate and power control.
586  */
587  manager->SetAttribute ("Basic", BooleanValue (true));
588  manager->SetAttribute ("Alpha", DoubleValue (1.25));
589  manager->SetAttribute ("Beta", DoubleValue (2));
590  manager->SetAttribute ("Tau", DoubleValue (0.015));
591  /*
592  * Constants for the Probabilistic Decision Table.
593  * We set both to 1 to avoid random behaviour in tests.
594  */
595  manager->SetAttribute ("Gamma", DoubleValue (1));
596  manager->SetAttribute ("Delta", DoubleValue (1));
597 
598  /*
599  * Create a dummy packet to simulate transmission.
600  */
601  Mac48Address remoteAddress = Mac48Address::Allocate ();
602  WifiMacHeader packetHeader;
603  packetHeader.SetAddr1 (remoteAddress);
604  packetHeader.SetType (WIFI_MAC_DATA);
605  packetHeader.SetQosTid (0);
606  Ptr<Packet> packet = Create<Packet> (10);
607  WifiMode ackMode;
608 
609  /*
610  * To initialize the manager we need to generate a transmission.
611  */
612  Ptr<Packet> p = Create<Packet> ();
613  dev->Send (p, remoteAddress, 1);
614 
641  //-----------------------------------------------------------------------------------------------------
642 
643  /*
644  * RRPAA initiates with minimal rate and maximal power.
645  */
646  WifiTxVector txVector = manager->GetDataTxVector (packetHeader);
647  WifiMode mode = txVector.GetMode ();
648  int power = (int) txVector.GetTxPowerLevel ();
649 
650  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 6000000, "RRPAA: Initial data rate wrong"); //802.11a minimal rate is 6Mbps
651  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Initial power level wrong");
652 
653  //-----------------------------------------------------------------------------------------------------
654 
655  /*
656  * As RRPAA starts with the 6Mbps rate, 7 successful transmissions are needed for RRPAA to increase rate.
657  * 1/8 = 0.125
658  */
659 
663  for (int i = 0; i < 6; i++)
664  {
665  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
666  }
667 
668  txVector = manager->GetDataTxVector (packetHeader);
669  mode = txVector.GetMode ();
670  power = (int) txVector.GetTxPowerLevel ();
671 
672  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 6000000, "RRPAA: Incorrect vale of data rate");
673  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
674 
678  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
679 
680  txVector = manager->GetDataTxVector (packetHeader);
681  mode = txVector.GetMode ();
682  power = (int) txVector.GetTxPowerLevel ();
683 
684  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 9000000, "RRPAA: Incorrect vale of data rate");
685  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
686 
687  //-----------------------------------------------------------------------------------------------------
688 
689  /*
690  * 5 failures are needed to make the rate decrease again.
691  * 5/11 = 0.45
692  */
693  for (int i = 0; i < 4; i++)
694  {
695  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
696  }
697 
698  txVector = manager->GetDataTxVector (packetHeader);
699  mode = txVector.GetMode ();
700  power = (int) txVector.GetTxPowerLevel ();
701 
702  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 9000000, "RRPAA: Incorrect vale of data rate");
703  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
704 
705  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
706 
707  txVector = manager->GetDataTxVector (packetHeader);
708  mode = txVector.GetMode ();
709  power = (int) txVector.GetTxPowerLevel ();
710 
711  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 6000000, "RRPAA: Incorrect vale of data rate");
712  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
713 
714  //-----------------------------------------------------------------------------------------------------
715 
720  for (int i = 0; i < 7; i++)
721  {
722  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
723  }
724 
725  txVector = manager->GetDataTxVector (packetHeader);
726  mode = txVector.GetMode ();
727  power = (int) txVector.GetTxPowerLevel ();
728 
729  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 9000000, "RRPAA: Incorrect vale of data rate");
730  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
731 
732  for (int i = 0; i < 10; i++)
733  {
734  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
735  }
736 
737  txVector = manager->GetDataTxVector (packetHeader);
738  mode = txVector.GetMode ();
739  power = (int) txVector.GetTxPowerLevel ();
740 
741  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 12000000, "RRPAA: Incorrect vale of data rate");
742  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
743 
744  for (int i = 0; i < 13; i++)
745  {
746  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
747  }
748 
749  txVector = manager->GetDataTxVector (packetHeader);
750  mode = txVector.GetMode ();
751  power = (int) txVector.GetTxPowerLevel ();
752 
753  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 18000000, "RRPAA: Incorrect vale of data rate");
754  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
755 
756  for (int i = 0; i < 19; i++)
757  {
758  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
759  }
760 
761  txVector = manager->GetDataTxVector (packetHeader);
762  mode = txVector.GetMode ();
763  power = (int) txVector.GetTxPowerLevel ();
764 
765  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 24000000, "RRPAA: Incorrect vale of data rate");
766  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
767 
768  for (int i = 0; i < 23; i++)
769  {
770  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
771  }
772 
773  txVector = manager->GetDataTxVector (packetHeader);
774  mode = txVector.GetMode ();
775  power = (int) txVector.GetTxPowerLevel ();
776 
777  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
778  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
779 
780  for (int i = 0; i < 33; i++)
781  {
782  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
783  }
784 
785  txVector = manager->GetDataTxVector (packetHeader);
786  mode = txVector.GetMode ();
787  power = (int) txVector.GetTxPowerLevel ();
788 
789  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 48000000, "RRPAA: Incorrect vale of data rate");
790  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
791 
792  for (int i = 0; i < 43; i++)
793  {
794  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
795  }
796 
797  txVector = manager->GetDataTxVector (packetHeader);
798  mode = txVector.GetMode ();
799  power = (int) txVector.GetTxPowerLevel ();
800 
801  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
802  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
803 
804  //-----------------------------------------------------------------------------------------------------
805 
812  for (int i = 0; i < 49; i++)
813  {
814  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
815  }
816 
817  txVector = manager->GetDataTxVector (packetHeader);
818  mode = txVector.GetMode ();
819  power = (int) txVector.GetTxPowerLevel ();
820 
821  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
822  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
823 
824  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
825 
826  txVector = manager->GetDataTxVector (packetHeader);
827  mode = txVector.GetMode ();
828  power = (int) txVector.GetTxPowerLevel ();
829 
830  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
831  NS_TEST_ASSERT_MSG_EQ (power, 16, "RRPAA: Incorrect value of power level");
832 
833  //-----------------------------------------------------------------------------------------------------
834 
840  for (int i = 0; i < 16 * 50; i++)
841  {
842  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
843  }
844 
845  txVector = manager->GetDataTxVector (packetHeader);
846  mode = txVector.GetMode ();
847  power = (int) txVector.GetTxPowerLevel ();
848 
849  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
850  NS_TEST_ASSERT_MSG_EQ (power, 0, "RRPAA: Incorrect value of power level");
851 
852  //-----------------------------------------------------------------------------------------------------
853 
858  for (int i = 0; i < 6; i++)
859  {
860  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
861  }
862 
863  txVector = manager->GetDataTxVector (packetHeader);
864  mode = txVector.GetMode ();
865  power = (int) txVector.GetTxPowerLevel ();
866 
867  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
868  NS_TEST_ASSERT_MSG_EQ (power, 1, "RRPAA: Incorrect value of power level");
869 
870  //-----------------------------------------------------------------------------------------------------
871 
872  /*
873  * After 16*6 failed transmissions power is increase to 17.
874  */
875 
876  for (int i = 0; i < 16 * 6; i++)
877  {
878  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
879  }
880 
881  txVector = manager->GetDataTxVector (packetHeader);
882  mode = txVector.GetMode ();
883  power = (int) txVector.GetTxPowerLevel ();
884 
885  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 54000000, "RRPAA: Incorrect vale of data rate");
886  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
887 
888  //-----------------------------------------------------------------------------------------------------
889 
890  /*
891  * After 6 more failures the rate should be decreased.
892  */
893 
894  for (int i = 0; i < 6; i++)
895  {
896  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
897  }
898 
899  txVector = manager->GetDataTxVector (packetHeader);
900  mode = txVector.GetMode ();
901  power = (int) txVector.GetTxPowerLevel ();
902 
903  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 48000000, "RRPAA: Incorrect vale of data rate");
904  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
905 
906  /*
907  * Now 11 failures are needed to decrease rate again.
908  */
909 
910  for (int i = 0; i < 11; i++)
911  {
912  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
913  }
914 
915  txVector = manager->GetDataTxVector (packetHeader);
916  mode = txVector.GetMode ();
917  power = (int) txVector.GetTxPowerLevel ();
918 
919  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
920  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
921 
922  //-----------------------------------------------------------------------------------------------------
923 
924  /*
925  * Test power decrement when loss probability is between MTL and ORI.
926  * As we are at rate 36 Mbps we need at least 25 successful transmissions
927  * and 5 failures.
928  */
929 
930  for (int i = 0; i < 25; i++)
931  {
932  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
933  }
934 
935  txVector = manager->GetDataTxVector (packetHeader);
936  mode = txVector.GetMode ();
937  power = (int) txVector.GetTxPowerLevel ();
938 
939  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
940  NS_TEST_ASSERT_MSG_EQ (power, 17, "RRPAA: Incorrect value of power level");
941 
942  for (int i = 0; i < 5; i++)
943  {
944  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
945  }
946 
947  txVector = manager->GetDataTxVector (packetHeader);
948  mode = txVector.GetMode ();
949  power = (int) txVector.GetTxPowerLevel ();
950 
951  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
952  NS_TEST_ASSERT_MSG_EQ (power, 16, "RRPAA: Incorrect value of power level");
953 
954  for (int i = 0; i < 5; i++)
955  {
956  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
957  }
958 
959  txVector = manager->GetDataTxVector (packetHeader);
960  mode = txVector.GetMode ();
961  power = (int) txVector.GetTxPowerLevel ();
962 
963  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
964  NS_TEST_ASSERT_MSG_EQ (power, 16, "RRPAA: Incorrect value of power level");
965 
966  for (int i = 0; i < 25; i++)
967  {
968  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
969  }
970 
971  txVector = manager->GetDataTxVector (packetHeader);
972  mode = txVector.GetMode ();
973  power = (int) txVector.GetTxPowerLevel ();
974 
975  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
976  NS_TEST_ASSERT_MSG_EQ (power, 15, "RRPAA: Incorrect value of power level");
977 
978  //-----------------------------------------------------------------------------------------------------
979 
980  /*
981  * Repeat the previous test until power 0 is reached.
982  */
983 
984  for (int i = 0; i < 16; i++)
985  {
986  for (int j = 0; j < 25; j++)
987  {
988  manager->ReportDataOk (remoteAddress, &packetHeader, 0, ackMode, 0, txVector, packet->GetSize ());
989  }
990 
991  for (int j = 0; j < 5; j++)
992  {
993  manager->ReportDataFailed (remoteAddress,&packetHeader, packet->GetSize ());
994  }
995  }
996 
997  txVector = manager->GetDataTxVector (packetHeader);
998  mode = txVector.GetMode ();
999  power = (int) txVector.GetTxPowerLevel ();
1000 
1001  NS_TEST_ASSERT_MSG_EQ (mode.GetDataRate (txVector.GetChannelWidth (), txVector.GetGuardInterval (), 1), 36000000, "RRPAA: Incorrect vale of data rate");
1002  NS_TEST_ASSERT_MSG_EQ (power, 0, "RRPAA: Incorrect value of power level");
1003 
1004  Simulator::Stop (Seconds (10.0));
1005 
1006  Simulator::Run ();
1007  Simulator::Destroy ();
1008 
1009 }
1010 
1011 void
1013 {
1014 
1015  TestParf ();
1016  TestAparf ();
1017  TestRrpaa ();
1018 }
1019 
1027 {
1028 public:
1030 };
1031 
1033  : TestSuite ("wifi-power-rate-adaptation", UNIT)
1034 {
1035  AddTestCase (new PowerRateAdaptationTest, TestCase::QUICK);
1036 }
1037 
AttributeValue implementation for Boolean.
Definition: boolean.h:36
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
void TestAparf()
Test aparf function.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:144
A suite of tests to run.
Definition: test.h:1343
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
Power Rate Adaptation Test.
uint16_t GetGuardInterval(void) const
The 5 GHz band.
Definition: wifi-phy-band.h:35
encapsulates test code
Definition: test.h:1153
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:97
channel
Definition: third.py:92
mobility
Definition: third.py:108
Power Rate Adaptation Test Suite.
phy
Definition: third.py:93
Ptr< WifiRemoteStationManager > GetRemoteStationManager(void) const
void SetAddr1(Mac48Address address)
Fill the Address 1 field with the given address.
Ptr< Object > Create(void) const
Create an Object instance of the configured TypeId.
static PowerRateAdaptationTestSuite g_powerRateAdaptationTestSuite
the test suite
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
Hold an unsigned integer type.
Definition: uinteger.h:44
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:166
mac
Definition: third.py:99
WifiMode GetMode(void) const
hold a list of per-remote-station state.
void SetQosTid(uint8_t tid)
Set the TID for the QoS header.
OFDM PHY (Clause 17)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber)
an EUI-48 address
Definition: mac48-address.h:43
Ptr< Node > ConfigureNode()
Configure nde function.
void TestParf()
Test parf function.
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
Instantiate subclasses of ns3::Object.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1278
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint8_t GetTxPowerLevel(void) const
uint16_t GetChannelWidth(void) const
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
void TestRrpaa()
Test rrpaa function.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition: object-base.cc:185
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:119
Implements the IEEE 802.11 MAC header.