A Discrete-Event Network Simulator
API
power-rate-adaptation-test.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Universidad de la República - Uruguay
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  * Author: Matías Richart <mrichart@fing.edu.uy>
18  */
19 
20 #include "ns3/adhoc-wifi-mac.h"
21 #include "ns3/constant-position-mobility-model.h"
22 #include "ns3/fcfs-wifi-queue-scheduler.h"
23 #include "ns3/frame-exchange-manager.h"
24 #include "ns3/interference-helper.h"
25 #include "ns3/node.h"
26 #include "ns3/simulator.h"
27 #include "ns3/test.h"
28 #include "ns3/wifi-default-ack-manager.h"
29 #include "ns3/wifi-default-protection-manager.h"
30 #include "ns3/wifi-net-device.h"
31 #include "ns3/yans-wifi-channel.h"
32 #include "ns3/yans-wifi-phy.h"
33 
34 using namespace ns3;
35 
43 {
44  public:
46 
47  void DoRun() override;
48 
49  private:
51  void TestParf();
53  void TestAparf();
55  void TestRrpaa();
60  Ptr<Node> ConfigureNode();
61 
63 };
64 
66  : TestCase("PowerRateAdaptation")
67 {
68 }
69 
72 {
73  /*
74  * Create and configure node.
75  */
76  Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice>();
77  Ptr<Node> node = CreateObject<Node>();
78  node->AddDevice(dev);
79 
80  /*
81  * Create channel model. Is is necessary to configure correctly the phy layer.
82  */
83  Ptr<YansWifiChannel> channel = CreateObject<YansWifiChannel>();
84 
85  /*
86  * Create mobility model. Is needed by the phy layer for transmission.
87  */
88  Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel>();
89 
90  /*
91  * Create and configure phy layer.
92  */
93  Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy>();
94  Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
95  phy->SetInterferenceHelper(interferenceHelper);
96  dev->SetPhy(phy);
97  phy->SetChannel(channel);
98  phy->SetDevice(dev);
99  phy->SetMobility(mobility);
100  phy->ConfigureStandard(WIFI_STANDARD_80211a);
101 
102  /*
103  * Configure power control parameters.
104  */
105  phy->SetNTxPower(18);
106  phy->SetTxPowerStart(0);
107  phy->SetTxPowerEnd(17);
108 
109  /*
110  * Create manager.
111  */
113  dev->SetRemoteStationManager(manager);
114 
115  /*
116  * Create mac layer. We use Adhoc because association is not needed to get supported rates.
117  */
118  Ptr<AdhocWifiMac> mac = CreateObject<AdhocWifiMac>();
119  mac->SetDevice(dev);
120  mac->SetAddress(Mac48Address::Allocate());
121  dev->SetMac(mac);
122  mac->ConfigureStandard(WIFI_STANDARD_80211a);
123  mac->SetMacQueueScheduler(CreateObject<FcfsWifiQueueScheduler>());
124  Ptr<FrameExchangeManager> fem = mac->GetFrameExchangeManager();
125 
126  Ptr<WifiProtectionManager> protectionManager = CreateObject<WifiDefaultProtectionManager>();
127  protectionManager->SetWifiMac(mac);
128  fem->SetProtectionManager(protectionManager);
129 
130  Ptr<WifiAckManager> ackManager = CreateObject<WifiDefaultAckManager>();
131  ackManager->SetWifiMac(mac);
132  fem->SetAckManager(ackManager);
133 
134  return node;
135 }
136 
137 void
139 {
140  m_manager.SetTypeId("ns3::ParfWifiManager");
141  Ptr<Node> node = ConfigureNode();
142  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice>(node->GetDevice(0));
144 
145  /*
146  * Configure thresholds for rate and power control.
147  */
148  manager->SetAttribute("AttemptThreshold", UintegerValue(15));
149  manager->SetAttribute("SuccessThreshold", UintegerValue(10));
150 
151  /*
152  * Create a dummy packet to simulate transmission.
153  */
154  Mac48Address remoteAddress = Mac48Address::Allocate();
155  WifiMacHeader packetHeader;
156  packetHeader.SetAddr1(remoteAddress);
157  packetHeader.SetType(WIFI_MAC_DATA);
158  packetHeader.SetQosTid(0);
159  Ptr<Packet> packet = Create<Packet>(10);
160  Ptr<WifiMpdu> mpdu = Create<WifiMpdu>(packet, packetHeader);
161  WifiMode ackMode;
162 
163  /*
164  * To initialize the manager we need to generate a transmission.
165  */
166  Ptr<Packet> p = Create<Packet>();
167  dev->Send(p, remoteAddress, 1);
168 
169  //-----------------------------------------------------------------------------------------------------
170 
171  /*
172  * Parf initiates with maximal rate and power.
173  */
174  WifiTxVector txVector =
175  manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
176  WifiMode mode = txVector.GetMode();
177  int power = (int)txVector.GetTxPowerLevel();
178 
180  54000000,
181  "PARF: Initial data rate wrong");
182  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Initial power level wrong");
183 
184  //-----------------------------------------------------------------------------------------------------
185 
186  /*
187  * After 10 consecutive successful transmissions parf increase rate or decrease power.
188  * As we are at maximal rate, the power should be decreased. recoveryPower=true.
189  */
190  for (int i = 0; i < 10; i++)
191  {
192  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
193  }
194 
195  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
196  mode = txVector.GetMode();
197  power = (int)txVector.GetTxPowerLevel();
198 
200  54000000,
201  "PARF: Incorrect vale of data rate");
202  NS_TEST_ASSERT_MSG_EQ(power, 16, "PARF: Incorrect value of power level");
203 
204  //-----------------------------------------------------------------------------------------------------
205 
206  /*
207  * As we are using recovery power, one failure make power increase.
208  *
209  */
210  manager->ReportDataFailed(mpdu);
211 
212  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
213  mode = txVector.GetMode();
214  power = (int)txVector.GetTxPowerLevel();
215 
217  54000000,
218  "PARF: Incorrect vale of data rate");
219  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
220 
221  //-----------------------------------------------------------------------------------------------------
222 
223  /*
224  * After 15 transmissions attempts parf increase rate or decrease power.
225  * As we are at maximal rate, the power should be decreased. recoveryPower=true.
226  */
227  for (int i = 0; i < 7; i++)
228  {
229  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
230  manager->ReportDataFailed(mpdu);
231  }
232  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
233 
234  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
235  mode = txVector.GetMode();
236  power = (int)txVector.GetTxPowerLevel();
237 
239  54000000,
240  "PARF: Incorrect vale of data rate");
241  NS_TEST_ASSERT_MSG_EQ(power, 16, "PARF: Incorrect value of power level");
242 
243  //-----------------------------------------------------------------------------------------------------
244 
245  /*
246  * As we are using recovery power, one failure make power increase. recoveryPower=false.
247  */
248 
249  manager->ReportDataFailed(mpdu);
250 
251  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
252  mode = txVector.GetMode();
253  power = (int)txVector.GetTxPowerLevel();
254 
256  54000000,
257  "PARF: Incorrect vale of data rate");
258  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
259 
260  //-----------------------------------------------------------------------------------------------------
261 
262  /*
263  * After two consecutive fails the rate is decreased or the power increased.
264  * As we are at maximal power, the rate should be decreased.
265  */
266  manager->ReportDataFailed(mpdu);
267  manager->ReportDataFailed(mpdu);
268 
269  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
270  mode = txVector.GetMode();
271  power = (int)txVector.GetTxPowerLevel();
272 
274  48000000,
275  "PARF: Incorrect vale of data rate");
276  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
277 
278  //-----------------------------------------------------------------------------------------------------
279 
280  /*
281  * After 10 consecutive successful transmissions parf increase rate or decrease power.
282  * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
283  */
284  for (int i = 0; i < 10; i++)
285  {
286  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
287  }
288 
289  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
290  mode = txVector.GetMode();
291  power = (int)txVector.GetTxPowerLevel();
292 
294  54000000,
295  "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  * As we are using recovery rate, one failure make rate decrease. recoveryRate=false.
302  */
303 
304  manager->ReportDataFailed(mpdu);
305 
306  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
307  mode = txVector.GetMode();
308  power = (int)txVector.GetTxPowerLevel();
309 
311  48000000,
312  "PARF: Incorrect vale of data rate");
313  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
314 
315  //-----------------------------------------------------------------------------------------------------
316 
317  /*
318  * After 10 consecutive successful transmissions parf increase rate or decrease power.
319  * As we are not at maximal rate, the rate is increased again. recoveryRate=true.
320  */
321  for (int i = 0; i < 10; i++)
322  {
323  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
324  }
325 
326  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
327  mode = txVector.GetMode();
328  power = (int)txVector.GetTxPowerLevel();
329 
331  54000000,
332  "PARF: Incorrect vale of data rate");
333  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
334 
335  //-----------------------------------------------------------------------------------------------------
336 
337  /*
338  * After 10 consecutive successful transmissions parf increase rate or decrease power.
339  * As we are at maximal rate, the power is decreased. recoveryRate=false, recoveryPower=true.
340  */
341  for (int i = 0; i < 10; i++)
342  {
343  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
344  }
345 
346  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
347  mode = txVector.GetMode();
348  power = (int)txVector.GetTxPowerLevel();
349 
351  54000000,
352  "PARF: Incorrect vale of data rate");
353  NS_TEST_ASSERT_MSG_EQ(power, 16, "PARF: Incorrect value of power level");
354 
355  //-----------------------------------------------------------------------------------------------------
356 
357  /*
358  * One successful transmissions after a power decrease make recoverPower=false.
359  * So we need two consecutive failures to increase power again.
360  */
361  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
362 
363  for (int i = 0; i < 2; i++)
364  {
365  manager->ReportDataFailed(mpdu);
366  }
367 
368  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
369  mode = txVector.GetMode();
370  power = (int)txVector.GetTxPowerLevel();
371 
373  54000000,
374  "PARF: Incorrect vale of data rate");
375  NS_TEST_ASSERT_MSG_EQ(power, 17, "PARF: Incorrect value of power level");
376 
377  Simulator::Destroy();
378 }
379 
380 void
382 {
383  m_manager.SetTypeId("ns3::AparfWifiManager");
384  Ptr<Node> node = ConfigureNode();
385  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice>(node->GetDevice(0));
387 
388  /*
389  * Configure thresholds for rate and power control.
390  */
391  manager->SetAttribute("SuccessThreshold1", UintegerValue(3));
392  manager->SetAttribute("SuccessThreshold2", UintegerValue(10));
393  manager->SetAttribute("FailThreshold", UintegerValue(1));
394  manager->SetAttribute("PowerThreshold", UintegerValue(10));
395 
396  /*
397  * Create a dummy packet to simulate transmission.
398  */
399  Mac48Address remoteAddress = Mac48Address::Allocate();
400  WifiMacHeader packetHeader;
401  packetHeader.SetAddr1(remoteAddress);
402  packetHeader.SetType(WIFI_MAC_DATA);
403  packetHeader.SetQosTid(0);
404  Ptr<Packet> packet = Create<Packet>(10);
405  Ptr<WifiMpdu> mpdu = Create<WifiMpdu>(packet, packetHeader);
406  WifiMode ackMode;
407 
408  /*
409  * To initialize the manager we need to generate a transmission.
410  */
411  Ptr<Packet> p = Create<Packet>();
412  dev->Send(p, remoteAddress, 1);
413 
414  //-----------------------------------------------------------------------------------------------------
415 
416  /*
417  * Aparf initiates with maximal rate and power.
418  */
419  WifiTxVector txVector =
420  manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
421  WifiMode mode = txVector.GetMode();
422  int power = (int)txVector.GetTxPowerLevel();
423 
425  54000000,
426  "APARF: Initial data rate wrong");
427  NS_TEST_ASSERT_MSG_EQ(power, 17, "APARF: Initial power level wrong");
428 
429  //-----------------------------------------------------------------------------------------------------
430 
431  /*
432  * As Aparf starts in state High, after 3 consecutive successful transmissions aparf increase
433  * rate or decrease power. As we are at maximal rate, the power should be decreased. Change to
434  * state Spread.
435  */
436  for (int i = 0; i < 3; i++)
437  {
438  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
439  }
440 
441  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
442  mode = txVector.GetMode();
443  power = (int)txVector.GetTxPowerLevel();
444 
446  54000000,
447  "APARF: Incorrect vale of data rate");
448  NS_TEST_ASSERT_MSG_EQ(power, 16, "APARF: Incorrect value of power level");
449 
450  //-----------------------------------------------------------------------------------------------------
451 
452  /*
453  * One failure make the power to be increased again.
454  * Change to state Low.
455  */
456  manager->ReportDataFailed(mpdu);
457 
458  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
459  mode = txVector.GetMode();
460  power = (int)txVector.GetTxPowerLevel();
461 
463  54000000,
464  "APARF: Incorrect vale of data rate");
465  NS_TEST_ASSERT_MSG_EQ(power, 17, "APARF: Incorrect value of power level");
466 
467  //-----------------------------------------------------------------------------------------------------
468 
469  /*
470  * As we are in state Low we need 10 successful transmissions to increase rate or decrease
471  * power. As we are at maximal rate, the power should be decreased. Change to state Spread.
472  */
473  for (int i = 0; i < 10; i++)
474  {
475  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
476  }
477 
478  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
479  mode = txVector.GetMode();
480  power = (int)txVector.GetTxPowerLevel();
481 
483  54000000,
484  "APARF: Incorrect vale of data rate");
485  NS_TEST_ASSERT_MSG_EQ(power, 16, "APARF: Incorrect value of power level");
486 
487  //-----------------------------------------------------------------------------------------------------
488 
489  /*
490  * One more successful transmission make to change to state High.
491  * Two more successful transmissions make power decrease.
492  */
493 
494  for (int i = 0; i < 3; i++)
495  {
496  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
497  }
498 
499  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
500  mode = txVector.GetMode();
501  power = (int)txVector.GetTxPowerLevel();
502 
504  54000000,
505  "APARF: Incorrect vale of data rate");
506  NS_TEST_ASSERT_MSG_EQ(power, 15, "APARF: Incorrect value of power level");
507 
508  //-----------------------------------------------------------------------------------------------------
509 
510  /*
511  * As we are in state High we need 3 successful transmissions to increase rate or decrease
512  * power. After 16*3 successful transmissions power is decreased to zero.
513  */
514  for (int i = 0; i < 16 * 3; i++)
515  {
516  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
517  }
518 
519  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
520  mode = txVector.GetMode();
521  power = (int)txVector.GetTxPowerLevel();
522 
524  54000000,
525  "APARF: Incorrect vale of data rate");
526  NS_TEST_ASSERT_MSG_EQ(power, 0, "APARF: Incorrect value of power level");
527 
528  //-----------------------------------------------------------------------------------------------------
529 
530  /*
531  * After one fail the rate is decreased or the power increased.
532  * As we are at minimal power, the power should be increased.
533  */
534  manager->ReportDataFailed(mpdu);
535 
536  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
537  mode = txVector.GetMode();
538  power = (int)txVector.GetTxPowerLevel();
539 
541  54000000,
542  "Incorrect vale of data rate");
543  NS_TEST_ASSERT_MSG_EQ(power, 1, "Incorrect value of power level");
544 
545  //-----------------------------------------------------------------------------------------------------
546 
547  /*
548  * After one fail the rate is decreased or the power increased.
549  * After 16 failed transmissions power is increase to 17.
550  */
551  for (int i = 0; i < 16; i++)
552  {
553  manager->ReportDataFailed(mpdu);
554  }
555 
556  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
557  mode = txVector.GetMode();
558  power = (int)txVector.GetTxPowerLevel();
559 
561  54000000,
562  "APARF: Incorrect vale of data rate");
563  NS_TEST_ASSERT_MSG_EQ(power, 17, "APARF: Incorrect value of power level");
564 
565  //-----------------------------------------------------------------------------------------------------
566 
567  /*
568  * After one fail the rate is decreased or the power increased.
569  * As we are at maximal power, the rate should be decreased.
570  * Set critical rate to 54 Mbps.
571  */
572  manager->ReportDataFailed(mpdu);
573 
574  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
575  mode = txVector.GetMode();
576  power = (int)txVector.GetTxPowerLevel();
577 
579  48000000,
580  "Incorrect vale of data rate");
581  NS_TEST_ASSERT_MSG_EQ(power, 17, "Incorrect value of power level");
582 
583  //-----------------------------------------------------------------------------------------------------
584 
585  /*
586  * As we are in state High we need 3 successful transmissions to increase rate or decrease
587  * power. As rate critical is set, after 3 successful transmissions power is decreased.
588  */
589  for (int i = 0; i < 3; i++)
590  {
591  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
592  }
593 
594  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
595  mode = txVector.GetMode();
596  power = (int)txVector.GetTxPowerLevel();
597 
599  48000000,
600  "APARF: Incorrect vale of data rate");
601  NS_TEST_ASSERT_MSG_EQ(power, 16, "APARF: Incorrect value of power level");
602 
603  //-----------------------------------------------------------------------------------------------------
604 
605  /*
606  * As we are in state High we need 3 successful transmissions to increase rate or decrease
607  * power. After 10 power changes critical rate is reset. So after 10*3 successful transmissions
608  * critical rate is set to 0. And 3 successful transmissions more will make power increase to
609  * maximum and rate increase to the critical rate.
610  */
611  for (int i = 0; i < 9 * 3; i++)
612  {
613  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
614  }
615 
616  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
617  mode = txVector.GetMode();
618  power = (int)txVector.GetTxPowerLevel();
619 
621  48000000,
622  "APARF: Incorrect vale of data rate");
623  NS_TEST_ASSERT_MSG_EQ(power, 7, "APARF: Incorrect value of power level");
624 
625  for (int i = 0; i < 3; i++)
626  {
627  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
628  }
629 
630  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
631  mode = txVector.GetMode();
632  power = (int)txVector.GetTxPowerLevel();
633 
635  54000000,
636  "APARF: Incorrect vale of data rate");
637  NS_TEST_ASSERT_MSG_EQ(power, 17, "APARF: Incorrect value of power level");
638 
639  Simulator::Destroy();
640 }
641 
642 void
644 {
645  m_manager.SetTypeId("ns3::RrpaaWifiManager");
646  Ptr<Node> node = ConfigureNode();
647  Ptr<WifiNetDevice> dev = DynamicCast<WifiNetDevice>(node->GetDevice(0));
649 
650  /*
651  * Configure constants for rate and power control.
652  */
653  manager->SetAttribute("Basic", BooleanValue(true));
654  manager->SetAttribute("Alpha", DoubleValue(1.25));
655  manager->SetAttribute("Beta", DoubleValue(2));
656  manager->SetAttribute("Tau", DoubleValue(0.015));
657  /*
658  * Constants for the Probabilistic Decision Table.
659  * We set both to 1 to avoid random behaviour in tests.
660  */
661  manager->SetAttribute("Gamma", DoubleValue(1));
662  manager->SetAttribute("Delta", DoubleValue(1));
663 
664  /*
665  * Create a dummy packet to simulate transmission.
666  */
667  Mac48Address remoteAddress = Mac48Address::Allocate();
668  WifiMacHeader packetHeader;
669  packetHeader.SetAddr1(remoteAddress);
670  packetHeader.SetType(WIFI_MAC_DATA);
671  packetHeader.SetQosTid(0);
672  Ptr<Packet> packet = Create<Packet>(10);
673  Ptr<WifiMpdu> mpdu = Create<WifiMpdu>(packet, packetHeader);
674  WifiMode ackMode;
675 
676  /*
677  * To initialize the manager we need to generate a transmission.
678  */
679  Ptr<Packet> p = Create<Packet>();
680  dev->Send(p, remoteAddress, 1);
681 
708  //-----------------------------------------------------------------------------------------------------
709 
710  /*
711  * RRPAA initiates with minimal rate and maximal power.
712  */
713  WifiTxVector txVector =
714  manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
715  WifiMode mode = txVector.GetMode();
716  int power = (int)txVector.GetTxPowerLevel();
717 
719  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
720  6000000,
721  "RRPAA: Initial data rate wrong"); // 802.11a minimal rate is 6Mbps
722  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Initial power level wrong");
723 
724  //-----------------------------------------------------------------------------------------------------
725 
726  /*
727  * As RRPAA starts with the 6Mbps rate, 7 successful transmissions are needed for RRPAA to
728  * increase rate. 1/8 = 0.125
729  */
730 
734  for (int i = 0; i < 6; i++)
735  {
736  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
737  }
738 
739  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
740  mode = txVector.GetMode();
741  power = (int)txVector.GetTxPowerLevel();
742 
744  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
745  6000000,
746  "RRPAA: Incorrect vale of data rate");
747  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
748 
752  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
753 
754  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
755  mode = txVector.GetMode();
756  power = (int)txVector.GetTxPowerLevel();
757 
759  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
760  9000000,
761  "RRPAA: Incorrect vale of data rate");
762  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
763 
764  //-----------------------------------------------------------------------------------------------------
765 
766  /*
767  * 5 failures are needed to make the rate decrease again.
768  * 5/11 = 0.45
769  */
770  for (int i = 0; i < 4; i++)
771  {
772  manager->ReportDataFailed(mpdu);
773  }
774 
775  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
776  mode = txVector.GetMode();
777  power = (int)txVector.GetTxPowerLevel();
778 
780  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
781  9000000,
782  "RRPAA: Incorrect vale of data rate");
783  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
784 
785  manager->ReportDataFailed(mpdu);
786 
787  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
788  mode = txVector.GetMode();
789  power = (int)txVector.GetTxPowerLevel();
790 
792  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
793  6000000,
794  "RRPAA: Incorrect vale of data rate");
795  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
796 
797  //-----------------------------------------------------------------------------------------------------
798 
803  for (int i = 0; i < 7; i++)
804  {
805  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
806  }
807 
808  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
809  mode = txVector.GetMode();
810  power = (int)txVector.GetTxPowerLevel();
811 
813  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
814  9000000,
815  "RRPAA: Incorrect vale of data rate");
816  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
817 
818  for (int i = 0; i < 10; i++)
819  {
820  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
821  }
822 
823  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
824  mode = txVector.GetMode();
825  power = (int)txVector.GetTxPowerLevel();
826 
828  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
829  12000000,
830  "RRPAA: Incorrect vale of data rate");
831  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
832 
833  for (int i = 0; i < 13; i++)
834  {
835  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
836  }
837 
838  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
839  mode = txVector.GetMode();
840  power = (int)txVector.GetTxPowerLevel();
841 
843  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
844  18000000,
845  "RRPAA: Incorrect vale of data rate");
846  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
847 
848  for (int i = 0; i < 19; i++)
849  {
850  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
851  }
852 
853  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
854  mode = txVector.GetMode();
855  power = (int)txVector.GetTxPowerLevel();
856 
858  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
859  24000000,
860  "RRPAA: Incorrect vale of data rate");
861  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
862 
863  for (int i = 0; i < 23; i++)
864  {
865  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
866  }
867 
868  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
869  mode = txVector.GetMode();
870  power = (int)txVector.GetTxPowerLevel();
871 
873  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
874  36000000,
875  "RRPAA: Incorrect vale of data rate");
876  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
877 
878  for (int i = 0; i < 33; i++)
879  {
880  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
881  }
882 
883  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
884  mode = txVector.GetMode();
885  power = (int)txVector.GetTxPowerLevel();
886 
888  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
889  48000000,
890  "RRPAA: Incorrect vale of data rate");
891  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
892 
893  for (int i = 0; i < 43; i++)
894  {
895  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
896  }
897 
898  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
899  mode = txVector.GetMode();
900  power = (int)txVector.GetTxPowerLevel();
901 
903  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
904  54000000,
905  "RRPAA: Incorrect vale of data rate");
906  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
907 
908  //-----------------------------------------------------------------------------------------------------
909 
916  for (int i = 0; i < 49; i++)
917  {
918  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
919  }
920 
921  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
922  mode = txVector.GetMode();
923  power = (int)txVector.GetTxPowerLevel();
924 
926  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
927  54000000,
928  "RRPAA: Incorrect vale of data rate");
929  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
930 
931  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
932 
933  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
934  mode = txVector.GetMode();
935  power = (int)txVector.GetTxPowerLevel();
936 
938  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
939  54000000,
940  "RRPAA: Incorrect vale of data rate");
941  NS_TEST_ASSERT_MSG_EQ(power, 16, "RRPAA: Incorrect value of power level");
942 
943  //-----------------------------------------------------------------------------------------------------
944 
950  for (int i = 0; i < 16 * 50; i++)
951  {
952  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
953  }
954 
955  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
956  mode = txVector.GetMode();
957  power = (int)txVector.GetTxPowerLevel();
958 
960  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
961  54000000,
962  "RRPAA: Incorrect vale of data rate");
963  NS_TEST_ASSERT_MSG_EQ(power, 0, "RRPAA: Incorrect value of power level");
964 
965  //-----------------------------------------------------------------------------------------------------
966 
971  for (int i = 0; i < 6; i++)
972  {
973  manager->ReportDataFailed(mpdu);
974  }
975 
976  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
977  mode = txVector.GetMode();
978  power = (int)txVector.GetTxPowerLevel();
979 
981  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
982  54000000,
983  "RRPAA: Incorrect vale of data rate");
984  NS_TEST_ASSERT_MSG_EQ(power, 1, "RRPAA: Incorrect value of power level");
985 
986  //-----------------------------------------------------------------------------------------------------
987 
988  /*
989  * After 16*6 failed transmissions power is increase to 17.
990  */
991 
992  for (int i = 0; i < 16 * 6; i++)
993  {
994  manager->ReportDataFailed(mpdu);
995  }
996 
997  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
998  mode = txVector.GetMode();
999  power = (int)txVector.GetTxPowerLevel();
1000 
1002  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1003  54000000,
1004  "RRPAA: Incorrect vale of data rate");
1005  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
1006 
1007  //-----------------------------------------------------------------------------------------------------
1008 
1009  /*
1010  * After 6 more failures the rate should be decreased.
1011  */
1012 
1013  for (int i = 0; i < 6; i++)
1014  {
1015  manager->ReportDataFailed(mpdu);
1016  }
1017 
1018  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1019  mode = txVector.GetMode();
1020  power = (int)txVector.GetTxPowerLevel();
1021 
1023  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1024  48000000,
1025  "RRPAA: Incorrect vale of data rate");
1026  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
1027 
1028  /*
1029  * Now 11 failures are needed to decrease rate again.
1030  */
1031 
1032  for (int i = 0; i < 11; i++)
1033  {
1034  manager->ReportDataFailed(mpdu);
1035  }
1036 
1037  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1038  mode = txVector.GetMode();
1039  power = (int)txVector.GetTxPowerLevel();
1040 
1042  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1043  36000000,
1044  "RRPAA: Incorrect vale of data rate");
1045  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
1046 
1047  //-----------------------------------------------------------------------------------------------------
1048 
1049  /*
1050  * Test power decrement when loss probability is between MTL and ORI.
1051  * As we are at rate 36 Mbps we need at least 25 successful transmissions
1052  * and 5 failures.
1053  */
1054 
1055  for (int i = 0; i < 25; i++)
1056  {
1057  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
1058  }
1059 
1060  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1061  mode = txVector.GetMode();
1062  power = (int)txVector.GetTxPowerLevel();
1063 
1065  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1066  36000000,
1067  "RRPAA: Incorrect vale of data rate");
1068  NS_TEST_ASSERT_MSG_EQ(power, 17, "RRPAA: Incorrect value of power level");
1069 
1070  for (int i = 0; i < 5; i++)
1071  {
1072  manager->ReportDataFailed(mpdu);
1073  }
1074 
1075  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1076  mode = txVector.GetMode();
1077  power = (int)txVector.GetTxPowerLevel();
1078 
1080  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1081  36000000,
1082  "RRPAA: Incorrect vale of data rate");
1083  NS_TEST_ASSERT_MSG_EQ(power, 16, "RRPAA: Incorrect value of power level");
1084 
1085  for (int i = 0; i < 5; i++)
1086  {
1087  manager->ReportDataFailed(mpdu);
1088  }
1089 
1090  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1091  mode = txVector.GetMode();
1092  power = (int)txVector.GetTxPowerLevel();
1093 
1095  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1096  36000000,
1097  "RRPAA: Incorrect vale of data rate");
1098  NS_TEST_ASSERT_MSG_EQ(power, 16, "RRPAA: Incorrect value of power level");
1099 
1100  for (int i = 0; i < 25; i++)
1101  {
1102  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
1103  }
1104 
1105  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1106  mode = txVector.GetMode();
1107  power = (int)txVector.GetTxPowerLevel();
1108 
1110  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1111  36000000,
1112  "RRPAA: Incorrect vale of data rate");
1113  NS_TEST_ASSERT_MSG_EQ(power, 15, "RRPAA: Incorrect value of power level");
1114 
1115  //-----------------------------------------------------------------------------------------------------
1116 
1117  /*
1118  * Repeat the previous test until power 0 is reached.
1119  */
1120 
1121  for (int i = 0; i < 16; i++)
1122  {
1123  for (int j = 0; j < 25; j++)
1124  {
1125  manager->ReportDataOk(mpdu, 0, ackMode, 0, txVector);
1126  }
1127 
1128  for (int j = 0; j < 5; j++)
1129  {
1130  manager->ReportDataFailed(mpdu);
1131  }
1132  }
1133 
1134  txVector = manager->GetDataTxVector(packetHeader, dev->GetPhy()->GetChannelWidth());
1135  mode = txVector.GetMode();
1136  power = (int)txVector.GetTxPowerLevel();
1137 
1139  mode.GetDataRate(txVector.GetChannelWidth(), txVector.GetGuardInterval(), 1),
1140  36000000,
1141  "RRPAA: Incorrect vale of data rate");
1142  NS_TEST_ASSERT_MSG_EQ(power, 0, "RRPAA: Incorrect value of power level");
1143 
1144  Simulator::Stop(Seconds(10.0));
1145 
1146  Simulator::Run();
1147  Simulator::Destroy();
1148 }
1149 
1150 void
1152 {
1153  TestParf();
1154  TestAparf();
1155  TestRrpaa();
1156 }
1157 
1165 {
1166  public:
1168 };
1169 
1171  : TestSuite("wifi-power-rate-adaptation", UNIT)
1172 {
1173  AddTestCase(new PowerRateAdaptationTest, TestCase::QUICK);
1174 }
1175 
Power Rate Adaptation Test.
void TestParf()
Test parf function.
void TestAparf()
Test aparf function.
Ptr< Node > ConfigureNode()
Configure nde function.
void DoRun() override
Implementation to actually run this TestCase.
void TestRrpaa()
Test rrpaa function.
Power Rate Adaptation Test Suite.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
an EUI-48 address
Definition: mac48-address.h:46
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:138
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition: node.cc:152
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
Hold an unsigned integer type.
Definition: uinteger.h:45
Implements the IEEE 802.11 MAC header.
void SetAddr1(Mac48Address address)
Fill the Address 1 field with the given address.
virtual void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
void SetQosTid(uint8_t tid)
Set the TID for the QoS header.
represent a single transmission mode
Definition: wifi-mode.h:51
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:122
void SetMac(const Ptr< WifiMac > mac)
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber) override
void SetRemoteStationManager(const Ptr< WifiRemoteStationManager > manager)
Ptr< WifiRemoteStationManager > GetRemoteStationManager() const
Ptr< WifiPhy > GetPhy() const
void SetPhy(const Ptr< WifiPhy > phy)
uint16_t GetChannelWidth() const
Definition: wifi-phy.cc:1051
hold a list of per-remote-station state.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
uint16_t GetGuardInterval() const
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode.
uint8_t GetTxPowerLevel() const
uint16_t GetChannelWidth() const
#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:144
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
@ WIFI_STANDARD_80211a
Every class exported by the ns3 library is enclosed in the ns3 namespace.
@ WIFI_MAC_DATA
channel
Definition: third.py:88
mac
Definition: third.py:92
mobility
Definition: third.py:105
phy
Definition: third.py:89
static PowerRateAdaptationTestSuite g_powerRateAdaptationTestSuite
the test suite