Brite Integration
This commit is contained in:
144
src/brite/doc/brite.rst
Normal file
144
src/brite/doc/brite.rst
Normal file
@@ -0,0 +1,144 @@
|
||||
.. include:: replace.txt
|
||||
|
||||
BRITE Integration
|
||||
------------------
|
||||
|
||||
This model implements an interface to BRITE, the Boston university
|
||||
Representative Internet Topology gEnerator [1]_. BRITE is a standard tool for
|
||||
generating realistic internet topologies. The ns-3 model, described herein,
|
||||
provides a helper class to facilitate generating ns-3 specific topologies
|
||||
using BRITE configuration files. BRITE builds the original graph which is
|
||||
stored as nodes and edges in the ns-3 BriteTopolgyHelper class. In the ns-3
|
||||
integration of BRITE, the generator generates a topology and then provides
|
||||
access to leaf nodes for each AS generated. ns-3 users can than attach
|
||||
custom topologies to these leaf nodes either by creating them manually or
|
||||
using topology generators provided in ns-3.
|
||||
|
||||
There are three major types of topologies available in BRITE: Router,
|
||||
AS, and Hierarchical which is a combination of AS and Router. For the
|
||||
purposes of ns-3 simulation, the most useful are likely to be Router and
|
||||
Hierarchical. Router level topologies be generated using either the Waxman
|
||||
model or the Barabasi-Albert model. Each model has different parameters that
|
||||
effect topology creation. For flat router topologies, all nodes are considered
|
||||
to be in the same AS.
|
||||
|
||||
BRITE Hierarchical topologies contain two levels. The first is the AS level.
|
||||
This level can be also be created by using either the Waxman model or the
|
||||
Barabasi-Albert model. Then for each node in the AS topology, a router level
|
||||
topology is constructed. These router level topologies can again either use
|
||||
the Waxman model or the Barbasi-Albert model. BRITE interconnects these separate
|
||||
router topologies as specified by the AS level topology. Once the hierarchical
|
||||
topology is constructed, it is flattened into a large router level topology.
|
||||
|
||||
Further information can be found in the BRITE user manual:::
|
||||
|
||||
http://www.cs.bu.edu/brite/publications/usermanual.pdf
|
||||
|
||||
Model Description
|
||||
*****************
|
||||
|
||||
The model relies on building an external BRITE library,
|
||||
and then building some ns-3 helpers that call out to the library.
|
||||
The source code for the ns-3 helpers lives in the directory
|
||||
``src/brite/helper``.
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
To generate the BRITE topology, ns-3 helpers call out to the external BRITE library,
|
||||
and using a standard BRITE configuration file, the BRITE code builds a graph with nodes
|
||||
and edges according to this configuration file. Please see the BRITE documenation
|
||||
or the example configuration files in src/brite/examples/conf_files to get a better
|
||||
grasp of BRITE configuration options. The graph built by BRITE is returned to ns-3,
|
||||
and a ns-3 implementation of the graph is built. Leaf nodes for each AS are available
|
||||
for the user to either attach custom topologies or install ns-3 applications directly.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [1] Alberto Medina, Anukool Lakhina, Ibrahim Matta, and John Byers. BRITE: An Approach to Universal Topology Generation. In Proceedings of the International Workshop on Modeling, Analysis and Simulation of Computer and Telecommunications Systems- MASCOTS '01, Cincinnati, Ohio, August 2001.
|
||||
|
||||
Usage
|
||||
*****
|
||||
|
||||
The brite-generic-example can be referenced to see basic usage of the BRITE
|
||||
interface. In summary, the BriteTopologyHelper is used as the interface point
|
||||
by passing in a BRITE configuration file. Along with the configuration file a
|
||||
BRITE formatted random seed file can also be passed in. If a seed file is not
|
||||
passed in, the helper will create a seed file using ns-3's UniformRandomVariable.
|
||||
Once the topology has been generated by BRITE, BuildBriteTopology() is called to
|
||||
create the ns-3 representation. Next IP Address can be assigned to the topology
|
||||
using either AssignIpv4Addresses() or AssignIpv6Addresses(). It should be noted
|
||||
that each point-to-point link in the topology will be treated as a new network
|
||||
therefore for IPV4 a /30 subnet should be used to avoid wasting a large amount of
|
||||
the available address space.
|
||||
|
||||
Example BRITE configuration files can be found in /src/brite/examples/conf_files/.
|
||||
ASBarbasi and ASWaxman are examples of AS only topologies. The RTBarabasi and
|
||||
RTWaxman files are examples of router only topologies. Finally the
|
||||
TD_ASBarabasi_RTWaxman configuration file is an example of a Hierarchical topology
|
||||
that uses the Barabasi-Albert model for the AS level and the Waxman model for each
|
||||
of the router level topologies. Information on the BRITE parameters used in these files
|
||||
can be found in the BRITE user manual.
|
||||
|
||||
|
||||
Building BRITE Integration
|
||||
==========================
|
||||
|
||||
The first step is to download and build the ns-3 specific BRITE repository:::
|
||||
|
||||
$ hg clone http://code.nsnam.org/BRITE
|
||||
$ cd BRITE
|
||||
$ make
|
||||
|
||||
This will build BRITE and create a library, libbrite.so, within the BRITE
|
||||
directory.
|
||||
|
||||
Once BRITE has been built successfully, we proceed to configure ns-3 with
|
||||
BRITE support. Change to your ns-3 directory:::
|
||||
|
||||
$ ./waf configure --with-brite=/your/path/to/brite/source --enable-examples
|
||||
|
||||
Make sure it says 'enabled' beside 'BRITE Integration'. If it does not, then
|
||||
something has gone wrong. Either you have forgotten to build BRITE first
|
||||
following the steps above, or ns-3 could not find your BRITE directory.
|
||||
|
||||
Next, build ns-3:::
|
||||
|
||||
$ ./waf
|
||||
|
||||
Examples
|
||||
========
|
||||
For an example demonstrating BRITE integration
|
||||
run:::
|
||||
|
||||
$ ./waf --run 'brite-generic-example'
|
||||
|
||||
By enabling the verbose parameter, the example will print out the node and
|
||||
edge information in a similar format to standard BRITE output. There are
|
||||
many other command-line parameters including confFile, tracing, and nix, described below:
|
||||
|
||||
confFile: A BRITE configuration file. Many different BRITE configuration
|
||||
file examples exist in the src/brite/examples/conf_files directory, for
|
||||
example, RTBarabasi20.conf and RTWaxman.conf. Please refer to
|
||||
the conf_files directory for more examples.
|
||||
|
||||
tracing: Enables ascii tracing.
|
||||
|
||||
nix: Enables nix-vector routing. Global routing is used by default.
|
||||
|
||||
The generic BRITE example also support visualization using pyviz, assuming
|
||||
python bindings in ns-3 are enabled:::
|
||||
|
||||
$ ./waf --run brite-generic-example --vis
|
||||
|
||||
Simulations involving BRITE can also be used with MPI. The total number of MPI instances is
|
||||
passed to the BRITE topology helper where a modulo divide is used to assign the nodes for each
|
||||
AS to a MPI instance. An example can be found in src/brite/examples:::
|
||||
|
||||
$ mpirun -np 2 ./waf --run brite-MPI-example
|
||||
|
||||
Please see the ns-3 MPI documentation for information on setting up MPI with ns-3.
|
||||
|
||||
|
||||
217
src/brite/examples/brite-MPI-example.cc
Normal file
217
src/brite/examples/brite-MPI-example.cc
Normal file
@@ -0,0 +1,217 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/mpi-interface.h"
|
||||
#include "ns3/network-module.h"
|
||||
#include "ns3/internet-module.h"
|
||||
#include "ns3/point-to-point-module.h"
|
||||
#include "ns3/mobility-module.h"
|
||||
#include "ns3/applications-module.h"
|
||||
#include "ns3/brite-module.h"
|
||||
#include "ns3/ipv4-nix-vector-helper.h"
|
||||
|
||||
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
#ifdef NS3_MPI
|
||||
#include <mpi.h>
|
||||
#endif
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("BriteMPITest");
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
#ifdef NS3_MPI
|
||||
// Distributed simulation setup
|
||||
MpiInterface::Enable (&argc, &argv);
|
||||
GlobalValue::Bind ("SimulatorImplementationType",
|
||||
StringValue ("ns3::DistributedSimulatorImpl"));
|
||||
|
||||
LogComponentEnable ("BriteMPITest", LOG_LEVEL_ALL);
|
||||
LogComponentEnable ("TcpSocketBase", LOG_LEVEL_INFO);
|
||||
|
||||
uint32_t systemId = MpiInterface::GetSystemId ();
|
||||
uint32_t systemCount = MpiInterface::GetSize ();
|
||||
|
||||
// Check for valid distributed parameters.
|
||||
// For just this particular example, must have 2 and only 2 Logical Processors (LPs)
|
||||
NS_ASSERT_MSG (systemCount == 2, "This demonstration requires 2 and only 2 logical processors.");
|
||||
|
||||
// BRITE needs a configuration file to build its graph. By default, this
|
||||
// example will use the TD_ASBarabasi_RTWaxman.conf file. There are many others
|
||||
// which can be found in the BRITE/conf_files directory
|
||||
std::string confFile = "src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf";
|
||||
bool tracing = false;
|
||||
bool nix = false;
|
||||
|
||||
CommandLine cmd;
|
||||
cmd.AddValue ("confFile", "BRITE conf file", confFile);
|
||||
cmd.AddValue ("tracing", "Enable or disable ascii tracing", tracing);
|
||||
cmd.AddValue ("nix", "Enable or disable nix-vector routing", nix);
|
||||
|
||||
cmd.Parse (argc,argv);
|
||||
|
||||
// Invoke the BriteTopologyHelper and pass in a BRITE
|
||||
// configuration file and a seed file. This will use
|
||||
// BRITE to build a graph from which we can build the ns-3 topology
|
||||
BriteTopologyHelper bth (confFile);
|
||||
|
||||
PointToPointHelper p2p;
|
||||
|
||||
Ipv4StaticRoutingHelper staticRouting;
|
||||
Ipv4GlobalRoutingHelper globalRouting;
|
||||
Ipv4ListRoutingHelper listRouting;
|
||||
Ipv4NixVectorHelper nixRouting;
|
||||
|
||||
InternetStackHelper stack;
|
||||
|
||||
if (nix)
|
||||
{
|
||||
listRouting.Add (staticRouting, 0);
|
||||
listRouting.Add (nixRouting, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
listRouting.Add (staticRouting, 0);
|
||||
listRouting.Add (globalRouting, 10);
|
||||
}
|
||||
|
||||
stack.SetRoutingHelper (listRouting);
|
||||
|
||||
Ipv4AddressHelper address;
|
||||
address.SetBase ("10.0.0.0", "255.255.255.252");
|
||||
|
||||
//build topology as normal but also pass systemCount
|
||||
bth.BuildBriteTopology (stack, systemCount);
|
||||
bth.AssignIpv4Addresses (address);
|
||||
|
||||
NS_LOG_LOGIC ("Number of AS created " << bth.GetNAs ());
|
||||
|
||||
uint16_t port = 5001;
|
||||
|
||||
NodeContainer client;
|
||||
NodeContainer server;
|
||||
|
||||
//For this example will use AS 0 and AS 1 which will be on seperate systems
|
||||
//due to the mod divide used to assign AS to system.
|
||||
|
||||
//GetSystemNumberForAs (uint32_t) can be used to determine which system an
|
||||
//AS is assigned to
|
||||
NS_LOG_LOGIC ("AS 0 has been assigned to system " << bth.GetSystemNumberForAs (0));
|
||||
NS_LOG_LOGIC ("As 1 has been assigned to system " << bth.GetSystemNumberForAs (1));
|
||||
|
||||
//install client node on last leaf node of AS 0
|
||||
client.Add (CreateObject<Node> (0));
|
||||
stack.Install (client);
|
||||
int numLeafNodesInAsZero = bth.GetNLeafNodesForAs (0);
|
||||
client.Add (bth.GetLeafNodeForAs (0, numLeafNodesInAsZero - 1));
|
||||
|
||||
//install server node on last leaf node on AS 1
|
||||
server.Add (CreateObject<Node> (1));
|
||||
stack.Install (server);
|
||||
int numLeafNodesInAsOne = bth.GetNLeafNodesForAs (1);
|
||||
server.Add (bth.GetLeafNodeForAs (1, numLeafNodesInAsOne - 1));
|
||||
|
||||
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
|
||||
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
|
||||
|
||||
NetDeviceContainer p2pClientDevices;
|
||||
NetDeviceContainer p2pServerDevices;
|
||||
|
||||
p2pClientDevices = p2p.Install (client);
|
||||
p2pServerDevices = p2p.Install (server);
|
||||
|
||||
address.SetBase ("10.1.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer clientInterfaces;
|
||||
clientInterfaces = address.Assign (p2pClientDevices);
|
||||
|
||||
address.SetBase ("10.2.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer serverInterfaces;
|
||||
serverInterfaces = address.Assign (p2pServerDevices);
|
||||
|
||||
if (!nix)
|
||||
{
|
||||
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
|
||||
}
|
||||
|
||||
//only has two systems in this example. Install applications only on nodes in my system
|
||||
|
||||
|
||||
//Moved here to get totalRX at end
|
||||
ApplicationContainer sinkApps;
|
||||
|
||||
if (systemId == 1)
|
||||
{
|
||||
|
||||
Address sinkLocalAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
|
||||
PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", sinkLocalAddress);
|
||||
sinkApps.Add (packetSinkHelper.Install (server.Get (0)));
|
||||
sinkApps.Start (Seconds (0.0));
|
||||
sinkApps.Stop (Seconds (10.0));
|
||||
}
|
||||
|
||||
if (systemId == 0)
|
||||
{
|
||||
OnOffHelper clientHelper ("ns3::TcpSocketFactory", Address ());
|
||||
clientHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
|
||||
clientHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
|
||||
|
||||
ApplicationContainer clientApps;
|
||||
AddressValue remoteAddress (InetSocketAddress (serverInterfaces.GetAddress (0), port));
|
||||
clientHelper.SetAttribute ("Remote", remoteAddress);
|
||||
clientApps.Add (clientHelper.Install (client.Get (0)));
|
||||
clientApps.Start (Seconds (1.0)); // Start 1 second after sink
|
||||
clientApps.Stop (Seconds (9.0)); // Stop before the sink
|
||||
}
|
||||
|
||||
if (!nix)
|
||||
{
|
||||
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
|
||||
}
|
||||
|
||||
if (tracing)
|
||||
{
|
||||
AsciiTraceHelper ascii;
|
||||
p2p.EnableAsciiAll (ascii.CreateFileStream ("briteLeaves.tr"));
|
||||
}
|
||||
|
||||
// Run the simulator
|
||||
Simulator::Stop (Seconds (200.0));
|
||||
Simulator::Run ();
|
||||
Simulator::Destroy ();
|
||||
|
||||
if (systemId == 1)
|
||||
{
|
||||
Ptr<PacketSink> sink1 = DynamicCast<PacketSink> (sinkApps.Get (0));
|
||||
NS_LOG_DEBUG ("Total Bytes Received: " << sink1->GetTotalRx ());
|
||||
}
|
||||
|
||||
MpiInterface::Disable ();
|
||||
|
||||
return 0;
|
||||
|
||||
#else
|
||||
NS_FATAL_ERROR ("Can't use distributed simulator without MPI compiled in");
|
||||
#endif
|
||||
}
|
||||
163
src/brite/examples/brite-generic-example.cc
Normal file
163
src/brite/examples/brite-generic-example.cc
Normal file
@@ -0,0 +1,163 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/network-module.h"
|
||||
#include "ns3/internet-module.h"
|
||||
#include "ns3/point-to-point-module.h"
|
||||
#include "ns3/mobility-module.h"
|
||||
#include "ns3/applications-module.h"
|
||||
#include "ns3/brite-module.h"
|
||||
#include "ns3/ipv4-nix-vector-helper.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
using namespace ns3;
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("BriteExample");
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_ALL);
|
||||
LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_ALL);
|
||||
|
||||
LogComponentEnable ("BriteExample", LOG_LEVEL_ALL);
|
||||
|
||||
// BRITE needs a configuration file to build its graph. By default, this
|
||||
// example will use the TD_ASBarabasi_RTWaxman.conf file. There are many others
|
||||
// which can be found in the BRITE/conf_files directory
|
||||
std::string confFile = "src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf";
|
||||
bool tracing = false;
|
||||
bool nix = false;
|
||||
|
||||
CommandLine cmd;
|
||||
cmd.AddValue ("confFile", "BRITE conf file", confFile);
|
||||
cmd.AddValue ("tracing", "Enable or disable ascii tracing", tracing);
|
||||
cmd.AddValue ("nix", "Enable or disable nix-vector routing", nix);
|
||||
|
||||
cmd.Parse (argc,argv);
|
||||
|
||||
nix = false;
|
||||
|
||||
// Invoke the BriteTopologyHelper and pass in a BRITE
|
||||
// configuration file and a seed file. This will use
|
||||
// BRITE to build a graph from which we can build the ns-3 topology
|
||||
BriteTopologyHelper bth (confFile);
|
||||
bth.AssignStreams (3);
|
||||
|
||||
PointToPointHelper p2p;
|
||||
|
||||
Ipv4StaticRoutingHelper staticRouting;
|
||||
Ipv4GlobalRoutingHelper globalRouting;
|
||||
Ipv4ListRoutingHelper listRouting;
|
||||
Ipv4NixVectorHelper nixRouting;
|
||||
|
||||
InternetStackHelper stack;
|
||||
|
||||
if (nix)
|
||||
{
|
||||
listRouting.Add (staticRouting, 0);
|
||||
listRouting.Add (nixRouting, 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
listRouting.Add (staticRouting, 0);
|
||||
listRouting.Add (globalRouting, 10);
|
||||
}
|
||||
|
||||
stack.SetRoutingHelper (listRouting);
|
||||
|
||||
Ipv4AddressHelper address;
|
||||
address.SetBase ("10.0.0.0", "255.255.255.252");
|
||||
|
||||
bth.BuildBriteTopology (stack);
|
||||
bth.AssignIpv4Addresses (address);
|
||||
|
||||
NS_LOG_INFO ("Number of AS created " << bth.GetNAs ());
|
||||
|
||||
//The BRITE topology generator generates a topology of routers. Here we create
|
||||
//two subnetworks which we attach to router leaf nodes generated by BRITE
|
||||
//Any NS3 topology may be used to attach to the BRITE leaf nodes but here we
|
||||
//use just one node
|
||||
|
||||
NodeContainer client;
|
||||
NodeContainer server;
|
||||
|
||||
client.Create (1);
|
||||
stack.Install (client);
|
||||
|
||||
//install client node on last leaf node of AS 0
|
||||
int numLeafNodesInAsZero = bth.GetNLeafNodesForAs (0);
|
||||
client.Add (bth.GetLeafNodeForAs (0, numLeafNodesInAsZero - 1));
|
||||
|
||||
server.Create (1);
|
||||
stack.Install (server);
|
||||
|
||||
//install server node on last leaf node on AS 1
|
||||
int numLeafNodesInAsOne = bth.GetNLeafNodesForAs (1);
|
||||
server.Add (bth.GetLeafNodeForAs (1, numLeafNodesInAsOne - 1));
|
||||
|
||||
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
|
||||
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
|
||||
|
||||
NetDeviceContainer p2pClientDevices;
|
||||
NetDeviceContainer p2pServerDevices;
|
||||
|
||||
p2pClientDevices = p2p.Install (client);
|
||||
p2pServerDevices = p2p.Install (server);
|
||||
|
||||
address.SetBase ("10.1.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer clientInterfaces;
|
||||
clientInterfaces = address.Assign (p2pClientDevices);
|
||||
|
||||
address.SetBase ("10.2.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer serverInterfaces;
|
||||
serverInterfaces = address.Assign (p2pServerDevices);
|
||||
|
||||
UdpEchoServerHelper echoServer (9);
|
||||
ApplicationContainer serverApps = echoServer.Install (server.Get (0));
|
||||
serverApps.Start (Seconds (1.0));
|
||||
serverApps.Stop (Seconds (5.0));
|
||||
|
||||
UdpEchoClientHelper echoClient (serverInterfaces.GetAddress (0), 9);
|
||||
echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
|
||||
echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
|
||||
echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
|
||||
|
||||
ApplicationContainer clientApps = echoClient.Install (client.Get (0));
|
||||
clientApps.Start (Seconds (2.0));
|
||||
clientApps.Stop (Seconds (5.0));
|
||||
|
||||
if (!nix)
|
||||
{
|
||||
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
|
||||
}
|
||||
|
||||
if (tracing)
|
||||
{
|
||||
AsciiTraceHelper ascii;
|
||||
p2p.EnableAsciiAll (ascii.CreateFileStream ("briteLeaves.tr"));
|
||||
}
|
||||
// Run the simulator
|
||||
Simulator::Stop (Seconds (6.0));
|
||||
Simulator::Run ();
|
||||
Simulator::Destroy ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
21
src/brite/examples/conf_files/ASBarabasi.conf
Normal file
21
src/brite/examples/conf_files/ASBarabasi.conf
Normal file
@@ -0,0 +1,21 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 4 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 1000 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
23
src/brite/examples/conf_files/ASWaxman.conf
Normal file
23
src/brite/examples/conf_files/ASWaxman.conf
Normal file
@@ -0,0 +1,23 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 3 #Router Waxman = 1, AS Waxman = 3
|
||||
N = 1000 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.15 #Waxman Parameter
|
||||
beta = 0.2 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
22
src/brite/examples/conf_files/RTBarabasi.conf
Normal file
22
src/brite/examples/conf_files/RTBarabasi.conf
Normal file
@@ -0,0 +1,22 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 2 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 100 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
22
src/brite/examples/conf_files/RTBarabasi10.conf
Normal file
22
src/brite/examples/conf_files/RTBarabasi10.conf
Normal file
@@ -0,0 +1,22 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 2 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 10 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
22
src/brite/examples/conf_files/RTBarabasi20.conf
Normal file
22
src/brite/examples/conf_files/RTBarabasi20.conf
Normal file
@@ -0,0 +1,22 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 2 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 20 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 1 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
22
src/brite/examples/conf_files/RTBarabasi5.conf
Normal file
22
src/brite/examples/conf_files/RTBarabasi5.conf
Normal file
@@ -0,0 +1,22 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 2 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 5 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
25
src/brite/examples/conf_files/RTWaxman.conf
Normal file
25
src/brite/examples/conf_files/RTWaxman.conf
Normal file
@@ -0,0 +1,25 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman = 1, AS Waxman = 3
|
||||
N = 1000 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.15 #Waxman Parameter
|
||||
beta = 0.2 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 1 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
25
src/brite/examples/conf_files/RTWaxman10.conf
Normal file
25
src/brite/examples/conf_files/RTWaxman10.conf
Normal file
@@ -0,0 +1,25 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman = 1, AS Waxman = 3
|
||||
N = 10 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.15 #Waxman Parameter
|
||||
beta = 0.2 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
25
src/brite/examples/conf_files/RTWaxman20.conf
Normal file
25
src/brite/examples/conf_files/RTWaxman20.conf
Normal file
@@ -0,0 +1,25 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman = 1, AS Waxman = 3
|
||||
N = 20 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.15 #Waxman Parameter
|
||||
beta = 0.2 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
25
src/brite/examples/conf_files/RTWaxman5.conf
Normal file
25
src/brite/examples/conf_files/RTWaxman5.conf
Normal file
@@ -0,0 +1,25 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman = 1, AS Waxman = 3
|
||||
N = 5 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 2 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.15 #Waxman Parameter
|
||||
beta = 0.2 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = 10.0
|
||||
BWMax = 1024.0
|
||||
EndModel
|
||||
|
||||
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
50
src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf
Normal file
50
src/brite/examples/conf_files/TD_ASBarabasi_RTWaxman.conf
Normal file
@@ -0,0 +1,50 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
|
||||
|
||||
BeginModel
|
||||
Name = 5 #Top Down = 5
|
||||
edgeConn = 2 #Random=1, Smallest Nonleaf = 2, Smallest Deg = 3, k-Degree=4
|
||||
k = -1 #Only needed if edgeConn is set to K-Degree, otherwise use -1
|
||||
BWInter = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWInterMin = 10.0
|
||||
BWInterMax = 1024.0
|
||||
BWIntra = 3 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWIntraMin = 10.0
|
||||
BWIntraMax = 1024.0
|
||||
EndModel
|
||||
|
||||
BeginModel
|
||||
Name = 4 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 2 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 1 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = -1.0
|
||||
BWMax = -1.0
|
||||
EndModel
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman=2, AS Waxman =3
|
||||
N = 20 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 2 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 1 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.5 #Waxman Parameter
|
||||
beta = 0.8 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = -1.0
|
||||
BWMax = -1.0
|
||||
EndModel
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
|
||||
7
src/brite/examples/wscript
Normal file
7
src/brite/examples/wscript
Normal file
@@ -0,0 +1,7 @@
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
def build(bld):
|
||||
obj = bld.create_ns3_program('brite-generic-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications'])
|
||||
obj.source = 'brite-generic-example.cc'
|
||||
obj = bld.create_ns3_program('brite-MPI-example', ['brite', 'internet', 'point-to-point', 'nix-vector-routing', 'applications', 'mpi'])
|
||||
obj.source = 'brite-MPI-example.cc'
|
||||
483
src/brite/helper/brite-topology-helper.cc
Normal file
483
src/brite/helper/brite-topology-helper.cc
Normal file
@@ -0,0 +1,483 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ns3/log.h"
|
||||
#include "ns3/abort.h"
|
||||
#include "ns3/net-device.h"
|
||||
#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/rng-seed-manager.h"
|
||||
|
||||
#include "brite-topology-helper.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
NS_LOG_COMPONENT_DEFINE ("BriteTopologyHelper");
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
BriteTopologyHelper::BriteTopologyHelper (std::string confFile,
|
||||
std::string seedFile,
|
||||
std::string newseedFile) : m_confFile (confFile),
|
||||
m_seedFile (seedFile),
|
||||
m_newSeedFile (newseedFile),
|
||||
m_numAs (0),
|
||||
m_topology (NULL),
|
||||
m_numNodes (0),
|
||||
m_numEdges (0)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
m_uv = CreateObject<UniformRandomVariable> ();
|
||||
|
||||
}
|
||||
|
||||
BriteTopologyHelper::BriteTopologyHelper (std::string confFile) : m_confFile (confFile),
|
||||
m_numAs (0),
|
||||
m_topology (NULL),
|
||||
m_numNodes (0),
|
||||
m_numEdges (0)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
m_uv = CreateObject<UniformRandomVariable> ();
|
||||
|
||||
}
|
||||
|
||||
BriteTopologyHelper::~BriteTopologyHelper ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
delete m_topology;
|
||||
|
||||
while (!m_netDevices.empty ())
|
||||
{
|
||||
delete m_netDevices.back ();
|
||||
m_netDevices.pop_back ();
|
||||
}
|
||||
|
||||
while (!m_asLeafNodes.empty ())
|
||||
{
|
||||
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)
|
||||
{
|
||||
BriteNodeInfo nodeInfo;
|
||||
nodeInfo.nodeId = g->GetNodePtr (i)->GetId ();
|
||||
nodeInfo.xCoordinate = g->GetNodePtr (i)->GetNodeInfo ()->GetCoordX ();
|
||||
nodeInfo.yCoordinate = g->GetNodePtr (i)->GetNodeInfo ()->GetCoordY ();
|
||||
nodeInfo.inDegree = g->GetNodePtr (i)->GetInDegree ();
|
||||
nodeInfo.outDegree = g->GetNodePtr (i)->GetOutDegree ();
|
||||
|
||||
switch (g->GetNodePtr (i)->GetNodeInfo ()->GetNodeType ())
|
||||
{
|
||||
case brite::NodeConf::RT_NODE:
|
||||
|
||||
if (((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId () == -1)
|
||||
{
|
||||
m_numAs = nodeInfo.asId = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_numAs = nodeInfo.asId = ((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId ();
|
||||
}
|
||||
|
||||
switch (((brite::RouterNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetRouterType ())
|
||||
{
|
||||
case brite::RouterNodeConf::RT_NONE:
|
||||
nodeInfo.type = "RT_NONE ";
|
||||
break;
|
||||
case brite::RouterNodeConf::RT_LEAF:
|
||||
nodeInfo.type = "RT_LEAF ";
|
||||
break;
|
||||
case brite::RouterNodeConf::RT_BORDER:
|
||||
nodeInfo.type = "RT_BORDER";
|
||||
break;
|
||||
case brite::RouterNodeConf::RT_STUB:
|
||||
nodeInfo.type = "RT_STUB ";
|
||||
break;
|
||||
case brite::RouterNodeConf::RT_BACKBONE:
|
||||
nodeInfo.type = "RT_BACKBONE ";
|
||||
break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("Topology::Output(): Improperly classfied Router node encountered...");
|
||||
}
|
||||
break;
|
||||
|
||||
case brite::NodeConf::AS_NODE:
|
||||
m_numAs = nodeInfo.asId =
|
||||
((brite::ASNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASId ();
|
||||
|
||||
switch (((brite::ASNodeConf*)(g->GetNodePtr (i)->GetNodeInfo ()))->GetASType ())
|
||||
{
|
||||
case brite::ASNodeConf::AS_NONE:
|
||||
nodeInfo.type = "AS_NONE ";
|
||||
break;
|
||||
case brite::ASNodeConf::AS_LEAF:
|
||||
nodeInfo.type = "AS_LEAF ";
|
||||
break;
|
||||
case brite::ASNodeConf::AS_STUB:
|
||||
nodeInfo.type = "AS_STUB ";
|
||||
break;
|
||||
case brite::ASNodeConf::AS_BORDER:
|
||||
nodeInfo.type = "AS_BORDER ";
|
||||
break;
|
||||
case brite::ASNodeConf::AS_BACKBONE:
|
||||
nodeInfo.type = "AS_BACKBONE ";
|
||||
break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("Topology::Output(): Improperly classfied AS node encountered...");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
m_briteNodeInfoList.push_back (nodeInfo);
|
||||
}
|
||||
|
||||
//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
|
||||
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 ();
|
||||
|
||||
for (el = edgeList.begin (); el != edgeList.end (); el++)
|
||||
{
|
||||
BriteEdgeInfo edgeInfo;
|
||||
edgeInfo.edgeId = (*el)->GetId ();
|
||||
edgeInfo.srcId = (*el)->GetSrc ()->GetId ();
|
||||
edgeInfo.destId = (*el)->GetDst ()->GetId ();
|
||||
edgeInfo.length = (*el)->Length ();
|
||||
|
||||
switch ((*el)->GetConf ()->GetEdgeType ())
|
||||
{
|
||||
case brite::EdgeConf::RT_EDGE:
|
||||
edgeInfo.delay = ((brite::RouterEdgeConf*)((*el)->GetConf ()))->GetDelay ();
|
||||
edgeInfo.bandwidth = (*el)->GetConf ()->GetBW ();
|
||||
//If there is only one AS, BRITE will use -1 as AS Number. We want it to be 0 instead.
|
||||
edgeInfo.asFrom = (((brite::RouterNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId () == -1) ? 0 : ((brite::RouterNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId ();
|
||||
edgeInfo.asTo = (((brite::RouterNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId () == -1) ? 0 : ((brite::RouterNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId ();
|
||||
break;
|
||||
|
||||
case brite::EdgeConf::AS_EDGE:
|
||||
edgeInfo.delay = -1; /* No delay for AS Edges */
|
||||
edgeInfo.bandwidth = (*el)->GetConf ()->GetBW ();
|
||||
edgeInfo.asFrom = ((brite::ASNodeConf*)((*el)->GetSrc ()->GetNodeInfo ()))->GetASId ();
|
||||
edgeInfo.asTo = ((brite::ASNodeConf*)((*el)->GetDst ()->GetNodeInfo ()))->GetASId ();
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_FATAL_ERROR ("Topology::Output(): Invalid Edge type encountered...");
|
||||
}
|
||||
|
||||
switch ((*el)->GetConf ()->GetEdgeType ())
|
||||
{
|
||||
case brite::EdgeConf::RT_EDGE:
|
||||
switch (((brite::RouterEdgeConf*)(*el)->GetConf ())->GetRouterEdgeType ())
|
||||
{
|
||||
case brite::RouterEdgeConf::RT_NONE:
|
||||
edgeInfo.type = "E_RT_NONE ";
|
||||
break;
|
||||
case brite::RouterEdgeConf::RT_STUB:
|
||||
edgeInfo.type = "E_RT_STUB ";
|
||||
break;
|
||||
case brite::RouterEdgeConf::RT_BORDER:
|
||||
edgeInfo.type = "E_RT_BORDER ";
|
||||
break;
|
||||
case brite::RouterEdgeConf::RT_BACKBONE:
|
||||
edgeInfo.type = "E_RT_BACKBONE ";
|
||||
break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("Output(): Invalid router edge type...");
|
||||
}
|
||||
break;
|
||||
|
||||
case brite::EdgeConf::AS_EDGE:
|
||||
switch (((brite::ASEdgeConf*)((*el)->GetConf ()))->GetASEdgeType ())
|
||||
{
|
||||
case brite::ASEdgeConf::AS_NONE:
|
||||
edgeInfo.type = "E_AS_NONE ";
|
||||
break;
|
||||
case brite::ASEdgeConf::AS_STUB:
|
||||
edgeInfo.type = "E_AS_STUB ";
|
||||
break;
|
||||
case brite::ASEdgeConf::AS_BORDER:
|
||||
edgeInfo.type = "E_AS_BORDER ";
|
||||
break;
|
||||
case brite::ASEdgeConf::AS_BACKBONE:
|
||||
edgeInfo.type = "E_AS_BACKBONE ";
|
||||
break;
|
||||
default:
|
||||
NS_FATAL_ERROR ("BriteOutput(): Invalid AS edge type...");
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
NS_FATAL_ERROR ("BriteOutput(): Invalid edge type...");
|
||||
|
||||
}
|
||||
|
||||
m_briteEdgeInfoList.push_back (edgeInfo);
|
||||
}
|
||||
}
|
||||
|
||||
Ptr<Node>
|
||||
BriteTopologyHelper::GetLeafNodeForAs (uint32_t asNum, uint32_t leafNum)
|
||||
{
|
||||
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 m_numNodes;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
BriteTopologyHelper::GetNEdgesTopology () const
|
||||
{
|
||||
return m_numEdges;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
BriteTopologyHelper::GetNAs (void) const
|
||||
{
|
||||
return m_numAs;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
BriteTopologyHelper::GetSystemNumberForAs (uint32_t asNum) const
|
||||
{
|
||||
return m_systemForAs[asNum];
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
//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;
|
||||
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)
|
||||
{
|
||||
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::AssignIpv4Addresses (Ipv4AddressHelper& address)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
//assign IPs
|
||||
for (unsigned int i = 0; i < m_netDevices.size (); ++i)
|
||||
{
|
||||
address.Assign (*m_netDevices[i]);
|
||||
address.NewNetwork ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BriteTopologyHelper::AssignIpv6Addresses (Ipv6AddressHelper& address)
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
|
||||
for (unsigned int i = 0; i < m_netDevices.size (); ++i)
|
||||
{
|
||||
address.Assign (*m_netDevices[i]);
|
||||
address.NewNetwork ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BriteTopologyHelper::ConstructTopology ()
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
//create one node container to hold leaf nodes for attaching
|
||||
for (uint32_t i = 0; i < m_numAs; ++i)
|
||||
{
|
||||
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)
|
||||
{
|
||||
// Set the link delay
|
||||
// The brite value for delay is given in milliseconds
|
||||
m_britePointToPointHelper.SetChannelAttribute ("Delay",
|
||||
TimeValue (MilliSeconds ((*it).delay)));
|
||||
|
||||
// The brite value for data rate is given in Mbps
|
||||
m_britePointToPointHelper.SetDeviceAttribute ("DataRate",
|
||||
DataRateValue (DataRate ((*it).bandwidth * mbpsToBps)));
|
||||
|
||||
m_netDevices.push_back ( new NetDeviceContainer ( m_britePointToPointHelper.Install (m_nodes.Get ((*it).srcId), m_nodes.Get ((*it).destId))));
|
||||
|
||||
m_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 ")
|
||||
{
|
||||
m_asLeafNodes[(*it).asId]->Add (m_nodes.Get ((*it).nodeId));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
298
src/brite/helper/brite-topology-helper.h
Normal file
298
src/brite/helper/brite-topology-helper.h
Normal file
@@ -0,0 +1,298 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef BRITE_TOPOLOGY_HELPER_H
|
||||
#define BRITE_TOPOLOGY_HELPER_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "ns3/channel.h"
|
||||
#include "ns3/node-container.h"
|
||||
#include "ns3/node-list.h"
|
||||
#include "ns3/point-to-point-helper.h"
|
||||
#include "ns3/internet-stack-helper.h"
|
||||
#include "ns3/ipv6-address-helper.h"
|
||||
#include "ns3/random-variable-stream.h"
|
||||
|
||||
//located in BRITE source directory
|
||||
#include "Brite.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
/**
|
||||
* \brief Interface with BRITE, the Boston university Representative Internet
|
||||
* Topology gEnerator
|
||||
*
|
||||
* This helper class creates an interface with BRITE and allows the user to
|
||||
* easily create ns-3 topologies from BRITE generated graphs. This class
|
||||
* accepts a BRITE configuration and seed file, much like the stand-alone
|
||||
* BRITE software. Using these files, BRITE generates a graph which is
|
||||
* stored herein. ns-3 examples can then grab the BRITE generated nodes and
|
||||
* edges from this helper and create ns-3 specific topologies.
|
||||
*
|
||||
*/
|
||||
|
||||
class PointToPointHelper;
|
||||
|
||||
class BriteTopologyHelper
|
||||
{
|
||||
public:
|
||||
/*
|
||||
* Construct a BriteTopologyHelper
|
||||
*
|
||||
* \param confFile a BRITE configuration file
|
||||
* \param seedFile a BRITE seed file
|
||||
* \param newseedFile a BRITE seed file with newly generated values
|
||||
*/
|
||||
BriteTopologyHelper (std::string confFile,
|
||||
std::string seedFile,
|
||||
std::string newseedFile);
|
||||
|
||||
/*
|
||||
* Construct a BriteTopologyHelper using NS3 to generate seed values
|
||||
* need by BRITE
|
||||
*
|
||||
*/
|
||||
BriteTopologyHelper (std::string confFile);
|
||||
|
||||
~BriteTopologyHelper ();
|
||||
|
||||
/*
|
||||
* Assigns stream number to UniformRandomVariable used to
|
||||
* generate brite seed file
|
||||
*
|
||||
* \param streamNumber the stream number to assign
|
||||
*
|
||||
*/
|
||||
void AssignStreams (int64_t streamNumber);
|
||||
|
||||
/*
|
||||
* Create NS3 topology using information generated from BRITE.
|
||||
*
|
||||
* \param stack Internet stack to assign to nodes in topology
|
||||
*/
|
||||
void BuildBriteTopology (InternetStackHelper& stack);
|
||||
|
||||
/*
|
||||
* Create NS3 topology using information generated from BRITE and configure topology for MPI use.
|
||||
*
|
||||
* \param stack Internet stack to assign to nodes in topology.
|
||||
* \param systemCount The number of MPI instances to be used in the simulation.
|
||||
*
|
||||
*/
|
||||
void BuildBriteTopology (InternetStackHelper& stack, const uint32_t systemCount);
|
||||
|
||||
/*
|
||||
* Returns the number of router leaf nodes for a given AS
|
||||
*
|
||||
* \param asNum the AS number
|
||||
* \returns the number of leaf nodes in the specified AS
|
||||
*
|
||||
*/
|
||||
uint32_t GetNLeafNodesForAs (uint32_t asNum);
|
||||
|
||||
/*
|
||||
* Returns a given router leaf node from a given AS
|
||||
*
|
||||
* \param asNum the AS number
|
||||
* \param leafNum the leaf number
|
||||
* \returns the specified node
|
||||
*/
|
||||
Ptr<Node> GetLeafNodeForAs (uint32_t asNum, uint32_t leafNum);
|
||||
|
||||
/*
|
||||
* Returns the total number of nodes for a given AS
|
||||
*
|
||||
* \param asNum the AS number
|
||||
* \returns the total number of nodes in the given AS
|
||||
*/
|
||||
uint32_t GetNNodesForAs (uint32_t asNum);
|
||||
|
||||
/*
|
||||
* Returns a given router node for a given AS
|
||||
*
|
||||
* \param asNum the AS number
|
||||
* \return the specified node
|
||||
*
|
||||
*/
|
||||
Ptr<Node> GetNodeForAs (uint32_t asNum, uint32_t nodeNum);
|
||||
|
||||
/**
|
||||
* Returns the number of AS created in the topology
|
||||
*
|
||||
* \returns the number of AS created in the topology
|
||||
*/
|
||||
uint32_t GetNAs (void) const;
|
||||
|
||||
/**
|
||||
* Returns the system number for the MPI instance that this AS is assigned to. Will always return 0 if MPI not used
|
||||
*
|
||||
* \returns The system number that the specified AS number belongs to
|
||||
*
|
||||
* param asNum The AS Number
|
||||
*/
|
||||
uint32_t GetSystemNumberForAs (uint32_t asNum) const;
|
||||
|
||||
/**
|
||||
* \param address an Ipv4AddressHelper which is used to install
|
||||
* Ipv4 addresses on all the node interfaces in
|
||||
* the topology
|
||||
*/
|
||||
void AssignIpv4Addresses (Ipv4AddressHelper& address);
|
||||
|
||||
/**
|
||||
* \param network an IPv6 address representing the network portion
|
||||
* of the IPv6 Address
|
||||
* \param prefix the prefix length
|
||||
*/
|
||||
void AssignIpv6Addresses (Ipv6AddressHelper& address);
|
||||
|
||||
/**
|
||||
* Returns the number of nodes created within
|
||||
* the topology
|
||||
*
|
||||
* \returns the total number of nodes within the brite topology
|
||||
*/
|
||||
uint32_t GetNNodesTopology () const;
|
||||
|
||||
/**
|
||||
* Returns the number of edges created within
|
||||
* the topology
|
||||
*
|
||||
* \returns the total number of edges within the brite topology
|
||||
*/
|
||||
uint32_t GetNEdgesTopology () const;
|
||||
|
||||
private:
|
||||
//brite values are unitless however all examples provided use mbps to specify rate
|
||||
//this constant value is used to convert the mbps provided by brite to bps.
|
||||
static const int mbpsToBps = 1000000;
|
||||
|
||||
/**
|
||||
* \brief Node information from BRITE
|
||||
*
|
||||
* The BRITE code generates a graph and returns
|
||||
* information on the nodes generated. This is
|
||||
* stored here in a struct.
|
||||
*/
|
||||
struct BriteNodeInfo
|
||||
{
|
||||
int nodeId;
|
||||
double xCoordinate;
|
||||
double yCoordinate;
|
||||
int inDegree;
|
||||
int outDegree;
|
||||
int asId;
|
||||
std::string type;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Edge information from BRITE
|
||||
*
|
||||
* The BRITE code generates a graph and returns
|
||||
* information on the edges generated. This is
|
||||
* stored here in a struct.
|
||||
*/
|
||||
struct BriteEdgeInfo
|
||||
{
|
||||
int edgeId;
|
||||
int srcId;
|
||||
int destId;
|
||||
double length;
|
||||
double delay;
|
||||
double bandwidth;
|
||||
int asFrom;
|
||||
int asTo;
|
||||
std::string type;
|
||||
};
|
||||
|
||||
//stores all of the nodes used in the BRITE generated topology
|
||||
NodeContainer m_nodes;
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*/
|
||||
void BuildBriteNodeInfoList (void);
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*/
|
||||
void BuildBriteEdgeInfoList (void);
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*/
|
||||
void ConstructTopology (void);
|
||||
|
||||
/**
|
||||
* \internal
|
||||
*/
|
||||
void GenerateBriteTopology (void);
|
||||
|
||||
//brite configuration file to use
|
||||
std::string m_confFile;
|
||||
|
||||
//brite seed file to use
|
||||
std::string m_seedFile;
|
||||
|
||||
//brite seed file to generate for next run
|
||||
std::string m_newSeedFile;
|
||||
|
||||
//stores the number of AS in the BRITE generated topology
|
||||
uint32_t m_numAs;
|
||||
|
||||
//stores the netdevices created for each AS
|
||||
std::vector<NetDeviceContainer*> m_netDevices;
|
||||
|
||||
//stores the leaf router nodes for each AS
|
||||
std::vector<NodeContainer*> m_asLeafNodes;
|
||||
|
||||
//stores all of the nodes in the brite topology by AS number
|
||||
std::vector<NodeContainer*> m_nodesByAs;
|
||||
|
||||
//stores the MPI system number each AS assigned to. All assigned to 0 if MPI not used.
|
||||
std::vector<int> m_systemForAs;
|
||||
|
||||
brite::Topology* m_topology;
|
||||
|
||||
//stores the number of nodes created in the BRITE topology
|
||||
uint32_t m_numNodes;
|
||||
|
||||
//stores the number of edges created in the BRITE topology
|
||||
uint32_t m_numEdges;
|
||||
|
||||
/**
|
||||
* The BRITE code generates multiple nodes and edges. Each
|
||||
* node and edge is stored in a BriteNodeInfo or BriteEdgeInfo
|
||||
* struct, and each instance is stored in a vector.
|
||||
*/
|
||||
typedef std::vector<BriteNodeInfo> BriteNodeInfoList;
|
||||
typedef std::vector<BriteEdgeInfo> BriteEdgeInfoList;
|
||||
|
||||
BriteNodeInfoList m_briteNodeInfoList;
|
||||
BriteEdgeInfoList m_briteEdgeInfoList;
|
||||
|
||||
//used to create the links within the topology
|
||||
PointToPointHelper m_britePointToPointHelper;
|
||||
|
||||
Ptr<UniformRandomVariable> m_uv;
|
||||
};
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* BRITE_TOPOLOGY_HELPER_H */
|
||||
200
src/brite/test/brite-test-topology.cc
Normal file
200
src/brite/test/brite-test-topology.cc
Normal file
@@ -0,0 +1,200 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation;
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include "ns3/core-module.h"
|
||||
#include "ns3/network-module.h"
|
||||
#include "ns3/internet-module.h"
|
||||
#include "ns3/point-to-point-module.h"
|
||||
#include "ns3/packet-sink-helper.h"
|
||||
#include "ns3/packet-sink.h"
|
||||
#include "ns3/random-variable-stream.h"
|
||||
#include "ns3/on-off-helper.h"
|
||||
#include "ns3/brite-module.h"
|
||||
#include "ns3/test.h"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class BriteTopologyStructureTestCase : public TestCase
|
||||
{
|
||||
public:
|
||||
BriteTopologyStructureTestCase ();
|
||||
virtual ~BriteTopologyStructureTestCase ();
|
||||
|
||||
private:
|
||||
virtual void DoRun (void);
|
||||
|
||||
};
|
||||
|
||||
BriteTopologyStructureTestCase::BriteTopologyStructureTestCase ()
|
||||
: TestCase ("Test that two brite topologies created with same seed value produce same graph (not an exact test)")
|
||||
{
|
||||
}
|
||||
|
||||
BriteTopologyStructureTestCase::~BriteTopologyStructureTestCase ()
|
||||
{
|
||||
}
|
||||
|
||||
void BriteTopologyStructureTestCase::DoRun (void)
|
||||
{
|
||||
|
||||
std::string confFile = "src/brite/test/test.conf";
|
||||
|
||||
SeedManager::SetRun (1);
|
||||
SeedManager::SetSeed (1);
|
||||
BriteTopologyHelper bthA (confFile);
|
||||
bthA.AssignStreams (1);
|
||||
|
||||
SeedManager::SetRun (1);
|
||||
SeedManager::SetSeed (1);
|
||||
BriteTopologyHelper bthB (confFile);
|
||||
bthB.AssignStreams (1);
|
||||
|
||||
InternetStackHelper stack;
|
||||
|
||||
bthA.BuildBriteTopology (stack);
|
||||
bthB.BuildBriteTopology (stack);
|
||||
|
||||
int numAsA = bthA.GetNAs ();
|
||||
int numAsB = bthB.GetNAs ();
|
||||
|
||||
//numAs should be 2 for the conf file in /src/brite/test/test.conf
|
||||
NS_TEST_ASSERT_MSG_EQ (numAsA, 2, "Number of AS for this topology must be 2");
|
||||
NS_TEST_ASSERT_MSG_EQ (numAsA, numAsB, "Number of AS should be same for both test topologies");
|
||||
NS_TEST_ASSERT_MSG_EQ (bthA.GetNNodesTopology (), bthB.GetNNodesTopology (), "Total number of nodes for each topology should be equal");
|
||||
NS_TEST_ASSERT_MSG_EQ (bthA.GetNEdgesTopology (), bthB.GetNEdgesTopology (), "Total number of edges for each topology should be equal");
|
||||
|
||||
for (unsigned int i = 0; i < bthA.GetNAs (); ++i)
|
||||
{
|
||||
NS_TEST_ASSERT_MSG_EQ (bthA.GetNLeafNodesForAs (i), bthB.GetNLeafNodesForAs (i), "Total number of leaf nodes different for AS " << i);
|
||||
}
|
||||
}
|
||||
|
||||
class BriteTopologyFunctionTestCase : public TestCase
|
||||
{
|
||||
public:
|
||||
BriteTopologyFunctionTestCase ();
|
||||
virtual ~BriteTopologyFunctionTestCase ();
|
||||
|
||||
private:
|
||||
virtual void DoRun (void);
|
||||
|
||||
};
|
||||
|
||||
BriteTopologyFunctionTestCase::BriteTopologyFunctionTestCase ()
|
||||
: TestCase ("Test that packets can be send across a BRITE topology using UDP")
|
||||
{
|
||||
}
|
||||
|
||||
BriteTopologyFunctionTestCase::~BriteTopologyFunctionTestCase ()
|
||||
{
|
||||
}
|
||||
|
||||
void BriteTopologyFunctionTestCase::DoRun (void)
|
||||
{
|
||||
|
||||
std::string confFile = "src/brite/test/test.conf";
|
||||
BriteTopologyHelper bth (confFile);
|
||||
|
||||
PointToPointHelper p2p;
|
||||
InternetStackHelper stack;
|
||||
Ipv4AddressHelper address;
|
||||
|
||||
address.SetBase ("10.0.0.0", "255.255.255.0");
|
||||
|
||||
bth.BuildBriteTopology (stack);
|
||||
bth.AssignIpv4Addresses (address);
|
||||
|
||||
NodeContainer source;
|
||||
NodeContainer sink;
|
||||
|
||||
source.Create (1);
|
||||
stack.Install (source);
|
||||
|
||||
//install source node on last leaf node of AS 0
|
||||
int numNodesInAsZero = bth.GetNNodesForAs (0);
|
||||
source.Add (bth.GetNodeForAs (0, numNodesInAsZero - 1));
|
||||
|
||||
sink.Create (1);
|
||||
stack.Install (sink);
|
||||
|
||||
//install sink node on last leaf node on AS 1
|
||||
int numNodesInAsOne = bth.GetNNodesForAs (1);
|
||||
sink.Add (bth.GetNodeForAs (1, numNodesInAsOne - 1));
|
||||
|
||||
p2p.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
|
||||
p2p.SetChannelAttribute ("Delay", StringValue ("2ms"));
|
||||
|
||||
NetDeviceContainer p2pSourceDevices;
|
||||
NetDeviceContainer p2pSinkDevices;
|
||||
|
||||
p2pSourceDevices = p2p.Install (source);
|
||||
p2pSinkDevices = p2p.Install (sink);
|
||||
|
||||
address.SetBase ("10.1.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer sourceInterfaces;
|
||||
sourceInterfaces = address.Assign (p2pSourceDevices);
|
||||
|
||||
address.SetBase ("10.2.0.0", "255.255.0.0");
|
||||
Ipv4InterfaceContainer sinkInterfaces;
|
||||
sinkInterfaces = address.Assign (p2pSinkDevices);
|
||||
|
||||
uint16_t port = 9;
|
||||
|
||||
OnOffHelper onOff ("ns3::UdpSocketFactory",
|
||||
Address (InetSocketAddress (sinkInterfaces.GetAddress (0), port)));
|
||||
onOff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
|
||||
onOff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
|
||||
onOff.SetAttribute ("DataRate", DataRateValue (DataRate (6000)));
|
||||
|
||||
ApplicationContainer apps = onOff.Install (source.Get (0));
|
||||
|
||||
apps.Start (Seconds (1.0));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
PacketSinkHelper sinkHelper ("ns3::UdpSocketFactory",
|
||||
Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
|
||||
apps = sinkHelper.Install (sink.Get (0));
|
||||
|
||||
apps.Start (Seconds (1.0));
|
||||
apps.Stop (Seconds (10.0));
|
||||
|
||||
Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
|
||||
|
||||
Simulator::Stop (Seconds (10.0));
|
||||
Simulator::Run ();
|
||||
|
||||
Ptr<PacketSink> sink1 = DynamicCast<PacketSink> (apps.Get (0));
|
||||
//NS_TEST_ASSERT_MSG_EQ (sink1->GetTotalRx (), 6656, "Not all packets received from source");
|
||||
|
||||
Simulator::Destroy ();
|
||||
|
||||
}
|
||||
|
||||
class BriteTestSuite : public TestSuite
|
||||
{
|
||||
public:
|
||||
BriteTestSuite () : TestSuite ("brite-testing", UNIT)
|
||||
{
|
||||
AddTestCase (new BriteTopologyStructureTestCase);
|
||||
AddTestCase (new BriteTopologyFunctionTestCase);
|
||||
}
|
||||
} g_briteTestSuite;
|
||||
|
||||
} // namespace ns3
|
||||
20
src/brite/test/examples-to-run.py
Normal file
20
src/brite/test/examples-to-run.py
Normal file
@@ -0,0 +1,20 @@
|
||||
#! /usr/bin/env python
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
|
||||
# A list of C++ examples to run in order to ensure that they remain
|
||||
# buildable and runnable over time. Each tuple in the list contains
|
||||
#
|
||||
# (example_name, do_run, do_valgrind_run).
|
||||
#
|
||||
# See test.py for more information.
|
||||
cpp_examples = [
|
||||
("brite-generic-example", "ENABLE_BRITE == True", "False"),
|
||||
]
|
||||
|
||||
# A list of Python examples to run in order to ensure that they remain
|
||||
# runnable over time. Each tuple in the list contains
|
||||
#
|
||||
# (example_name, do_run).
|
||||
#
|
||||
# See test.py for more information.
|
||||
python_examples = []
|
||||
50
src/brite/test/test.conf
Normal file
50
src/brite/test/test.conf
Normal file
@@ -0,0 +1,50 @@
|
||||
#This config file was generated by the GUI.
|
||||
|
||||
BriteConfig
|
||||
|
||||
|
||||
|
||||
BeginModel
|
||||
Name = 5 #Top Down = 5
|
||||
edgeConn = 2 #Random=1, Smallest Nonleaf = 2, Smallest Deg = 3, k-Degree=4
|
||||
k = -1 #Only needed if edgeConn is set to K-Degree, otherwise use -1
|
||||
BWInter = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWInterMin = 10.0
|
||||
BWInterMax = 1024.0
|
||||
BWIntra = 3 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWIntraMin = 10.0
|
||||
BWIntraMax = 1024.0
|
||||
EndModel
|
||||
|
||||
BeginModel
|
||||
Name = 4 #Router Barabasi=2, AS Barabasi =4
|
||||
N = 2 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 1 #Random = 1, Heavy Tailed = 2
|
||||
m = 1 #Number of neighboring node each new node connects to.
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = -1.0
|
||||
BWMax = -1.0
|
||||
EndModel
|
||||
|
||||
BeginModel
|
||||
Name = 1 #Router Waxman=2, AS Waxman =3
|
||||
N = 5 #Number of nodes in graph
|
||||
HS = 1000 #Size of main plane (number of squares)
|
||||
LS = 100 #Size of inner planes (number of squares)
|
||||
NodePlacement = 2 #Random = 1, Heavy Tailed = 2
|
||||
GrowthType = 1 #Incremental = 1, All = 2
|
||||
m = 1 #Number of neighboring node each new node connects to.
|
||||
alpha = 0.5 #Waxman Parameter
|
||||
beta = 0.8 #Waxman Parameter
|
||||
BWDist = 1 #Constant = 1, Uniform =2, HeavyTailed = 3, Exponential =4
|
||||
BWMin = -1.0
|
||||
BWMax = -1.0
|
||||
EndModel
|
||||
|
||||
BeginOutput #**Atleast one of these options should have value 1**
|
||||
BRITE = 1 #0 = Do not save as BRITE, 1 = save as BRITE.
|
||||
OTTER = 0 #0 = Do not visualize with Otter, 1 = Visualize
|
||||
EndOutput
|
||||
|
||||
91
src/brite/wscript
Normal file
91
src/brite/wscript
Normal file
@@ -0,0 +1,91 @@
|
||||
## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
|
||||
import os
|
||||
import Options
|
||||
|
||||
|
||||
def options(opt):
|
||||
opt.add_option('--with-brite',
|
||||
help=('Use BRITE integration support, given by the indicated path,'
|
||||
' to allow the use of the BRITE topology generator'),
|
||||
default=False, dest='with_brite')
|
||||
|
||||
def configure(conf):
|
||||
conf.env['ENABLE_BRITE'] = False
|
||||
|
||||
if Options.options.with_brite:
|
||||
if os.path.isdir(Options.options.with_brite):
|
||||
conf.msg("Checking BRITE location", ("%s (given)" % Options.options.with_brite))
|
||||
conf.env['WITH_BRITE'] = os.path.abspath(Options.options.with_brite)
|
||||
else:
|
||||
brite_dir = os.path.join('..','BRITE')
|
||||
if os.path.isdir(brite_dir):
|
||||
conf.msg("Checking for BRITE location", ("%s (guessed)" % brite_dir))
|
||||
conf.env['WITH_BRITE'] = os.path.abspath(brite_dir)
|
||||
del brite_dir
|
||||
if not conf.env['WITH_BRITE']:
|
||||
conf.msg("Checking for BRITE location", False)
|
||||
conf.report_optional_feature("brite", "BRITE Integration", False,
|
||||
"BRITE not found (see option --with-brite)")
|
||||
return
|
||||
else:
|
||||
conf.report_optional_feature("brite", "BRITE Integration", False, 'BRITE not enabled (see option --with-brite)')
|
||||
return
|
||||
|
||||
test_code = '''
|
||||
#include "Brite.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
'''
|
||||
|
||||
conf.env['DL'] = conf.check(mandatory=True, lib='dl', define_name='DL', uselib='DL')
|
||||
|
||||
conf.env.append_value('NS3_MODULE_PATH',os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.')))
|
||||
|
||||
conf.env['INCLUDES_BRITE'] = os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'.'))
|
||||
|
||||
conf.env['CPPPATH_BRITE'] = [
|
||||
os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'.')),
|
||||
os.path.abspath(os.path.join(conf.env['WITH_BRITE'],'Models'))
|
||||
]
|
||||
conf.env['LIBPATH_BRITE'] = [os.path.abspath(os.path.join(conf.env['WITH_BRITE'], '.'))]
|
||||
|
||||
conf.env.append_value('CXXDEFINES', 'NS3_BRITE')
|
||||
conf.env.append_value('CPPPATH', conf.env['CPPPATH_BRITE'])
|
||||
|
||||
conf.env['BRITE'] = conf.check(fragment=test_code, lib='brite', libpath=conf.env['LIBPATH_BRITE'], use='BRITE DL')
|
||||
conf.report_optional_feature("brite", "BRITE Integration",
|
||||
conf.env['BRITE'], "BRITE library not found")
|
||||
|
||||
if conf.env['BRITE']:
|
||||
conf.env['ENABLE_BRITE'] = True
|
||||
conf.env.append_value('CXXDEFINES', 'NS3_BRITE')
|
||||
conf.env.append_value('CPPPATH', conf.env['CPPPATH_BRITE'])
|
||||
|
||||
def build(bld):
|
||||
|
||||
module = bld.create_ns3_module('brite', ['network', 'core', 'internet', 'point-to-point'])
|
||||
module.source = [
|
||||
]
|
||||
|
||||
module_test = bld.create_ns3_module_test_library('brite')
|
||||
module_test.source = [
|
||||
]
|
||||
|
||||
if bld.env['BRITE'] and bld.env['DL']:
|
||||
module.uselib = 'BRITE DL'
|
||||
|
||||
headers = bld.new_task_gen(features=['ns3header'])
|
||||
headers.module = 'brite'
|
||||
headers.source = [
|
||||
]
|
||||
|
||||
if bld.env['ENABLE_BRITE']:
|
||||
module.source.append ('helper/brite-topology-helper.cc')
|
||||
headers.source.append ('helper/brite-topology-helper.h')
|
||||
module_test.source.append('test/brite-test-topology.cc')
|
||||
|
||||
if bld.env['ENABLE_EXAMPLES'] and bld.env['ENABLE_BRITE']:
|
||||
bld.add_subdirs('examples')
|
||||
2
test.py
2
test.py
@@ -52,6 +52,7 @@ interesting_config_items = [
|
||||
"EXAMPLE_DIRECTORIES",
|
||||
"ENABLE_PYTHON_BINDINGS",
|
||||
"ENABLE_CLICK",
|
||||
"ENABLE_BRITE",
|
||||
"ENABLE_OPENFLOW",
|
||||
"APPNAME",
|
||||
"BUILD_PROFILE",
|
||||
@@ -65,6 +66,7 @@ ENABLE_THREADING = False
|
||||
ENABLE_EXAMPLES = True
|
||||
ENABLE_TESTS = True
|
||||
ENABLE_CLICK = False
|
||||
ENABLE_BRITE = False
|
||||
ENABLE_OPENFLOW = False
|
||||
EXAMPLE_DIRECTORIES = []
|
||||
APPNAME = ""
|
||||
|
||||
Reference in New Issue
Block a user