Files
unison/examples/tutorial/third.cc

178 lines
5.5 KiB
C++
Raw Normal View History

/*
2024-06-17 16:17:10 +02:00
* SPDX-License-Identifier: GPL-2.0-only
*/
2011-03-02 13:42:28 -08:00
#include "ns3/applications-module.h"
2022-10-07 20:08:35 +00:00
#include "ns3/core-module.h"
#include "ns3/csma-module.h"
#include "ns3/internet-module.h"
2022-10-07 20:08:35 +00:00
#include "ns3/mobility-module.h"
#include "ns3/network-module.h"
#include "ns3/point-to-point-module.h"
2018-05-10 22:13:49 +02:00
#include "ns3/ssid.h"
2022-10-07 20:08:35 +00:00
#include "ns3/yans-wifi-helper.h"
// Default Network Topology
//
// Wifi 10.1.3.0
// AP
// * * * *
// | | | | 10.1.1.0
// n5 n6 n7 n0 -------------- n1 n2 n3 n4
// point-to-point | | | |
// ================
// LAN 10.1.2.0
using namespace ns3;
2022-10-07 20:08:35 +00:00
NS_LOG_COMPONENT_DEFINE("ThirdScriptExample");
int
2022-10-07 20:08:35 +00:00
main(int argc, char* argv[])
{
2022-10-07 20:08:35 +00:00
bool verbose = true;
uint32_t nCsma = 3;
uint32_t nWifi = 3;
bool tracing = false;
CommandLine cmd(__FILE__);
cmd.AddValue("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
cmd.AddValue("nWifi", "Number of wifi STA devices", nWifi);
cmd.AddValue("verbose", "Tell echo applications to log if true", verbose);
cmd.AddValue("tracing", "Enable pcap tracing", tracing);
cmd.Parse(argc, argv);
// The underlying restriction of 18 is due to the grid position
// allocator's configuration; the grid layout will exceed the
// bounding box if more than 18 nodes are provided.
if (nWifi > 18)
{
2022-10-07 20:08:35 +00:00
std::cout << "nWifi should be 18 or less; otherwise grid layout exceeds the bounding box"
<< std::endl;
return 1;
}
2022-10-07 20:08:35 +00:00
if (verbose)
{
2022-10-07 20:08:35 +00:00
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
2022-10-07 20:08:35 +00:00
NodeContainer p2pNodes;
p2pNodes.Create(2);
2022-10-07 20:08:35 +00:00
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));
2022-10-07 20:08:35 +00:00
NetDeviceContainer p2pDevices;
p2pDevices = pointToPoint.Install(p2pNodes);
2022-10-07 20:08:35 +00:00
NodeContainer csmaNodes;
csmaNodes.Add(p2pNodes.Get(1));
csmaNodes.Create(nCsma);
2022-10-07 20:08:35 +00:00
CsmaHelper csma;
csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
csma.SetChannelAttribute("Delay", TimeValue(NanoSeconds(6560)));
2022-10-07 20:08:35 +00:00
NetDeviceContainer csmaDevices;
csmaDevices = csma.Install(csmaNodes);
2022-10-07 20:08:35 +00:00
NodeContainer wifiStaNodes;
wifiStaNodes.Create(nWifi);
NodeContainer wifiApNode = p2pNodes.Get(0);
2022-10-07 20:08:35 +00:00
YansWifiChannelHelper channel = YansWifiChannelHelper::Default();
YansWifiPhyHelper phy;
phy.SetChannel(channel.Create());
2022-10-07 20:08:35 +00:00
WifiMacHelper mac;
Ssid ssid = Ssid("ns-3-ssid");
2022-10-07 20:08:35 +00:00
WifiHelper wifi;
2022-10-07 20:08:35 +00:00
NetDeviceContainer staDevices;
mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid), "ActiveProbing", BooleanValue(false));
staDevices = wifi.Install(phy, mac, wifiStaNodes);
2022-10-07 20:08:35 +00:00
NetDeviceContainer apDevices;
mac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid));
apDevices = wifi.Install(phy, mac, wifiApNode);
2022-10-07 20:08:35 +00:00
MobilityHelper mobility;
2022-10-07 20:08:35 +00:00
mobility.SetPositionAllocator("ns3::GridPositionAllocator",
"MinX",
DoubleValue(0.0),
"MinY",
DoubleValue(0.0),
"DeltaX",
DoubleValue(5.0),
"DeltaY",
DoubleValue(10.0),
"GridWidth",
UintegerValue(3),
"LayoutType",
StringValue("RowFirst"));
2022-10-07 20:08:35 +00:00
mobility.SetMobilityModel("ns3::RandomWalk2dMobilityModel",
"Bounds",
RectangleValue(Rectangle(-50, 50, -50, 50)));
mobility.Install(wifiStaNodes);
2022-10-07 20:08:35 +00:00
mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
mobility.Install(wifiApNode);
2022-10-07 20:08:35 +00:00
InternetStackHelper stack;
stack.Install(csmaNodes);
stack.Install(wifiApNode);
stack.Install(wifiStaNodes);
2022-10-07 20:08:35 +00:00
Ipv4AddressHelper address;
2022-10-07 20:08:35 +00:00
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pInterfaces;
p2pInterfaces = address.Assign(p2pDevices);
2022-10-07 20:08:35 +00:00
address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = address.Assign(csmaDevices);
2022-10-07 20:08:35 +00:00
address.SetBase("10.1.3.0", "255.255.255.0");
address.Assign(staDevices);
address.Assign(apDevices);
2022-10-07 20:08:35 +00:00
UdpEchoServerHelper echoServer(9);
2022-10-07 20:08:35 +00:00
ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
serverApps.Start(Seconds(1.0));
serverApps.Stop(Seconds(10.0));
2022-10-07 20:08:35 +00:00
UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
echoClient.SetAttribute("MaxPackets", UintegerValue(1));
echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
echoClient.SetAttribute("PacketSize", UintegerValue(1024));
2022-10-07 20:08:35 +00:00
ApplicationContainer clientApps = echoClient.Install(wifiStaNodes.Get(nWifi - 1));
clientApps.Start(Seconds(2.0));
clientApps.Stop(Seconds(10.0));
2022-10-07 20:08:35 +00:00
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
2022-10-07 20:08:35 +00:00
Simulator::Stop(Seconds(10.0));
2022-10-07 20:08:35 +00:00
if (tracing)
{
2022-10-07 20:08:35 +00:00
phy.SetPcapDataLinkType(WifiPhyHelper::DLT_IEEE802_11_RADIO);
pointToPoint.EnablePcapAll("third");
phy.EnablePcap("third", apDevices.Get(0));
csma.EnablePcap("third", csmaDevices.Get(0), true);
}
2022-10-07 20:08:35 +00:00
Simulator::Run();
Simulator::Destroy();
return 0;
}