Additional cleanup of mixed-wireless; get packets to flow across different device technologies
This commit is contained in:
@@ -47,12 +47,19 @@
|
||||
// | |
|
||||
// +----------------+ +----------------+
|
||||
// | 802.11 | | 802.11 |
|
||||
// | net | | net |
|
||||
// | infra net | | infra net |
|
||||
// | K-1 hosts | | K-1 hosts |
|
||||
// +----------------+ +----------------+
|
||||
//
|
||||
// We'll send data from the first wired LAN node on the first wired LAN
|
||||
// to the last wireless STA on the last infrastructure net, thereby
|
||||
// causing packets to traverse CSMA to adhoc to infrastructure links
|
||||
//
|
||||
// Note that certain mobility patterns may cause packet forwarding
|
||||
// to fail (if nodes become disconnected)
|
||||
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/common-module.h"
|
||||
#include "ns3/node-module.h"
|
||||
@@ -60,6 +67,7 @@
|
||||
#include "ns3/mobility-module.h"
|
||||
#include "ns3/contrib-module.h"
|
||||
#include "ns3/wifi-module.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
@@ -91,13 +99,14 @@ main (int argc, char *argv[])
|
||||
uint32_t lanNodes = 5;
|
||||
uint32_t stopTime = 10;
|
||||
bool useCourseChangeCallback = false;
|
||||
bool enableTracing = false;
|
||||
|
||||
//
|
||||
// Simulation defaults are typically set next, before command line
|
||||
// arguments are parsed.
|
||||
//
|
||||
Config::SetDefault ("ns3::OnOffApplication::PacketSize", StringValue ("210"));
|
||||
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("448kb/s"));
|
||||
Config::SetDefault ("ns3::OnOffApplication::DataRate", StringValue ("10kb/s"));
|
||||
|
||||
//
|
||||
// For convenience, we add the local variables to the command line argument
|
||||
@@ -110,6 +119,7 @@ main (int argc, char *argv[])
|
||||
cmd.AddValue("lanNodes", "number of LAN nodes", lanNodes);
|
||||
cmd.AddValue("stopTime", "simulation stop time (seconds)", stopTime);
|
||||
cmd.AddValue("useCourseChangeCallback", "whether to enable course change tracing", useCourseChangeCallback);
|
||||
cmd.AddValue("enableTracing", "enable tracing", enableTracing);
|
||||
|
||||
//
|
||||
// The system global variables and the local values added to the argument
|
||||
@@ -169,8 +179,8 @@ main (int argc, char *argv[])
|
||||
}
|
||||
mobility.SetPositionAllocator (positionAlloc);
|
||||
mobility.SetMobilityModel ("ns3::RandomDirection2dMobilityModel",
|
||||
"Bounds", RectangleValue (Rectangle (0, 1000, 0, 1000)),
|
||||
"Speed", RandomVariableValue (ConstantVariable (2000)),
|
||||
"Bounds", RectangleValue (Rectangle (0, 20, 0, 20)),
|
||||
"Speed", RandomVariableValue (ConstantVariable (2)),
|
||||
"Pause", RandomVariableValue (ConstantVariable (0.2)));
|
||||
mobility.Install (backbone);
|
||||
|
||||
@@ -240,20 +250,38 @@ main (int argc, char *argv[])
|
||||
// two containers here; one with all of the new nodes, and one
|
||||
// with all of the nodes including new and existing nodes
|
||||
//
|
||||
NodeContainer newInfraNodes;
|
||||
newInfraNodes.Create (infraNodes - 1);
|
||||
NodeContainer stas;
|
||||
stas.Create (infraNodes - 1);
|
||||
// Now, create the container with all nodes on this link
|
||||
NodeContainer infra (backbone.Get (i), newInfraNodes);
|
||||
NodeContainer infra (backbone.Get (i), stas);
|
||||
//
|
||||
// Create another ad hoc network and devices
|
||||
// Create an infrastructure network
|
||||
//
|
||||
WifiHelper wifiInfra = WifiHelper::Default ();
|
||||
wifiPhy.SetChannel (wifiChannel.Create ());
|
||||
NetDeviceContainer infraDevices = wifiInfra.Install (wifiPhy, infra);
|
||||
// Create unique ssids for these networks
|
||||
std::string ssidString("wifi-infra");
|
||||
std::stringstream ss;
|
||||
ss << i;
|
||||
ssidString += ss.str();
|
||||
Ssid ssid = Ssid (ssidString);
|
||||
wifiInfra.SetRemoteStationManager ("ns3::ArfWifiManager");
|
||||
// setup stas
|
||||
wifiInfra.SetMac ("ns3::NqstaWifiMac",
|
||||
"Ssid", SsidValue (ssid),
|
||||
"ActiveProbing", BooleanValue (false));
|
||||
NetDeviceContainer staDevices = wifiInfra.Install (wifiPhy, stas);
|
||||
// setup ap.
|
||||
wifiInfra.SetMac ("ns3::NqapWifiMac", "Ssid", SsidValue (ssid),
|
||||
"BeaconGeneration", BooleanValue (true),
|
||||
"BeaconInterval", TimeValue (Seconds (2.5)));
|
||||
NetDeviceContainer apDevices = wifiInfra.Install (wifiPhy, backbone.Get (i));
|
||||
// Collect all of these new devices
|
||||
NetDeviceContainer infraDevices (apDevices, staDevices);
|
||||
|
||||
// Add the IPv4 protocol stack to the nodes in our container
|
||||
//
|
||||
internet.Install (newInfraNodes);
|
||||
internet.Install (stas);
|
||||
//
|
||||
// Assign IPv4 addresses to the device drivers (actually to the associated
|
||||
// IPv4 interfaces) we just created.
|
||||
@@ -277,8 +305,8 @@ main (int argc, char *argv[])
|
||||
mobility.PushReferenceMobilityModel (backbone.Get (i));
|
||||
mobility.SetPositionAllocator (subnetAlloc);
|
||||
mobility.SetMobilityModel ("ns3::RandomDirection2dMobilityModel",
|
||||
"Bounds", RectangleValue (Rectangle (-25, 25, -25, 25)),
|
||||
"Speed", RandomVariableValue (ConstantVariable (30)),
|
||||
"Bounds", RectangleValue (Rectangle (-10, 10, -10, 10)),
|
||||
"Speed", RandomVariableValue (ConstantVariable (3)),
|
||||
"Pause", RandomVariableValue (ConstantVariable (0.4)));
|
||||
mobility.Install (infra);
|
||||
}
|
||||
@@ -288,6 +316,14 @@ main (int argc, char *argv[])
|
||||
// //
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The below global routing does not take into account wireless effects.
|
||||
// However, it is useful for setting default routes for all of the nodes
|
||||
// such as the LAN nodes.
|
||||
NS_LOG_INFO ("Enabling global routing on all nodes");
|
||||
GlobalRouteManager::PopulateRoutingTables ();
|
||||
|
||||
// We enable OLSR (which will be consulted at a higher priority than
|
||||
// the global routing above) on the backbone ad hoc nodes
|
||||
NS_LOG_INFO ("Enabling OLSR routing on all backbone nodes");
|
||||
OlsrHelper olsr;
|
||||
olsr.Install (backbone);
|
||||
@@ -299,16 +335,25 @@ main (int argc, char *argv[])
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Create the OnOff application to send UDP datagrams of size
|
||||
// 210 bytes at a rate of 448 Kb/s, between two nodes
|
||||
// 210 bytes at a rate of 10 Kb/s, between two nodes
|
||||
// We'll send data from the first wired LAN node on the first wired LAN
|
||||
// to the last wireless STA on the last infrastructure net, thereby
|
||||
// causing packets to traverse CSMA to adhoc to infrastructure links
|
||||
|
||||
NS_LOG_INFO ("Create Applications.");
|
||||
uint16_t port = 9; // Discard port (RFC 863)
|
||||
|
||||
// Let's make sure that the user does not define too few LAN nodes
|
||||
// to make this example work. We need lanNodes >= 5
|
||||
NS_ASSERT (lanNodes >= 5);
|
||||
Ptr<Node> appSource = NodeList::GetNode (11);
|
||||
Ptr<Node> appSink = NodeList::GetNode (13);
|
||||
Ipv4Address remoteAddr = Ipv4Address ("172.16.0.5");
|
||||
// Let's make sure that the user does not define too few nodes
|
||||
// to make this example work. We need lanNodes > 1 and infraNodes > 1
|
||||
NS_ASSERT (lanNodes > 1 && infraNodes > 1);
|
||||
// We want the source to be the first node created outside of the backbone
|
||||
// Conveniently, the variable "backboneNodes" holds this node index value
|
||||
Ptr<Node> appSource = NodeList::GetNode (backboneNodes);
|
||||
// We want the sink to be the last node created in the topology.
|
||||
uint32_t lastNodeIndex = backboneNodes + backboneNodes*(lanNodes - 1) + backboneNodes*(infraNodes - 1) - 1;
|
||||
Ptr<Node> appSink = NodeList::GetNode (lastNodeIndex);
|
||||
// Let's fetch the IP address of the last node, which is on Ipv4Interface 1
|
||||
Ipv4Address remoteAddr = appSink->GetObject<Ipv4> ()->GetAddress(1);
|
||||
|
||||
OnOffHelper onoff ("ns3::UdpSocketFactory",
|
||||
Address (InetSocketAddress (remoteAddr, port)));
|
||||
@@ -331,21 +376,23 @@ main (int argc, char *argv[])
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
NS_LOG_INFO ("Configure Tracing.");
|
||||
//
|
||||
// Let's set up some ns-2-like ascii traces, using another helper class
|
||||
//
|
||||
std::ofstream ascii;
|
||||
ascii.open ("mixed-wireless.tr");
|
||||
YansWifiPhyHelper::EnableAsciiAll (ascii);
|
||||
CsmaHelper::EnableAsciiAll (ascii);
|
||||
// Look at nodes 11, 13 only
|
||||
//WifiHelper::EnableAscii (ascii, 11, 0);
|
||||
//WifiHelper::EnableAscii (ascii, 13, 0);
|
||||
if (enableTracing == true)
|
||||
{
|
||||
//
|
||||
// Let's set up some ns-2-like ascii traces, using another helper class
|
||||
//
|
||||
ascii.open ("mixed-wireless.tr");
|
||||
YansWifiPhyHelper::EnableAsciiAll (ascii);
|
||||
CsmaHelper::EnableAsciiAll (ascii);
|
||||
InternetStackHelper::EnableAsciiAll (ascii);
|
||||
|
||||
// Let's do a pcap trace on the backbone devices
|
||||
YansWifiPhyHelper::EnablePcap ("mixed-wireless", backboneDevices);
|
||||
// Let's additionally trace the application Sink, ifIndex 0
|
||||
CsmaHelper::EnablePcap ("mixed-wireless", appSink->GetId (), 0);
|
||||
// Let's do a pcap trace on the application source and sink, ifIndex 0
|
||||
CsmaHelper::EnablePcap ("mixed-wireless", appSource->GetId (), 0);
|
||||
YansWifiPhyHelper::EnablePcap ("mixed-wireless", appSink->GetId (), 0);
|
||||
YansWifiPhyHelper::EnablePcap ("mixed-wireless", 9, 2);
|
||||
YansWifiPhyHelper::EnablePcap ("mixed-wireless", 9, 0);
|
||||
}
|
||||
|
||||
if (useCourseChangeCallback == true)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user