A Discrete-Event Network Simulator
API
vanet-routing-compare.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 North Carolina State University
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: Scott E. Carpenter <scarpen@ncsu.edu>
18 *
19 */
20
21/*
22 * This example program allows one to run vehicular ad hoc
23 * network (VANET) simulation scenarios in ns-3 to assess
24 * performance by evaluating different 802.11p MAC/PHY
25 * characteristics, propagation loss models (e.g. Friss,
26 * Two-Ray Ground, or ITU R-P.1411), and application traffic
27 * (e.g. Basic Safety Message) and/or routing traffic (e.g.
28 * DSDV, AODV, OLSR, or DSR) under either a synthetic highway
29 * scenario (i.e. a random waypoint mobility model) or by
30 * playing back mobility trace files (i.e. ns-2 movement files).
31 *
32 * The script draws from several ns-3 examples, including:
33 * /examples/routing/manet-routing-compare.cc
34 * /src/propagation/model/itu-r-1411-los-propagation-loss-model.cc
35 * /src/mobility/examples/ns2-mobility-trace.cc
36 * /src/wave/examples/wave-simple-80211p.cc
37 *
38 * The script allows many parameters to be modified and
39 * includes two predefined scenarios. By default
40 * scenario=1 runs for 10 simulated seconds with 40 nodes
41 * (i.e. vehicles) moving according to RandomWaypointMobilityModel
42 * with a speed of 20 m/s and no pause time within a 300x1500 m
43 * region. The WiFi is 802.11p with continuous access to a 10 MHz
44 * Control Channel (CH) for all traffic. All nodes transmit a
45 * 200-byte safety message 10 times per second at 6 Mbps.
46 * Additionally, all nodes (optionally) attempt to
47 * continuously route 64-byte packets at an application
48 * rate of 2.048 Kbps to one of 10 other nodes,
49 * selected as sink nodes. The default routing protocol is AODV
50 * and the Two-Ray Ground loss model is used.
51 * The transmit power is set to 20 dBm and the transmission range
52 * for safety message packet delivery is 145 m.
53 *
54 * Scenario 2 plays back vehicular trace files in
55 * ns-2 movement format, and are taken from:
56 * https://web.archive.org/web/20150218095728/http://www.lst.inf.ethz.ch/research/ad-hoc/car-traces
57 * This scenario is 300 simulation seconds of 99
58 * vehicles respectively within the Unterstrass
59 * section of Zurich Switzerland that travel based on
60 * models derived from real traffic data. Note that these
61 * scenarios can require a lot of clock time to complete.
62 *
63 * All parameters can be changed from their defaults (see
64 * --help) and changing simulation parameters can have dramatic
65 * impact on network performance.
66 *
67 * Several items can be output:
68 * - a CSV file of data reception statistics, output once per
69 * second
70 * - final statistics, in a CSV file
71 * - dump of routing tables at 5 seconds into the simulation
72 * - ASCII trace file
73 * - PCAP trace files for each node
74 *
75 * Simulation scenarios can be defined and configuration
76 * settings can be saved using config-store (raw text)
77 * which can they be replayed again. This is an easy way
78 * to define and save the settings for a scenario, and then
79 * re-execute the same scenario exactly, or to set up
80 * several different simulation scenarios.
81 * For example, to set up a scenario and save the configuration
82 * as "scenario1.txt":
83 * ./ns3 run "vanet-routing-compare --scenario=1 --saveconfig=scenario1.txt"
84 * Then, to re-play the scenario using the save configuration
85 * settings:
86 * ./ns3 run "vanet-routing-compare --loadconfig=scenario1.txt"
87 *
88 * Class Diagram:
89 * main()
90 * +--uses-- VanetRoutingExperiment
91 * +--is_a--- WifiApp
92 * +--uses--- ConfigStoreHelper
93 * +--has_a-- WaveBsmHelper
94 * | +--has_a-- WaveBsmStats
95 * +--has_a-- RoutingHelper
96 * | +--has_a--RoutingStats
97 * +--has_a-- WifiPhyStats
98 *
99 */
100
101#include "ns3/aodv-module.h"
102#include "ns3/applications-module.h"
103#include "ns3/config-store-module.h"
104#include "ns3/core-module.h"
105#include "ns3/dsdv-module.h"
106#include "ns3/dsr-module.h"
107#include "ns3/flow-monitor-module.h"
108#include "ns3/integer.h"
109#include "ns3/internet-module.h"
110#include "ns3/itu-r-1411-los-propagation-loss-model.h"
111#include "ns3/mobility-module.h"
112#include "ns3/network-module.h"
113#include "ns3/ocb-wifi-mac.h"
114#include "ns3/olsr-module.h"
115#include "ns3/wave-bsm-helper.h"
116#include "ns3/wave-helper.h"
117#include "ns3/wave-mac-helper.h"
118#include "ns3/wifi-80211p-helper.h"
119#include "ns3/yans-wifi-helper.h"
120
121#include <fstream>
122#include <iostream>
123
124using namespace ns3;
125using namespace dsr;
126
127NS_LOG_COMPONENT_DEFINE("vanet-routing-compare");
128
136{
137 public:
141 RoutingStats();
142
148
154
160
166
172 void IncRxBytes(uint32_t rxBytes);
173
177 void IncRxPkts();
178
183 void SetRxBytes(uint32_t rxBytes);
184
189 void SetRxPkts(uint32_t rxPkts);
190
196
202
208
214
219 void IncTxBytes(uint32_t txBytes);
220
224 void IncTxPkts();
225
230 void SetTxBytes(uint32_t txBytes);
231
236 void SetTxPkts(uint32_t txPkts);
237
238 private:
247};
248
250 : m_RxBytes(0),
251 m_cumulativeRxBytes(0),
252 m_RxPkts(0),
253 m_cumulativeRxPkts(0),
254 m_TxBytes(0),
255 m_cumulativeTxBytes(0),
256 m_TxPkts(0),
257 m_cumulativeTxPkts(0)
258{
259}
260
263{
264 return m_RxBytes;
265}
266
269{
270 return m_cumulativeRxBytes;
271}
272
275{
276 return m_RxPkts;
277}
278
281{
282 return m_cumulativeRxPkts;
283}
284
285void
287{
288 m_RxBytes += rxBytes;
289 m_cumulativeRxBytes += rxBytes;
290}
291
292void
294{
295 m_RxPkts++;
297}
298
299void
301{
302 m_RxBytes = rxBytes;
303}
304
305void
307{
308 m_RxPkts = rxPkts;
309}
310
313{
314 return m_TxBytes;
315}
316
319{
320 return m_cumulativeTxBytes;
321}
322
325{
326 return m_TxPkts;
327}
328
331{
332 return m_cumulativeTxPkts;
333}
334
335void
337{
338 m_TxBytes += txBytes;
339 m_cumulativeTxBytes += txBytes;
340}
341
342void
344{
345 m_TxPkts++;
347}
348
349void
351{
352 m_TxBytes = txBytes;
353}
354
355void
357{
358 m_TxPkts = txPkts;
359}
360
371class RoutingHelper : public Object
372{
373 public:
378 static TypeId GetTypeId();
379
384
388 ~RoutingHelper() override;
389
402 void Install(NodeContainer& c,
405 double totalTime,
406 int protocol,
407 uint32_t nSinks,
408 int routingTables);
409
415 void OnOffTrace(std::string context, Ptr<const Packet> packet);
416
422
427 void SetLogging(int log);
428
429 private:
435
442
448 void SetupRoutingMessages(NodeContainer& c, Ipv4InterfaceContainer& adhocTxInterfaces);
449
457
463
470 std::string m_protocolName;
471 int m_log;
472};
473
475
476TypeId
478{
479 static TypeId tid =
480 TypeId("ns3::RoutingHelper").SetParent<Object>().AddConstructor<RoutingHelper>();
481 return tid;
482}
483
485 : m_TotalSimTime(300.01),
486 m_protocol(0),
487 m_port(9),
488 m_nSinks(0),
489 m_routingTables(0),
490 m_log(0)
491{
492}
493
495{
496}
497
498void
502 double totalTime,
503 int protocol,
504 uint32_t nSinks,
505 int routingTables)
506{
507 m_TotalSimTime = totalTime;
508 m_protocol = protocol;
509 m_nSinks = nSinks;
510 m_routingTables = routingTables;
511
513 AssignIpAddresses(d, i);
515}
516
519{
520 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory");
521 Ptr<Socket> sink = Socket::CreateSocket(node, tid);
523 sink->Bind(local);
524 sink->SetRecvCallback(MakeCallback(&RoutingHelper::ReceiveRoutingPacket, this));
525
526 return sink;
527}
528
529void
531{
532 AodvHelper aodv;
534 DsdvHelper dsdv;
535 DsrHelper dsr;
536 DsrMainHelper dsrMain;
538 InternetStackHelper internet;
539
540 Time rtt = Time(5.0);
541 AsciiTraceHelper ascii;
542 Ptr<OutputStreamWrapper> rtw = ascii.CreateFileStream("routing_table");
543
544 switch (m_protocol)
545 {
546 case 0:
547 m_protocolName = "NONE";
548 break;
549 case 1:
550 if (m_routingTables != 0)
551 {
552 olsr.PrintRoutingTableAllAt(rtt, rtw);
553 }
554 list.Add(olsr, 100);
555 m_protocolName = "OLSR";
556 break;
557 case 2:
558 if (m_routingTables != 0)
559 {
560 aodv.PrintRoutingTableAllAt(rtt, rtw);
561 }
562 list.Add(aodv, 100);
563 m_protocolName = "AODV";
564 break;
565 case 3:
566 if (m_routingTables != 0)
567 {
568 dsdv.PrintRoutingTableAllAt(rtt, rtw);
569 }
570 list.Add(dsdv, 100);
571 m_protocolName = "DSDV";
572 break;
573 case 4:
574 // setup is later
575 m_protocolName = "DSR";
576 break;
577 default:
578 NS_FATAL_ERROR("No such protocol:" << m_protocol);
579 break;
580 }
581
582 if (m_protocol < 4)
583 {
584 internet.SetRoutingHelper(list);
585 internet.Install(c);
586 }
587 else if (m_protocol == 4)
588 {
589 internet.Install(c);
590 dsrMain.Install(dsr, c);
591 }
592
593 if (m_log != 0)
594 {
595 NS_LOG_UNCOND("Routing Setup for " << m_protocolName);
596 }
597}
598
599void
601{
602 NS_LOG_INFO("Assigning IP addresses");
603 Ipv4AddressHelper addressAdhoc;
604 // we may have a lot of nodes, and want them all
605 // in same subnet, to support broadcast
606 addressAdhoc.SetBase("10.1.0.0", "255.255.0.0");
607 adhocTxInterfaces = addressAdhoc.Assign(d);
608}
609
610void
612{
613 // Setup routing transmissions
614 OnOffHelper onoff1("ns3::UdpSocketFactory", Address());
615 onoff1.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1.0]"));
616 onoff1.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0.0]"));
617
618 Ptr<UniformRandomVariable> var = CreateObject<UniformRandomVariable>();
619 int64_t stream = 2;
620 var->SetStream(stream);
621 for (uint32_t i = 0; i < m_nSinks; i++)
622 {
623 // protocol == 0 means no routing data, WAVE BSM only
624 // so do not set up sink
625 if (m_protocol != 0)
626 {
627 Ptr<Socket> sink = SetupRoutingPacketReceive(adhocTxInterfaces.GetAddress(i), c.Get(i));
628 }
629
630 AddressValue remoteAddress(InetSocketAddress(adhocTxInterfaces.GetAddress(i), m_port));
631 onoff1.SetAttribute("Remote", remoteAddress);
632
633 ApplicationContainer temp = onoff1.Install(c.Get(i + m_nSinks));
634 temp.Start(Seconds(var->GetValue(1.0, 2.0)));
636 }
637}
638
646static inline std::string
648{
649 std::ostringstream oss;
650
651 oss << Simulator::Now().As(Time::S) << " " << socket->GetNode()->GetId();
652
653 if (InetSocketAddress::IsMatchingType(srcAddress))
654 {
655 InetSocketAddress addr = InetSocketAddress::ConvertFrom(srcAddress);
656 oss << " received one packet from " << addr.GetIpv4();
657 }
658 else
659 {
660 oss << " received one packet!";
661 }
662 return oss.str();
663}
664
665void
667{
668 Ptr<Packet> packet;
669 Address srcAddress;
670 while ((packet = socket->RecvFrom(srcAddress)))
671 {
672 // application data, for goodput
673 uint32_t RxRoutingBytes = packet->GetSize();
674 GetRoutingStats().IncRxBytes(RxRoutingBytes);
676 if (m_log != 0)
677 {
679 PrintReceivedRoutingPacket(socket, packet, srcAddress));
680 }
681 }
682}
683
684void
686{
687 uint32_t pktBytes = packet->GetSize();
688 routingStats.IncTxBytes(pktBytes);
689}
690
693{
694 return routingStats;
695}
696
697void
699{
700 m_log = log;
701}
702
707class WifiPhyStats : public Object
708{
709 public:
714 static TypeId GetTypeId();
715
719 WifiPhyStats();
720
724 ~WifiPhyStats() override;
725
732
741 void PhyTxTrace(std::string context,
742 Ptr<const Packet> packet,
743 WifiMode mode,
744 WifiPreamble preamble,
745 uint8_t txPower);
746
752 void PhyTxDrop(std::string context, Ptr<const Packet> packet);
753
760 void PhyRxDrop(std::string context, Ptr<const Packet> packet, WifiPhyRxfailureReason reason);
761
762 private:
765};
766
768
769TypeId
771{
772 static TypeId tid =
773 TypeId("ns3::WifiPhyStats").SetParent<Object>().AddConstructor<WifiPhyStats>();
774 return tid;
775}
776
778 : m_phyTxPkts(0),
779 m_phyTxBytes(0)
780{
781}
782
784{
785}
786
787void
788WifiPhyStats::PhyTxTrace(std::string context,
789 Ptr<const Packet> packet,
790 WifiMode mode,
791 WifiPreamble preamble,
792 uint8_t txPower)
793{
794 NS_LOG_FUNCTION(this << context << packet << "PHYTX mode=" << mode);
795 ++m_phyTxPkts;
796 uint32_t pktSize = packet->GetSize();
798
799 // NS_LOG_UNCOND ("Received PHY size=" << pktSize);
800}
801
802void
803WifiPhyStats::PhyTxDrop(std::string context, Ptr<const Packet> packet)
804{
805 NS_LOG_UNCOND("PHY Tx Drop");
806}
807
808void
809WifiPhyStats::PhyRxDrop(std::string context,
810 Ptr<const Packet> packet,
812{
813 NS_LOG_UNCOND("PHY Rx Drop");
814}
815
818{
819 return m_phyTxBytes;
820}
821
827{
828 public:
832 WifiApp();
833
837 virtual ~WifiApp();
838
844 void Simulate(int argc, char** argv);
845
846 protected:
850 virtual void SetDefaultAttributeValues();
851
857 virtual void ParseCommandLineArguments(int argc, char** argv);
858
862 virtual void ConfigureNodes();
863
867 virtual void ConfigureChannels();
868
872 virtual void ConfigureDevices();
873
877 virtual void ConfigureMobility();
878
882 virtual void ConfigureApplications();
883
887 virtual void ConfigureTracing();
888
892 virtual void RunSimulation();
893
897 virtual void ProcessOutputs();
898};
899
901{
902}
903
905{
906}
907
908void
909WifiApp::Simulate(int argc, char** argv)
910{
911 // Simulator Program Flow:
912 // (source: NS-3 Annual Meeting, May, 2014, session 2 slides 6, 28)
913 // (HandleProgramInputs:)
914 // SetDefaultAttributeValues
915 // ParseCommandLineArguments
916 // (ConfigureTopology:)
917 // ConfigureNodes
918 // ConfigureChannels
919 // ConfigureDevices
920 // ConfigureMobility
921 // ConfigureApplications
922 // e.g AddInternetStackToNodes
923 // ConfigureIpAddressingAndRouting
924 // configureSendMessages
925 // ConfigureTracing
926 // RunSimulation
927 // ProcessOutputs
928
930 ParseCommandLineArguments(argc, argv);
939}
940
941void
943{
944}
945
946void
948{
949}
950
951void
953{
954}
955
956void
958{
959}
960
961void
963{
964}
965
966void
968{
969}
970
971void
973{
974}
975
976void
978{
979}
980
981void
983{
984}
985
986void
988{
989}
990
996{
997 public:
1002
1007 void LoadConfig(std::string configFilename);
1008
1013 void SaveConfig(std::string configFilename);
1014};
1015
1017{
1018}
1019
1020void
1021ConfigStoreHelper::LoadConfig(std::string configFilename)
1022{
1023 // Input config store from txt format
1024 Config::SetDefault("ns3::ConfigStore::Filename", StringValue(configFilename));
1025 Config::SetDefault("ns3::ConfigStore::FileFormat", StringValue("RawText"));
1026 Config::SetDefault("ns3::ConfigStore::Mode", StringValue("Load"));
1027 ConfigStore inputConfig;
1028 inputConfig.ConfigureDefaults();
1029 // inputConfig.ConfigureAttributes ();
1030}
1031
1032void
1033ConfigStoreHelper::SaveConfig(std::string configFilename)
1034{
1035 // only save if a non-empty filename has been specified
1036 if (configFilename != "")
1037 {
1038 // Output config store to txt format
1039 Config::SetDefault("ns3::ConfigStore::Filename", StringValue(configFilename));
1040 Config::SetDefault("ns3::ConfigStore::FileFormat", StringValue("RawText"));
1041 Config::SetDefault("ns3::ConfigStore::Mode", StringValue("Save"));
1042 ConfigStore outputConfig;
1043 outputConfig.ConfigureDefaults();
1044 // outputConfig.ConfigureAttributes ();
1045 }
1046}
1047
1054{
1055 public:
1060
1061 protected:
1065 void SetDefaultAttributeValues() override;
1066
1072 void ParseCommandLineArguments(int argc, char** argv) override;
1073
1077 void ConfigureNodes() override;
1078
1082 void ConfigureChannels() override;
1083
1087 void ConfigureDevices() override;
1088
1092 void ConfigureMobility() override;
1093
1097 void ConfigureApplications() override;
1098
1102 void ConfigureTracing() override;
1103
1107 void RunSimulation() override;
1108
1112 void ProcessOutputs() override;
1113
1114 private:
1118 void Run();
1119
1125 void CommandSetup(int argc, char** argv);
1126
1131 void CheckThroughput();
1132
1136 void SetupLogFile();
1137
1141 void SetupLogging();
1142
1146 void ConfigureDefaults();
1147
1152
1156 void SetupAdhocDevices();
1157
1164 void SetupWaveMessages();
1165
1170 void SetupRoutingMessages();
1171
1175 void SetupScenario();
1176
1180 void WriteCsvHeader();
1181
1185 void SetConfigFromGlobals();
1186
1190 void SetGlobalsFromConfig();
1191
1198 static void CourseChange(std::ostream* os,
1199 std::string context,
1201
1203 std::string m_CSVfileName;
1204 std::string m_CSVfileName2;
1206 std::string m_protocolName;
1207 double m_txp;
1210
1213 std::string m_lossModelName;
1214
1215 std::string m_phyMode;
1217
1218 std::string m_traceFile;
1219 std::string m_logFile;
1223 std::string m_rate;
1224 std::string m_phyModeB;
1225 std::string m_trName;
1231 std::ofstream m_os;
1242
1246 int m_log;
1260 std::vector<double> m_txSafetyRanges;
1261 std::string m_exp;
1263};
1264
1266 : m_port(9),
1267 m_CSVfileName("vanet-routing.output.csv"),
1268 m_CSVfileName2("vanet-routing.output2.csv"),
1269 m_nSinks(10),
1270 m_protocolName("protocol"),
1271 m_txp(20),
1272 m_traceMobility(false),
1273 // AODV
1274 m_protocol(2),
1275 // Two-Ray ground
1276 m_lossModel(3),
1277 m_fading(0),
1278 m_lossModelName(""),
1279 m_phyMode("OfdmRate6MbpsBW10MHz"),
1280 // 1=802.11p
1281 m_80211mode(1),
1282 m_traceFile(""),
1283 m_logFile("low99-ct-unterstrass-1day.filt.7.adj.log"),
1284 m_mobility(1),
1285 m_nNodes(156),
1286 m_TotalSimTime(300.01),
1287 m_rate("2048bps"),
1288 m_phyModeB("DsssRate11Mbps"),
1289 m_trName("vanet-routing-compare"),
1290 m_nodeSpeed(20),
1291 m_nodePause(0),
1292 m_wavePacketSize(200),
1293 m_waveInterval(0.1),
1294 m_verbose(0),
1295 m_scenario(1),
1296 m_gpsAccuracyNs(40),
1297 m_txMaxDelayMs(10),
1298 m_routingTables(0),
1299 m_asciiTrace(0),
1300 m_pcap(0),
1301 m_loadConfigFilename("load-config.txt"),
1302 m_saveConfigFilename(""),
1303 m_log(0),
1304 m_streamIndex(0),
1305 m_adhocTxNodes(),
1306 m_txSafetyRange1(50.0),
1307 m_txSafetyRange2(100.0),
1308 m_txSafetyRange3(150.0),
1309 m_txSafetyRange4(200.0),
1310 m_txSafetyRange5(250.0),
1311 m_txSafetyRange6(300.0),
1312 m_txSafetyRange7(350.0),
1313 m_txSafetyRange8(400.0),
1314 m_txSafetyRange9(450.0),
1315 m_txSafetyRange10(500.0),
1316 m_txSafetyRanges(),
1317 m_exp(""),
1318 m_cumulativeBsmCaptureStart(0)
1319{
1320 m_wifiPhyStats = CreateObject<WifiPhyStats>();
1321 m_routingHelper = CreateObject<RoutingHelper>();
1322
1323 // set to non-zero value to enable
1324 // simply uncond logging during simulation run
1325 m_log = 1;
1326}
1327
1328void
1330{
1331 // handled in constructor
1332}
1333
1334// important configuration items stored in global values
1335
1337static ns3::GlobalValue g_port("VRCport",
1338 "Port",
1340 ns3::MakeUintegerChecker<uint32_t>());
1341
1343static ns3::GlobalValue g_nSinks("VRCnSinks",
1344 "Number of sink nodes for routing non-BSM traffic",
1346 ns3::MakeUintegerChecker<uint32_t>());
1347
1349static ns3::GlobalValue g_traceMobility("VRCtraceMobility",
1350 "Trace mobility 1=yes;0=no",
1352 ns3::MakeUintegerChecker<uint32_t>());
1353
1355static ns3::GlobalValue g_protocol("VRCprotocol",
1356 "Routing protocol",
1358 ns3::MakeUintegerChecker<uint32_t>());
1359
1361static ns3::GlobalValue g_lossModel("VRClossModel",
1362 "Propagation Loss Model",
1364 ns3::MakeUintegerChecker<uint32_t>());
1365
1367static ns3::GlobalValue g_fading("VRCfading",
1368 "Fast Fading Model",
1370 ns3::MakeUintegerChecker<uint32_t>());
1371
1373static ns3::GlobalValue g_80211mode("VRC80211mode",
1374 "802.11 mode (0=802.11a;1=802.11p)",
1376 ns3::MakeUintegerChecker<uint32_t>());
1377
1379static ns3::GlobalValue g_mobility("VRCmobility",
1380 "Mobility mode 0=random waypoint;1=mobility trace file",
1382 ns3::MakeUintegerChecker<uint32_t>());
1383
1385static ns3::GlobalValue g_nNodes("VRCnNodes",
1386 "Number of nodes (vehicles)",
1387 ns3::UintegerValue(156),
1388 ns3::MakeUintegerChecker<uint32_t>());
1389
1391static ns3::GlobalValue g_nodeSpeed("VRCnodeSpeed",
1392 "Node speed (m/s) for RWP model",
1394 ns3::MakeUintegerChecker<uint32_t>());
1395
1397static ns3::GlobalValue g_nodePause("VRCnodePause",
1398 "Node pause time (s) for RWP model",
1400 ns3::MakeUintegerChecker<uint32_t>());
1401
1403static ns3::GlobalValue g_wavePacketSize("VRCwavePacketSize",
1404 "Size in bytes of WAVE BSM",
1405 ns3::UintegerValue(200),
1406 ns3::MakeUintegerChecker<uint32_t>());
1407
1409static ns3::GlobalValue g_verbose("VRCverbose",
1410 "Verbose 0=no;1=yes",
1412 ns3::MakeUintegerChecker<uint32_t>());
1413
1415static ns3::GlobalValue g_scenario("VRCscenario",
1416 "Scenario",
1418 ns3::MakeUintegerChecker<uint32_t>());
1419
1421static ns3::GlobalValue g_routingTables("VRCroutingTables",
1422 "Dump routing tables at t=5 seconds 0=no;1=yes",
1424 ns3::MakeUintegerChecker<uint32_t>());
1425
1427static ns3::GlobalValue g_asciiTrace("VRCasciiTrace",
1428 "Dump ASCII trace 0=no;1=yes",
1430 ns3::MakeUintegerChecker<uint32_t>());
1431
1433static ns3::GlobalValue g_pcap("VRCpcap",
1434 "Generate PCAP files 0=no;1=yes",
1436 ns3::MakeUintegerChecker<uint32_t>());
1437
1440 "VRCcumulativeBsmCaptureStart",
1441 "Simulation start time for capturing cumulative BSM",
1444
1446static ns3::GlobalValue g_txSafetyRange1("VRCtxSafetyRange1",
1447 "BSM range for PDR inclusion",
1448 ns3::DoubleValue(50.0),
1449 ns3::MakeDoubleChecker<double>());
1450
1452static ns3::GlobalValue g_txSafetyRange2("VRCtxSafetyRange2",
1453 "BSM range for PDR inclusion",
1454 ns3::DoubleValue(100.0),
1455 ns3::MakeDoubleChecker<double>());
1456
1458static ns3::GlobalValue g_txSafetyRange3("VRCtxSafetyRange3",
1459 "BSM range for PDR inclusion",
1460 ns3::DoubleValue(150.0),
1461 ns3::MakeDoubleChecker<double>());
1462
1464static ns3::GlobalValue g_txSafetyRange4("VRCtxSafetyRange4",
1465 "BSM range for PDR inclusion",
1466 ns3::DoubleValue(200.0),
1467 ns3::MakeDoubleChecker<double>());
1468
1470static ns3::GlobalValue g_txSafetyRange5("VRCtxSafetyRange5",
1471 "BSM range for PDR inclusion",
1472 ns3::DoubleValue(250.0),
1473 ns3::MakeDoubleChecker<double>());
1474
1476static ns3::GlobalValue g_txSafetyRange6("VRCtxSafetyRange6",
1477 "BSM range for PDR inclusion",
1478 ns3::DoubleValue(300.0),
1479 ns3::MakeDoubleChecker<double>());
1480
1482static ns3::GlobalValue g_txSafetyRange7("VRCtxSafetyRange7",
1483 "BSM range for PDR inclusion",
1484 ns3::DoubleValue(350.0),
1485 ns3::MakeDoubleChecker<double>());
1486
1488static ns3::GlobalValue g_txSafetyRange8("VRCtxSafetyRange8",
1489 "BSM range for PDR inclusion",
1490 ns3::DoubleValue(400.0),
1491 ns3::MakeDoubleChecker<double>());
1492
1494static ns3::GlobalValue g_txSafetyRange9("VRCtxSafetyRange9",
1495 "BSM range for PDR inclusion",
1496 ns3::DoubleValue(450.0),
1497 ns3::MakeDoubleChecker<double>());
1498
1500static ns3::GlobalValue g_txSafetyRange10("VRCtxSafetyRange10",
1501 "BSM range for PDR inclusion",
1502 ns3::DoubleValue(500.0),
1503 ns3::MakeDoubleChecker<double>());
1504
1506static ns3::GlobalValue g_txp("VRCtxp",
1507 "Transmission power dBm",
1508 ns3::DoubleValue(7.5),
1509 ns3::MakeDoubleChecker<double>());
1510
1512static ns3::GlobalValue g_totalTime("VRCtotalTime",
1513 "Total simulation time (s)",
1514 ns3::DoubleValue(300.01),
1515 ns3::MakeDoubleChecker<double>());
1516
1518static ns3::GlobalValue g_waveInterval("VRCwaveInterval",
1519 "Interval (s) between WAVE BSMs",
1520 ns3::DoubleValue(0.1),
1521 ns3::MakeDoubleChecker<double>());
1522
1524static ns3::GlobalValue g_gpsAccuracyNs("VRCgpsAccuracyNs",
1525 "GPS sync accuracy (ns)",
1526 ns3::DoubleValue(40),
1527 ns3::MakeDoubleChecker<double>());
1528
1530static ns3::GlobalValue g_txMaxDelayMs("VRCtxMaxDelayMs",
1531 "Tx May Delay (ms)",
1532 ns3::DoubleValue(10),
1533 ns3::MakeDoubleChecker<double>());
1534
1536static ns3::GlobalValue g_CSVfileName("VRCCSVfileName",
1537 "CSV filename (for time series data)",
1538 ns3::StringValue("vanet-routing.output.csv"),
1540
1542static ns3::GlobalValue g_CSVfileName2("VRCCSVfileName2",
1543 "CSV filename 2 (for overall simulation scenario results)",
1544 ns3::StringValue("vanet-routing.output2.csv"),
1546
1548static ns3::GlobalValue g_phyMode("VRCphyMode",
1549 "PHY mode (802.11p)",
1550 ns3::StringValue("OfdmRate6MbpsBW10MHz"),
1552
1555 "VRCtraceFile",
1556 "Mobility trace filename",
1557 ns3::StringValue("./src/wave/examples/low99-ct-unterstrass-1day.filt.7.adj.mob"),
1559
1561static ns3::GlobalValue g_logFile("VRClogFile",
1562 "Log filename",
1563 ns3::StringValue("low99-ct-unterstrass-1day.filt.7.adj.log"),
1565
1567static ns3::GlobalValue g_rate("VRCrate",
1568 "Data rate",
1569 ns3::StringValue("2048bps"),
1571
1573static ns3::GlobalValue g_phyModeB("VRCphyModeB",
1574 "PHY mode (802.11a)",
1575 ns3::StringValue("DsssRate11Mbps"),
1577
1579static ns3::GlobalValue g_trName("VRCtrName",
1580 "Trace name",
1581 ns3::StringValue("vanet-routing-compare"),
1583
1584void
1586{
1587 CommandSetup(argc, argv);
1588 SetupScenario();
1589
1590 // user may specify up to 10 different tx distances
1591 // to be used for calculating different values of Packet
1592 // Delivery Ratio (PDR). Used to see the effects of
1593 // fading over distance
1594 m_txSafetyRanges.resize(10, 0);
1605
1607
1608 // we are done with all configuration
1609 // save config-store, if requested
1611 ConfigStoreHelper configStoreHelper;
1612 configStoreHelper.SaveConfig(m_saveConfigFilename);
1613
1614 m_waveBsmHelper.GetWaveBsmStats()->SetLogging(m_log);
1616}
1617
1618void
1620{
1622}
1623
1624void
1626{
1627 // set up channel and devices
1629}
1630
1631void
1633{
1634 // devices are set up in SetupAdhocDevices(),
1635 // called by ConfigureChannels()
1636
1637 // use a PHY callback for tracing
1638 // to determine the total amount of
1639 // data transmitted, and then used to calculate
1640 // the MAC/PHY overhead beyond the app-data
1641 if (m_80211mode == 3)
1642 {
1643 // WAVE
1644 Config::Connect("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/State/Tx",
1646 Config::Connect("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/PhyTxDrop",
1648 Config::Connect("/NodeList/*/DeviceList/*/$ns3::WaveNetDevice/PhyEntities/*/PhyRxDrop",
1650 }
1651 else
1652 {
1653 Config::Connect("/NodeList/*/DeviceList/*/Phy/State/Tx",
1655 Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxDrop",
1657 Config::Connect("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxDrop",
1659 }
1660}
1661
1662void
1664{
1666}
1667
1668void
1670{
1671 // Traffic mix consists of:
1672 // 1. routing data
1673 // 2. Broadcasting of Basic Safety Message (BSM)
1676
1677 // config trace to capture app-data (bytes) for
1678 // routing data, subtracted and used for
1679 // routing overhead
1680 std::ostringstream oss;
1681 oss.str("");
1682 oss << "/NodeList/*/ApplicationList/*/$ns3::OnOffApplication/Tx";
1684}
1685
1686void
1688{
1690 SetupLogFile();
1691 SetupLogging();
1692
1693 AsciiTraceHelper ascii;
1694 MobilityHelper::EnableAsciiAll(ascii.CreateFileStream(m_trName + ".mob"));
1695}
1696
1697void
1699{
1700 Run();
1701}
1702
1703void
1705{
1706 // calculate and output final results
1707 double bsm_pdr1 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(1);
1708 double bsm_pdr2 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(2);
1709 double bsm_pdr3 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(3);
1710 double bsm_pdr4 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(4);
1711 double bsm_pdr5 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(5);
1712 double bsm_pdr6 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(6);
1713 double bsm_pdr7 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(7);
1714 double bsm_pdr8 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(8);
1715 double bsm_pdr9 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(9);
1716 double bsm_pdr10 = m_waveBsmHelper.GetWaveBsmStats()->GetCumulativeBsmPdr(10);
1717
1718 double averageRoutingGoodputKbps = 0.0;
1720 averageRoutingGoodputKbps = (((double)totalBytesTotal * 8.0) / m_TotalSimTime) / 1000.0;
1721
1722 // calculate MAC/PHY overhead (mac-phy-oh)
1723 // total WAVE BSM bytes sent
1724 uint32_t cumulativeWaveBsmBytes = m_waveBsmHelper.GetWaveBsmStats()->GetTxByteCount();
1725 uint32_t cumulativeRoutingBytes = m_routingHelper->GetRoutingStats().GetCumulativeTxBytes();
1726 uint32_t totalAppBytes = cumulativeWaveBsmBytes + cumulativeRoutingBytes;
1727 uint32_t totalPhyBytes = m_wifiPhyStats->GetTxBytes();
1728 // mac-phy-oh = (total-phy-bytes - total-app-bytes) / total-phy-bytes
1729 double mac_phy_oh = 0.0;
1730 if (totalPhyBytes > 0)
1731 {
1732 mac_phy_oh = (double)(totalPhyBytes - totalAppBytes) / (double)totalPhyBytes;
1733 }
1734
1735 if (m_log != 0)
1736 {
1737 NS_LOG_UNCOND("BSM_PDR1=" << bsm_pdr1 << " BSM_PDR2=" << bsm_pdr2
1738 << " BSM_PDR3=" << bsm_pdr3 << " BSM_PDR4=" << bsm_pdr4
1739 << " BSM_PDR5=" << bsm_pdr5 << " BSM_PDR6=" << bsm_pdr6
1740 << " BSM_PDR7=" << bsm_pdr7 << " BSM_PDR8=" << bsm_pdr8
1741 << " BSM_PDR9=" << bsm_pdr9 << " BSM_PDR10=" << bsm_pdr10
1742 << " Goodput=" << averageRoutingGoodputKbps
1743 << "Kbps MAC/PHY-oh=" << mac_phy_oh);
1744 }
1745
1746 std::ofstream out(m_CSVfileName2, std::ios::app);
1747
1748 out << bsm_pdr1 << "," << bsm_pdr2 << "," << bsm_pdr3 << "," << bsm_pdr4 << "," << bsm_pdr5
1749 << "," << bsm_pdr6 << "," << bsm_pdr7 << "," << bsm_pdr8 << "," << bsm_pdr9 << ","
1750 << bsm_pdr10 << "," << averageRoutingGoodputKbps << "," << mac_phy_oh << "" << std::endl;
1751
1752 out.close();
1753
1754 m_os.close(); // close log file
1755}
1756
1757void
1759{
1760 NS_LOG_INFO("Run Simulation.");
1761
1763
1764 Simulator::Stop(Seconds(m_TotalSimTime));
1765 Simulator::Run();
1766 Simulator::Destroy();
1767}
1768
1769// Prints actual position and velocity when a course change event occurs
1770void
1772 std::string context,
1774{
1775 Vector pos = mobility->GetPosition(); // Get position
1776 Vector vel = mobility->GetVelocity(); // Get velocity
1777
1778 pos.z = 1.5;
1779
1780 int nodeId = mobility->GetObject<Node>()->GetId();
1781 double t = (Simulator::Now()).GetSeconds();
1782 if (t >= 1.0)
1783 {
1784 WaveBsmHelper::GetNodesMoving()[nodeId] = 1;
1785 }
1786
1787 // NS_LOG_UNCOND ("Changing pos for node=" << nodeId << " at " << Simulator::Now () );
1788
1789 // Prints position and velocities
1790 *os << Simulator::Now() << " POS: x=" << pos.x << ", y=" << pos.y << ", z=" << pos.z
1791 << "; VEL:" << vel.x << ", y=" << vel.y << ", z=" << vel.z << std::endl;
1792}
1793
1794void
1796{
1799 double kbps = (bytesTotal * 8.0) / 1000;
1800 double wavePDR = 0.0;
1801 int wavePktsSent = m_waveBsmHelper.GetWaveBsmStats()->GetTxPktCount();
1802 int wavePktsReceived = m_waveBsmHelper.GetWaveBsmStats()->GetRxPktCount();
1803 if (wavePktsSent > 0)
1804 {
1805 int wavePktsReceived = m_waveBsmHelper.GetWaveBsmStats()->GetRxPktCount();
1806 wavePDR = (double)wavePktsReceived / (double)wavePktsSent;
1807 }
1808
1809 int waveExpectedRxPktCount = m_waveBsmHelper.GetWaveBsmStats()->GetExpectedRxPktCount(1);
1810 int waveRxPktInRangeCount = m_waveBsmHelper.GetWaveBsmStats()->GetRxPktInRangeCount(1);
1811 double wavePDR1_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(1);
1812 double wavePDR2_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(2);
1813 double wavePDR3_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(3);
1814 double wavePDR4_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(4);
1815 double wavePDR5_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(5);
1816 double wavePDR6_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(6);
1817 double wavePDR7_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(7);
1818 double wavePDR8_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(8);
1819 double wavePDR9_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(9);
1820 double wavePDR10_2 = m_waveBsmHelper.GetWaveBsmStats()->GetBsmPdr(10);
1821
1822 // calculate MAC/PHY overhead (mac-phy-oh)
1823 // total WAVE BSM bytes sent
1824 uint32_t cumulativeWaveBsmBytes = m_waveBsmHelper.GetWaveBsmStats()->GetTxByteCount();
1825 uint32_t cumulativeRoutingBytes = m_routingHelper->GetRoutingStats().GetCumulativeTxBytes();
1826 uint32_t totalAppBytes = cumulativeWaveBsmBytes + cumulativeRoutingBytes;
1827 uint32_t totalPhyBytes = m_wifiPhyStats->GetTxBytes();
1828 // mac-phy-oh = (total-phy-bytes - total-app-bytes) / total-phy-bytes
1829 double mac_phy_oh = 0.0;
1830 if (totalPhyBytes > 0)
1831 {
1832 mac_phy_oh = (double)(totalPhyBytes - totalAppBytes) / (double)totalPhyBytes;
1833 }
1834
1835 std::ofstream out(m_CSVfileName, std::ios::app);
1836
1837 if (m_log != 0)
1838 {
1839 NS_LOG_UNCOND("At t=" << (Simulator::Now()).As(Time::S) << " BSM_PDR1=" << wavePDR1_2
1840 << " BSM_PDR1=" << wavePDR2_2 << " BSM_PDR3=" << wavePDR3_2
1841 << " BSM_PDR4=" << wavePDR4_2 << " BSM_PDR5=" << wavePDR5_2
1842 << " BSM_PDR6=" << wavePDR6_2 << " BSM_PDR7=" << wavePDR7_2
1843 << " BSM_PDR8=" << wavePDR8_2 << " BSM_PDR9=" << wavePDR9_2
1844 << " BSM_PDR10=" << wavePDR10_2 << " Goodput=" << kbps
1845 << "Kbps" /*<< " MAC/PHY-OH=" << mac_phy_oh*/);
1846 }
1847
1848 out << (Simulator::Now()).As(Time::S) << "," << kbps << "," << packetsReceived << ","
1849 << m_nSinks << "," << m_protocolName << "," << m_txp << "," << wavePktsSent << ","
1850 << wavePktsReceived << "," << wavePDR << "," << waveExpectedRxPktCount << ","
1851 << waveRxPktInRangeCount << "," << wavePDR1_2 << "," << wavePDR2_2 << "," << wavePDR3_2
1852 << "," << wavePDR4_2 << "," << wavePDR5_2 << "," << wavePDR6_2 << "," << wavePDR7_2 << ","
1853 << wavePDR8_2 << "," << wavePDR9_2 << "," << wavePDR10_2 << "," << mac_phy_oh << ""
1854 << std::endl;
1855
1856 out.close();
1857
1860 m_waveBsmHelper.GetWaveBsmStats()->SetRxPktCount(0);
1861 m_waveBsmHelper.GetWaveBsmStats()->SetTxPktCount(0);
1862 for (int index = 1; index <= 10; index++)
1863 {
1864 m_waveBsmHelper.GetWaveBsmStats()->SetExpectedRxPktCount(index, 0);
1865 m_waveBsmHelper.GetWaveBsmStats()->SetRxPktInRangeCount(index, 0);
1866 }
1867
1868 Time currentTime = Simulator::Now();
1869 if (currentTime <= m_cumulativeBsmCaptureStart)
1870 {
1871 for (int index = 1; index <= 10; index++)
1872 {
1873 m_waveBsmHelper.GetWaveBsmStats()->ResetTotalRxPktCounts(index);
1874 }
1875 }
1876
1877 Simulator::Schedule(Seconds(1.0), &VanetRoutingExperiment::CheckThroughput, this);
1878}
1879
1880void
1882{
1883 // get settings saved from config-store
1884 UintegerValue uintegerValue;
1885 DoubleValue doubleValue;
1886 StringValue stringValue;
1887 TimeValue timeValue;
1888
1889 // This may not be the best way to manage program configuration
1890 // (directing them through global values), but management
1891 // through the config-store here is copied from
1892 // src/lte/examples/lena-dual-stripe.cc
1893
1894 GlobalValue::GetValueByName("VRCport", uintegerValue);
1895 m_port = uintegerValue.Get();
1896 GlobalValue::GetValueByName("VRCnSinks", uintegerValue);
1897 m_nSinks = uintegerValue.Get();
1898 GlobalValue::GetValueByName("VRCtraceMobility", uintegerValue);
1899 m_traceMobility = uintegerValue.Get();
1900 GlobalValue::GetValueByName("VRCprotocol", uintegerValue);
1901 m_protocol = uintegerValue.Get();
1902 GlobalValue::GetValueByName("VRClossModel", uintegerValue);
1903 m_lossModel = uintegerValue.Get();
1904 GlobalValue::GetValueByName("VRCfading", uintegerValue);
1905 m_fading = uintegerValue.Get();
1906 GlobalValue::GetValueByName("VRC80211mode", uintegerValue);
1907 m_80211mode = uintegerValue.Get();
1908 GlobalValue::GetValueByName("VRCmobility", uintegerValue);
1909 m_mobility = uintegerValue.Get();
1910 GlobalValue::GetValueByName("VRCnNodes", uintegerValue);
1911 m_nNodes = uintegerValue.Get();
1912 GlobalValue::GetValueByName("VRCnodeSpeed", uintegerValue);
1913 m_nodeSpeed = uintegerValue.Get();
1914 GlobalValue::GetValueByName("VRCnodePause", uintegerValue);
1915 m_nodePause = uintegerValue.Get();
1916 GlobalValue::GetValueByName("VRCwavePacketSize", uintegerValue);
1917 m_wavePacketSize = uintegerValue.Get();
1918 GlobalValue::GetValueByName("VRCverbose", uintegerValue);
1919 m_verbose = uintegerValue.Get();
1920 GlobalValue::GetValueByName("VRCscenario", uintegerValue);
1921 m_scenario = uintegerValue.Get();
1922 GlobalValue::GetValueByName("VRCroutingTables", uintegerValue);
1923 m_routingTables = uintegerValue.Get();
1924 GlobalValue::GetValueByName("VRCasciiTrace", uintegerValue);
1925 m_asciiTrace = uintegerValue.Get();
1926 GlobalValue::GetValueByName("VRCpcap", uintegerValue);
1927 m_pcap = uintegerValue.Get();
1928 GlobalValue::GetValueByName("VRCcumulativeBsmCaptureStart", timeValue);
1929 m_cumulativeBsmCaptureStart = timeValue.Get();
1930
1931 GlobalValue::GetValueByName("VRCtxSafetyRange1", doubleValue);
1932 m_txSafetyRange1 = doubleValue.Get();
1933 GlobalValue::GetValueByName("VRCtxSafetyRange2", doubleValue);
1934 m_txSafetyRange2 = doubleValue.Get();
1935 GlobalValue::GetValueByName("VRCtxSafetyRange3", doubleValue);
1936 m_txSafetyRange3 = doubleValue.Get();
1937 GlobalValue::GetValueByName("VRCtxSafetyRange4", doubleValue);
1938 m_txSafetyRange4 = doubleValue.Get();
1939 GlobalValue::GetValueByName("VRCtxSafetyRange5", doubleValue);
1940 m_txSafetyRange5 = doubleValue.Get();
1941 GlobalValue::GetValueByName("VRCtxSafetyRange6", doubleValue);
1942 m_txSafetyRange6 = doubleValue.Get();
1943 GlobalValue::GetValueByName("VRCtxSafetyRange7", doubleValue);
1944 m_txSafetyRange7 = doubleValue.Get();
1945 GlobalValue::GetValueByName("VRCtxSafetyRange8", doubleValue);
1946 m_txSafetyRange8 = doubleValue.Get();
1947 GlobalValue::GetValueByName("VRCtxSafetyRange9", doubleValue);
1948 m_txSafetyRange9 = doubleValue.Get();
1949 GlobalValue::GetValueByName("VRCtxSafetyRange10", doubleValue);
1950 m_txSafetyRange10 = doubleValue.Get();
1951 GlobalValue::GetValueByName("VRCtxp", doubleValue);
1952 m_txp = doubleValue.Get();
1953 GlobalValue::GetValueByName("VRCtotalTime", doubleValue);
1954 m_TotalSimTime = doubleValue.Get();
1955 GlobalValue::GetValueByName("VRCwaveInterval", doubleValue);
1956 m_waveInterval = doubleValue.Get();
1957 GlobalValue::GetValueByName("VRCgpsAccuracyNs", doubleValue);
1958 m_gpsAccuracyNs = doubleValue.Get();
1959 GlobalValue::GetValueByName("VRCtxMaxDelayMs", doubleValue);
1960 m_txMaxDelayMs = doubleValue.Get();
1961
1962 GlobalValue::GetValueByName("VRCCSVfileName", stringValue);
1963 m_CSVfileName = stringValue.Get();
1964 GlobalValue::GetValueByName("VRCCSVfileName2", stringValue);
1965 m_CSVfileName2 = stringValue.Get();
1966 GlobalValue::GetValueByName("VRCphyMode", stringValue);
1967 m_phyMode = stringValue.Get();
1968 GlobalValue::GetValueByName("VRCtraceFile", stringValue);
1969 m_traceFile = stringValue.Get();
1970 GlobalValue::GetValueByName("VRClogFile", stringValue);
1971 m_logFile = stringValue.Get();
1972 GlobalValue::GetValueByName("VRCrate", stringValue);
1973 m_rate = stringValue.Get();
1974 GlobalValue::GetValueByName("VRCphyModeB", stringValue);
1975 m_phyModeB = stringValue.Get();
1976 GlobalValue::GetValueByName("VRCtrName", stringValue);
1977 m_trName = stringValue.Get();
1978}
1979
1980void
1982{
1983 // get settings saved from config-store
1984 UintegerValue uintegerValue;
1985 DoubleValue doubleValue;
1986 StringValue stringValue;
1987
2006
2022
2031 GlobalValue::GetValueByName("VRCtrName", stringValue);
2032 m_trName = stringValue.Get();
2033}
2034
2035void
2037{
2038 CommandLine cmd(__FILE__);
2039 double txDist1 = 50.0;
2040 double txDist2 = 100.0;
2041 double txDist3 = 150.0;
2042 double txDist4 = 200.0;
2043 double txDist5 = 250.0;
2044 double txDist6 = 300.0;
2045 double txDist7 = 350.0;
2046 double txDist8 = 350.0;
2047 double txDist9 = 350.0;
2048 double txDist10 = 350.0;
2049
2050 // allow command line overrides
2051 cmd.AddValue("CSVfileName", "The name of the CSV output file name", m_CSVfileName);
2052 cmd.AddValue("CSVfileName2", "The name of the CSV output file name2", m_CSVfileName2);
2053 cmd.AddValue("totaltime", "Simulation end time", m_TotalSimTime);
2054 cmd.AddValue("nodes", "Number of nodes (i.e. vehicles)", m_nNodes);
2055 cmd.AddValue("sinks", "Number of routing sinks", m_nSinks);
2056 cmd.AddValue("txp", "Transmit power (dB), e.g. txp=7.5", m_txp);
2057 cmd.AddValue("traceMobility", "Enable mobility tracing", m_traceMobility);
2058 cmd.AddValue("protocol", "1=OLSR;2=AODV;3=DSDV;4=DSR", m_protocol);
2059 cmd.AddValue("lossModel", "1=Friis;2=ItuR1411Los;3=TwoRayGround;4=LogDistance", m_lossModel);
2060 cmd.AddValue("fading", "0=None;1=Nakagami;(buildings=1 overrides)", m_fading);
2061 cmd.AddValue("phyMode", "Wifi Phy mode", m_phyMode);
2062 cmd.AddValue("80211Mode", "1=802.11p; 2=802.11b; 3=WAVE-PHY", m_80211mode);
2063 cmd.AddValue("traceFile", "Ns2 movement trace file", m_traceFile);
2064 cmd.AddValue("logFile", "Log file", m_logFile);
2065 cmd.AddValue("mobility", "1=trace;2=RWP", m_mobility);
2066 cmd.AddValue("rate", "Rate", m_rate);
2067 cmd.AddValue("phyModeB", "Phy mode 802.11b", m_phyModeB);
2068 cmd.AddValue("speed", "Node speed (m/s)", m_nodeSpeed);
2069 cmd.AddValue("pause", "Node pause (s)", m_nodePause);
2070 cmd.AddValue("verbose", "0=quiet;1=verbose", m_verbose);
2071 cmd.AddValue("bsm", "(WAVE) BSM size (bytes)", m_wavePacketSize);
2072 cmd.AddValue("interval", "(WAVE) BSM interval (s)", m_waveInterval);
2073 cmd.AddValue("scenario", "1=synthetic, 2=playback-trace", m_scenario);
2074 // User is allowed to have up to 10 different PDRs (Packet
2075 // Delivery Ratios) calculate, and so can specify up to
2076 // 10 different tx distances.
2077 cmd.AddValue("txdist1", "Expected BSM tx range, m", txDist1);
2078 cmd.AddValue("txdist2", "Expected BSM tx range, m", txDist2);
2079 cmd.AddValue("txdist3", "Expected BSM tx range, m", txDist3);
2080 cmd.AddValue("txdist4", "Expected BSM tx range, m", txDist4);
2081 cmd.AddValue("txdist5", "Expected BSM tx range, m", txDist5);
2082 cmd.AddValue("txdist6", "Expected BSM tx range, m", txDist6);
2083 cmd.AddValue("txdist7", "Expected BSM tx range, m", txDist7);
2084 cmd.AddValue("txdist8", "Expected BSM tx range, m", txDist8);
2085 cmd.AddValue("txdist9", "Expected BSM tx range, m", txDist9);
2086 cmd.AddValue("txdist10", "Expected BSM tx range, m", txDist10);
2087 cmd.AddValue("gpsaccuracy", "GPS time accuracy, in ns", m_gpsAccuracyNs);
2088 cmd.AddValue("txmaxdelay", "Tx max delay, in ms", m_txMaxDelayMs);
2089 cmd.AddValue("routingTables", "Dump routing tables at t=5 seconds", m_routingTables);
2090 cmd.AddValue("asciiTrace", "Dump ASCII Trace data", m_asciiTrace);
2091 cmd.AddValue("pcap", "Create PCAP files for all nodes", m_pcap);
2092 cmd.AddValue("loadconfig", "Config-store filename to load", m_loadConfigFilename);
2093 cmd.AddValue("saveconfig", "Config-store filename to save", m_saveConfigFilename);
2094 cmd.AddValue("exp", "Experiment", m_exp);
2095 cmd.AddValue("BsmCaptureStart",
2096 "Start time to begin capturing pkts for cumulative Bsm",
2098 cmd.Parse(argc, argv);
2099
2100 m_txSafetyRange1 = txDist1;
2101 m_txSafetyRange2 = txDist2;
2102 m_txSafetyRange3 = txDist3;
2103 m_txSafetyRange4 = txDist4;
2104 m_txSafetyRange5 = txDist5;
2105 m_txSafetyRange6 = txDist6;
2106 m_txSafetyRange7 = txDist7;
2107 m_txSafetyRange8 = txDist8;
2108 m_txSafetyRange9 = txDist9;
2109 m_txSafetyRange10 = txDist10;
2110 // load configuration info from config-store
2111 ConfigStoreHelper configStoreHelper;
2112 configStoreHelper.LoadConfig(m_loadConfigFilename);
2113 // transfer config-store values to config parameters
2115
2116 // parse again so you can override input file default values via command line
2117 cmd.Parse(argc, argv);
2118
2119 m_txSafetyRange1 = txDist1;
2120 m_txSafetyRange2 = txDist2;
2121 m_txSafetyRange3 = txDist3;
2122 m_txSafetyRange4 = txDist4;
2123 m_txSafetyRange5 = txDist5;
2124 m_txSafetyRange6 = txDist6;
2125 m_txSafetyRange7 = txDist7;
2126 m_txSafetyRange8 = txDist8;
2127 m_txSafetyRange9 = txDist9;
2128 m_txSafetyRange10 = txDist10;
2129}
2130
2131void
2133{
2134 // open log file for output
2135 m_os.open(m_logFile);
2136}
2137
2138void
2140{
2141 // Enable logging from the ns2 helper
2142 LogComponentEnable("Ns2MobilityHelper", LOG_LEVEL_DEBUG);
2143
2144 Packet::EnablePrinting();
2145}
2146
2147void
2149{
2150 Config::SetDefault("ns3::OnOffApplication::PacketSize", StringValue("64"));
2151 Config::SetDefault("ns3::OnOffApplication::DataRate", StringValue(m_rate));
2152
2153 // Set Non-unicastMode rate to unicast mode
2154 if (m_80211mode == 2)
2155 {
2156 Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode",
2158 }
2159 else
2160 {
2161 Config::SetDefault("ns3::WifiRemoteStationManager::NonUnicastMode", StringValue(m_phyMode));
2162 }
2163}
2164
2165void
2167{
2168 if (m_mobility == 1)
2169 {
2170 // Create Ns2MobilityHelper with the specified trace log file as parameter
2172 ns2.Install(); // configure movements for each node, while reading trace file
2173 // initially assume all nodes are not moving
2174 WaveBsmHelper::GetNodesMoving().resize(m_nNodes, 0);
2175 }
2176 else if (m_mobility == 2)
2177 {
2178 MobilityHelper mobilityAdhoc;
2179
2180 ObjectFactory pos;
2181 pos.SetTypeId("ns3::RandomBoxPositionAllocator");
2182 pos.Set("X", StringValue("ns3::UniformRandomVariable[Min=0.0|Max=1500.0]"));
2183 pos.Set("Y", StringValue("ns3::UniformRandomVariable[Min=0.0|Max=300.0]"));
2184 // we need antenna height uniform [1.0 .. 2.0] for loss model
2185 pos.Set("Z", StringValue("ns3::UniformRandomVariable[Min=1.0|Max=2.0]"));
2186
2187 Ptr<PositionAllocator> taPositionAlloc = pos.Create()->GetObject<PositionAllocator>();
2188 m_streamIndex += taPositionAlloc->AssignStreams(m_streamIndex);
2189
2190 std::stringstream ssSpeed;
2191 ssSpeed << "ns3::UniformRandomVariable[Min=0.0|Max=" << m_nodeSpeed << "]";
2192 std::stringstream ssPause;
2193 ssPause << "ns3::ConstantRandomVariable[Constant=" << m_nodePause << "]";
2194 mobilityAdhoc.SetMobilityModel("ns3::RandomWaypointMobilityModel",
2195 "Speed",
2196 StringValue(ssSpeed.str()),
2197 "Pause",
2198 StringValue(ssPause.str()),
2199 "PositionAllocator",
2200 PointerValue(taPositionAlloc));
2201 mobilityAdhoc.SetPositionAllocator(taPositionAlloc);
2202 mobilityAdhoc.Install(m_adhocTxNodes);
2204
2205 // initially assume all nodes are moving
2206 WaveBsmHelper::GetNodesMoving().resize(m_nNodes, 1);
2207 }
2208
2209 // Configure callback for logging
2210 Config::Connect("/NodeList/*/$ns3::MobilityModel/CourseChange",
2212}
2213
2214void
2216{
2217 if (m_lossModel == 1)
2218 {
2219 m_lossModelName = "ns3::FriisPropagationLossModel";
2220 }
2221 else if (m_lossModel == 2)
2222 {
2223 m_lossModelName = "ns3::ItuR1411LosPropagationLossModel";
2224 }
2225 else if (m_lossModel == 3)
2226 {
2227 m_lossModelName = "ns3::TwoRayGroundPropagationLossModel";
2228 }
2229 else if (m_lossModel == 4)
2230 {
2231 m_lossModelName = "ns3::LogDistancePropagationLossModel";
2232 }
2233 else
2234 {
2235 // Unsupported propagation loss model.
2236 // Treating as ERROR
2237 NS_LOG_ERROR("Invalid propagation loss model specified. Values must be [1-4], where "
2238 "1=Friis;2=ItuR1411Los;3=TwoRayGround;4=LogDistance");
2239 }
2240
2241 // frequency
2242 double freq = 0.0;
2243 if ((m_80211mode == 1) || (m_80211mode == 3))
2244 {
2245 // 802.11p 5.9 GHz
2246 freq = 5.9e9;
2247 }
2248 else
2249 {
2250 // 802.11b 2.4 GHz
2251 freq = 2.4e9;
2252 }
2253
2254 // Setup propagation models
2255 YansWifiChannelHelper wifiChannel;
2256 wifiChannel.SetPropagationDelay("ns3::ConstantSpeedPropagationDelayModel");
2257 if (m_lossModel == 3)
2258 {
2259 // two-ray requires antenna height (else defaults to Friss)
2261 "Frequency",
2262 DoubleValue(freq),
2263 "HeightAboveZ",
2264 DoubleValue(1.5));
2265 }
2266 else
2267 {
2268 wifiChannel.AddPropagationLoss(m_lossModelName, "Frequency", DoubleValue(freq));
2269 }
2270
2271 // Propagation loss models are additive.
2272 if (m_fading != 0)
2273 {
2274 // if no obstacle model, then use Nakagami fading if requested
2275 wifiChannel.AddPropagationLoss("ns3::NakagamiPropagationLossModel");
2276 }
2277
2278 // the channel
2279 Ptr<YansWifiChannel> channel = wifiChannel.Create();
2280
2281 // The below set of helpers will help us to put together the wifi NICs we want
2282 YansWifiPhyHelper wifiPhy;
2283 wifiPhy.SetChannel(channel);
2284 // ns-3 supports generate a pcap trace
2285 wifiPhy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11);
2286
2287 YansWavePhyHelper wavePhy = YansWavePhyHelper::Default();
2288 wavePhy.SetChannel(channel);
2289 wavePhy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11);
2290
2291 // Setup WAVE PHY and MAC
2292 NqosWaveMacHelper wifi80211pMac = NqosWaveMacHelper::Default();
2293 WaveHelper waveHelper = WaveHelper::Default();
2294 Wifi80211pHelper wifi80211p = Wifi80211pHelper::Default();
2295 if (m_verbose)
2296 {
2297 wifi80211p.EnableLogComponents(); // Turn on all Wifi 802.11p logging
2298 // likewise, turn on WAVE PHY logging
2299 waveHelper.EnableLogComponents();
2300 }
2301
2303
2304 // Setup 802.11b stuff
2305 wifi.SetStandard(WIFI_STANDARD_80211b);
2306
2307 wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
2308 "DataMode",
2310 "ControlMode",
2312
2313 // Setup 802.11p stuff
2314 wifi80211p.SetRemoteStationManager("ns3::ConstantRateWifiManager",
2315 "DataMode",
2317 "ControlMode",
2319
2320 // Setup WAVE-PHY stuff
2321 waveHelper.SetRemoteStationManager("ns3::ConstantRateWifiManager",
2322 "DataMode",
2324 "ControlMode",
2326
2327 // Set Tx Power
2328 wifiPhy.Set("TxPowerStart", DoubleValue(m_txp));
2329 wifiPhy.Set("TxPowerEnd", DoubleValue(m_txp));
2330 wavePhy.Set("TxPowerStart", DoubleValue(m_txp));
2331 wavePhy.Set("TxPowerEnd", DoubleValue(m_txp));
2332
2333 // Add an upper mac and disable rate control
2334 WifiMacHelper wifiMac;
2335 wifiMac.SetType("ns3::AdhocWifiMac");
2336 QosWaveMacHelper waveMac = QosWaveMacHelper::Default();
2337
2338 // Setup net devices
2339
2340 if (m_80211mode == 3)
2341 {
2342 m_adhocTxDevices = waveHelper.Install(wavePhy, waveMac, m_adhocTxNodes);
2343 }
2344 else if (m_80211mode == 1)
2345 {
2346 m_adhocTxDevices = wifi80211p.Install(wifiPhy, wifi80211pMac, m_adhocTxNodes);
2347 }
2348 else
2349 {
2350 m_adhocTxDevices = wifi.Install(wifiPhy, wifiMac, m_adhocTxNodes);
2351 }
2352
2353 if (m_asciiTrace != 0)
2354 {
2355 AsciiTraceHelper ascii;
2357 wifiPhy.EnableAsciiAll(osw);
2358 wavePhy.EnableAsciiAll(osw);
2359 }
2360 if (m_pcap != 0)
2361 {
2362 wifiPhy.EnablePcapAll("vanet-routing-compare-pcap");
2363 wavePhy.EnablePcapAll("vanet-routing-compare-pcap");
2364 }
2365}
2366
2367void
2369{
2370 // WAVE PHY mode
2371 // 0=continuous channel; 1=channel-switching
2372 int chAccessMode = 0;
2373 if (m_80211mode == 3)
2374 {
2375 chAccessMode = 1;
2376 }
2377
2382 // GPS accuracy (i.e, clock drift), in number of ns
2385 chAccessMode,
2386 // tx max delay before transmit, in ms
2388
2389 // fix random number streams
2391}
2392
2393void
2395{
2400 m_protocol,
2401 m_nSinks,
2403}
2404
2405void
2407{
2408 // member variable parameter use
2409 // defaults or command line overrides,
2410 // except where scenario={1,2,3,...}
2411 // have been specified, in which case
2412 // specify parameters are overwritten
2413 // here to setup for specific scenarios
2414
2415 // certain parameters may be further overridden
2416 // i.e. specify a scenario, override tx power.
2417
2418 if (m_scenario == 1)
2419 {
2420 // 40 nodes in RWP 300 m x 1500 m synthetic highway, 10s
2421 m_traceFile = "";
2422 m_logFile = "";
2423 m_mobility = 2;
2424 if (m_nNodes == 156)
2425 {
2426 m_nNodes = 40;
2427 }
2428 if (m_TotalSimTime == 300.01)
2429 {
2430 m_TotalSimTime = 10.0;
2431 }
2432 }
2433 else if (m_scenario == 2)
2434 {
2435 // Realistic vehicular trace in 4.6 km x 3.0 km suburban Zurich
2436 // "low density, 99 total vehicles"
2437 m_traceFile = "src/wave/examples/low99-ct-unterstrass-1day.filt.7.adj.mob";
2438 m_logFile = "low99-ct-unterstrass-1day.filt.7.adj.log";
2439 m_mobility = 1;
2440 m_nNodes = 99;
2441 m_TotalSimTime = 300.01;
2442 m_nodeSpeed = 0;
2443 m_nodePause = 0;
2444 m_CSVfileName = "low_vanet-routing-compare.csv";
2445 m_CSVfileName = "low_vanet-routing-compare2.csv";
2446 }
2447}
2448
2449void
2451{
2452 // blank out the last output file and write the column headers
2453 std::ofstream out(m_CSVfileName);
2454 out << "SimulationSecond,"
2455 << "ReceiveRate,"
2456 << "PacketsReceived,"
2457 << "NumberOfSinks,"
2458 << "RoutingProtocol,"
2459 << "TransmissionPower,"
2460 << "WavePktsSent,"
2461 << "WavePtksReceived,"
2462 << "WavePktsPpr,"
2463 << "ExpectedWavePktsReceived,"
2464 << "ExpectedWavePktsInCoverageReceived,"
2465 << "BSM_PDR1,"
2466 << "BSM_PDR2,"
2467 << "BSM_PDR3,"
2468 << "BSM_PDR4,"
2469 << "BSM_PDR5,"
2470 << "BSM_PDR6,"
2471 << "BSM_PDR7,"
2472 << "BSM_PDR8,"
2473 << "BSM_PDR9,"
2474 << "BSM_PDR10,"
2475 << "MacPhyOverhead" << std::endl;
2476 out.close();
2477
2478 std::ofstream out2(m_CSVfileName2);
2479 out2 << "BSM_PDR1,"
2480 << "BSM_PDR2,"
2481 << "BSM_PDR3,"
2482 << "BSM_PDR4,"
2483 << "BSM_PDR5,"
2484 << "BSM_PDR6,"
2485 << "BSM_PDR7,"
2486 << "BSM_PDR8,"
2487 << "BSM_PDR9,"
2488 << "BSM_PDR10,"
2489 << "AverageRoutingGoodputKbps,"
2490 << "MacPhyOverhead" << std::endl;
2491 out2.close();
2492}
2493
2494int
2495main(int argc, char* argv[])
2496{
2498 experiment.Simulate(argc, argv);
2499}
The ConfigStoreHelper class simplifies config-store raw text load and save.
void SaveConfig(std::string configFilename)
Saves a configuration to a given named config-store raw text configuration file.
void LoadConfig(std::string configFilename)
Loads a saved config-store raw text configuration from a given named file.
The RoutingHelper class generates routing data between nodes (vehicles) and uses the RoutingStats cla...
uint32_t m_protocol
routing protocol; 0=NONE, 1=OLSR, 2=AODV, 3=DSDV, 4=DSR
void SetLogging(int log)
Enable/disable logging.
double m_TotalSimTime
seconds
void SetupRoutingMessages(NodeContainer &c, Ipv4InterfaceContainer &adhocTxInterfaces)
Sets up routing messages on the nodes and their interfaces.
int m_routingTables
dump routing table (at t=5 sec). 0=No, 1=Yes
Ptr< Socket > SetupRoutingPacketReceive(Ipv4Address addr, Ptr< Node > node)
Sets up a routing packet for tranmission.
RoutingHelper()
Constructor.
void SetupRoutingProtocol(NodeContainer &c)
Sets up the protocol protocol on the nodes.
void AssignIpAddresses(NetDeviceContainer &d, Ipv4InterfaceContainer &adhocTxInterfaces)
Assigns IPv4 addresses to net devices and their interfaces.
void Install(NodeContainer &c, NetDeviceContainer &d, Ipv4InterfaceContainer &i, double totalTime, int protocol, uint32_t nSinks, int routingTables)
Installs routing functionality on nodes and their devices and interfaces.
RoutingStats routingStats
routing statistics
uint32_t m_nSinks
number of sink nodes (< all nodes)
~RoutingHelper() override
Destructor.
RoutingStats & GetRoutingStats()
Returns the RoutingStats instance.
std::string m_protocolName
protocol name
static TypeId GetTypeId()
Get class TypeId.
void OnOffTrace(std::string context, Ptr< const Packet > packet)
Trace the receipt of an on-off-application generated packet.
void ReceiveRoutingPacket(Ptr< Socket > socket)
Process a received routing packet.
The RoutingStats class manages collects statistics on routing data (application-data packet and byte ...
uint32_t m_cumulativeRxBytes
cumulative receive bytes
uint32_t GetTxPkts()
Returns the number of packets transmitted.
uint32_t m_RxBytes
reeive bytes
void IncRxBytes(uint32_t rxBytes)
Increments the number of (application-data) bytes received, not including MAC/PHY overhead.
uint32_t m_cumulativeTxPkts
cumulative transmit packets
void IncRxPkts()
Increments the count of packets received.
uint32_t m_TxPkts
transmit packets
void IncTxPkts()
Increment the count of packets transmitted.
uint32_t GetTxBytes()
Returns the number of bytes transmitted.
uint32_t m_cumulativeRxPkts
cumulative receive packets
uint32_t GetCumulativeTxPkts()
Returns the cumulative number of packets transmitted.
void SetRxPkts(uint32_t rxPkts)
Sets the number of packets received.
void IncTxBytes(uint32_t txBytes)
Increment the number of bytes transmitted.
void SetTxPkts(uint32_t txPkts)
Sets the number of packets transmitted.
uint32_t m_RxPkts
receive packets
RoutingStats()
Constructor.
void SetTxBytes(uint32_t txBytes)
Sets the number of bytes transmitted.
uint32_t GetRxBytes()
Returns the number of bytes received.
uint32_t m_cumulativeTxBytes
cumulative transmit bytes
uint32_t GetRxPkts()
Returns the count of packets received.
uint32_t GetCumulativeTxBytes()
Returns the cumulative number of bytes transmitted.
uint32_t GetCumulativeRxPkts()
Returns the cumulative count of packets received.
uint32_t GetCumulativeRxBytes()
Returns the cumulative number of bytes received.
uint32_t m_TxBytes
transmit bytes
void SetRxBytes(uint32_t rxBytes)
Sets the number of bytes received.
The VanetRoutingExperiment class implements a wifi app that allows VANET routing experiments to be si...
std::string m_trName
trace file name
void ConfigureDefaults()
Configure default attributes.
std::string m_CSVfileName
CSV file name.
void SetDefaultAttributeValues() override
Sets default attribute values.
void ConfigureApplications() override
Configure applications.
int64_t m_streamIndex
used to get consistent random numbers across scenarios
std::string m_saveConfigFilename
save configi file name
void ProcessOutputs() override
Process outputs.
void SetupRoutingMessages()
Set up generation of packets to be routed through the vehicular network.
std::string m_loadConfigFilename
load config file name
std::string m_protocolName
protocol name
void SetupScenario()
Set up a prescribed scenario.
void Run()
Run the simulation.
NetDeviceContainer m_adhocTxDevices
adhoc transmit devices
void ParseCommandLineArguments(int argc, char **argv) override
Process command line arguments.
WaveBsmHelper m_waveBsmHelper
helper
Ptr< WifiPhyStats > m_wifiPhyStats
wifi phy statistics
std::vector< double > m_txSafetyRanges
list of ranges
void CommandSetup(int argc, char **argv)
Run the simulation.
std::string m_traceFile
trace file
Time m_cumulativeBsmCaptureStart
capture start
void ConfigureMobility() override
Configure mobility.
std::string m_phyModeB
phy mode
void CheckThroughput()
Checks the throughput and outputs summary to CSV file1.
std::string m_CSVfileName2
CSV file name.
static void CourseChange(std::ostream *os, std::string context, Ptr< const MobilityModel > mobility)
Course change function.
void SetupAdhocDevices()
Set up the adhoc devices.
void SetupLogging()
Set up logging.
double m_txMaxDelayMs
transmit maximum delay
void ConfigureDevices() override
Configure devices.
double m_gpsAccuracyNs
GPS accuracy.
void ConfigureChannels() override
Configure channels.
std::string m_lossModelName
loss model name
void ConfigureTracing() override
Configure tracing.
NodeContainer m_adhocTxNodes
adhoc transmit nodes
uint32_t m_nSinks
number of sinks
void SetupLogFile()
Set up log file.
void SetupWaveMessages()
Set up generation of IEEE 1609 WAVE messages, as a Basic Safety Message (BSM).
uint32_t m_nNodes
number of nodes
double m_TotalSimTime
total sim time
void RunSimulation() override
Run the simulation.
void SetupAdhocMobilityNodes()
Set up the adhoc mobility nodes.
bool m_traceMobility
trace mobility
void SetConfigFromGlobals()
Set up configuration parameter from the global variables.
void WriteCsvHeader()
Write the header line to the CSV file1.
void ConfigureNodes() override
Configure nodes.
Ipv4InterfaceContainer m_adhocTxInterfaces
adhoc transmit interfaces
void SetGlobalsFromConfig()
Set up the global variables from the configuration parameters.
std::ofstream m_os
output stream
Ptr< RoutingHelper > m_routingHelper
routing helper
The WifiApp class enforces program flow for ns-3 wifi applications.
void Simulate(int argc, char **argv)
Enacts simulation of an ns-3 wifi application.
virtual void ConfigureChannels()
Configure channels.
virtual void ParseCommandLineArguments(int argc, char **argv)
Process command line arguments.
virtual void RunSimulation()
Run the simulation.
WifiApp()
Constructor.
virtual void ConfigureNodes()
Configure nodes.
virtual void ConfigureTracing()
Configure tracing.
virtual void ConfigureApplications()
Configure applications.
virtual ~WifiApp()
Destructor.
virtual void ConfigureMobility()
Configure mobility.
virtual void ConfigureDevices()
Configure devices.
virtual void SetDefaultAttributeValues()
Sets default attribute values.
virtual void ProcessOutputs()
Process outputs.
The WifiPhyStats class collects Wifi MAC/PHY statistics.
void PhyTxDrop(std::string context, Ptr< const Packet > packet)
Callback signiture for Phy/TxDrop.
uint32_t m_phyTxBytes
phy transmit bytes
static TypeId GetTypeId()
Gets the class TypeId.
WifiPhyStats()
Constructor.
void PhyTxTrace(std::string context, Ptr< const Packet > packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower)
Callback signiture for Phy/Tx trace.
~WifiPhyStats() override
Destructor.
void PhyRxDrop(std::string context, Ptr< const Packet > packet, WifiPhyRxfailureReason reason)
Callback signiture for Phy/RxDrop.
uint32_t GetTxBytes()
Returns the number of bytes that have been transmitted (this includes MAC/PHY overhead)
uint32_t m_phyTxPkts
phy transmit packets
a polymophic address class
Definition: address.h:92
AttributeValue implementation for Address.
Helper class that adds AODV routing to nodes.
Definition: aodv-helper.h:36
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
Manage ASCII trace files for device models.
Definition: trace-helper.h:173
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
Parse command-line arguments.
Definition: command-line.h:232
Introspection did not find any typical Config paths.
Definition: config-store.h:61
void ConfigureDefaults()
Configure the default values.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
double Get() const
Definition: double.cc:37
Helper class that adds DSDV routing to nodes.
Definition: dsdv-helper.h:47
DSR helper class to manage creation of DSR routing instance and to insert it on a node as a sublayer ...
Definition: dsr-helper.h:53
Helper class that adds DSR routing to nodes.
void Install(DsrHelper &dsrHelper, NodeContainer nodes)
Install routing to the nodes.
Hold a so-called 'global value'.
Definition: global-value.h:76
bool SetValue(const AttributeValue &value)
Set the value of this GlobalValue.
an Inet address class
Ipv4Address GetIpv4() const
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
void SetRoutingHelper(const Ipv4RoutingHelper &routing)
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:43
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class that adds ns3::Ipv4ListRouting objects.
static void PrintRoutingTableAllAt(Time printTime, Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S)
prints the routing tables of all nodes at a particular time.
Helper class used to assign positions and mobility models to nodes.
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by the mobility models on t...
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetMobilityModel(std::string type, Ts &&... args)
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
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.
A network Node.
Definition: node.h:56
uint32_t GetId() const
Definition: node.cc:117
Nqos Wave Mac Helper class.
Helper class which can read ns-2 movement files and configure nodes mobility.
void Install() const
Read the ns2 trace file and configure the movement patterns of all nodes contained in the global ns3:...
Instantiate subclasses of ns3::Object.
Ptr< Object > Create() const
Create an Object instance of the configured TypeId.
void Set(const std::string &name, const AttributeValue &value, Args &&... args)
Set an attribute to be set during construction.
void SetTypeId(TypeId tid)
Set the TypeId of the Objects to be created by this factory.
A base class which provides memory management and object aggregation.
Definition: object.h:89
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
Definition: object.h:471
Helper class that adds OLSR routing to nodes.
Definition: olsr-helper.h:42
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:44
ApplicationContainer Install(NodeContainer c) const
Install an ns3::OnOffApplication on each node of the input container configured with all the attribut...
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:863
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
Hold objects of type Ptr<T>.
Definition: pointer.h:37
Allocate a set of positions.
Qos Wave Mac Helper class.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
virtual Ptr< Node > GetNode() const =0
Return the node this socket is associated with.
Hold variables of type string.
Definition: string.h:42
std::string Get() const
Definition: string.cc:31
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
Definition: time.cc:417
AttributeValue implementation for Time.
Definition: nstime.h:1425
Time Get() const
Definition: time.cc:532
a unique identifier for an interface.
Definition: type-id.h:60
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:935
Hold an unsigned integer type.
Definition: uinteger.h:45
uint64_t Get() const
Definition: uinteger.cc:37
double GetValue(double min, double max)
Get the next random value, as a double in the specified range .
The WaveBsmHelper class manages IEEE 1609 WAVE (Wireless Access in Vehicular Environments) Basic Safe...
ApplicationContainer Install(Ipv4InterfaceContainer i) const
Install an ns3::BsmApplication on each node of the input container configured with all the attributes...
Ptr< WaveBsmStats > GetWaveBsmStats()
Returns the WaveBsmStats instance.
int64_t AssignStreams(NodeContainer c, int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
helps to create WaveNetDevice objects
Definition: wave-helper.h:116
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer c) const
Definition: wave-helper.cc:336
static void EnableLogComponents()
Helper to enable all WaveNetDevice log components with one statement.
Definition: wave-helper.cc:405
void SetRemoteStationManager(std::string type, Ts &&... args)
Definition: wave-helper.h:224
helps to create wifi 802.11p objects of WifiNetDevice class
NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &macHelper, NodeContainer c) const override
static void EnableLogComponents()
Helper to enable all WifiNetDevice log components with one statement.
helps to create WifiNetDevice objects
Definition: wifi-helper.h:325
void SetRemoteStationManager(std::string type, Args &&... args)
Helper function used to set the station manager.
Definition: wifi-helper.h:590
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
represent a single transmission mode
Definition: wifi-mode.h:50
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
Definition: wifi-helper.cc:543
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:163
To trace WaveNetDevice, we have to overwrite the trace functions of class YansWifiPhyHelper.
Definition: wave-helper.h:42
manage and create wifi channel objects for the YANS model.
void SetPropagationDelay(std::string name, Ts &&... args)
void AddPropagationLoss(std::string name, Ts &&... args)
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
void experiment(std::string queue_disc_type)
Ptr< const AttributeChecker > MakeStringChecker()
Definition: string.cc:30
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:891
void Connect(std::string path, const CallbackBase &cb)
Definition: config.cc:975
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:160
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:254
#define NS_LOG_UNCOND(msg)
Output the requested message unconditionally.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:275
auto MakeBoundCallback(R(*fnPtr)(Args...), BArgs... bargs)
Make Callbacks with varying number of bound arguments.
Definition: callback.h:752
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Time Now()
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:296
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1350
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
@ WIFI_STANDARD_80211b
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Definition: nstime.h:850
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:691
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
Definition: time.cc:535
@ LOG_LEVEL_DEBUG
LOG_DEBUG and above.
Definition: log.h:104
void LogComponentEnable(const char *name, enum LogLevel level)
Enable the logging output associated with that log component.
Definition: log.cc:358
Definition: olsr.py:1
cmd
Definition: second.py:33
channel
Definition: third.py:81
wifi
Definition: third.py:88
mobility
Definition: third.py:96
#define list
static ns3::GlobalValue g_port("VRCport", "Port", ns3::UintegerValue(9), ns3::MakeUintegerChecker< uint32_t >())
Port.
static ns3::GlobalValue g_txMaxDelayMs("VRCtxMaxDelayMs", "Tx May Delay (ms)", ns3::DoubleValue(10), ns3::MakeDoubleChecker< double >())
Tx May Delay (ms)
static ns3::GlobalValue g_CSVfileName2("VRCCSVfileName2", "CSV filename 2 (for overall simulation scenario results)", ns3::StringValue("vanet-routing.output2.csv"), ns3::MakeStringChecker())
CSV filename 2 (for overall simulation scenario results)
static ns3::GlobalValue g_txSafetyRange10("VRCtxSafetyRange10", "BSM range for PDR inclusion", ns3::DoubleValue(500.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_fading("VRCfading", "Fast Fading Model", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Fast Fading Model.
static ns3::GlobalValue g_wavePacketSize("VRCwavePacketSize", "Size in bytes of WAVE BSM", ns3::UintegerValue(200), ns3::MakeUintegerChecker< uint32_t >())
Size in bytes of WAVE BSM.
static ns3::GlobalValue g_gpsAccuracyNs("VRCgpsAccuracyNs", "GPS sync accuracy (ns)", ns3::DoubleValue(40), ns3::MakeDoubleChecker< double >())
GPS sync accuracy (ns)
static ns3::GlobalValue g_protocol("VRCprotocol", "Routing protocol", ns3::UintegerValue(2), ns3::MakeUintegerChecker< uint32_t >())
Routing protocol.
static ns3::GlobalValue g_scenario("VRCscenario", "Scenario", ns3::UintegerValue(1), ns3::MakeUintegerChecker< uint32_t >())
Scenario.
static ns3::GlobalValue g_pcap("VRCpcap", "Generate PCAP files 0=no;1=yes", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Generate PCAP files 0=no;1=yes.
static ns3::GlobalValue g_nodeSpeed("VRCnodeSpeed", "Node speed (m/s) for RWP model", ns3::UintegerValue(20), ns3::MakeUintegerChecker< uint32_t >())
Node speed (m/s) for RWP model.
static ns3::GlobalValue g_cumulativeBsmCaptureStart("VRCcumulativeBsmCaptureStart", "Simulation start time for capturing cumulative BSM", ns3::TimeValue(Seconds(0)), ns3::MakeTimeChecker())
Simulation start time for capturing cumulative BSM.
static ns3::GlobalValue g_80211mode("VRC80211mode", "802.11 mode (0=802.11a;1=802.11p)", ns3::UintegerValue(1), ns3::MakeUintegerChecker< uint32_t >())
802.11 mode (0=802.11a;1=802.11p)
static ns3::GlobalValue g_traceMobility("VRCtraceMobility", "Trace mobility 1=yes;0=no", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Trace mobility 1=yes;0=no.
static ns3::GlobalValue g_totalTime("VRCtotalTime", "Total simulation time (s)", ns3::DoubleValue(300.01), ns3::MakeDoubleChecker< double >())
Total simulation time (s)
static ns3::GlobalValue g_nNodes("VRCnNodes", "Number of nodes (vehicles)", ns3::UintegerValue(156), ns3::MakeUintegerChecker< uint32_t >())
Number of nodes (vehicles)
static ns3::GlobalValue g_rate("VRCrate", "Data rate", ns3::StringValue("2048bps"), ns3::MakeStringChecker())
Data rate.
static std::string PrintReceivedRoutingPacket(Ptr< Socket > socket, Ptr< Packet > packet, Address srcAddress)
Print a received routing packet on a string.
static ns3::GlobalValue g_txSafetyRange1("VRCtxSafetyRange1", "BSM range for PDR inclusion", ns3::DoubleValue(50.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_mobility("VRCmobility", "Mobility mode 0=random waypoint;1=mobility trace file", ns3::UintegerValue(1), ns3::MakeUintegerChecker< uint32_t >())
Mobility mode 0=random waypoint;1=mobility trace file.
static ns3::GlobalValue g_routingTables("VRCroutingTables", "Dump routing tables at t=5 seconds 0=no;1=yes", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Dump routing tables at t=5 seconds 0=no;1=yes.
static ns3::GlobalValue g_txSafetyRange4("VRCtxSafetyRange4", "BSM range for PDR inclusion", ns3::DoubleValue(200.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_nodePause("VRCnodePause", "Node pause time (s) for RWP model", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Node pause time (s) for RWP model.
static ns3::GlobalValue g_verbose("VRCverbose", "Verbose 0=no;1=yes", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Verbose 0=no;1=yes.
static ns3::GlobalValue g_txSafetyRange2("VRCtxSafetyRange2", "BSM range for PDR inclusion", ns3::DoubleValue(100.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_txSafetyRange7("VRCtxSafetyRange7", "BSM range for PDR inclusion", ns3::DoubleValue(350.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_asciiTrace("VRCasciiTrace", "Dump ASCII trace 0=no;1=yes", ns3::UintegerValue(0), ns3::MakeUintegerChecker< uint32_t >())
Dump ASCII trace 0=no;1=yes.
static ns3::GlobalValue g_traceFile("VRCtraceFile", "Mobility trace filename", ns3::StringValue("./src/wave/examples/low99-ct-unterstrass-1day.filt.7.adj.mob"), ns3::MakeStringChecker())
Mobility trace filename.
static ns3::GlobalValue g_logFile("VRClogFile", "Log filename", ns3::StringValue("low99-ct-unterstrass-1day.filt.7.adj.log"), ns3::MakeStringChecker())
Log filename.
static ns3::GlobalValue g_trName("VRCtrName", "Trace name", ns3::StringValue("vanet-routing-compare"), ns3::MakeStringChecker())
Trace name)
static ns3::GlobalValue g_txSafetyRange5("VRCtxSafetyRange5", "BSM range for PDR inclusion", ns3::DoubleValue(250.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_txp("VRCtxp", "Transmission power dBm", ns3::DoubleValue(7.5), ns3::MakeDoubleChecker< double >())
Transmission power dBm.
static ns3::GlobalValue g_CSVfileName("VRCCSVfileName", "CSV filename (for time series data)", ns3::StringValue("vanet-routing.output.csv"), ns3::MakeStringChecker())
CSV filename (for time series data)
static ns3::GlobalValue g_txSafetyRange6("VRCtxSafetyRange6", "BSM range for PDR inclusion", ns3::DoubleValue(300.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_nSinks("VRCnSinks", "Number of sink nodes for routing non-BSM traffic", ns3::UintegerValue(10), ns3::MakeUintegerChecker< uint32_t >())
Number of sink nodes for routing non-BSM traffic.
static ns3::GlobalValue g_txSafetyRange3("VRCtxSafetyRange3", "BSM range for PDR inclusion", ns3::DoubleValue(150.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_phyModeB("VRCphyModeB", "PHY mode (802.11a)", ns3::StringValue("DsssRate11Mbps"), ns3::MakeStringChecker())
PHY mode (802.11a)
static ns3::GlobalValue g_waveInterval("VRCwaveInterval", "Interval (s) between WAVE BSMs", ns3::DoubleValue(0.1), ns3::MakeDoubleChecker< double >())
Interval (s) between WAVE BSMs.
static ns3::GlobalValue g_phyMode("VRCphyMode", "PHY mode (802.11p)", ns3::StringValue("OfdmRate6MbpsBW10MHz"), ns3::MakeStringChecker())
PHY mode (802.11p)
static ns3::GlobalValue g_txSafetyRange8("VRCtxSafetyRange8", "BSM range for PDR inclusion", ns3::DoubleValue(400.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_txSafetyRange9("VRCtxSafetyRange9", "BSM range for PDR inclusion", ns3::DoubleValue(450.0), ns3::MakeDoubleChecker< double >())
BSM range for PDR inclusion.
static ns3::GlobalValue g_lossModel("VRClossModel", "Propagation Loss Model", ns3::UintegerValue(3), ns3::MakeUintegerChecker< uint32_t >())
Propagation Loss Model.
std::map< Mac48Address, uint64_t > packetsReceived
Map that stores the total packets received per STA (and addressed to that STA)
Definition: wifi-bianchi.cc:72
uint32_t pktSize
packet size used for the simulation (in bytes)
Ptr< PacketSink > sink
Pointer to the packet sink application.
Definition: wifi-tcp.cc:55