Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(784)

Unified Diff: src/brite/helper/brite-topology-helper.cc

Issue 6499120: Brite Integration
Patch Set: Brite Update Created 11 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/brite/helper/brite-topology-helper.h ('k') | src/brite/test/brite-test-topology.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/brite/helper/brite-topology-helper.cc
===================================================================
--- a/src/brite/helper/brite-topology-helper.cc
+++ b/src/brite/helper/brite-topology-helper.cc
@@ -21,8 +21,9 @@
#include "ns3/net-device-container.h"
#include "ns3/point-to-point-helper.h"
#include "ns3/ipv4-address-helper.h"
+#include "ns3/random-variable-stream.h"
#include "ns3/data-rate.h"
-#include "ns3/random-variable-stream.h"
+#include "ns3/rng-seed-manager.h"
#include "brite-topology-helper.h"
@@ -35,60 +36,56 @@
BriteTopologyHelper::BriteTopologyHelper (std::string confFile,
std::string seedFile,
- std::string newseedFile) : numAs(0), numNodes(0), numEdges(0)
+ std::string newseedFile) : m_confFile(confFile), m_seedFile(seedFile), m_newSeedFile(newseedFile), m_numAs(0), m_topology(NULL), m_numNodes(0), m_numEdges(0)
{
- brite::Brite br (confFile, seedFile, newseedFile);
- m_topology = br.GetTopology ();
- BuildBriteNodeInfoList ();
- BuildBriteEdgeInfoList ();
+ NS_LOG_FUNCTION(this);
+
+ m_uv = CreateObject<UniformRandomVariable> ();
+
}
-BriteTopologyHelper::BriteTopologyHelper (std::string confFile) : numAs(0), numNodes(0), numEdges(0)
+BriteTopologyHelper::BriteTopologyHelper (std::string confFile) : m_confFile(confFile), m_numAs(0), m_topology(NULL), m_numNodes(0), m_numEdges(0)
{
+ NS_LOG_FUNCTION(this);
- //Generate seed file expected by BRITE
- //need unsigned shorts 0-65535
- Ptr<UniformRandomVariable> uv = CreateObject<UniformRandomVariable> ();
- std::ofstream seedFile;
- seedFile.open ("briteSeedFile.txt");
- seedFile << "PLACES " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << std::endl;
- seedFile << "CONNECT " << uv->GetInteger (0, 65535) << " " << uv->GetValue () << " " << uv->GetValue () << std::endl;
- seedFile << "EDGE_CONN " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << std::endl;
- seedFile << "GROUPING " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << std::endl;
- seedFile << "ASSIGNMENT " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << std::endl;
- seedFile << "BANDWIDTH " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << " " << uv->GetInteger (0, 65535) << std::endl;
- seedFile.close ();
-
- brite::Brite br (confFile, "briteSeedFile.txt", "briteSeedFile.txt");
-
- m_topology = br.GetTopology ();
- BuildBriteNodeInfoList ();
- BuildBriteEdgeInfoList ();
-
- //remove temporary seed file
- remove("briteSeedFile.txt");
+ m_uv = CreateObject<UniformRandomVariable> ();
+
}
BriteTopologyHelper::~BriteTopologyHelper ()
{
+ NS_LOG_FUNCTION(this);
delete m_topology;
- while(!netDevices.empty())
+ while(!m_netDevices.empty ())
{
- delete netDevices.back();
- netDevices.pop_back();
+ delete m_netDevices.back ();
+ m_netDevices.pop_back();
}
- while(!asLeafNodes.empty())
+ while(!m_asLeafNodes.empty ())
{
- delete asLeafNodes.back();
- asLeafNodes.pop_back();
+ delete m_asLeafNodes.back ();
+ m_asLeafNodes.pop_back ();
}
+
+ while(!m_nodesByAs.empty ())
+ {
+ delete m_nodesByAs.back ();
+ m_nodesByAs.pop_back ();
+ }
+}
+
+void
+BriteTopologyHelper::AssignStreams (int64_t streamNumber)
+{
+ m_uv->SetStream(streamNumber);
}
void
BriteTopologyHelper::BuildBriteNodeInfoList (void)
{
+ NS_LOG_FUNCTION(this);
brite::Graph *g = m_topology->GetGraph ();
for (int i = 0; i < g->GetNumNodes (); ++i)
{
@@ -104,9 +101,9 @@
case brite::NodeConf::RT_NODE:
if(((brite::RouterNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetASId() == -1)
- numAs = nodeInfo.asId = 0;
+ m_numAs = nodeInfo.asId = 0;
else
- numAs = nodeInfo.asId = ((brite::RouterNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetASId();
+ m_numAs = nodeInfo.asId = ((brite::RouterNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetASId();
switch (((brite::RouterNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetRouterType())
{
@@ -131,7 +128,7 @@
break;
case brite::NodeConf::AS_NODE:
- numAs = nodeInfo.asId =
+ m_numAs = nodeInfo.asId =
((brite::ASNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetASId();
switch (((brite::ASNodeConf*)(g->GetNodePtr(i)->GetNodeInfo()))->GetASType())
@@ -160,15 +157,16 @@
m_briteNodeInfoList.push_back (nodeInfo);
}
- //Currently numAS stores the highest AS number. We want numAs to store the number
+ //Currently m_numAs stores the highest AS number. We want m_numAs to store the number
//of AS created in the topology. Since AS numbering starts at 0 we add one to get
//the correct count
- numAs++;
+ m_numAs++;
}
void
BriteTopologyHelper::BuildBriteEdgeInfoList (void)
{
+ NS_LOG_FUNCTION(this);
brite::Graph *g = m_topology->GetGraph ();
std::list<brite::Edge*>::iterator el;
std::list<brite::Edge*> edgeList = g->GetEdges ();
@@ -253,101 +251,186 @@
}
}
-NodeContainer&
-BriteTopologyHelper::GetLeafNodesForAS (uint32_t asNum)
+Ptr<Node>
+BriteTopologyHelper::GetLeafNodeForAs (uint32_t asNum, uint32_t leafNum)
{
- return *asLeafNodes[asNum];
+ return m_asLeafNodes[asNum]->Get (leafNum);
+}
+
+Ptr<Node>
+BriteTopologyHelper::GetNodeForAs(uint32_t asNum, uint32_t nodeNum)
+{
+ return m_nodesByAs[asNum]->Get (nodeNum);
+}
+
+uint32_t
+BriteTopologyHelper::GetNNodesForAs(uint32_t asNum)
+{
+ return m_nodesByAs[asNum]->GetN ();
+}
+
+uint32_t
+BriteTopologyHelper::GetNLeafNodesForAs (uint32_t asNum)
+{
+ return m_asLeafNodes[asNum]->GetN ();
}
uint32_t
BriteTopologyHelper::GetNNodesTopology () const
{
- return numNodes;
+ return m_numNodes;
}
-
uint32_t
BriteTopologyHelper::GetNEdgesTopology () const
{
- return numEdges;
+ return m_numEdges;
}
uint32_t
BriteTopologyHelper::GetNAs (void) const
{
- return numAs;
+ return m_numAs;
}
uint32_t
BriteTopologyHelper::GetSystemNumberForAs (uint32_t asNum) const
{
- return systemForAs[asNum];
+ return m_systemForAs[asNum];
}
-void
-BriteTopologyHelper::BuildBriteTopology (const uint32_t systemCount)
+void BriteTopologyHelper::GenerateBriteTopology (void)
{
+ NS_ASSERT_MSG(m_topology == NULL, "Brite Topology Already Created");
+
+ //check to see if need to generate seed file
+ bool generateSeedFile = m_seedFile.empty();
+
+ if(generateSeedFile)
+ {
+ NS_LOG_LOGIC("Generating BRITE Seed file");
+
+ std::ofstream seedFile;
+
+ //overwrite file if already there
+ seedFile.open ("briteSeedFile.txt", std::ios_base::out | std::ios_base::trunc);
- //determine as system number for each AS
- for(uint32_t i = 0; i < numAs; ++i)
+ //verify open
+ NS_ASSERT(!seedFile.fail());
+
+ //Generate seed file expected by BRITE
+ //need unsigned shorts 0-65535
+ seedFile << "PLACES " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile << "CONNECT " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile << "EDGE_CONN " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile << "GROUPING " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile << "ASSIGNMENT " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile << "BANDWIDTH " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << " " << m_uv->GetInteger (0, 65535) << std::endl;
+ seedFile.close ();
+
+ //if we're using NS3 generated seed files don't want brite to create a new seed file.
+ m_seedFile = m_newSeedFile = "briteSeedFile.txt";
+ }
+
+ brite::Brite br (m_confFile, m_seedFile, m_newSeedFile);
+ m_topology = br.GetTopology ();
+ BuildBriteNodeInfoList ();
+ BuildBriteEdgeInfoList ();
+
+ //brite automatically spits out the seed values used to a seperate file so no need to keep this anymore
+ if(generateSeedFile)
+ remove("briteSeedFile.txt");
+
+}
+
+void
+BriteTopologyHelper::BuildBriteTopology (InternetStackHelper& stack)
+{
+ NS_LOG_FUNCTION(this);
+
+ GenerateBriteTopology ();
+
+ //not using MPI so each AS is on system number 0
+ for(uint32_t i = 0; i < m_numAs; ++i)
+ {
+ m_systemForAs.push_back(0);
+ }
+
+ //create all nodes with system number 0
+ m_nodes.Create (m_briteNodeInfoList.size());
+
+ m_numNodes = m_briteNodeInfoList.size();
+
+ NS_LOG_DEBUG(m_numNodes << " nodes created in BRITE topology");
+
+ stack.Install (m_nodes);
+
+ ConstructTopology ();
+}
+
+void
+BriteTopologyHelper::BuildBriteTopology (InternetStackHelper& stack, const uint32_t systemCount)
+{
+ NS_LOG_FUNCTION(this);
+
+ GenerateBriteTopology ();
+
+ //determine as system number for each AS
+ NS_LOG_LOGIC("Assigning << " << m_numAs << " AS to " << systemCount << " MPI instances");
+ for(uint32_t i = 0; i < m_numAs; ++i)
{
int val = i % systemCount;
- systemForAs.push_back(val);
+ m_systemForAs.push_back(val);
NS_LOG_INFO ("AS: " << i << " System: " << val);
}
//create nodes
for(BriteTopologyHelper::BriteNodeInfoList::iterator it = m_briteNodeInfoList.begin(); it != m_briteNodeInfoList.end(); ++it)
{
- nodes.Add(CreateObject<Node> (GetSystemNumberForAs ((*it).asId)));
- numNodes++;
+ m_nodes.Add(CreateObject<Node> (GetSystemNumberForAs ((*it).asId)));
+ m_numNodes++;
}
-
+
+ NS_LOG_INFO(m_numNodes << " nodes created in BRITE topology");
+
+ stack.Install (m_nodes);
+
ConstructTopology ();
}
void
-BriteTopologyHelper::InstallStack (InternetStackHelper& stack)
-{
- stack.Install (nodes);
-}
-
-void
BriteTopologyHelper::AssignIpv4Addresses (Ipv4AddressHelper& address)
{
- //assign IPs to each AS
- for(unsigned int i = 0; i < netDevices.size(); ++i)
+ NS_LOG_FUNCTION(this);
+ //assign IPs
+ for(unsigned int i = 0; i < m_netDevices.size(); ++i)
{
- address.Assign(*netDevices[i]);
+ address.Assign(*m_netDevices[i]);
address.NewNetwork();
}
}
void
-BriteTopologyHelper::AssignIpv6Addresses (Ipv6Address network, Ipv6Prefix prefix)
+BriteTopologyHelper::AssignIpv6Addresses (Ipv6AddressHelper& address)
{
- Ipv6AddressGenerator::Init (network, prefix);
- Ipv6Address v6network;
- Ipv6AddressHelper addressHelper;
-
- //assign IPs to each AS
- for(unsigned int i = 0; i < netDevices.size (); ++i)
+ NS_LOG_FUNCTION(this);
+
+ for(unsigned int i = 0; i < m_netDevices.size(); ++i)
{
- v6network = Ipv6AddressGenerator::GetNetwork (prefix);
- addressHelper.SetBase (v6network, prefix);
- addressHelper.Assign (*netDevices[i]);
- Ipv6AddressGenerator::NextNetwork (prefix);
+ address.Assign(*m_netDevices[i]);
+ address.NewNetwork();
}
}
void
BriteTopologyHelper::ConstructTopology ()
{
- //create one device container for each AS and one node container to hold leaf nodes for attaching
- for(uint32_t i = 0; i < numAs; ++i)
+ NS_LOG_FUNCTION(this);
+ //create one node container to hold leaf nodes for attaching
+ for(uint32_t i = 0; i < m_numAs; ++i)
{
- netDevices.push_back(new NetDeviceContainer());
- asLeafNodes.push_back(new NodeContainer());
+ m_asLeafNodes.push_back(new NodeContainer());
+ m_nodesByAs.push_back(new NodeContainer());
}
for (BriteTopologyHelper::BriteEdgeInfoList::iterator it = m_briteEdgeInfoList.begin(); it != m_briteEdgeInfoList.end(); ++it)
@@ -361,45 +444,24 @@
m_britePointToPointHelper.SetDeviceAttribute ("DataRate",
DataRateValue (DataRate ((*it).bandwidth * mbpsToBps)));
- netDevices[(*it).asFrom]->Add (m_britePointToPointHelper.Install (nodes.Get ((*it).srcId),
- nodes.Get ((*it).destId)));
+ m_netDevices.push_back( new NetDeviceContainer( m_britePointToPointHelper.Install (m_nodes.Get ((*it).srcId), m_nodes.Get ((*it).destId))));
+
+ m_numEdges++;
- numEdges++;
}
+
+ NS_LOG_INFO("Created " << m_numEdges << " edges in BRITE topology");
//iterate through all nodes and add leaf nodes for each AS
for(BriteTopologyHelper::BriteNodeInfoList::iterator it = m_briteNodeInfoList.begin(); it != m_briteNodeInfoList.end(); ++it)
{
+ m_nodesByAs[(*it).asId]->Add (m_nodes.Get ((*it).nodeId));
+
if((*it).type == "RT_LEAF ")
{
- asLeafNodes[(*it).asId]->Add (nodes.Get ((*it).nodeId));
+ m_asLeafNodes[(*it).asId]->Add (m_nodes.Get ((*it).nodeId));
}
}
}
-PointToPointHelper&
-BriteTopologyHelper::GetPointToPointHelperForTopology ()
-{
- return m_britePointToPointHelper;
-}
-
-void
-BriteTopologyHelper::BuildBriteTopology ()
-{
-
- //not using MPI so each AS is on system number 0
- for(uint32_t i = 0; i < numAs; ++i)
- {
- systemForAs.push_back(0);
- }
-
- //create all nodes with system number 0
- nodes.Create (m_briteNodeInfoList.size());
-
- numNodes = m_briteNodeInfoList.size();
-
- ConstructTopology ();
-
-}
-
} // namespace ns3
« no previous file with comments | « src/brite/helper/brite-topology-helper.h ('k') | src/brite/test/brite-test-topology.cc » ('j') | no next file with comments »

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b