19 #include "ns3/abort.h"
20 #include "ns3/net-device.h"
21 #include "ns3/net-device-container.h"
22 #include "ns3/point-to-point-helper.h"
23 #include "ns3/ipv4-address-helper.h"
24 #include "ns3/random-variable-stream.h"
25 #include "ns3/data-rate.h"
26 #include "ns3/rng-seed-manager.h"
28 #include "brite-topology-helper.h"
37 BriteTopologyHelper::BriteTopologyHelper (std::string confFile,
39 std::string newseedFile) : m_confFile (confFile),
40 m_seedFile (seedFile),
41 m_newSeedFile (newseedFile),
49 m_uv = CreateObject<UniformRandomVariable> ();
53 BriteTopologyHelper::BriteTopologyHelper (std::string confFile) : m_confFile (confFile),
61 m_uv = CreateObject<UniformRandomVariable> ();
65 BriteTopologyHelper::~BriteTopologyHelper ()
70 while (!m_netDevices.empty ())
72 delete m_netDevices.back ();
73 m_netDevices.pop_back ();
76 while (!m_asLeafNodes.empty ())
78 delete m_asLeafNodes.back ();
79 m_asLeafNodes.pop_back ();
82 while (!m_nodesByAs.empty ())
84 delete m_nodesByAs.back ();
85 m_nodesByAs.pop_back ();
90 BriteTopologyHelper::AssignStreams (int64_t streamNumber)
92 m_uv->SetStream (streamNumber);
99 brite::Graph *g = m_topology->GetGraph ();
100 for (
int i = 0; i < g->GetNumNodes (); ++i)
103 nodeInfo.nodeId = g->GetNodePtr (i)->GetId ();
104 nodeInfo.xCoordinate = g->GetNodePtr (i)->GetNodeInfo ()->GetCoordX ();
105 nodeInfo.yCoordinate = g->GetNodePtr (i)->GetNodeInfo ()->GetCoordY ();
106 nodeInfo.inDegree = g->GetNodePtr (i)->GetInDegree ();
107 nodeInfo.outDegree = g->GetNodePtr (i)->GetOutDegree ();
109 switch (g->GetNodePtr (i)->GetNodeInfo ()->GetNodeType ())
111 case brite::NodeConf::RT_NODE:
113 if (((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId () == -1)
115 m_numAs = nodeInfo.asId = 0;
119 m_numAs = nodeInfo.asId = ((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId ();
122 switch (((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetRouterType ())
124 case brite::RouterNodeConf::RT_NONE:
125 nodeInfo.type =
"RT_NONE ";
127 case brite::RouterNodeConf::RT_LEAF:
128 nodeInfo.type =
"RT_LEAF ";
130 case brite::RouterNodeConf::RT_BORDER:
131 nodeInfo.type =
"RT_BORDER";
133 case brite::RouterNodeConf::RT_STUB:
134 nodeInfo.type =
"RT_STUB ";
136 case brite::RouterNodeConf::RT_BACKBONE:
137 nodeInfo.type =
"RT_BACKBONE ";
140 NS_FATAL_ERROR (
"Topology::Output(): Improperly classfied Router node encountered...");
144 case brite::NodeConf::AS_NODE:
145 m_numAs = nodeInfo.asId =
146 ((brite::ASNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId ();
148 switch (((brite::ASNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASType ())
150 case brite::ASNodeConf::AS_NONE:
151 nodeInfo.type =
"AS_NONE ";
153 case brite::ASNodeConf::AS_LEAF:
154 nodeInfo.type =
"AS_LEAF ";
156 case brite::ASNodeConf::AS_STUB:
157 nodeInfo.type =
"AS_STUB ";
159 case brite::ASNodeConf::AS_BORDER:
160 nodeInfo.type =
"AS_BORDER ";
162 case brite::ASNodeConf::AS_BACKBONE:
163 nodeInfo.type =
"AS_BACKBONE ";
166 NS_FATAL_ERROR (
"Topology::Output(): Improperly classfied AS node encountered...");
171 m_briteNodeInfoList.push_back (nodeInfo);
184 brite::Graph *g = m_topology->GetGraph ();
185 std::list<brite::Edge*>::iterator el;
186 std::list<brite::Edge*> edgeList = g->GetEdges ();
188 for (el = edgeList.begin (); el != edgeList.end (); el++)
191 edgeInfo.edgeId = (*el)->GetId ();
192 edgeInfo.srcId = (*el)->GetSrc ()->GetId ();
193 edgeInfo.destId = (*el)->GetDst ()->GetId ();
194 edgeInfo.length = (*el)->Length ();
196 switch ((*el)->GetConf ()->GetEdgeType ())
198 case brite::EdgeConf::RT_EDGE:
199 edgeInfo.delay = ((brite::RouterEdgeConf*)((*el)->GetConf ()))->GetDelay ();
200 edgeInfo.bandwidth = (*el)->GetConf ()->GetBW ();
202 edgeInfo.asFrom = (((brite::RouterNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId () == -1) ? 0 : ((brite::RouterNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId ();
203 edgeInfo.asTo = (((brite::RouterNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId () == -1) ? 0 : ((brite::RouterNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId ();
206 case brite::EdgeConf::AS_EDGE:
208 edgeInfo.bandwidth = (*el)->GetConf ()->GetBW ();
209 edgeInfo.asFrom = ((brite::ASNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId ();
210 edgeInfo.asTo = ((brite::ASNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId ();
214 NS_FATAL_ERROR (
"Topology::Output(): Invalid Edge type encountered...");
217 switch ((*el)->GetConf ()->GetEdgeType ())
219 case brite::EdgeConf::RT_EDGE:
220 switch (((brite::RouterEdgeConf*)(*el)->GetConf ())->GetRouterEdgeType ())
222 case brite::RouterEdgeConf::RT_NONE:
223 edgeInfo.type =
"E_RT_NONE ";
225 case brite::RouterEdgeConf::RT_STUB:
226 edgeInfo.type =
"E_RT_STUB ";
228 case brite::RouterEdgeConf::RT_BORDER:
229 edgeInfo.type =
"E_RT_BORDER ";
231 case brite::RouterEdgeConf::RT_BACKBONE:
232 edgeInfo.type =
"E_RT_BACKBONE ";
239 case brite::EdgeConf::AS_EDGE:
240 switch (((brite::ASEdgeConf*)((*el)->GetConf ()))->GetASEdgeType ())
242 case brite::ASEdgeConf::AS_NONE:
243 edgeInfo.type =
"E_AS_NONE ";
245 case brite::ASEdgeConf::AS_STUB:
246 edgeInfo.type =
"E_AS_STUB ";
248 case brite::ASEdgeConf::AS_BORDER:
249 edgeInfo.type =
"E_AS_BORDER ";
251 case brite::ASEdgeConf::AS_BACKBONE:
252 edgeInfo.type =
"E_AS_BACKBONE ";
264 m_briteEdgeInfoList.push_back (edgeInfo);
269 BriteTopologyHelper::GetLeafNodeForAs (uint32_t asNum, uint32_t leafNum)
271 return m_asLeafNodes[asNum]->Get (leafNum);
275 BriteTopologyHelper::GetNodeForAs (uint32_t asNum, uint32_t nodeNum)
277 return m_nodesByAs[asNum]->Get (nodeNum);
281 BriteTopologyHelper::GetNNodesForAs (uint32_t asNum)
283 return m_nodesByAs[asNum]->GetN ();
287 BriteTopologyHelper::GetNLeafNodesForAs (uint32_t asNum)
289 return m_asLeafNodes[asNum]->GetN ();
313 return m_systemForAs[asNum];
318 NS_ASSERT_MSG (m_topology == NULL,
"Brite Topology Already Created");
321 bool generateSeedFile = m_seedFile.empty ();
323 if (generateSeedFile)
327 std::ofstream seedFile;
330 seedFile.open (
"briteSeedFile.txt", std::ios_base::out | std::ios_base::trunc);
337 seedFile <<
"PLACES " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
338 seedFile <<
"CONNECT " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
339 seedFile <<
"EDGE_CONN " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
340 seedFile <<
"GROUPING " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
341 seedFile <<
"ASSIGNMENT " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
342 seedFile <<
"BANDWIDTH " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) <<
" " << m_uv->GetInteger (0, 65535) << std::endl;
346 m_seedFile = m_newSeedFile =
"briteSeedFile.txt";
349 brite::Brite br (m_confFile, m_seedFile, m_newSeedFile);
350 m_topology = br.GetTopology ();
351 BuildBriteNodeInfoList ();
352 BuildBriteEdgeInfoList ();
355 if (generateSeedFile)
357 remove (
"briteSeedFile.txt");
367 GenerateBriteTopology ();
370 for (uint32_t i = 0; i < m_numAs; ++i)
372 m_systemForAs.push_back (0);
376 m_nodes.Create (m_briteNodeInfoList.size ());
378 m_numNodes = m_briteNodeInfoList.size ();
380 NS_LOG_DEBUG (m_numNodes <<
" nodes created in BRITE topology");
384 ConstructTopology ();
388 BriteTopologyHelper::BuildBriteTopology (InternetStackHelper& stack,
const uint32_t systemCount)
392 GenerateBriteTopology ();
395 NS_LOG_LOGIC (
"Assigning << " << m_numAs <<
" AS to " << systemCount <<
" MPI instances");
396 for (uint32_t i = 0; i < m_numAs; ++i)
398 int val = i % systemCount;
399 m_systemForAs.push_back (val);
404 for (BriteTopologyHelper::BriteNodeInfoList::iterator it = m_briteNodeInfoList.begin (); it != m_briteNodeInfoList.end (); ++it)
406 m_nodes.Add (CreateObject<Node> (GetSystemNumberForAs ((*it).asId)));
410 NS_LOG_INFO (m_numNodes <<
" nodes created in BRITE topology");
412 stack.Install (m_nodes);
414 ConstructTopology ();
422 for (
unsigned int i = 0; i < m_netDevices.size (); ++i)
424 address.
Assign (*m_netDevices[i]);
434 for (
unsigned int i = 0; i < m_netDevices.size (); ++i)
436 address.
Assign (*m_netDevices[i]);
446 for (uint32_t i = 0; i < m_numAs; ++i)
452 for (BriteTopologyHelper::BriteEdgeInfoList::iterator it = m_briteEdgeInfoList.begin (); it != m_briteEdgeInfoList.end (); ++it)
456 m_britePointToPointHelper.SetChannelAttribute (
"Delay",
460 m_britePointToPointHelper.SetDeviceAttribute (
"DataRate",
463 m_netDevices.push_back (
new NetDeviceContainer ( m_britePointToPointHelper.Install (m_nodes.Get ((*it).srcId), m_nodes.Get ((*it).destId))));
469 NS_LOG_INFO (
"Created " << m_numEdges <<
" edges in BRITE topology");
472 for (BriteTopologyHelper::BriteNodeInfoList::iterator it = m_briteNodeInfoList.begin (); it != m_briteNodeInfoList.end (); ++it)
474 m_nodesByAs[(*it).asId]->Add (m_nodes.Get ((*it).nodeId));
476 if ((*it).type ==
"RT_LEAF ")
478 m_asLeafNodes[(*it).asId]->Add (m_nodes.Get ((*it).nodeId));
Node information from BRITE.
#define NS_LOG_FUNCTION(parameters)
Edge information from BRITE.
#define NS_ASSERT(condition)
#define NS_LOG_COMPONENT_DEFINE(name)
uint32_t GetNAs(void) const
aggregate IP/TCP/UDP functionality to existing Nodes.
void AssignIpv6Addresses(Ipv6AddressHelper &address)
void ConstructTopology(void)
#define NS_FATAL_ERROR(msg)
fatal error handling
Ipv6InterfaceContainer Assign(const NetDeviceContainer &c)
Allocate an Ipv6InterfaceContainer with auto-assigned addresses.
Class for representing data rates.
hold objects of type ns3::Time
uint32_t GetNEdgesTopology() const
void BuildBriteNodeInfoList(void)
void AssignIpv4Addresses(Ipv4AddressHelper &address)
uint32_t GetNNodesTopology() const
void BuildBriteEdgeInfoList(void)
holds a vector of ns3::NetDevice pointers
#define NS_LOG_LOGIC(msg)
keep track of a set of node pointers.
void GenerateBriteTopology(void)
void Install(std::string nodeName) const
Helper class to auto-assign global IPv6 unicast addresses.
#define NS_ASSERT_MSG(condition, message)
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
uint32_t GetSystemNumberForAs(uint32_t asNum) const
hold objects of type ns3::DataRate
#define NS_LOG_DEBUG(msg)
Ipv4Address NewNetwork(void)
Increment the network number and reset the IP address counter to the base value provided in the SetBa...
void NewNetwork(Ipv6Address network, Ipv6Prefix prefix) NS_DEPRECATED
Allocate a new network.
Time MilliSeconds(uint64_t ms)
create ns3::Time instances in units of milliseconds.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.