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 |