I'm trying to set up multicast on a point-to-point network. I'm
starting with the code in csma-multicast.cc and I'm adapting it to
meet my needs. I'm using NetAnim to visualize packet traffic, and I'm
not seeing any. So I'm wondering if I've got my network configured
correctly. I'm guessing that I don't, so if any if you have a spare
moment, I'd appreciate it if you could take a look at my code and let
me know what I'm doing wrong.
#include "ns3/core-module.h"
#include "ns3/simulator-module.h"
#include "ns3/node-module.h"
#include "ns3/helper-module.h"
#include <iostream>
using namespace ns3;
void setNodeLocation(Ptr<Node> node, double x, double y)
{
Ptr<CanvasLocation> loc = node->GetObject<CanvasLocation>();
if (0 == loc)
{
loc = CreateObject<CanvasLocation>();
node->AggregateObject(loc);
}
Vector locVec(x, y, 0);
loc->SetLocation(locVec);
}
void boundingBox(NodeContainer nodes)
{
setNodeLocation(nodes.Get(0), 3.5, 2.5);
setNodeLocation(nodes.Get(1), 7, 2.5);
setNodeLocation(nodes.Get(2), 2.5, 1);
setNodeLocation(nodes.Get(3), 8, 1);
setNodeLocation(nodes.Get(4), 2.5, 4);
setNodeLocation(nodes.Get(5), 8, 4);
setNodeLocation(nodes.Get(6), 1, 1);
setNodeLocation(nodes.Get(7), 9.5, 1);
setNodeLocation(nodes.Get(8), 1, 4);
setNodeLocation(nodes.Get(9), 9.5, 4);
setNodeLocation(nodes.Get(10), 8, 2.5);
setNodeLocation(nodes.Get(11), 9.5, 2.5);
}
void buildNetwork(NodeContainer nodes)
{
PointToPointHelper p2p;
p2p.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
p2p.SetChannelAttribute("Delay", StringValue("2ms"));
NodeContainer n0n1 = NodeContainer(nodes.Get(0), nodes.Get(1));
NodeContainer n0n2 = NodeContainer(nodes.Get(0), nodes.Get(2));
NodeContainer n1n3 = NodeContainer(nodes.Get(1), nodes.Get(3));
NodeContainer n0n4 = NodeContainer(nodes.Get(0), nodes.Get(4));
NodeContainer n1n5 = NodeContainer(nodes.Get(1), nodes.Get(5));
NodeContainer n2n6 = NodeContainer(nodes.Get(2), nodes.Get(6));
NodeContainer n3n7 = NodeContainer(nodes.Get(3), nodes.Get(7));
NodeContainer n4n8 = NodeContainer(nodes.Get(4), nodes.Get(8));
NodeContainer n5n9 = NodeContainer(nodes.Get(5), nodes.Get(9));
NodeContainer n1n10 = NodeContainer(nodes.Get(1), nodes.Get(10));
NodeContainer n10n11 = NodeContainer(nodes.Get(10), nodes.Get(11));
NetDeviceContainer d0d1 = p2p.Install(n0n1);
NetDeviceContainer d0d2 = p2p.Install(n0n2);
NetDeviceContainer d1d3 = p2p.Install(n1n3);
NetDeviceContainer d0d4 = p2p.Install(n0n4);
NetDeviceContainer d1d5 = p2p.Install(n1n5);
NetDeviceContainer d2d6 = p2p.Install(n2n6);
NetDeviceContainer d3d7 = p2p.Install(n3n7);
NetDeviceContainer d4d8 = p2p.Install(n4n8);
NetDeviceContainer d5d9 = p2p.Install(n5n9);
NetDeviceContainer d1d10 = p2p.Install(n1n10);
NetDeviceContainer d10d11 = p2p.Install(n10n11);
Ipv4AddressHelper address;
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer i0i1 = address.Assign(d0d1);
address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer i0i2 = address.Assign(d0d2);
address.SetBase("10.1.3.0", "255.255.255.0");
Ipv4InterfaceContainer i1i3 = address.Assign(d1d3);
address.SetBase("10.1.4.0", "255.255.255.0");
Ipv4InterfaceContainer i0i4 = address.Assign(d0d4);
address.SetBase("10.1.5.0", "255.255.255.0");
Ipv4InterfaceContainer i1i5 = address.Assign(d1d5);
address.SetBase("10.1.6.0", "255.255.255.0");
Ipv4InterfaceContainer i2i6 = address.Assign(d2d6);
address.SetBase("10.1.7.0", "255.255.255.0");
Ipv4InterfaceContainer i3i7 = address.Assign(d3d7);
address.SetBase("10.1.8.0", "255.255.255.0");
Ipv4InterfaceContainer i4i8 = address.Assign(d4d8);
address.SetBase("10.1.9.0", "255.255.255.0");
Ipv4InterfaceContainer i5i9 = address.Assign(d5d9);
address.SetBase("10.1.10.0", "255.255.255.0");
Ipv4InterfaceContainer i1i10 = address.Assign(d1d10);
address.SetBase("10.1.11.0", "255.255.255.0");
Ipv4InterfaceContainer i10i11 = address.Assign(d10d11);
// Configure multicasting
Ipv4Address multicastSource("10.1.6.2");
Ipv4Address multicastGroup("226.10.28.80");
Ipv4StaticRoutingHelper multicast;
// Configure sender node for multicast
Ptr<Node> sender = nodes.Get(6);
Ptr<NetDevice> senderIf = d2d6.Get(1);
multicast.SetDefaultMulticastRoute(sender, senderIf);
// Configure intermediate nodes for multicast
NetDeviceContainer out0;
out0.Add(d0d1.Get(0));
multicast.AddMulticastRoute(nodes.Get(0), multicastSource,
multicastGroup, d0d2.Get(0), out0);
NetDeviceContainer out1;
out1.Add(d1d3.Get(0));
out1.Add(d1d10.Get(0));
out1.Add(d1d5.Get(0));
multicast.AddMulticastRoute(nodes.Get(1), multicastSource,
multicastGroup, d0d1.Get(1), out1);
NetDeviceContainer out2;
out2.Add(d0d2.Get(1));
multicast.AddMulticastRoute(nodes.Get(2), multicastSource,
multicastGroup, d2d6.Get(0), out2);
NetDeviceContainer out3;
out3.Add(d3d7.Get(0));
multicast.AddMulticastRoute(nodes.Get(3), multicastSource,
multicastGroup, d1d3.Get(1), out3);
NetDeviceContainer out4;
out4.Add(d4d8.Get(0));
multicast.AddMulticastRoute(nodes.Get(4), multicastSource,
multicastGroup, d0d4.Get(1), out4);
NetDeviceContainer out5;
out5.Add(d5d9.Get(0));
multicast.AddMulticastRoute(nodes.Get(5), multicastSource,
multicastGroup, d1d5.Get(1), out5);
NetDeviceContainer out10;
out10.Add(d10d11.Get(0));
multicast.AddMulticastRoute(nodes.Get(10), multicastSource,
multicastGroup, d1d10.Get(1), out10);
}
int main(int argc, char *argv[])
{
int NUM_NODES = 12;
NodeContainer nodes;
nodes.Create(NUM_NODES);
InternetStackHelper stack;
stack.Install(nodes);
buildNetwork(nodes);
ApplicationContainer clientApps;
ApplicationContainer replicaApps;
PacketSinkHelper sink ("ns3::UdpSocketFactory",
InetSocketAddress(Ipv4Address::GetAny(), 9));
replicaApps.Add(sink.Install(nodes.Get(9)));
replicaApps.Add(sink.Install(nodes.Get(8)));
replicaApps.Add(sink.Install(nodes.Get(7)));
replicaApps.Add(sink.Install(nodes.Get(11)));
replicaApps.Start(Seconds(0.0));
replicaApps.Stop(Seconds(10.0));
OnOffHelper onoff ("ns3::UdpSocketFactory",
Address (InetSocketAddress ("226.10.28.80", 9)));
onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable
(1)));
onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable
(0)));
onoff.SetAttribute ("DataRate", DataRateValue (DataRate ("255b/
s")));
onoff.SetAttribute ("PacketSize", UintegerValue (128));
clientApps.Add(onoff.Install(nodes.Get(6)));
clientApps.Start(Seconds(0.0));
clientApps.Stop(Seconds(9.5));
AnimationInterface anim;
anim.SetOutputFile("
p2p-multicast.tr");
boundingBox(nodes);
anim.StartAnimation();
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
Simulator::Run();
Simulator::Destroy();
anim.StopAnimation();
return 0;
}