branch merge
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/internet-node-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
|
||||
@@ -36,36 +36,12 @@
|
||||
#include <string>
|
||||
#include <cassert>
|
||||
|
||||
#include "ns3/log.h"
|
||||
|
||||
#include "ns3/command-line.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/random-variable.h"
|
||||
#include "ns3/config.h"
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/data-rate.h"
|
||||
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
#include "ns3/ascii-trace.h"
|
||||
#include "ns3/pcap-trace.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/point-to-point-channel.h"
|
||||
#include "ns3/point-to-point-net-device.h"
|
||||
#include "ns3/csma-channel.h"
|
||||
#include "ns3/csma-net-device.h"
|
||||
#include "ns3/csma-topology.h"
|
||||
#include "ns3/csma-ipv4-topology.h"
|
||||
#include "ns3/mac48-address.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
#include "ns3/ipv4.h"
|
||||
#include "ns3/socket.h"
|
||||
#include "ns3/inet-socket-address.h"
|
||||
#include "ns3/ipv4-route.h"
|
||||
#include "ns3/point-to-point-topology.h"
|
||||
#include "ns3/onoff-application.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
#include "ns3/uinteger.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
@@ -114,68 +90,49 @@ main (int argc, char *argv[])
|
||||
cmd.Parse (argc, argv);
|
||||
|
||||
NS_LOG_INFO ("Create nodes.");
|
||||
Ptr<Node> n0 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n1 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n2 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n3 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n4 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n5 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n6 = CreateObject<InternetNode> ();
|
||||
NodeContainer c;
|
||||
c.Create (7);
|
||||
NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
|
||||
NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
|
||||
NodeContainer n5n6 = NodeContainer (c.Get (5), c.Get (6));
|
||||
NodeContainer n2345 = NodeContainer (c.Get (2), c.Get (3), c.Get (4), c.Get (5));
|
||||
|
||||
InternetStackHelper internet;
|
||||
internet.Build (c);
|
||||
|
||||
// We create the channels first without any IP addressing information
|
||||
NS_LOG_INFO ("Create channels.");
|
||||
Ptr<PointToPointChannel> channel0 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n0, n2, DataRate (5000000), MilliSeconds (2));
|
||||
PointToPointHelper p2p;
|
||||
p2p.SetChannelParameter ("BitRate", DataRate (5000000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (2));
|
||||
NetDeviceContainer d0d2 = p2p.Build (n0n2);
|
||||
|
||||
Ptr<PointToPointChannel> channel1 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n1, n2, DataRate (5000000), MilliSeconds (2));
|
||||
|
||||
Ptr<PointToPointChannel> channel2 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n5, n6, DataRate (1500000), MilliSeconds (10));
|
||||
NetDeviceContainer d1d2 = p2p.Build (n1n2);
|
||||
|
||||
p2p.SetChannelParameter ("BitRate", DataRate (1500000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (10));
|
||||
NetDeviceContainer d5d6 = p2p.Build (n5n6);
|
||||
|
||||
// We create the channels first without any IP addressing information
|
||||
Ptr<CsmaChannel> channelc0 =
|
||||
CsmaTopology::CreateCsmaChannel(
|
||||
DataRate(5000000), MilliSeconds(2));
|
||||
|
||||
NS_LOG_INFO ("Build Topology.");
|
||||
uint32_t n2ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n2, channelc0,
|
||||
Mac48Address("10:54:23:54:23:50"));
|
||||
uint32_t n3ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n3, channelc0,
|
||||
Mac48Address("10:54:23:54:23:51"));
|
||||
uint32_t n4ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n4, channelc0,
|
||||
Mac48Address("10:54:23:54:23:52"));
|
||||
uint32_t n5ifIndex = CsmaIpv4Topology::AddIpv4CsmaNetDevice (n5, channelc0,
|
||||
Mac48Address("10:54:23:54:23:53"));
|
||||
|
||||
CsmaHelper csma;
|
||||
csma.SetChannelParameter ("BitRate", DataRate (5000000));
|
||||
csma.SetChannelParameter ("Delay", MilliSeconds (2));
|
||||
NetDeviceContainer d2345 = csma.Build (n2345);
|
||||
|
||||
// Later, we add IP addresses.
|
||||
NS_LOG_INFO ("Assign IP Addresses.");
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel0, n0, Ipv4Address ("10.1.1.1"),
|
||||
n2, Ipv4Address ("10.1.1.2"));
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel1, n1, Ipv4Address ("10.1.2.1"),
|
||||
n2, Ipv4Address ("10.1.2.2"));
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel2, n5, Ipv4Address ("10.1.3.1"),
|
||||
n6, Ipv4Address ("10.1.3.2"));
|
||||
Ipv4AddressHelper ipv4;
|
||||
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
|
||||
ipv4.Allocate (d0d2);
|
||||
|
||||
CsmaIpv4Topology::AddIpv4Address (
|
||||
n2, n2ifIndex, Ipv4Address("10.250.1.1"), Ipv4Mask("255.255.255.0"));
|
||||
ipv4.SetBase ("10.1.2.0", "255.255.255.0");
|
||||
ipv4.Allocate (d1d2);
|
||||
|
||||
CsmaIpv4Topology::AddIpv4Address (
|
||||
n3, n3ifIndex, Ipv4Address("10.250.1.2"), Ipv4Mask("255.255.255.0"));
|
||||
|
||||
CsmaIpv4Topology::AddIpv4Address (
|
||||
n4, n4ifIndex, Ipv4Address("10.250.1.3"), Ipv4Mask("255.255.255.0"));
|
||||
|
||||
CsmaIpv4Topology::AddIpv4Address (
|
||||
n5, n5ifIndex, Ipv4Address("10.250.1.4"), Ipv4Mask("255.255.255.0"));
|
||||
ipv4.SetBase ("10.1.3.0", "255.255.255.0");
|
||||
Ipv4InterfaceContainer i5i6 = ipv4.Allocate (d5d6);
|
||||
|
||||
ipv4.SetBase ("10.250.1.0", "255.255.255.0");
|
||||
ipv4.Allocate (d2345);
|
||||
|
||||
// Create router nodes, initialize routing database and set up the routing
|
||||
// tables in the nodes.
|
||||
@@ -185,17 +142,15 @@ main (int argc, char *argv[])
|
||||
// 210 bytes at a rate of 448 Kb/s
|
||||
NS_LOG_INFO ("Create Applications.");
|
||||
uint16_t port = 9; // Discard port (RFC 863)
|
||||
Ptr<OnOffApplication> ooff =
|
||||
CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.3.2", port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"),
|
||||
"OnTime", ConstantVariable (1),
|
||||
"OffTime", ConstantVariable (0),
|
||||
"DataRate", DataRate("300bps"),
|
||||
"PacketSize", Uinteger (50));
|
||||
n0->AddApplication (ooff);
|
||||
// Start the application
|
||||
ooff->Start (Seconds (1.0));
|
||||
ooff->Stop (Seconds (10.0));
|
||||
OnOffHelper onoff;
|
||||
onoff.SetAppAttribute ("OnTime", ConstantVariable (1));
|
||||
onoff.SetAppAttribute ("OffTime", ConstantVariable (0));
|
||||
onoff.SetAppAttribute ("DataRate", DataRate("300bps"));
|
||||
onoff.SetAppAttribute ("PacketSize", Uinteger (50));
|
||||
onoff.SetUdpRemote (i5i6.GetAddress (1), port);
|
||||
ApplicationContainer apps = onoff.Build (c.Get (0));
|
||||
apps.Start (Seconds (1.0));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
// Configure tracing of all enqueue, dequeue, and NetDevice receive events
|
||||
// Trace output will be sent to the simple-global-routing.tr file
|
||||
|
||||
@@ -37,32 +37,12 @@
|
||||
#include <string>
|
||||
#include <cassert>
|
||||
|
||||
#include "ns3/log.h"
|
||||
|
||||
#include "ns3/command-line.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/random-variable.h"
|
||||
#include "ns3/config.h"
|
||||
#include "ns3/uinteger.h"
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/data-rate.h"
|
||||
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
#include "ns3/ascii-trace.h"
|
||||
#include "ns3/pcap-trace.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/point-to-point-channel.h"
|
||||
#include "ns3/point-to-point-net-device.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
#include "ns3/ipv4.h"
|
||||
#include "ns3/socket.h"
|
||||
#include "ns3/inet-socket-address.h"
|
||||
#include "ns3/ipv4-route.h"
|
||||
#include "ns3/point-to-point-topology.h"
|
||||
#include "ns3/onoff-application.h"
|
||||
#include "ns3/packet-sink.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
@@ -128,50 +108,50 @@ main (int argc, char *argv[])
|
||||
// Here, we will explicitly create four nodes. In more sophisticated
|
||||
// topologies, we could configure a node factory.
|
||||
NS_LOG_INFO ("Create nodes.");
|
||||
Ptr<Node> n0 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n1 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n2 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n3 = CreateObject<InternetNode> ();
|
||||
NodeContainer c;
|
||||
c.Create (4);
|
||||
NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
|
||||
NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
|
||||
NodeContainer n3n2 = NodeContainer (c.Get (3), c.Get (2));
|
||||
NodeContainer n1n3 = NodeContainer (c.Get (1), c.Get (3));
|
||||
|
||||
// We create the channels first without any IP addressing information
|
||||
NS_LOG_INFO ("Create channels.");
|
||||
Ptr<PointToPointChannel> channel0 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n0, n2, DataRate (5000000), MilliSeconds (2));
|
||||
PointToPointHelper p2p;
|
||||
p2p.SetChannelParameter ("BitRate", DataRate (5000000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (2));
|
||||
NetDeviceContainer d0d2 = p2p.Build (n0n2);
|
||||
|
||||
Ptr<PointToPointChannel> channel1 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n1, n2, DataRate (5000000), MilliSeconds (2));
|
||||
|
||||
Ptr<PointToPointChannel> channel2 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n2, n3, DataRate (1500000), MilliSeconds (10));
|
||||
|
||||
Ptr<PointToPointChannel> channel3 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n1, n3, DataRate (1500000), MilliSeconds (100));
|
||||
NetDeviceContainer d1d2 = p2p.Build (n1n2);
|
||||
|
||||
p2p.SetChannelParameter ("BitRate", DataRate(1500000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (10));
|
||||
NetDeviceContainer d3d2 = p2p.Build (n3n2);
|
||||
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (100));
|
||||
NetDeviceContainer d1d3 = p2p.Build (n1n3);
|
||||
|
||||
InternetStackHelper internet;
|
||||
internet.Build (c);
|
||||
|
||||
// Later, we add IP addresses. The middle two octets correspond to
|
||||
// the channel number.
|
||||
NS_LOG_INFO ("Assign IP Addresses.");
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel0, n0, Ipv4Address ("10.0.0.1"),
|
||||
n2, Ipv4Address ("10.0.0.2"));
|
||||
Ipv4AddressHelper ipv4;
|
||||
ipv4.SetBase ("10.0.0.0", "255.255.255.0");
|
||||
ipv4.Allocate (d0d2);
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel1, n1, Ipv4Address ("10.1.1.1"),
|
||||
n2, Ipv4Address ("10.1.1.2"));
|
||||
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
|
||||
Ipv4InterfaceContainer i1i2 = ipv4.Allocate (d1d2);
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel2, n2, Ipv4Address ("10.2.2.1"),
|
||||
n3, Ipv4Address ("10.2.2.2"));
|
||||
ipv4.SetBase ("10.2.2.0", "255.255.255.0");
|
||||
ipv4.Allocate (d3d2);
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel3, n1, Ipv4Address ("10.3.3.1"),
|
||||
n3, Ipv4Address ("10.3.3.2"));
|
||||
ipv4.SetBase ("10.3.3.0", "255.255.255.0");
|
||||
Ipv4InterfaceContainer i1i3 = ipv4.Allocate (d1d3);
|
||||
|
||||
PointToPointTopology::SetIpv4Metric (
|
||||
channel3, n1, n3, sampleMetric);
|
||||
i1i3.SetMetric (0, sampleMetric);
|
||||
i1i3.SetMetric (1, sampleMetric);
|
||||
|
||||
// Create router nodes, initialize routing database and set up the routing
|
||||
// tables in the nodes.
|
||||
@@ -182,24 +162,20 @@ main (int argc, char *argv[])
|
||||
uint16_t port = 9; // Discard port (RFC 863)
|
||||
|
||||
// Create a flow from n3 to n1, starting at time 1.1 seconds
|
||||
Ptr<OnOffApplication> ooff =
|
||||
CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.1.1", port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"),
|
||||
"OnTime", ConstantVariable (1),
|
||||
"OffTime", ConstantVariable (0));
|
||||
n3->AddApplication (ooff);
|
||||
// Start the application
|
||||
ooff->Start (Seconds (1.1));
|
||||
ooff->Stop (Seconds (10.0));
|
||||
OnOffHelper onoff;
|
||||
onoff.SetAppAttribute ("OnTime", ConstantVariable (1));
|
||||
onoff.SetAppAttribute ("OffTime", ConstantVariable (0));
|
||||
onoff.SetUdpRemote (i1i2.GetAddress (0), port);
|
||||
ApplicationContainer apps = onoff.Build (c.Get (3));
|
||||
apps.Start (Seconds (1.1));
|
||||
apps.Start (Seconds (10.0));
|
||||
|
||||
// Create a packet sink to receive these packets
|
||||
Ptr<PacketSink> sink =
|
||||
CreateObject<PacketSink> ("Remote", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"));
|
||||
n1->AddApplication (sink);
|
||||
// Start the sink
|
||||
sink->Start (Seconds (1.1));
|
||||
sink->Stop (Seconds (10.0));
|
||||
PacketSinkHelper sink;
|
||||
sink.SetupUdp (Ipv4Address::GetAny (), port);
|
||||
apps = sink.Build (c.Get (1));
|
||||
apps.Start (Seconds (1.1));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
// Configure tracing of all enqueue, dequeue, and NetDevice receive events
|
||||
// Trace output will be sent to the simple-alternate-routing.tr file
|
||||
|
||||
@@ -38,34 +38,13 @@
|
||||
// - Tracing of queues and packet receptions to file
|
||||
// "simple-error-model.tr"
|
||||
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/assert.h"
|
||||
#include "ns3/command-line.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/config.h"
|
||||
#include "ns3/uinteger.h"
|
||||
#include "ns3/string.h"
|
||||
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/data-rate.h"
|
||||
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/common-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/ascii-trace.h"
|
||||
#include "ns3/pcap-trace.h"
|
||||
#include "ns3/internet-node.h"
|
||||
#include "ns3/random-variable.h"
|
||||
#include "ns3/point-to-point-channel.h"
|
||||
#include "ns3/point-to-point-net-device.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
#include "ns3/inet-socket-address.h"
|
||||
#include "ns3/ipv4.h"
|
||||
#include "ns3/socket.h"
|
||||
#include "ns3/ipv4-route.h"
|
||||
#include "ns3/point-to-point-topology.h"
|
||||
#include "ns3/onoff-application.h"
|
||||
#include "ns3/packet-sink.h"
|
||||
#include "ns3/error-model.h"
|
||||
#include "ns3/double.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
@@ -96,122 +75,92 @@ main (int argc, char *argv[])
|
||||
// Here, we will explicitly create four nodes. In more sophisticated
|
||||
// topologies, we could configure a node factory.
|
||||
NS_LOG_INFO ("Create nodes.");
|
||||
Ptr<Node> n0 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n1 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n2 = CreateObject<InternetNode> ();
|
||||
Ptr<Node> n3 = CreateObject<InternetNode> ();
|
||||
NodeContainer c;
|
||||
c.Create (4);
|
||||
NodeContainer n0n2 = NodeContainer (c.Get (0), c.Get (2));
|
||||
NodeContainer n1n2 = NodeContainer (c.Get (1), c.Get (2));
|
||||
NodeContainer n3n2 = NodeContainer (c.Get (3), c.Get (2));
|
||||
|
||||
InternetStackHelper internet;
|
||||
internet.Build (c);
|
||||
|
||||
// We create the channels first without any IP addressing information
|
||||
NS_LOG_INFO ("Create channels.");
|
||||
Ptr<PointToPointChannel> channel0 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n0, n2, DataRate(5000000), MilliSeconds(2));
|
||||
PointToPointHelper p2p;
|
||||
p2p.SetChannelParameter ("BitRate", DataRate (5000000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (2));
|
||||
NetDeviceContainer d0d2 = p2p.Build (n0n2);
|
||||
|
||||
Ptr<PointToPointChannel> channel1 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n1, n2, DataRate(5000000), MilliSeconds(2));
|
||||
|
||||
Ptr<PointToPointChannel> channel2 =
|
||||
PointToPointTopology::AddPointToPointLink (
|
||||
n2, n3, DataRate(1500000), MilliSeconds(10));
|
||||
NetDeviceContainer d1d2 = p2p.Build (n1n2);
|
||||
|
||||
p2p.SetChannelParameter ("BitRate", DataRate (1500000));
|
||||
p2p.SetChannelParameter ("Delay", MilliSeconds (10));
|
||||
NetDeviceContainer d3d2 = p2p.Build (n3n2);
|
||||
|
||||
// Later, we add IP addresses.
|
||||
NS_LOG_INFO ("Assign IP Addresses.");
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel0, n0, Ipv4Address("10.1.1.1"),
|
||||
n2, Ipv4Address("10.1.1.2"));
|
||||
Ipv4AddressHelper ipv4;
|
||||
ipv4.SetBase ("10.1.1.0", "255.255.255.0");
|
||||
ipv4.Allocate (d0d2);
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel1, n1, Ipv4Address("10.1.2.1"),
|
||||
n2, Ipv4Address("10.1.2.2"));
|
||||
|
||||
PointToPointTopology::AddIpv4Addresses (
|
||||
channel2, n2, Ipv4Address("10.1.3.1"),
|
||||
n3, Ipv4Address("10.1.3.2"));
|
||||
ipv4.SetBase ("10.1.2.0", "255.255.255.0");
|
||||
Ipv4InterfaceContainer i1i2 = ipv4.Allocate (d1d2);
|
||||
|
||||
// Finally, we add static routes. These three steps (Channel and
|
||||
// NetDevice creation, IP Address assignment, and routing) are
|
||||
// separated because there may be a need to postpone IP Address
|
||||
// assignment (emulation) or modify to use dynamic routing
|
||||
NS_LOG_INFO ("Add Static Routes.");
|
||||
PointToPointTopology::AddIpv4Routes(n0, n2, channel0);
|
||||
PointToPointTopology::AddIpv4Routes(n1, n2, channel1);
|
||||
PointToPointTopology::AddIpv4Routes(n2, n3, channel2);
|
||||
ipv4.SetBase ("10.1.3.0", "255.255.255.0");
|
||||
Ipv4InterfaceContainer i3i2 = ipv4.Allocate (d3d2);
|
||||
|
||||
NS_LOG_INFO ("Use global routing.");
|
||||
GlobalRouteManager::PopulateRoutingTables ();
|
||||
|
||||
// Create the OnOff application to send UDP datagrams of size
|
||||
// 210 bytes at a rate of 448 Kb/s
|
||||
NS_LOG_INFO ("Create Applications.");
|
||||
uint16_t port = 9; // Discard port (RFC 863)
|
||||
Ptr<OnOffApplication> ooff =
|
||||
CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.3.2", port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"),
|
||||
"OnTime", ConstantVariable(1),
|
||||
"OffTime", ConstantVariable(0));
|
||||
n0->AddApplication (ooff);
|
||||
// Start the application
|
||||
ooff->Start(Seconds(1.0));
|
||||
ooff->Stop (Seconds(10.0));
|
||||
OnOffHelper onoff;
|
||||
onoff.SetUdpRemote (i3i2.GetAddress (1), port);
|
||||
onoff.SetAppAttribute ("OnTime", ConstantVariable(1));
|
||||
onoff.SetAppAttribute ("OffTime", ConstantVariable(0));
|
||||
ApplicationContainer apps = onoff.Build (c.Get (0));
|
||||
apps.Start(Seconds(1.0));
|
||||
apps.Stop (Seconds(10.0));
|
||||
|
||||
// Create an optional packet sink to receive these packets
|
||||
Ptr<PacketSink> sink = CreateObject<PacketSink> ("Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"));
|
||||
n3->AddApplication (sink);
|
||||
// Start the sink
|
||||
sink->Start (Seconds (1.0));
|
||||
sink->Stop (Seconds (10.0));
|
||||
PacketSinkHelper sink;
|
||||
sink.SetupUdp (Ipv4Address::GetAny (), port);
|
||||
apps = sink.Build (c.Get (3));
|
||||
apps.Start (Seconds (1.0));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
// Create a similar flow from n3 to n1, starting at time 1.1 seconds
|
||||
ooff = CreateObject<OnOffApplication> ("Remote", Address (InetSocketAddress ("10.1.2.1", port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"),
|
||||
"OnTime", ConstantVariable(1),
|
||||
"OffTime", ConstantVariable(0));
|
||||
n3->AddApplication (ooff);
|
||||
// Start the application
|
||||
ooff->Start(Seconds(1.1));
|
||||
ooff->Stop (Seconds(10.0));
|
||||
onoff.SetUdpRemote (i1i2.GetAddress (0), port);
|
||||
apps = onoff.Build (c.Get (3));
|
||||
apps.Start(Seconds(1.1));
|
||||
apps.Stop (Seconds(10.0));
|
||||
|
||||
// Create a packet sink to receive these packets
|
||||
sink = CreateObject<PacketSink> ("Local", Address (InetSocketAddress (Ipv4Address::GetAny (), port)),
|
||||
"Protocol", TypeId::LookupByName ("ns3::Udp"));
|
||||
n1->AddApplication (sink);
|
||||
// Start the sink
|
||||
sink->Start (Seconds (1.1));
|
||||
sink->Stop (Seconds (10.0));
|
||||
|
||||
// Here, finish off packet routing configuration
|
||||
// This will likely set by some global StaticRouting object in the future
|
||||
NS_LOG_INFO ("Set Default Routes.");
|
||||
Ptr<Ipv4> ipv4;
|
||||
ipv4 = n0->GetObject<Ipv4> ();
|
||||
ipv4->SetDefaultRoute (Ipv4Address ("10.1.1.2"), 1);
|
||||
ipv4 = n3->GetObject<Ipv4> ();
|
||||
ipv4->SetDefaultRoute (Ipv4Address ("10.1.3.1"), 1);
|
||||
sink.SetupUdp (Ipv4Address::GetAny (), port);
|
||||
apps = sink.Build (c.Get (1));
|
||||
apps.Start (Seconds (1.1));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
//
|
||||
// Error model
|
||||
//
|
||||
// We want to add an error model to node 3's NetDevice
|
||||
// We can obtain a handle to the NetDevice via the channel and node
|
||||
// pointers
|
||||
Ptr<PointToPointNetDevice> nd3 = PointToPointTopology::GetNetDevice
|
||||
(n3, channel2);
|
||||
// Create an ErrorModel based on the implementation (constructor)
|
||||
// specified by the default classId
|
||||
Ptr<RateErrorModel> em = CreateObject<RateErrorModel> ("RanVar", UniformVariable (0.0, 1.0),
|
||||
"Rate", Double (0.001));
|
||||
nd3->AddReceiveErrorModel (em);
|
||||
"ErrorRate", Double (0.001));
|
||||
d3d2.Get (0)->SetAttribute ("ReceiveErrorModel", em);
|
||||
|
||||
// Now, let's use the ListErrorModel and explicitly force a loss
|
||||
// of the packets with pkt-uids = 11 and 17 on node 2, device 0
|
||||
Ptr<PointToPointNetDevice> nd2 = PointToPointTopology::GetNetDevice
|
||||
(n2, channel0);
|
||||
std::list<uint32_t> sampleList;
|
||||
sampleList.push_back (11);
|
||||
sampleList.push_back (17);
|
||||
// This time, we'll explicitly create the error model we want
|
||||
Ptr<ListErrorModel> pem = CreateObject<ListErrorModel> ();
|
||||
pem->SetList (sampleList);
|
||||
nd2->AddReceiveErrorModel (pem);
|
||||
d0d2.Get (1)->SetAttribute ("ReceiveErrorModel", pem);
|
||||
|
||||
// Configure tracing of all enqueue, dequeue, and NetDevice receive events
|
||||
// Trace output will be sent to the simple-error-model.tr file
|
||||
|
||||
@@ -36,12 +36,13 @@
|
||||
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/node-module.h"
|
||||
#include "ns3/global-route-manager.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
|
||||
#include "ns3/ascii-trace.h"
|
||||
#include "ns3/pcap-trace.h"
|
||||
|
||||
#include "ns3/internet-node-module.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("TcpLargeTransfer");
|
||||
@@ -149,7 +150,7 @@ int main (int argc, char *argv[])
|
||||
ipv4.SetBase ("10.1.3.0", "255.255.255.0");
|
||||
ipv4.Allocate (dev0);
|
||||
ipv4.SetBase ("10.1.2.0", "255.255.255.0");
|
||||
ipv4.Allocate (dev1);
|
||||
Ipv4InterfaceContainer ipInterfs = ipv4.Allocate (dev1);
|
||||
|
||||
// and setup ip routing tables to get total ip-level connectivity.
|
||||
GlobalRouteManager::PopulateRoutingTables ();
|
||||
@@ -177,7 +178,7 @@ int main (int argc, char *argv[])
|
||||
Ptr<Socket> localSocket = socketFactory->CreateSocket ();
|
||||
localSocket->Bind ();
|
||||
Simulator::ScheduleNow (&StartFlow, localSocket, nBytes,
|
||||
Ipv4Address ("10.1.2.2"), servPort);
|
||||
ipInterfs.GetAddress (1), servPort);
|
||||
|
||||
// Configure tracing of all enqueue, dequeue, and NetDevice receive events
|
||||
// Trace output will be sent to the simple-examples.tr file
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/mobility-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/helper-module.h"
|
||||
#include "ns3/mobility-module.h"
|
||||
#include "ns3/simulator-module.h"
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ PointToPointNetDevice::GetTypeId (void)
|
||||
DataRate ("10Mb/s"),
|
||||
MakeDataRateAccessor (&PointToPointNetDevice::m_bps),
|
||||
MakeDataRateChecker ())
|
||||
.AddAttribute ("RxErrorModel", "XXX",
|
||||
.AddAttribute ("ReceiveErrorModel", "XXX",
|
||||
Ptr<ErrorModel> (0),
|
||||
MakePtrAccessor (&PointToPointNetDevice::m_receiveErrorModel),
|
||||
MakePtrChecker<ErrorModel> ())
|
||||
@@ -224,7 +224,6 @@ void PointToPointNetDevice::AddReceiveErrorModel (Ptr<ErrorModel> em)
|
||||
NS_LOG_PARAMS ("(" << em << ")");
|
||||
|
||||
m_receiveErrorModel = em;
|
||||
AggregateObject (em);
|
||||
}
|
||||
|
||||
void PointToPointNetDevice::Receive (Ptr<Packet> packet)
|
||||
|
||||
@@ -120,10 +120,11 @@ Ipv4AddressHelper::NewNetwork (void)
|
||||
return Ipv4Address (m_network << m_shift);
|
||||
}
|
||||
|
||||
void
|
||||
Ipv4InterfaceContainer
|
||||
Ipv4AddressHelper::Allocate (const NetDeviceContainer &c)
|
||||
{
|
||||
NS_LOG_FUNCTION;
|
||||
Ipv4InterfaceContainer retval;
|
||||
for (uint32_t i = 0; i < c.GetN (); ++i) {
|
||||
Ptr<NetDevice> device = c.Get (i);
|
||||
|
||||
@@ -145,7 +146,9 @@ Ipv4AddressHelper::Allocate (const NetDeviceContainer &c)
|
||||
ipv4->SetNetworkMask (ifIndex, m_mask);
|
||||
ipv4->SetMetric (ifIndex, 1);
|
||||
ipv4->SetUp (ifIndex);
|
||||
retval.Add (ipv4, ifIndex);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
const uint32_t N_BITS = 32;
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
#define IPV4_ADDRESS_HELPER_H
|
||||
|
||||
#include "ns3/ipv4-address.h"
|
||||
#include "ns3/net-device-container.h"
|
||||
#include "net-device-container.h"
|
||||
#include "ipv4-interface-container.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -164,7 +165,7 @@ public:
|
||||
* @see SetBase
|
||||
* @see NewNetwork
|
||||
*/
|
||||
void Allocate (const NetDeviceContainer &c);
|
||||
Ipv4InterfaceContainer Allocate (const NetDeviceContainer &c);
|
||||
|
||||
private:
|
||||
uint32_t NumAddressBits (uint32_t maskbits) const;
|
||||
|
||||
34
src/helper/ipv4-interface-container.cc
Normal file
34
src/helper/ipv4-interface-container.cc
Normal file
@@ -0,0 +1,34 @@
|
||||
#include "ipv4-interface-container.h"
|
||||
#include "ns3/node-list.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
Ipv4InterfaceContainer::Ipv4InterfaceContainer ()
|
||||
{}
|
||||
|
||||
uint32_t
|
||||
Ipv4InterfaceContainer::GetN (void) const
|
||||
{
|
||||
return m_interfaces.size ();
|
||||
}
|
||||
Ipv4Address
|
||||
Ipv4InterfaceContainer::GetAddress (uint32_t i) const
|
||||
{
|
||||
Ptr<Ipv4> ipv4 = m_interfaces[i].first;
|
||||
uint32_t interface = m_interfaces[i].second;
|
||||
return ipv4->GetAddress (interface);
|
||||
}
|
||||
void
|
||||
Ipv4InterfaceContainer::SetMetric (uint32_t i, uint16_t metric)
|
||||
{
|
||||
Ptr<Ipv4> ipv4 = m_interfaces[i].first;
|
||||
uint32_t interface = m_interfaces[i].second;
|
||||
ipv4->SetMetric (interface, metric);
|
||||
}
|
||||
void
|
||||
Ipv4InterfaceContainer::Add (Ptr<Ipv4> ipv4, uint32_t interface)
|
||||
{
|
||||
m_interfaces.push_back (std::make_pair (ipv4, interface));
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
39
src/helper/ipv4-interface-container.h
Normal file
39
src/helper/ipv4-interface-container.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef IPV4_INTERFACE_CONTAINER_H
|
||||
#define IPV4_INTERFACE_CONTAINER_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vector>
|
||||
#include "ns3/ipv4.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief keep track of a set of ipv4 interfaces.
|
||||
*
|
||||
*/
|
||||
class Ipv4InterfaceContainer
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Create an empty Ipv4InterfaceContainer.
|
||||
*/
|
||||
Ipv4InterfaceContainer ();
|
||||
|
||||
/**
|
||||
* \returns the number of interfaces stored in this Ipv4InterfaceContainer.
|
||||
*/
|
||||
uint32_t GetN (void) const;
|
||||
|
||||
Ipv4Address GetAddress (uint32_t i) const;
|
||||
void SetMetric (uint32_t i, uint16_t metric);
|
||||
|
||||
void Add (Ptr<Ipv4> ipv4, uint32_t interface);
|
||||
|
||||
private:
|
||||
std::vector<std::pair<Ptr<Ipv4>,uint32_t> > m_interfaces;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* IPV4_INTERFACE_CONTAINER_H */
|
||||
@@ -15,6 +15,21 @@ NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b)
|
||||
Add (a);
|
||||
Add (b);
|
||||
}
|
||||
NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b,
|
||||
const NodeContainer &c)
|
||||
{
|
||||
Add (a);
|
||||
Add (b);
|
||||
Add (c);
|
||||
}
|
||||
NodeContainer::NodeContainer (const NodeContainer &a, const NodeContainer &b,
|
||||
const NodeContainer &c, const NodeContainer &d)
|
||||
{
|
||||
Add (a);
|
||||
Add (b);
|
||||
Add (c);
|
||||
Add (d);
|
||||
}
|
||||
|
||||
NodeContainer::Iterator
|
||||
NodeContainer::Begin (void) const
|
||||
|
||||
@@ -35,6 +35,9 @@ public:
|
||||
*/
|
||||
NodeContainer (const NodeContainer &a, const NodeContainer &b);
|
||||
|
||||
NodeContainer (const NodeContainer &a, const NodeContainer &b, const NodeContainer &c);
|
||||
NodeContainer (const NodeContainer &a, const NodeContainer &b, const NodeContainer &c, const NodeContainer &d);
|
||||
|
||||
/**
|
||||
* \returns an iterator to the start of the vector of node pointers.
|
||||
*/
|
||||
|
||||
@@ -17,6 +17,7 @@ def build(bld):
|
||||
'on-off-helper.cc',
|
||||
'packet-sink-helper.cc',
|
||||
'packet-socket-helper.cc',
|
||||
'ipv4-interface-container.cc',
|
||||
]
|
||||
|
||||
headers = bld.create_obj('ns3header')
|
||||
@@ -36,4 +37,5 @@ def build(bld):
|
||||
'on-off-helper.h',
|
||||
'packet-sink-helper.h',
|
||||
'packet-socket-helper.h',
|
||||
'ipv4-interface-container.h',
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user