32 #include "ns3/config.h"
33 #include "ns3/gnuplot.h"
34 #include "ns3/boolean.h"
35 #include "ns3/string.h"
36 #include "ns3/double.h"
37 #include "ns3/integer.h"
38 #include "ns3/uinteger.h"
39 #include "ns3/command-line.h"
40 #include "ns3/node-list.h"
41 #include "ns3/yans-wifi-helper.h"
43 #include "ns3/wifi-mac-header.h"
44 #include "ns3/queue-size.h"
45 #include "ns3/propagation-loss-model.h"
46 #include "ns3/propagation-delay-model.h"
47 #include "ns3/rng-seed-manager.h"
48 #include "ns3/mobility-helper.h"
49 #include "ns3/wifi-net-device.h"
50 #include "ns3/packet-socket-helper.h"
51 #include "ns3/packet-socket-client.h"
52 #include "ns3/packet-socket-server.h"
53 #include "ns3/application-container.h"
54 #include "ns3/ampdu-subframe-header.h"
55 #include "ns3/wifi-mac.h"
57 #define PI 3.1415926535
96 {5, 0.8418}, {10, 0.7831}, {15, 0.7460}, {20, 0.7186}, {25, 0.6973}, {30, 0.6802}, {35, 0.6639}, {40, 0.6501}, {45, 0.6386}, {50, 0.6285},
99 {5, 1.6170}, {10, 1.5075}, {15, 1.4371}, {20, 1.3849}, {25, 1.3442}, {30, 1.3115}, {35, 1.2803}, {40, 1.2538}, {45, 1.2317}, {50, 1.2124},
101 {
"DsssRate5_5Mbps", {
102 {5, 3.8565}, {10, 3.6170}, {15, 3.4554}, {20, 3.3339}, {25, 3.2385}, {30, 3.1613}, {35, 3.0878}, {40, 3.0249}, {45, 2.9725}, {50, 2.9266},
105 {5, 6.3821}, {10, 6.0269}, {15, 5.7718}, {20, 5.5765}, {25, 5.4217}, {30, 5.2958}, {35, 5.1755}, {40, 5.0722}, {45, 4.9860}, {50, 4.9103},
109 {5, 4.6899}, {10, 4.3197}, {15, 4.1107}, {20, 3.9589}, {25, 3.8478}, {30, 3.7490}, {35, 3.6618}, {40, 3.5927}, {45, 3.5358}, {50, 3.4711},
112 {5, 6.8188}, {10, 6.2885}, {15, 5.9874}, {20, 5.7680}, {25, 5.6073}, {30, 5.4642}, {35, 5.3378}, {40, 5.2376}, {45, 5.1551}, {50, 5.0612},
115 {5, 8.8972}, {10, 8.2154}, {15, 7.8259}, {20, 7.5415}, {25, 7.3329}, {30, 7.1469}, {35, 6.9825}, {40, 6.8521}, {45, 6.7447}, {50, 6.6225},
118 {5, 12.6719}, {10, 11.7273}, {15, 11.1814}, {20, 10.7810}, {25, 10.4866}, {30, 10.2237}, {35, 9.9910}, {40, 9.8061}, {45, 9.6538}, {50, 9.4804},
121 {5, 16.0836}, {10, 14.9153}, {15, 14.2327}, {20, 13.7300}, {25, 13.3595}, {30, 13.0281}, {35, 12.7343}, {40, 12.5008}, {45, 12.3083}, {50, 12.0889},
124 {5, 22.0092}, {10, 20.4836}, {15, 19.5743}, {20, 18.8997}, {25, 18.4002}, {30, 17.9524}, {35, 17.5545}, {40, 17.2377}, {45, 16.9760}, {50, 16.6777},
127 {5, 26.8382}, {10, 25.0509}, {15, 23.9672}, {20, 23.1581}, {25, 22.5568}, {30, 22.0165}, {35, 21.5355}, {40, 21.1519}, {45, 20.8348}, {50, 20.4729},
130 {5, 29.2861}, {10, 27.3763}, {15, 26.2078}, {20, 25.3325}, {25, 24.6808}, {30, 24.0944}, {35, 23.5719}, {40, 23.1549}, {45, 22.8100}, {50, 22.4162},
133 {
"ErpOfdmRate6Mbps", {
134 {5, 4.6899}, {10, 4.3197}, {15, 4.1107}, {20, 3.9589}, {25, 3.8478}, {30, 3.7490}, {35, 3.6618}, {40, 3.5927}, {45, 3.5358}, {50, 3.4711},
136 {
"ErpOfdmRate9Mbps", {
137 {5, 6.8188}, {10, 6.2885}, {15, 5.9874}, {20, 5.7680}, {25, 5.6073}, {30, 5.4642}, {35, 5.3378}, {40, 5.2376}, {45, 5.1551}, {50, 5.0612},
139 {
"ErpOfdmRate12Mbps", {
140 {5, 8.8972}, {10, 8.2154}, {15, 7.8259}, {20, 7.5415}, {25, 7.3329}, {30, 7.1469}, {35, 6.9825}, {40, 6.8521}, {45, 6.7447}, {50, 6.6225},
142 {
"ErpOfdmRate18Mbps", {
143 {5, 12.6719}, {10, 11.7273}, {15, 11.1814}, {20, 10.7810}, {25, 10.4866}, {30, 10.2237}, {35, 9.9910}, {40, 9.8061}, {45, 9.6538}, {50, 9.4804},
145 {
"ErpOfdmRate24Mbps", {
146 {5, 16.0836}, {10, 14.9153}, {15, 14.2327}, {20, 13.7300}, {25, 13.3595}, {30, 13.0281}, {35, 12.7343}, {40, 12.5008}, {45, 12.3083}, {50, 12.0889},
148 {
"ErpOfdmRate36Mbps", {
149 {5, 22.0092}, {10, 20.4836}, {15, 19.5743}, {20, 18.8997}, {25, 18.4002}, {30, 17.9524}, {35, 17.5545}, {40, 17.2377}, {45, 16.9760}, {50, 16.6777},
151 {
"ErpOfdmRate48Mbps", {
152 {5, 26.8382}, {10, 25.0509}, {15, 23.9672}, {20, 23.1581}, {25, 22.5568}, {30, 22.0165}, {35, 21.5355}, {40, 21.1519}, {45, 20.8348}, {50, 20.4729},
154 {
"ErpOfdmRate54Mbps", {
155 {5, 29.2861}, {10, 27.3763}, {15, 26.2078}, {20, 25.3325}, {25, 24.6808}, {30, 24.0944}, {35, 23.5719}, {40, 23.1549}, {45, 22.8100}, {50, 22.4162},
159 {5, 6.3381}, {10, 5.8172}, {15, 5.5223}, {20, 5.3146}, {25, 5.1525}, {30, 5.0187}, {35, 4.9039}, {40, 4.8034}, {45, 4.7134}, {50, 4.6317},
162 {5, 11.6580}, {10, 10.7369}, {15, 10.2068}, {20, 9.8309}, {25, 9.5365}, {30, 9.2930}, {35, 9.0837}, {40, 8.9001}, {45, 8.7355}, {50, 8.5860},
165 {5, 15.8572}, {10, 14.6445}, {15, 13.9367}, {20, 13.4323}, {25, 13.0361}, {30, 12.7076}, {35, 12.4249}, {40, 12.1766}, {45, 11.9538}, {50, 11.7511},
168 {5, 19.7457}, {10, 18.2820}, {15, 17.4163}, {20, 16.7963}, {25, 16.3078}, {30, 15.9021}, {35, 15.5524}, {40, 15.2449}, {45, 14.9687}, {50, 14.7173},
171 {5, 25.8947}, {10, 24.0721}, {15, 22.9698}, {20, 22.1738}, {25, 21.5437}, {30, 21.0186}, {35, 20.5650}, {40, 20.1654}, {45, 19.8059}, {50, 19.4784},
174 {5, 30.0542}, {10, 28.0155}, {15, 26.7625}, {20, 25.8523}, {25, 25.1295}, {30, 24.5258}, {35, 24.0034}, {40, 23.5426}, {45, 23.1277}, {50, 22.7492},
177 {5, 32.6789}, {10, 30.5150}, {15, 29.1708}, {20, 28.1907}, {25, 27.4107}, {30, 26.7583}, {35, 26.1931}, {40, 25.6941}, {45, 25.2446}, {50, 24.8343},
180 {5, 34.1710}, {10, 31.9398}, {15, 30.5451}, {20, 29.5261}, {25, 28.7140}, {30, 28.0342}, {35, 27.4449}, {40, 26.9245}, {45, 26.4554}, {50, 26.0271},
183 {5, 37.6051}, {10, 35.2296}, {15, 33.7228}, {20, 32.6160}, {25, 31.7314}, {30, 30.9895}, {35, 30.3455}, {40, 29.7760}, {45, 29.2623}, {50, 28.7929},
186 {5, 39.5947}, {10, 37.1424}, {15, 35.5731}, {20, 34.4169}, {25, 33.4911}, {30, 32.7138}, {35, 32.0385}, {40, 31.4410}, {45, 30.9016}, {50, 30.4086},
189 {5, 39.5947}, {10, 37.1424}, {15, 35.5731}, {20, 34.4169}, {25, 33.4911}, {30, 32.7138}, {35, 32.0385}, {40, 31.4410}, {45, 30.9016}, {50, 30.4086},
192 {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
195 {5, 11.4999}, {10, 10.5902}, {15, 10.0669}, {20, 9.6960}, {25, 9.4055}, {30, 9.1652}, {35, 8.9587}, {40, 8.7775}, {45, 8.6151}, {50, 8.4676},
198 {5, 19.5937}, {10, 18.1394}, {15, 17.2798}, {20, 16.6642}, {25, 16.1793}, {30, 15.7766}, {35, 15.4295}, {40, 15.1242}, {45, 14.8502}, {50, 14.6007},
201 {5, 25.6338}, {10, 23.8255}, {15, 22.7329}, {20, 21.9442}, {25, 21.3200}, {30, 20.7999}, {35, 20.3506}, {40, 19.9549}, {45, 19.5990}, {50, 19.2746},
204 {5, 30.0542}, {10, 28.0155}, {15, 26.7625}, {20, 25.8523}, {25, 25.1295}, {30, 24.5258}, {35, 24.0034}, {40, 23.5426}, {45, 23.1277}, {50, 22.7492},
207 {5, 37.6051}, {10, 35.2296}, {15, 33.7228}, {20, 32.6160}, {25, 31.7314}, {30, 30.9895}, {35, 30.3455}, {40, 29.7760}, {45, 29.2623}, {50, 28.7929},
210 {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
213 {5, 44.2801}, {10, 41.6672}, {15, 39.9580}, {20, 38.6892}, {25, 37.6692}, {30, 36.8103}, {35, 36.0625}, {40, 35.3998}, {45, 34.8008}, {50, 34.2528},
216 {5, 44.2801}, {10, 41.6672}, {15, 39.9580}, {20, 38.6892}, {25, 37.6692}, {30, 36.8103}, {35, 36.0625}, {40, 35.3998}, {45, 34.8008}, {50, 34.2528},
219 {5, 47.0648}, {10, 44.3699}, {15, 42.5825}, {20, 41.2495}, {25, 40.1751}, {30, 39.2689}, {35, 38.4790}, {40, 37.7781}, {45, 37.1443}, {50, 36.5639},
222 {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
225 {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
228 {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
231 {5, 19.6542}, {10, 18.1962}, {15, 17.3342}, {20, 16.7168}, {25, 16.2305}, {30, 15.8265}, {35, 15.4784}, {40, 15.1723}, {45, 14.8973}, {50, 14.6471},
234 {5, 30.9311}, {10, 28.8495}, {15, 27.5657}, {20, 26.6320}, {25, 25.8899}, {30, 25.2699}, {35, 24.7332}, {40, 24.2595}, {45, 23.8330}, {50, 23.4439},
237 {5, 37.0575}, {10, 34.7039}, {15, 33.2146}, {20, 32.1216}, {25, 31.2485}, {30, 30.5164}, {35, 29.8811}, {40, 29.3194}, {45, 28.8127}, {50, 28.3499},
240 {5, 41.8065}, {10, 39.2749}, {15, 37.6383}, {20, 36.4282}, {25, 35.4575}, {30, 34.6414}, {35, 33.9316}, {40, 33.3031}, {45, 32.7355}, {50, 32.2164},
243 {5, 47.0648}, {10, 44.3699}, {15, 42.5825}, {20, 41.2495}, {25, 40.1751}, {30, 39.2689}, {35, 38.4790}, {40, 37.7781}, {45, 37.1443}, {50, 36.5639},
246 {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
249 {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
252 {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
255 {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
258 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
261 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
264 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
267 {5, 29.8428}, {10, 27.8145}, {15, 26.5689}, {20, 25.6645}, {25, 24.9463}, {30, 24.3466}, {35, 23.8276}, {40, 23.3699}, {45, 22.9578}, {50, 22.5819},
270 {5, 41.1308}, {10, 38.6227}, {15, 37.0064}, {20, 35.8126}, {25, 34.8556}, {30, 34.0513}, {35, 33.3520}, {40, 32.7329}, {45, 32.1739}, {50, 31.6628},
273 {5, 46.2101}, {10, 43.5393}, {15, 41.7755}, {20, 40.4620}, {25, 39.4041}, {30, 38.5123}, {35, 37.7353}, {40, 37.0461}, {45, 36.4229}, {50, 35.8524},
276 {5, 50.2233}, {10, 47.4474}, {15, 45.5760}, {20, 44.1727}, {25, 43.0382}, {30, 42.0794}, {35, 41.2425}, {40, 40.4991}, {45, 39.8262}, {50, 39.2095},
279 {5, 53.8362}, {10, 50.9837}, {15, 49.0221}, {20, 47.5418}, {25, 46.3407}, {30, 45.3233}, {35, 44.4337}, {40, 43.6425}, {45, 42.9255}, {50, 42.2678},
282 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
285 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
288 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
291 {5, 58.0092}, {10, 55.0896}, {15, 53.0321}, {20, 51.4672}, {25, 50.1922}, {30, 49.1091}, {35, 48.1601}, {40, 47.3148}, {45, 46.5478}, {50, 45.8436},
294 {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
297 {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
300 {5, 62.8834}, {10, 59.9147}, {15, 57.7564}, {20, 56.0992}, {25, 54.7419}, {30, 53.5850}, {35, 52.5689}, {40, 51.6620}, {45, 50.8379}, {50, 50.0803},
308 {5, 0.8437}, {10, 0.7861}, {15, 0.7496}, {20, 0.7226}, {25, 0.7016}, {30, 0.6847}, {35, 0.6686}, {40, 0.6549}, {45, 0.6435}, {50, 0.6336},
311 {5, 1.6228}, {10, 1.5168}, {15, 1.4482}, {20, 1.3972}, {25, 1.3574}, {30, 1.3253}, {35, 1.2947}, {40, 1.2687}, {45, 1.2469}, {50, 1.2279},
313 {
"DsssRate5_5Mbps", {
314 {5, 3.8896}, {10, 3.6707}, {15, 3.5203}, {20, 3.4063}, {25, 3.3161}, {30, 3.2429}, {35, 3.1729}, {40, 3.1128}, {45, 3.0625}, {50, 3.0184},
317 {5, 6.4734}, {10, 6.1774}, {15, 5.9553}, {20, 5.7819}, {25, 5.6429}, {30, 5.5289}, {35, 5.4191}, {40, 5.3243}, {45, 5.2446}, {50, 5.1745},
321 {5, 4.7087}, {10, 4.3453}, {15, 4.1397}, {20, 3.9899}, {25, 3.8802}, {30, 3.7824}, {35, 3.6961}, {40, 3.6276}, {45, 3.5712}, {50, 3.5071},
324 {5, 6.8586}, {10, 6.3431}, {15, 6.0489}, {20, 5.8340}, {25, 5.6762}, {30, 5.5355}, {35, 5.4110}, {40, 5.3122}, {45, 5.2307}, {50, 5.1380},
327 {5, 8.9515}, {10, 8.2901}, {15, 7.9102}, {20, 7.6319}, {25, 7.4274}, {30, 7.2447}, {35, 7.0829}, {40, 6.9544}, {45, 6.8485}, {50, 6.7278},
330 {5, 12.7822}, {10, 11.8801}, {15, 11.3543}, {20, 10.9668}, {25, 10.6809}, {30, 10.4249}, {35, 10.1978}, {40, 10.0171}, {45, 9.8679}, {50, 9.6978},
333 {5, 16.2470}, {10, 15.1426}, {15, 14.4904}, {20, 14.0072}, {25, 13.6496}, {30, 13.3288}, {35, 13.0436}, {40, 12.8164}, {45, 12.6286}, {50, 12.4144},
336 {5, 22.3164}, {10, 20.9147}, {15, 20.0649}, {20, 19.4289}, {25, 18.9552}, {30, 18.5284}, {35, 18.1476}, {40, 17.8434}, {45, 17.5915}, {50, 17.3036},
339 {5, 27.2963}, {10, 25.6987}, {15, 24.7069}, {20, 23.9578}, {25, 23.3965}, {30, 22.8891}, {35, 22.4350}, {40, 22.0713}, {45, 21.7696}, {50, 21.4243},
342 {5, 29.8324}, {10, 28.1519}, {15, 27.0948}, {20, 26.2925}, {25, 25.6896}, {30, 25.1434}, {35, 24.6539}, {40, 24.2613}, {45, 23.9353}, {50, 23.5618},
345 {
"ErpOfdmRate6Mbps", {
346 {5, 4.7087}, {10, 4.3453}, {15, 4.1397}, {20, 3.9899}, {25, 3.8802}, {30, 3.7824}, {35, 3.6961}, {40, 3.6276}, {45, 3.5712}, {50, 3.5071},
348 {
"ErpOfdmRate9Mbps", {
349 {5, 6.8586}, {10, 6.3431}, {15, 6.0489}, {20, 5.8340}, {25, 5.6762}, {30, 5.5355}, {35, 5.4110}, {40, 5.3122}, {45, 5.2307}, {50, 5.1380},
351 {
"ErpOfdmRate12Mbps", {
352 {5, 8.9515}, {10, 8.2901}, {15, 7.9102}, {20, 7.6319}, {25, 7.4274}, {30, 7.2447}, {35, 7.0829}, {40, 6.9544}, {45, 6.8485}, {50, 6.7278},
354 {
"ErpOfdmRate18Mbps", {
355 {5, 12.7822}, {10, 11.8801}, {15, 11.3543}, {20, 10.9668}, {25, 10.6809}, {30, 10.4249}, {35, 10.1978}, {40, 10.0171}, {45, 9.8679}, {50, 9.6978},
357 {
"ErpOfdmRate24Mbps", {
358 {5, 16.2470}, {10, 15.1426}, {15, 14.4904}, {20, 14.0072}, {25, 13.6496}, {30, 13.3288}, {35, 13.0436}, {40, 12.8164}, {45, 12.6286}, {50, 12.4144},
360 {
"ErpOfdmRate36Mbps", {
361 {5, 22.3164}, {10, 20.9147}, {15, 20.0649}, {20, 19.4289}, {25, 18.9552}, {30, 18.5284}, {35, 18.1476}, {40, 17.8434}, {45, 17.5915}, {50, 17.3036},
363 {
"ErpOfdmRate48Mbps", {
364 {5, 27.2963}, {10, 25.6987}, {15, 24.7069}, {20, 23.9578}, {25, 23.3965}, {30, 22.8891}, {35, 22.4350}, {40, 22.0713}, {45, 21.7696}, {50, 21.4243},
366 {
"ErpOfdmRate54Mbps", {
367 {5, 29.8324}, {10, 28.1519}, {15, 27.0948}, {20, 26.2925}, {25, 25.6896}, {30, 25.1434}, {35, 24.6539}, {40, 24.2613}, {45, 23.9353}, {50, 23.5618},
371 {5, 6.3746}, {10, 5.8670}, {15, 5.5782}, {20, 5.3742}, {25, 5.2147}, {30, 5.0829}, {35, 4.9696}, {40, 4.8703}, {45, 4.7813}, {50, 4.7004},
374 {5, 11.7574}, {10, 10.8735}, {15, 10.3606}, {20, 9.9954}, {25, 9.7084}, {30, 9.4704}, {35, 9.2654}, {40, 9.0853}, {45, 8.9235}, {50, 8.7763},
377 {5, 16.0419}, {10, 14.8998}, {15, 14.2252}, {20, 13.7413}, {25, 13.3594}, {30, 13.0417}, {35, 12.7674}, {40, 12.5258}, {45, 12.3086}, {50, 12.1107},
380 {5, 20.0089}, {10, 18.6480}, {15, 17.8309}, {20, 17.2410}, {25, 16.7736}, {30, 16.3837}, {35, 16.0465}, {40, 15.7491}, {45, 15.4813}, {50, 15.2369},
383 {5, 26.3492}, {10, 24.7107}, {15, 23.6964}, {20, 22.9553}, {25, 22.3640}, {30, 21.8683}, {35, 21.4379}, {40, 21.0571}, {45, 20.7134}, {50, 20.3991},
386 {5, 30.6683}, {10, 28.8843}, {15, 27.7540}, {20, 26.9210}, {25, 26.2528}, {30, 25.6906}, {35, 25.2012}, {40, 24.7671}, {45, 24.3746}, {50, 24.0151},
389 {5, 33.4062}, {10, 31.5485}, {15, 30.3527}, {20, 29.4662}, {25, 28.7527}, {30, 28.1508}, {35, 27.6259}, {40, 27.1597}, {45, 26.7376}, {50, 26.3507},
392 {5, 34.9671}, {10, 33.0739}, {15, 31.8436}, {20, 30.9282}, {25, 30.1900}, {30, 29.5665}, {35, 29.0221}, {40, 28.5382}, {45, 28.0997}, {50, 27.6975},
395 {5, 38.5714}, {10, 36.6144}, {15, 35.3124}, {20, 34.3355}, {25, 33.5438}, {30, 32.8728}, {35, 32.2854}, {40, 31.7623}, {45, 31.2874}, {50, 30.8512},
398 {5, 40.6674}, {10, 38.6851}, {15, 37.3466}, {20, 36.3371}, {25, 35.5165}, {30, 34.8197}, {35, 34.2087}, {40, 33.6638}, {45, 33.1688}, {50, 32.7137},
401 {5, 40.6674}, {10, 38.6851}, {15, 37.3466}, {20, 36.3371}, {25, 35.5165}, {30, 34.8197}, {35, 34.2087}, {40, 33.6638}, {45, 33.1688}, {50, 32.7137},
404 {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
407 {5, 11.6208}, {10, 10.7566}, {15, 10.2544}, {20, 9.8965}, {25, 9.6151}, {30, 9.3815}, {35, 9.1804}, {40, 9.0035}, {45, 8.8446}, {50, 8.7000},
410 {5, 19.8764}, {10, 18.5328}, {15, 17.7255}, {20, 17.1424}, {25, 16.6803}, {30, 16.2947}, {35, 15.9612}, {40, 15.6668}, {45, 15.4018}, {50, 15.1599},
413 {5, 26.1198}, {10, 24.5088}, {15, 23.5107}, {20, 22.7810}, {25, 22.1986}, {30, 21.7101}, {35, 21.2858}, {40, 20.9104}, {45, 20.5714}, {50, 20.2613},
416 {5, 30.6683}, {10, 28.8843}, {15, 27.7540}, {20, 26.9210}, {25, 26.2528}, {30, 25.6906}, {35, 25.2012}, {40, 24.7671}, {45, 24.3746}, {50, 24.0151},
419 {5, 38.5714}, {10, 36.6144}, {15, 35.3124}, {20, 34.3355}, {25, 33.5438}, {30, 32.8728}, {35, 32.2854}, {40, 31.7623}, {45, 31.2874}, {50, 30.8512},
422 {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
425 {5, 45.6261}, {10, 43.6185}, {15, 42.2095}, {20, 41.1328}, {25, 40.2509}, {30, 39.4981}, {35, 38.8356}, {40, 38.2430}, {45, 37.7032}, {50, 37.2058},
428 {5, 45.6261}, {10, 43.6185}, {15, 42.2095}, {20, 41.1328}, {25, 40.2509}, {30, 39.4981}, {35, 38.8356}, {40, 38.2430}, {45, 37.7032}, {50, 37.2058},
431 {5, 48.5883}, {10, 46.5892}, {15, 45.1489}, {20, 44.0388}, {25, 43.1252}, {30, 42.3428}, {35, 41.6525}, {40, 41.0338}, {45, 40.4694}, {50, 39.9486},
434 {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
437 {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
440 {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
443 {5, 20.0101}, {10, 18.6928}, {15, 17.8976}, {20, 17.3219}, {25, 16.8648}, {30, 16.4830}, {35, 16.1523}, {40, 15.8603}, {45, 15.5971}, {50, 15.3567},
446 {5, 31.6415}, {10, 29.8575}, {15, 28.7177}, {20, 27.8747}, {25, 27.1971}, {30, 26.6261}, {35, 26.1283}, {40, 25.6865}, {45, 25.2866}, {50, 24.9200},
449 {5, 38.0818}, {10, 36.1730}, {15, 34.9016}, {20, 33.9470}, {25, 33.1729}, {30, 32.5165}, {35, 31.9417}, {40, 31.4295}, {45, 30.9645}, {50, 30.5372},
452 {5, 43.0043}, {10, 41.0039}, {15, 39.6294}, {20, 38.5865}, {25, 37.7358}, {30, 37.0116}, {35, 36.3756}, {40, 35.8076}, {45, 35.2909}, {50, 34.8154},
455 {5, 48.5883}, {10, 46.5892}, {15, 45.1489}, {20, 44.0388}, {25, 43.1252}, {30, 42.3428}, {35, 41.6525}, {40, 41.0338}, {45, 40.4694}, {50, 39.9486},
458 {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
461 {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
464 {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
467 {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
470 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
473 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
476 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
479 {5, 30.6710}, {10, 28.9919}, {15, 27.9160}, {20, 27.1188}, {25, 26.4770}, {30, 25.9355}, {35, 25.4630}, {40, 25.0432}, {45, 24.6629}, {50, 24.3141},
482 {5, 42.3965}, {10, 40.4510}, {15, 39.1127}, {20, 38.0965}, {25, 37.2670}, {30, 36.5606}, {35, 35.9398}, {40, 35.3852}, {45, 34.8806}, {50, 34.4160},
485 {5, 47.8139}, {10, 45.8767}, {15, 44.4795}, {20, 43.4017}, {25, 42.5141}, {30, 41.7535}, {35, 41.0821}, {40, 40.4801}, {45, 39.9307}, {50, 39.4236},
488 {5, 51.9619}, {10, 49.9941}, {15, 48.5284}, {20, 47.3867}, {25, 46.4416}, {30, 45.6290}, {35, 44.9099}, {40, 44.2640}, {45, 43.6736}, {50, 43.1279},
491 {5, 55.8389}, {10, 53.9360}, {15, 52.4548}, {20, 51.2855}, {25, 50.3106}, {30, 49.4682}, {35, 48.7201}, {40, 48.0462}, {45, 47.4288}, {50, 46.8571},
494 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
497 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
500 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
503 {5, 60.3411}, {10, 58.5527}, {15, 57.0724}, {20, 55.8834}, {25, 54.8827}, {30, 54.0128}, {35, 53.2368}, {40, 52.5352}, {45, 51.8906}, {50, 51.2922},
506 {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
509 {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
512 {5, 65.6329}, {10, 64.0336}, {15, 62.5814}, {20, 61.3869}, {25, 60.3690}, {30, 59.4769}, {35, 58.6764}, {40, 57.9495}, {45, 57.2790}, {50, 56.6548},
520 std::string sub = context.substr (10);
521 uint32_t pos = sub.find (
"/Device");
522 return atoi (sub.substr (0, pos).c_str ());
529 std::string sub = context.substr (10);
530 uint32_t pos = sub.find (
"/Device");
531 uint32_t nodeId = atoi (sub.substr (0, pos).c_str ());
550 auto it = counter.find (addr);
551 if (it != counter.end ())
553 it->second += increment;
557 counter.insert (std::make_pair (addr, increment));
568 uint32_t extractedLength;
571 packet = packet->
CreateFragment (0,
static_cast<uint32_t
> (extractedLength));
603 CwTrace (std::string context, uint32_t oldVal, uint32_t newVal)
698 NS_FATAL_ERROR (
"All devices should send with same power, so no packet switch during preamble detection should occur!");
726 <<
" nMPDUs=" << +nMpdus
729 <<
" preamble=" << preamble);
734 NS_FATAL_ERROR (
"A-MPDU settings not properly applied: maximum configured MPDUs is " << +
maxMpdus <<
" but received an A-MPDU containing " << +nMpdus <<
" MPDUs");
736 NS_LOG_WARN (
"Warning: less MPDUs aggregated in a received A-MPDU (" << +nMpdus <<
") than configured (" << +
maxMpdus <<
")");
870 uint32_t trialNumber, uint32_t networkSize,
Time duration,
bool pcap,
bool infra, uint16_t guardIntervalNs,
871 double distanceM,
double apTxPowerDbm,
double staTxPowerDbm,
Time pktInterval);
880 uint32_t trialNumber, uint32_t networkSize,
Time duration,
bool pcap,
bool infra, uint16_t guardIntervalNs,
881 double distance,
double apTxPowerDbm,
double staTxPowerDbm,
Time pktInterval)
889 wifiNodes.
Create (networkSize + 1);
893 wifiNodes.
Create (networkSize);
897 phy.SetErrorRateModel (
"ns3::NistErrorRateModel");
904 uint32_t nNodes = wifiNodes.
GetN ();
908 uint64_t beaconInterval = std::min<uint64_t> ((ceil ((duration.
GetSeconds () * 1000000) / 1024) * 1024), (65535 * 1024));
909 mac.SetType (
"ns3::ApWifiMac",
916 mac.SetType (
"ns3::StaWifiMac",
921 for (uint32_t i = 1; i < nNodes; ++i)
928 mac.SetType (
"ns3::AdhocWifiMac");
936 Config::Set (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported",
BooleanValue (guardIntervalNs == 400));
940 for (uint32_t i = 0; i < nNodes; ++i)
952 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
954 positionAlloc->Add (Vector (1.0, 1.0, 0.0));
957 double angle = (
static_cast<double> (360) / (nNodes - 1));
958 for (uint32_t i = 0; i < (nNodes - 1); ++i)
960 positionAlloc->Add (Vector (1.0 + (distance * cos ((i * angle *
PI) / 180)), 1.0 + (distance * sin ((i * angle *
PI) / 180)), 0.0));
963 mobility.SetPositionAllocator (positionAlloc);
967 packetSocket.
Install (wifiNodes);
974 uint32_t i = infra ? 1 : 0;
975 for (; i < nNodes; ++i)
977 uint32_t j = infra ? 0 : (i + 1) % nNodes;
984 client->SetRemote (socketAddr);
988 client->SetAttribute (
"Interval",
TimeValue (pktInterval));
994 server->SetLocal (socketAddr);
1040 phy.EnablePcap (
"wifi_bianchi_pcap",
devices);
1063 auto it = counter.find (addr);
1064 if (it != counter.end ())
1071 int main (
int argc,
char *argv[])
1073 uint32_t nMinStas = 5;
1074 uint32_t nMaxStas = 50;
1075 uint32_t nStepSize = 5;
1077 double duration = 100;
1078 uint32_t trials = 1;
1081 std::string workDir =
"./";
1082 std::string phyMode =
"OfdmRate54Mbps";
1083 std::string standard (
"11a");
1084 bool validate =
false;
1085 uint16_t plotBianchiModel = 0x01;
1086 double maxRelativeError = 0.015;
1087 double frequency = 5;
1088 uint16_t channelWidth = 20;
1089 uint16_t guardIntervalNs = 800;
1090 uint16_t pktInterval = 1000;
1091 double distance = 0.001;
1092 double apTxPower = 16;
1093 double staTxPower = 16;
1106 cmd.AddValue (
"verbose",
"Logging level (0: no log - 1: simulation script logs - 2: all logs)",
verbose);
1107 cmd.AddValue (
"tracing",
"Generate trace files",
tracing);
1108 cmd.AddValue (
"pktSize",
"The packet size in bytes",
pktSize);
1109 cmd.AddValue (
"trials",
"The maximal number of runs per network size", trials);
1110 cmd.AddValue (
"duration",
"Time duration for each trial in seconds", duration);
1111 cmd.AddValue (
"pcap",
"Enable/disable PCAP tracing", pcap);
1112 cmd.AddValue (
"infra",
"True to use infrastructure mode, false to use ring adhoc mode", infra);
1113 cmd.AddValue (
"workDir",
"The working directory used to store generated files", workDir);
1114 cmd.AddValue (
"phyMode",
"Set the constant PHY mode string used to transmit frames", phyMode);
1115 cmd.AddValue (
"standard",
"Set the standard (11a, 11b, 11g, 11n, 11ac, 11ax)", standard);
1116 cmd.AddValue (
"nMinStas",
"Minimum number of stations to start with", nMinStas);
1117 cmd.AddValue (
"nMaxStas",
"Maximum number of stations to start with", nMaxStas);
1118 cmd.AddValue (
"nStepSize",
"Number of stations to add at each step", nStepSize);
1119 cmd.AddValue (
"plotBianchiModel",
"First bit corresponds to the DIFS model, second bit to the EIFS model", plotBianchiModel);
1120 cmd.AddValue (
"validate",
"Enable/disable validation of the ns-3 simulations against the Bianchi model", validate);
1121 cmd.AddValue (
"maxRelativeError",
"The maximum relative error tolerated between ns-3 results and the Bianchi model (used for regression, i.e. when the validate flag is set)", maxRelativeError);
1122 cmd.AddValue (
"frequency",
"Set the operating frequency band in GHz: 2.4, 5 or 6", frequency);
1123 cmd.AddValue (
"channelWidth",
"Set the constant channel width in MHz (only for 11n/ac/ax)", channelWidth);
1124 cmd.AddValue (
"guardIntervalNs",
"Set the the guard interval in nanoseconds (800 or 400 for 11n/ac, 800 or 1600 or 3200 for 11 ax)", guardIntervalNs);
1125 cmd.AddValue (
"maxMpdus",
"Set the maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)",
maxMpdus);
1126 cmd.AddValue (
"distance",
"Set the distance in meters between the AP and the STAs", distance);
1127 cmd.AddValue (
"apTxPower",
"Set the transmit power of the AP in dBm (if infrastructure only)", apTxPower);
1128 cmd.AddValue (
"staTxPower",
"Set the transmit power of each STA in dBm (or all STAs if adhoc)", staTxPower);
1129 cmd.AddValue (
"pktInterval",
"Set the socket packet interval in microseconds", pktInterval);
1130 cmd.Parse (argc, argv);
1137 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-cw-trace.out");
1142 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-backoff-trace.out");
1147 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-phy-tx-trace.out");
1152 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-mac-tx-trace.out");
1157 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-mac-rx-trace.out");
1162 NS_FATAL_ERROR (
"Failed to open file wifi-bianchi-socket-send-trace.out");
1179 std::stringstream phyModeStr;
1180 phyModeStr << phyMode;
1181 if (phyMode.find (
"Mcs") != std::string::npos)
1183 phyModeStr <<
"_" << channelWidth <<
"MHz";
1186 std::stringstream ss;
1187 ss <<
"wifi-"<< standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-" << phyModeStr.str () <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize <<
"-throughput.plt";
1188 std::ofstream throughputPlot (ss.str ().c_str ());
1190 ss <<
"wifi-" << standard <<
"-p-" <<
pktSize << (infra ?
"-infrastructure" :
"-adhoc") <<
"-r-" << phyModeStr.str () <<
"-min-" << nMinStas <<
"-max-" << nMaxStas <<
"-step-" << nStepSize <<
"-throughput.eps";
1194 if (standard ==
"11a")
1200 else if (standard ==
"11b")
1206 else if (standard ==
"11g")
1212 else if (standard ==
"11n")
1214 if (frequency == 2.4)
1218 else if (frequency == 5)
1224 NS_FATAL_ERROR (
"Unsupported frequency band " << frequency <<
" GHz for standard " << standard);
1227 else if (standard ==
"11ac")
1232 else if (standard ==
"11ax")
1234 if (frequency == 2.4)
1238 else if (frequency == 5)
1242 else if (frequency == 6)
1248 NS_FATAL_ERROR (
"Unsupported frequency band " << frequency <<
" GHz for standard " << standard);
1256 std::string channelStr =
"{0, " +
std::to_string (channelWidth) +
", BAND_"
1257 + (frequency == 2.4 ?
"2_4" : (frequency == 5 ?
"5" :
"6"))
1274 else if (frequency == 5)
1292 wifi.SetStandard (wifiStandard);
1293 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager",
1307 double averageThroughput, throughputArray[trials];
1308 for (uint32_t n = nMinStas; n <= nMaxStas; n += nStepSize)
1310 averageThroughput = 0;
1312 for (uint32_t runIndex = 0; runIndex < trials; runIndex++)
1328 std::cout <<
"Trial " << runIndex + 1 <<
" of " << trials <<
"; "<< phyModeStr.str () <<
" for " << n <<
" nodes " << std::endl;
1331 cwTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "<< phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1332 backoffTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; "<< phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1333 phyTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1334 macTxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1335 macRxTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1336 socketSendTraceFile <<
"# Trial " << runIndex + 1 <<
" of " << trials <<
"; " << phyModeStr.str () <<
" for " << n <<
" nodes" << std::endl;
1338 experiment.Run (
wifi, wifiPhy, wifiMac, wifiChannel, runIndex, n,
Seconds (duration), pcap, infra, guardIntervalNs, distance, apTxPower, staTxPower,
MicroSeconds (pktInterval));
1348 Time dataTransferDuration = last -
first;
1349 double nodeThroughput = (it->second * 8 /
static_cast<double> (dataTransferDuration.
GetMicroSeconds ()));
1350 throughput += nodeThroughput;
1360 uint64_t nodeRxEvents =
1361 nodePhyHeaderFailures + nodePsduFailures + nodePsduSuccess + nodeRxEventWhileDecodingPreamble +
1362 nodeRxEventWhileRxing + nodeRxEventWhileTxing + nodeRxEventAbortedByTx;
1363 std::cout <<
"Node " << it->first
1364 <<
": TX packets " << nodeTxPackets
1365 <<
"; RX packets " << nodeRxPackets
1366 <<
"; PHY header failures " << nodePhyHeaderFailures
1367 <<
"; PSDU failures " << nodePsduFailures
1368 <<
"; PSDU success " << nodePsduSuccess
1369 <<
"; RX events while decoding preamble " << nodeRxEventWhileDecodingPreamble
1370 <<
"; RX events while RXing " << nodeRxEventWhileRxing
1371 <<
"; RX events while TXing " << nodeRxEventWhileTxing
1372 <<
"; RX events aborted by TX " << nodeRxEventAbortedByTx
1373 <<
"; total RX events " << nodeRxEvents
1374 <<
"; total events " << nodeTxPackets + nodeRxEvents
1375 <<
"; time first RX " <<
first
1376 <<
"; time last RX " << last
1377 <<
"; dataTransferDuration " << dataTransferDuration
1378 <<
"; throughput " << nodeThroughput <<
" Mbps" << std::endl;
1380 std::cout <<
"Total throughput: " << throughput <<
" Mbps" << std::endl;
1381 averageThroughput += throughput;
1382 throughputArray[runIndex] = throughput;
1384 averageThroughput = averageThroughput / trials;
1386 bool rateFound =
false;
1387 double relativeErrorDifs = 0;
1388 double relativeErrorEifs = 0;
1393 auto it = itDifs->second.find (n);
1394 if (it != itDifs->second.end ())
1396 relativeErrorDifs = (std::abs (averageThroughput - it->second) / it->second);
1397 std::cout <<
"Relative error (DIFS): " << 100 * relativeErrorDifs <<
"%" << std::endl;
1401 NS_FATAL_ERROR (
"No Bianchi results (DIFS) calculated for that number of stations!");
1408 auto it = itEifs->second.find (n);
1409 if (it != itEifs->second.end ())
1411 relativeErrorEifs = (std::abs (averageThroughput - it->second) / it->second);
1412 std::cout <<
"Relative error (EIFS): " << 100 * relativeErrorEifs <<
"%" << std::endl;
1416 NS_FATAL_ERROR (
"No Bianchi results (EIFS) calculated for that number of stations!");
1419 if (!rateFound && validate)
1423 double relativeError =
std::min (relativeErrorDifs, relativeErrorEifs);
1424 if (validate && (relativeError > maxRelativeError))
1430 for (uint32_t i = 0; i < trials; ++i)
1432 stDev += pow (throughputArray[i] - averageThroughput, 2);
1434 stDev = sqrt (stDev / (trials - 1));
1435 dataset.
Add (n, averageThroughput, stDev);
1442 for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
1445 auto it = itDifs->second.find (i);
1446 if (it != itDifs->second.end ())
1450 datasetBianchiDifs.
Add (i, value);
1455 for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
1457 datasetBianchiDifs.
Add (i, 0.0);
1464 for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
1467 auto it = itEifs->second.find (i);
1468 if (it != itEifs->second.end ())
1472 datasetBianchiEifs.
Add (i, value);
1477 for (uint32_t i = nMinStas; i <= nMaxStas; i += nStepSize)
1479 datasetBianchiEifs.
Add (i, 0.0);
1483 datasetBianchiEifs.
SetTitle (
"Bianchi (EIFS - lower bound)");
1484 datasetBianchiDifs.
SetTitle (
"Bianchi (DIFS - upper bound)");
1486 gnuplot.
SetTerminal (
"postscript eps color enh \"Times-BoldItalic\"");
1487 gnuplot.
SetLegend (
"Number of competing stations",
"Throughput (Mbps)");
1489 ss <<
"Frame size " <<
pktSize <<
" bytes";
1492 ss <<
"set xrange [" << nMinStas <<
":" << nMaxStas <<
"]\n"
1493 <<
"set xtics " << nStepSize <<
"\n"
1494 <<
"set grid xtics ytics\n"
1496 <<
"set style line 1 linewidth 5\n"
1497 <<
"set style line 2 linewidth 5\n"
1498 <<
"set style line 3 linewidth 5\n"
1499 <<
"set style line 4 linewidth 5\n"
1500 <<
"set style line 5 linewidth 5\n"
1501 <<
"set style line 6 linewidth 5\n"
1502 <<
"set style line 7 linewidth 5\n"
1503 <<
"set style line 8 linewidth 5\n"
1504 <<
"set style increment user";
1506 if (plotBianchiModel & 0x0001)
1508 datasetBianchiDifs.
SetTitle (
"Bianchi");
1511 if (plotBianchiModel & 0x0002)
1513 datasetBianchiEifs.
SetTitle (
"Bianchi");
1516 if (plotBianchiModel == 0x0003)
1518 datasetBianchiEifs.
SetTitle (
"Bianchi (EIFS - lower bound)");
1519 datasetBianchiDifs.
SetTitle (
"Bianchi (DIFS - upper bound)");
1522 throughputPlot.close ();
Helper class for UAN CW MAC example.
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
a polymophic address class
holds a vector of ns3::Application pointers.
AttributeValue implementation for Boolean.
Parse command-line arguments.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Class to represent a 2D points plot.
void SetErrorBars(enum ErrorBars errorBars)
void SetStyle(enum Style style)
void Add(double x, double y)
void SetTitle(const std::string &title)
Change line title.
a simple class to generate gnuplot-ready plotting commands from a set of datasets.
void AddDataset(const GnuplotDataset &dataset)
void SetLegend(const std::string &xLegend, const std::string &yLegend)
void SetTerminal(const std::string &terminal)
void GenerateOutput(std::ostream &os)
Writes gnuplot commands and data values to a single output stream.
void SetExtra(const std::string &extra)
void SetTitle(const std::string &title)
Hold a signed integer type.
static Mac48Address ConvertFrom(const Address &address)
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
uint32_t GetN(void) const
Get the number of Ptr<Node> stored in this container.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t GetNDevices(void) const
uint32_t AddApplication(Ptr< Application > application)
Associate an Application to this Node.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
static Ptr< Node > GetNode(uint32_t n)
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
an address for a packet socket
void SetProtocol(uint16_t protocol)
Set the protocol.
void SetPhysicalAddress(const Address address)
Set the destination address.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
Give ns3::PacketSocket powers to ns3::Node.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
Class for representing queue sizes.
AttributeValue implementation for QueueSize.
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Run(void)
Run the simulation.
static Time Now(void)
Return the current simulation virtual time.
The IEEE 802.11 SSID Information Element.
AttributeValue implementation for Ssid.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
double GetSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
static void EnableLogComponents(void)
Helper to enable all WifiNetDevice log components with one statement.
create MAC layers for a ns3::WifiNetDevice.
represent a single transmission mode
Hold together all Wifi-related objects.
Ptr< WifiMac > GetMac(void) const
Address GetAddress(void) const override
void DisablePreambleDetectionModel()
Disable the preamble detection model.
@ DLT_IEEE802_11_RADIO
Include Radiotap link layer information.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
bool IsAggregation(void) const
Checks whether the PSDU contains A-MPDU.
manage and create wifi channel objects for the YANS model.
void SetPropagationDelay(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Ptr< YansWifiChannel > Create(void) const
void AddPropagationLoss(std::string name, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Make it easy to create and manage PHY objects for the YANS model.
void experiment(std::string queue_disc_type)
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
void Set(std::string path, const AttributeValue &value)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
@ PACKETS
Use number of packets for queue size.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
@ PREAMBLE_DETECT_FAILURE
@ FRAME_CAPTURE_PACKET_SWITCH
@ RECEPTION_ABORTED_BY_TX
@ PREAMBLE_DETECTION_PACKET_SWITCH
@ value
the parser finished reading a JSON value
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::map< WifiSpectrumBand, double > RxPowerWattPerChannelBand
A map of the received power (Watts) for each band.
@ LOG_LEVEL_ALL
Print everything.
@ LOG_LEVEL_WARN
LOG_WARN and above.
void LogComponentEnable(char const *name, enum LogLevel level)
Enable the logging output associated with that log component.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
SignalNoiseDbm structure.
std::map< Mac48Address, uint64_t > rxEventAbortedByTx
Map that stores the number of reception events aborted per STA because the PHY has started to transmi...
std::map< Mac48Address, uint64_t > rxEventWhileTxing
Map that stores the number of reception events per STA that occured while PHY was already transmittin...
void PhyRxErrorTrace(std::string context, Ptr< const Packet > p, double snr)
std::map< Mac48Address, uint64_t > packetsReceived
Map that stores the total packets received per STA (and addressed to that STA)
std::ofstream backoffTraceFile
File that traces backoff over time.
std::map< Mac48Address, uint64_t > bytesReceived
Map that stores the total bytes received per STA (and addressed to that STA)
std::map< Mac48Address, uint64_t > rxEventWhileDecodingPreamble
Map that stores the number of reception events per STA that occured while PHY was already decoding a ...
void AssociationLog(std::string context, Mac48Address address)
void SocketSendTrace(std::string context, Ptr< const Packet > p, const Address &addr)
bool tracing
Flag to enable/disable generation of tracing files.
uint32_t ContextToNodeId(std::string context)
std::map< Mac48Address, uint64_t > rxEventWhileRxing
Map that stores the number of reception events per STA that occured while PHY was already receiving a...
void TracePacketReception(std::string context, Ptr< const Packet > p, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)
void PhyRxDropTrace(std::string context, Ptr< const Packet > p, WifiPhyRxfailureReason reason)
void PhyTxTrace(std::string context, Ptr< const Packet > p, double txPowerW)
std::map< Mac48Address, uint64_t > psduFailed
Map that stores the total number of unsuccessfully received PSDUS (for which the PHY header was succe...
std::map< Mac48Address, uint64_t > packetsTransmitted
Map that stores the total packets transmitted per STA.
void CwTrace(std::string context, uint32_t oldVal, uint32_t newVal)
std::map< std::string, std::map< unsigned int, double > > bianchiResultsDifs
std::map< Mac48Address, Time > timeLastReceived
Map that stores the time at which the last packet was received per STA (and the packet is addressed t...
std::map< Mac48Address, Time > timeFirstTransmitted
Map that stores the time at which the first packet was transmitted per STA.
uint8_t maxMpdus
The maximum number of MPDUs in A-MPDUs (0 to disable MPDU aggregation)
void PhyRxDoneTrace(std::string context, Ptr< const Packet > p)
std::set< uint32_t > associated
Contains the IDs of the STAs that successfully associated to the access point (in infrastructure mode...
std::map< Mac48Address, uint64_t > phyHeaderFailed
Map that stores the total number of unsuccessfully received PHY headers per STA.
void MacTxTrace(std::string context, Ptr< const Packet > p)
std::ofstream socketSendTraceFile
File that traces packets transmitted by the application over time.
uint64_t GetCount(const std::map< Mac48Address, uint64_t > &counter, Mac48Address addr)
std::ofstream macTxTraceFile
File that traces MAC transmissions over time.
void PhyRxTrace(std::string context, Ptr< const Packet > p, RxPowerWattPerChannelBand power)
std::ofstream phyTxTraceFile
File that traces PHY transmissions over time.
void IncrementCounter(std::map< Mac48Address, uint64_t > &counter, Mac48Address addr, uint64_t increment=1)
std::map< Mac48Address, Time > timeFirstReceived
Map that stores the time at which the first packet was received per STA (and the packet is addressed ...
void BackoffTrace(std::string context, uint32_t newVal)
uint32_t pktSize
packet size used for the simulation (in bytes)
std::map< Mac48Address, uint64_t > psduSucceeded
Map that stores the total number of successfully received PSDUs per STA (including PSDUs not addresse...
std::map< Mac48Address, Time > timeLastTransmitted
Map that stores the time at which the last packet was transmitted per STA.
std::map< std::string, std::map< unsigned int, double > > bianchiResultsEifs
void MacRxTrace(std::string context, Ptr< const Packet > p)
void PhyTxDoneTrace(std::string context, Ptr< const Packet > p)
void PhyRxPayloadTrace(std::string context, WifiTxVector txVector, Time psduDuration)
Mac48Address ContextToMac(std::string context)
void PhyRxOkTrace(std::string context, Ptr< const Packet > p, double snr, WifiMode mode, WifiPreamble preamble)
void DisassociationLog(std::string context, Mac48Address address)
std::ofstream cwTraceFile
File that traces CW over time.
std::ofstream macRxTraceFile
File that traces MAC receptions over time.