An update for AnnotatedTopologyReader and examples that use this reader
diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index 1c66523..c92aec0 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -20,6 +20,30 @@
#include "annotated-topology-reader.h"
+#include "ns3/nstime.h"
+#include "ns3/log.h"
+#include "ns3/assert.h"
+#include "ns3/names.h"
+#include "ns3/net-device-container.h"
+#include "ns3/point-to-point-helper.h"
+#include "ns3/point-to-point-net-device.h"
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-global-routing-helper.h"
+#include "ns3/drop-tail-queue.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv4.h"
+#include "ns3/string.h"
+#include "ns3/pointer.h"
+#include "ns3/uinteger.h"
+#include "ns3/ipv4-address.h"
+
+#include "ns3/constant-position-mobility-model.h"
+#include "ns3/random-variable.h"
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
using namespace std;
namespace ns3
@@ -31,502 +55,252 @@
TypeId AnnotatedTopologyReader::GetTypeId (void)
{
- static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
+ static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
.SetParent<Object> ()
;
- return tid;
+ return tid;
}
-AnnotatedTopologyReader::AnnotatedTopologyReader ()
+AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path)
+ : m_path (path)
+ , m_ulx (0)
+ , m_uly (0)
+ , m_lrx (100.0)
+ , m_lry (100.0)
{
- NS_LOG_FUNCTION (this);
+ NS_LOG_FUNCTION (this);
}
-
+
+void
+AnnotatedTopologyReader::SetBoundingBox (double ulx, double uly, double lrx, double lry)
+{
+ NS_LOG_FUNCTION (this << ulx << uly << lrx << lry);
+
+ m_ulx = ulx;
+ m_uly = uly;
+ m_lrx = lrx;
+ m_lry = lry;
+}
+
AnnotatedTopologyReader::~AnnotatedTopologyReader ()
{
- NS_LOG_FUNCTION (this);
+ NS_LOG_FUNCTION (this);
}
NodeContainer
AnnotatedTopologyReader::Read (void)
{
- ifstream topgen;
- topgen.open (GetFileName ().c_str ());
- map<string, Ptr<Node> > nodeMap;
- NodeContainer nodes;
+ ifstream topgen;
+ topgen.open (GetFileName ().c_str ());
+ NodeContainer nodes;
- if ( !topgen.is_open () )
+ if (!topgen.is_open ())
{
- return nodes;
+ NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
+ return nodes;
}
-
- string from;
- string to;
- string linkAttr;
-
- int linksNumber = 0;
- int nodesNumber = 0;
-
- int totnode = 0;
- int totlink = 0;
-
- istringstream lineBuffer;
- string line;
-
- getline (topgen,line);
- lineBuffer.str (line);
-
- lineBuffer >> totnode;
- lineBuffer >> totlink;
- NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
-
- if(!topgen.eof ())
- NS_LOG_INFO("!EOF");
+ int linksNumber = 0;
+ int nodesNumber = 0;
- for (int i = 0; i < totlink && !topgen.eof (); i++)
+ string line;
+ getline (topgen,line);
+ istringstream headerLineBuffer (line);
+
+ int totnode;
+ int totlink;
+ headerLineBuffer >> totnode;
+ headerLineBuffer >> totlink;
+
+ NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
+
+ for (int i = 0; i < totlink && !topgen.eof (); i++)
{
- //NS_LOG_INFO("Line #" <<i);
- getline (topgen,line);
- lineBuffer.clear ();
- lineBuffer.str (line);
+ getline (topgen, line);
+ istringstream lineBuffer (line);
- lineBuffer >> from;
- lineBuffer >> to;
-
-
- if ( (!from.empty ()) && (!to.empty ()) )
+ string from;
+ string to;
+ lineBuffer >> from;
+ lineBuffer >> to;
+
+ if ( (!from.empty ()) && (!to.empty ()) )
{
- NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
-
- if ( nodeMap[from] == 0 )
+ NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
+
+ Ptr<Node> fromNode = Names::Find<Node> (m_path, from);
+ Ptr<Node> toNode = Names::Find<Node> (m_path, to);
+
+ if (fromNode == 0)
{
- Ptr<Node> tmpNode = CreateObject<Node> ();
- nodeMap[from] = tmpNode;
- nodes.Add (tmpNode);
- nodesNumber++;
+ fromNode = CreateObject<Node> ();
+ Names::Add (m_path, from, fromNode);
+ nodes.Add (fromNode);
+ nodesNumber++;
}
- if (nodeMap[to] == 0)
+ if (toNode == 0)
{
- Ptr<Node> tmpNode = CreateObject<Node> ();
- nodeMap[to] = tmpNode;
- nodes.Add (tmpNode);
- nodesNumber++;
+ toNode = CreateObject<Node> ();
+ Names::Add (m_path, to, toNode);
+ nodes.Add (toNode);
+ nodesNumber++;
}
- Link link ( nodeMap[from], from, nodeMap[to], to );
+ Link link (fromNode, from, toNode, to);
- lineBuffer >> linkAttr;
- if ( !linkAttr.empty () )
+ string dataRate;
+ lineBuffer >> dataRate;
+
+ string ospf;
+ lineBuffer >> ospf;
+
+ string delay;
+ lineBuffer >> delay;
+
+ string queueSizeNode1;
+ lineBuffer >> queueSizeNode1;
+
+ string queueSizeNode2;
+ lineBuffer >> queueSizeNode2;
+
+ if (dataRate.empty () ||
+ ospf.empty () ||
+ delay.empty () ||
+ queueSizeNode1.empty () ||
+ queueSizeNode2.empty ())
{
- link.SetAttribute ("DataRate", linkAttr);
+ NS_LOG_ERROR ("File [" << GetFileName () << ":" << i+2 << " wrong format, skipping");
+ continue;
}
-
- lineBuffer >> linkAttr;
- if ( !linkAttr.empty () )
- {
- link.SetAttribute ("OSPF", linkAttr);
- }
+
+ link.SetAttribute ("DataRate", dataRate);
+ link.SetAttribute ("OSPF", ospf);
+ link.SetAttribute ("Delay", delay);
+ link.SetAttribute ("QueueSizeNode1", queueSizeNode1);
+ link.SetAttribute ("QueueSizeNode2", queueSizeNode2);
- lineBuffer >> linkAttr;
- if ( !linkAttr.empty () )
- {
- link.SetAttribute ("Delay", linkAttr);
- }
+ AddLink (link);
- lineBuffer >> linkAttr;
- if ( !linkAttr.empty () )
- {
- link.SetAttribute ("QueueSizeNode1", linkAttr);
- }
-
- lineBuffer >> linkAttr;
- if ( !linkAttr.empty () )
- {
- link.SetAttribute ("QueueSizeNode2", linkAttr);
- }
-
- AddLink (link);
-
- linksNumber++;
+ linksNumber++;
}
}
+
+ NS_ASSERT (nodesNumber == totnode && linksNumber == totlink);
- NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
- topgen.close ();
-
- return nodes;
+ NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
+ topgen.close ();
+
+ ApplySettings ();
+ AssignCoordinates ();
+
+ return nodes;
}
-
-void
-AnnotatedTopologyReader::ApplySettings(NetDeviceContainer* ndc, NodeContainer* nc)
-{
- InternetStackHelper stack;
- Ipv4AddressHelper address;
- address.SetBase ("10.1.0.0", "255.255.255.0");
-
- Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
- stack.SetRoutingHelper (ipv4RoutingHelper);
-
-
-
- //This loop passes all links and checks if ipv4 is installed on the node
- // if not, it installs.
- // We can't use stack.Install(nc) because in nc there are duplicates and assertion fails
- TopologyReader::ConstLinksIterator iter;
- int j = 0;
- for ( iter = this->LinksBegin (); iter != this->LinksEnd (); iter++, j++ )
- {
- NodeContainer twoNodes = nc[j];
-
- Ptr<Node> nd = twoNodes.Get(0);
- if(nd==NULL)
- NS_LOG_INFO("nd = null");
-
- Ptr<Node> nd2 = twoNodes.Get(1);
- if(nd2==NULL)
- NS_LOG_INFO("nd2 = null");
-
- Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
- if(ipv4 == 0)
- {
- NS_LOG_INFO("ipv4 = null");
- stack.Install(nd);
- }
-
- Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
- if(ipv42 == 0)
- {
- NS_LOG_INFO("ipv42 = null");
- stack.Install(nd2);
- }
-
- //NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
- //NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
- }
-
- NS_LOG_INFO("ITER2");
- uint32_t base = 0;
- PointToPointHelper p2p;
- TopologyReader::ConstLinksIterator iter2;
- int i = 0;
- for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
- {
- p2p.SetDeviceAttribute("DataRate", StringValue(iter2->GetAttribute("DataRate")+"Kbps"));
- NS_LOG_INFO("DataRate = " + iter2->GetAttribute("DataRate")+"Kbps");
- p2p.SetChannelAttribute("Delay", StringValue(iter2->GetAttribute("Delay")+"ms"));
- NS_LOG_INFO("Delay = " + iter2->GetAttribute("Delay")+"ms");
- p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
- ndc[i] = p2p.Install(nc[i]);
-
- Ipv4Address address1(base+i*256 + 1);
- Ipv4Address address2(base+i*256 + 2);
-
- NodeContainer twoNodes = nc[i];
-
- Ptr<Node> nd = twoNodes.Get(0);
- if(nd==NULL)
- NS_LOG_INFO("nd = null");
-
-
-
- Ptr<Node> nd2 = twoNodes.Get(1);
- if(nd2==NULL)
- NS_LOG_INFO("nd2 = null");
-
- //NS_LOG_INFO("1");
- NS_LOG_INFO("#netdevices = " << nd->GetNDevices());
- NS_LOG_INFO("#netdevices = " << nd2->GetNDevices());
-
- Ptr<NetDevice> device = nd->GetDevice(nd->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
-
- if(device==NULL)
- NS_LOG_INFO("device = 0");
-
- std::string ospf = iter2->GetAttribute("OSPF");
- uint16_t metric = atoi(ospf.c_str());
- NS_LOG_INFO("OSPF metric = " << metric);
-
- {
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device);
- address.Assign (*temp);
- }
-
- Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
- if(ipv4 == 0)
- {
- NS_LOG_INFO("ipv4 = null");
- //stack.Install(nd);
- /*NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device);
- address.Assign (*temp);
- ipv4 = nd->GetObject<Ipv4>();*/
- }
-
- NS_LOG_INFO("Before GetID");
- int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
- NS_LOG_INFO("InterfaceID = " << interfaceId);
- ipv4->SetMetric(interfaceId,metric);
-
-
-
-
-
- /*Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
-
- if(ipv4 == 0)
- NS_LOG_INFO("ipv4 = null");
- int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
- ipv4->SetMetric(interfaceId,metric);*/
-
- //Ptr<Ipv4Interface> interface = nd->GetDevice(nd->GetNDevices()-1)->GetObject<Ipv4Interface> ();
- //ipv4->SetMetric(metric);
-
- //NS_LOG_INFO("2");
-
- Ptr<NetDevice> device2 = nd2->GetDevice(nd2->GetNDevices()-1)->GetObject<PointToPointNetDevice> ();
-
- if(device2==NULL)
- NS_LOG_INFO("device2 = 0");
-
- {
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device2);
- address.Assign (*temp);
- }
-
- Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
- if(ipv42 == 0)
- {
- NS_LOG_INFO("ipv42 = null");
- /*stack.Install(nd2);
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device2);
- address.Assign (*temp);
- ipv42 = nd2->GetObject<Ipv4>();*/
- }
-
- NS_LOG_INFO("Before GetID");
- interfaceId = ipv42->GetInterfaceForDevice(device2);
- NS_LOG_INFO("InterfaceID = " << interfaceId);
- ipv42->SetMetric(interfaceId,metric);
-
-
-
- PointerValue tmp1;
- device->GetAttribute ("TxQueue", tmp1);
- //NS_LOG_INFO("2.5");
- Ptr<Object> txQueue1 = tmp1.GetObject ();
-
- PointerValue tmp2;
- device2->GetAttribute ("TxQueue", tmp2);
- Ptr<Object> txQueue2 = tmp2.GetObject ();
- //NS_LOG_INFO("3");
- Ptr<DropTailQueue> dtq1 = txQueue1->GetObject <DropTailQueue> ();
- NS_ASSERT (dtq1 != 0);
-
- Ptr<DropTailQueue> dtq2 = txQueue2->GetObject <DropTailQueue> ();
- NS_ASSERT (dtq2 != 0);
-
- std::string queuesize1 = iter2->GetAttribute("QueueSizeNode1");
- std::string queuesize2 = iter2->GetAttribute("QueueSizeNode2");
- //NS_LOG_INFO("4");
- txQueue1->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize1.c_str())));
- txQueue2->SetAttribute("MaxPackets", UintegerValue (atoi(queuesize2.c_str())));
-
- UintegerValue limit;
- txQueue1->GetAttribute ("MaxPackets", limit);
- NS_LOG_INFO ("NetDevice #"<< device->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
-
- txQueue2->GetAttribute ("MaxPackets", limit);
- NS_LOG_INFO ("NetDevice #"<< device2->GetIfIndex() << "has queue limit " << limit.Get () << " packets");
- }
-}
-
- /*
-void
-AnnotatedTopologyReader::ApplyOspfMetric(NetDeviceContainer* ndc, NodeContainer* nc)
-{
- InternetStackHelper stack;
- Ipv4AddressHelper address;
- address.SetBase ("10.0.0.0", "255.255.255.252");
-
- Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingOrderedNexthops");
- stack.SetRoutingHelper (ipv4RoutingHelper);
-
-
- TopologyReader::ConstLinksIterator iter2;
- int i = 0;
- for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
- {
- NodeContainer twoNodes = nc[i];
- Ptr<NetDevice> device = ndc[i].Get(0);
- Ptr<NetDevice> device2 = ndc[i].Get(1);
-
- //Ptr<Node> nd = twoNodes.Get(0);
- Ptr<Node> nd = device->GetNode();
- if(nd==NULL)
- NS_LOG_INFO("nd = null");
-
- //Ptr<Node> nd2 = twoNodes.Get(1);
- Ptr<Node> nd2 = device->GetNode();
- if(nd2==NULL)
- NS_LOG_INFO("nd2 = null");
-
-
-
- std::string ospf = iter2->GetAttribute("OSPF");
- uint16_t metric = atoi(ospf.c_str());
- NS_LOG_INFO("OSPF metric = " << metric);
-
- Ptr<Ipv4> ipv4 = nd->GetObject<Ipv4>();
-
- if(ipv4 == 0)
- {
- NS_LOG_INFO("ipv4 = null");
- stack.Install(nd);
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device);
- address.Assign (*temp);
- ipv4 = nd->GetObject<Ipv4>();
- }
-
- NS_LOG_INFO("Before GetID");
- int32_t interfaceId = ipv4->GetInterfaceForDevice(device);
- NS_LOG_INFO("InterfaceID = " << interfaceId);
- ipv4->SetMetric(interfaceId,metric);
-
-
-
- Ptr<Ipv4> ipv42 = nd2->GetObject<Ipv4>();
- if(ipv42 == 0)
- {
- NS_LOG_INFO("ipv42 = null");
- stack.Install(nd2);
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device2);
- address.Assign (*temp);
- ipv42 = nd2->GetObject<Ipv4>();
- }
-
- //if(ipv4 == 0)
- // NS_LOG_INFO("ipv4 = null");
-
- NS_LOG_INFO("Before GetID");
- interfaceId = ipv42->GetInterfaceForDevice(device2);
- if(interfaceId == -1)
- {
- NS_LOG_INFO("interfaceID = -1");
- stack.Install(nd2);
- NetDeviceContainer* temp = new NetDeviceContainer[1];
- temp->Add(device2);
- address.Assign (*temp);
- ipv42 = nd2->GetObject<Ipv4>();
- interfaceId = ipv42->GetInterfaceForDevice(device2);
- }
- NS_LOG_INFO("InterfaceID = " << interfaceId);
- ipv42->SetMetric(interfaceId,metric);
-
- }
-}*/
void
-AnnotatedTopologyReader::BoundingBox (NodeContainer* nc, double ulx, double uly, double lrx, double lry)
+AnnotatedTopologyReader::AssignIpv4Addresses (Ipv4Address base)
{
-
- UniformVariable randX(ulx, lrx);
- double x = 0.0;
- UniformVariable randY(uly, lry);
- double y = 0.0;
+ Ipv4AddressHelper address (base, Ipv4Mask ("/24"));
-
- PointToPointHelper p2p;
- TopologyReader::ConstLinksIterator iter2;
- int i = 0;
- for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
+ BOOST_FOREACH (const Link &link, m_linksList)
{
- NodeContainer twoNodes = nc[i];
-
- Ptr<Node> nd = twoNodes.Get(0);
- if(nd==NULL)
- NS_LOG_INFO("nd = null");
-
- Ptr<Node> nd2 = twoNodes.Get(1);
- if(nd2==NULL)
- NS_LOG_INFO("nd2 = null");
-
- Ptr<ConstantPositionMobilityModel> loc = nd->GetObject<ConstantPositionMobilityModel> ();
- if (loc ==0)
- {
- loc = CreateObject<ConstantPositionMobilityModel> ();
- nd->AggregateObject (loc);
- }
-
- x = randX.GetValue();
- y = randY.GetValue();
- NS_LOG_INFO("X = "<<x <<"Y = "<<y);
- Vector locVec (x, y, 0);
- loc->SetPosition (locVec);
-
-
- Ptr<ConstantPositionMobilityModel> loc2 = nd2->GetObject<ConstantPositionMobilityModel> ();
- if (loc2 ==0)
- {
- loc2 = CreateObject<ConstantPositionMobilityModel> ();
- nd2->AggregateObject (loc2);
- }
-
- x = randX.GetValue();
- y = randY.GetValue();
- NS_LOG_INFO("X = "<<x <<"Y = "<<y);
- Vector locVec2 (x, y, 0);
- loc2->SetPosition (locVec2);
+ address.Assign (NetDeviceContainer (link.GetFromNetDevice (),
+ link.GetToNetDevice ()));
+
+ base = Ipv4Address (base.Get () + 256);
+ address.SetBase (base, Ipv4Mask ("/24"));
}
- /*
- double xDist;
- double yDist;
- if (lrx > ulx)
- {
- xDist = lrx - ulx;
- }
- else
- {
- xDist = ulx - lrx;
- }
- if (lry > uly)
- {
- yDist = lry - uly;
- }
- else
- {
- yDist = uly - lry;
- }
- double xAdder = xDist / m_xSize;
- double yAdder = yDist / m_ySize;
- double yLoc = yDist / 2;
- for (uint32_t i = 0; i < m_ySize; ++i)
- {
- double xLoc = xDist / 2;
- for (uint32_t j = 0; j < m_xSize; ++j)
- {
- Ptr<Node> node = GetNode (i, j);
- Ptr<ConstantPositionMobilityModel> loc = node->GetObject<ConstantPositionMobilityModel> ();
- if (loc ==0)
- {
- loc = CreateObject<ConstantPositionMobilityModel> ();
- node->AggregateObject (loc);
- }
- Vector locVec (xLoc, yLoc, 0);
- loc->SetPosition (locVec);
-
- xLoc += xAdder;
- }
- yLoc += yAdder;
- }
- }
-*/
-}
+
+ ApplyOspfMetric ();
}
+void
+AnnotatedTopologyReader::ApplyOspfMetric ()
+{
+ BOOST_FOREACH (const Link &link, m_linksList)
+ {
+ uint16_t metric = boost::lexical_cast<uint16_t> (link.GetAttribute ("OSPF"));
+
+ {
+ Ptr<Ipv4> ipv4 = link.GetFromNode ()->GetObject<Ipv4> ();
+ NS_ASSERT (ipv4 != 0);
+
+ int32_t interfaceId = ipv4->GetInterfaceForDevice (link.GetFromNetDevice ());
+ NS_ASSERT (interfaceId >= 0);
+
+ ipv4->SetMetric (interfaceId,metric);
+ }
+
+ {
+ Ptr<Ipv4> ipv4 = link.GetToNode ()->GetObject<Ipv4> ();
+ NS_ASSERT (ipv4 != 0);
+
+ int32_t interfaceId = ipv4->GetInterfaceForDevice (link.GetToNetDevice ());
+ NS_ASSERT (interfaceId >= 0);
+
+ ipv4->SetMetric (interfaceId,metric);
+ }
+ }
+}
+
+void
+AnnotatedTopologyReader::ApplySettings ()
+{
+ PointToPointHelper p2p;
+
+ // temporary queue, will be changed later
+ p2p.SetQueue ("ns3::DropTailQueue",
+ "MaxPackets", StringValue("100"));
+
+ BOOST_FOREACH (Link &link, m_linksList)
+ {
+ NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate")+"Kbps");
+ p2p.SetDeviceAttribute ("DataRate", StringValue(link.GetAttribute("DataRate")+"Kbps"));
+
+ NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay")+"ms");
+ p2p.SetChannelAttribute ("Delay", StringValue(link.GetAttribute("Delay")+"ms"));
+
+ NetDeviceContainer nd = p2p.Install(link.GetFromNode (), link.GetToNode ());
+ link.SetNetDevices (nd.Get (0), nd.Get (1));
+
+ NS_LOG_INFO ("Queue: " << link.GetAttribute("QueueSizeNode1") << " <==> " << link.GetAttribute("QueueSizeNode2"));
+
+ PointerValue txQueueFrom;
+ link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueueFrom);
+ NS_ASSERT (txQueueFrom.Get<DropTailQueue> () != 0);
+
+ PointerValue txQueueTo;
+ link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueueTo);
+ NS_ASSERT (txQueueTo.Get<DropTailQueue> () != 0);
+
+ txQueueFrom.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode1")));
+ txQueueTo. Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode2")));
+ }
+}
+
+void
+AnnotatedTopologyReader::AssignCoordinates ()
+{
+ UniformVariable randX (m_ulx, m_lrx);
+ double x = 0.0;
+ UniformVariable randY (m_uly, m_lry);
+ double y = 0.0;
+
+ BOOST_FOREACH (Link &link, m_linksList)
+ {
+ Ptr<ConstantPositionMobilityModel> loc = link.GetFromNode ()->GetObject<ConstantPositionMobilityModel> ();
+ if (loc != 0)
+ continue; // no need to assign twice
+
+ loc = CreateObject<ConstantPositionMobilityModel> ();
+ link.GetFromNode ()->AggregateObject (loc);
+
+ x = randX.GetValue();
+ y = randY.GetValue();
+ NS_LOG_INFO("X = "<<x <<"Y = "<<y);
+
+ loc->SetPosition (Vector (x, y, 0));
+ }
+}
+
+}
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index ca0bc48..6eec5ad 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -22,73 +22,80 @@
#define __ANNOTATED_TOPOLOGY_READER_H__
#include "ns3/topology-reader.h"
-#include "ns3/nstime.h"
-#include "ns3/log.h"
-#include "ns3/net-device-container.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-address-helper.h"
-#include "ns3/ipv4-global-routing-helper.h"
-#include "ns3/drop-tail-queue.h"
-#include "ns3/ipv4-interface.h"
-#include "ns3/ipv4.h"
-#include "ns3/string.h"
-#include "ns3/pointer.h"
-#include "ns3/uinteger.h"
-#include "ns3/ipv4-address.h"
-#include <string>
-#include <fstream>
-#include <cstdlib>
-#include <iostream>
-#include <sstream>
-
-#include "ns3/animation-interface.h"
-#include "ns3/constant-position-mobility-model.h"
-#include "ns3/random-variable.h"
namespace ns3
{
/**
-* \brief This class reads annotated topology and apply settings to the corresponding nodes and links
-* Input File Format
-* 1st line is NumberOfNodes TAB NumberofLinks
-* Nth line is NodeID1 TAB NodeID2 TAB DataRateKBPS TAB OSPF TAB DelayMiliseconds TAB QueueSizeInPacketsNode1 TAB QueueSizeInPacketsNode2
-*
-*/
+ * \brief This class reads annotated topology and apply settings to the corresponding nodes and links
+ * Input File Format
+ * 1st line is NumberOfNodes TAB NumberofLinks
+ * Nth line is NodeID1 TAB NodeID2 TAB DataRateKBPS TAB OSPF TAB DelayMiliseconds TAB QueueSizeInPacketsNode1 TAB QueueSizeInPacketsNode2
+ *
+ */
class AnnotatedTopologyReader : public TopologyReader
{
public:
- typedef std::list< Link >::iterator LinksIterator;
- static TypeId GetTypeId (void);
-
- AnnotatedTopologyReader ();
- virtual ~AnnotatedTopologyReader ();
-
-
- /**
- * \brief Main annotated topology reading function.
- *
- * This method opens an input stream and reads topology file with annotations.
- *
- * \return the container of the nodes created (or empty container if there was an error)
- */
- virtual NodeContainer Read (void);
-
- /**
- * \brief This method applies setting to corresponding nodes and links
- * NetDeviceContainer must be allocated
- * NodeContainer from Read method
- */
- void ApplySettings(NetDeviceContainer *ndc, NodeContainer* nc);
-
- //void ApplyOspfMetric(NetDeviceContainer* ndc, NodeContainer* nc);
- void BoundingBox (NodeContainer* nc, double ulx, double uly, double lrx, double lry);
-
+ typedef std::list< Link >::iterator LinksIterator;
+ static TypeId GetTypeId (void);
+
+ /**
+ * \brief Constructor
+ *
+ * \param path ns3::Names path
+ *
+ * \see ns3::Names class
+ */
+ AnnotatedTopologyReader (const std::string &path="");
+ virtual ~AnnotatedTopologyReader ();
+
+ /**
+ * \brief Main annotated topology reading function.
+ *
+ * This method opens an input stream and reads topology file with annotations.
+ *
+ * \return the container of the nodes created (or empty container if there was an error)
+ */
+ virtual
+ NodeContainer Read (void);
+
+ /**
+ * \brief Set bounding box for the nodes
+ */
+ void
+ SetBoundingBox (double ulx, double uly, double lrx, double lry);
+
+ /**
+ * \brief Assign IPv4 addresses to all links
+ *
+ * Note, IPv4 stack should be installed on all nodes prior this call
+ *
+ * Every link will receive /24 netmask
+ *
+ * \param base Starting IPv4 address (second link will have base+256)
+ */
+ void
+ AssignIpv4Addresses (Ipv4Address base);
+
private:
- AnnotatedTopologyReader (const AnnotatedTopologyReader&);
- AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
+ /**
+ * \brief This method applies setting to corresponding nodes and links
+ * NetDeviceContainer must be allocated
+ * NodeContainer from Read method
+ */
+ void ApplySettings ();
+ void AssignCoordinates ();
+ void ApplyOspfMetric ();
+
+private:
+ AnnotatedTopologyReader (const AnnotatedTopologyReader&);
+ AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
+
+ std::string m_path;
+ double m_ulx;
+ double m_uly;
+ double m_lrx;
+ double m_lry;
};
}