48 #include "ns3/core-module.h"
49 #include "ns3/network-module.h"
50 #include "ns3/internet-module.h"
51 #include "ns3/point-to-point-module.h"
52 #include "ns3/applications-module.h"
53 #include "ns3/global-route-manager.h"
54 #include "ns3/mobility-module.h"
55 #include "ns3/netanim-module.h"
56 #include "ns3/assert.h"
57 #include "ns3/ipv4-global-routing-helper.h"
64 vector<vector<bool> >
readNxNMatrix (std::string adj_mat_file_name);
67 void printMatrix (
const char* description, vector<vector<bool> > array);
71 int main (
int argc,
char *argv[])
78 double SimTime = 3.00;
79 double SinkStartTime = 1.0001;
80 double SinkStopTime = 2.90001;
81 double AppStartTime = 2.0001;
82 double AppStopTime = 2.80001;
84 std::string AppPacketRate (
"40Kbps");
87 std::string LinkRate (
"10Mbps");
88 std::string LinkDelay (
"2ms");
92 srand ( (
unsigned)time ( NULL ) );
94 std::string tr_name (
"n-node-ppp.tr");
95 std::string pcap_name (
"n-node-ppp");
96 std::string flow_name (
"n-node-ppp.xml");
97 std::string anim_name (
"n-node-ppp.anim.xml");
99 std::string adj_mat_file_name (
"examples/matrix-topology/adjacency_matrix.txt");
100 std::string node_coordinates_file_name (
"examples/matrix-topology/node_coordinates.txt");
103 cmd.Parse (argc, argv);
109 vector<vector<bool> > Adj_Matrix;
119 vector<vector<double> > coord_array;
125 int n_nodes = coord_array.size ();
126 int matrixDimension = Adj_Matrix.size ();
128 if (matrixDimension != n_nodes)
130 NS_FATAL_ERROR (
"The number of lines in coordinate file is: " << n_nodes <<
" not equal to the number of nodes in adjacency matrix size " << matrixDimension);
140 nodes.Create (n_nodes);
151 internet.
Install (NodeContainer::GetGlobal ());
156 ipv4_n.
SetBase (
"10.0.0.0",
"255.255.255.252");
160 uint32_t linkCount = 0;
162 for (
size_t i = 0; i < Adj_Matrix.size (); i++)
164 for (
size_t j = 0; j < Adj_Matrix[i].size (); j++)
167 if (Adj_Matrix[i][j] == 1)
174 NS_LOG_INFO (
"matrix element [" << i <<
"][" << j <<
"] is 1");
178 NS_LOG_INFO (
"matrix element [" << i <<
"][" << j <<
"] is 0");
182 NS_LOG_INFO (
"Number of links in the adjacency matrix is: " << linkCount);
186 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
197 for (
size_t m = 0; m < coord_array.size (); m++)
199 positionAlloc_n->Add (Vector (coord_array[m][0], coord_array[m][1], 0));
204 nLoc = CreateObject<ConstantPositionMobilityModel> ();
211 Vector nVec (coord_array[m][0], -coord_array[m][1], 0);
212 nLoc->SetPosition (nVec);
226 for (
int i = 0; i < n_nodes; i++)
236 for (
int i = 0; i < n_nodes; i++)
238 for (
int j = 0; j < n_nodes; j++)
251 double rn =
x->GetValue ();
257 onoff.SetConstantRate (
DataRate (AppPacketRate));
284 Simulator::Stop (
Seconds (SimTime));
287 Simulator::Destroy ();
299 ifstream adj_mat_file;
300 adj_mat_file.open (adj_mat_file_name.c_str (), ios::in);
301 if (adj_mat_file.fail ())
303 NS_FATAL_ERROR (
"File " << adj_mat_file_name.c_str () <<
" not found");
305 vector<vector<bool> > array;
309 while (!adj_mat_file.eof ())
312 getline (adj_mat_file, line);
315 NS_LOG_WARN (
"WARNING: Ignoring blank row in the array: " << i);
319 istringstream iss (line);
324 while (iss >> element)
326 row.push_back (element);
337 NS_LOG_ERROR (
"ERROR: Number of elements in line " << i <<
": " << j <<
" not equal to number of elements in line 0: " << n_nodes);
338 NS_FATAL_ERROR (
"ERROR: The number of rows is not equal to the number of columns! in the adjacency matrix");
342 array.push_back (row);
349 NS_LOG_ERROR (
"There are " << i <<
" rows and " << n_nodes <<
" columns.");
350 NS_FATAL_ERROR (
"ERROR: The number of rows is not equal to the number of columns! in the adjacency matrix");
353 adj_mat_file.close ();
360 ifstream node_coordinates_file;
361 node_coordinates_file.open (node_coordinates_file_name.c_str (), ios::in);
362 if (node_coordinates_file.fail ())
364 NS_FATAL_ERROR (
"File " << node_coordinates_file_name.c_str () <<
" not found");
366 vector<vector<double> > coord_array;
369 while (!node_coordinates_file.eof ())
372 getline (node_coordinates_file, line);
376 NS_LOG_WARN (
"WARNING: Ignoring blank row: " << m);
380 istringstream iss (line);
384 while (iss >> coordinate)
386 row.push_back (coordinate);
392 NS_LOG_ERROR (
"ERROR: Number of elements at line#" << m <<
" is " << n <<
" which is not equal to 2 for node coordinates file");
398 coord_array.push_back (row);
402 node_coordinates_file.close ();
407 void printMatrix (
const char* description, vector<vector<bool> > array)
409 cout <<
"**** Start " << description <<
"********" << endl;
410 for (
size_t m = 0; m < array.size (); m++)
412 for (
size_t n = 0; n < array[m].size (); n++)
414 cout << array[m][n] <<
' ';
418 cout <<
"**** End " << description <<
"********" << endl;
424 cout <<
"**** Start " << description <<
"********" << endl;
425 for (
size_t m = 0; m < coord_array.size (); m++)
427 for (
size_t n = 0; n < coord_array[m].size (); n++)
429 cout << coord_array[m][n] <<
' ';
433 cout <<
"**** End " << description <<
"********" << endl;
Interface to network animator.
holds a vector of ns3::Application pointers.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
void EnableAsciiAll(std::string prefix)
Enable ascii trace output on each device (which is of the appropriate type) in the set of all nodes c...
Manage ASCII trace files for device models.
Ptr< OutputStreamWrapper > CreateFileStream(std::string filename, std::ios::openmode filemode=std::ios::out)
Create and initialize an output stream object we'll use to write the traced bits.
Parse command-line arguments.
Mobility model for which the current position does not change once it has been set and until it is se...
Class for representing data rates.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Ipv4Address NewNetwork(void)
Increment the network number and reset the IP address counter to the base value provided in the SetBa...
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
Ipv4 addresses are stored in host order in this class.
Access to the IPv4 forwarding table, interfaces, and configuration.
a class to store IPv4 address information on an interface
Helper class used to assign positions and mobility models to nodes.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
Build a set of PointToPointNetDevice objects.
void SetDeviceAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each NetDevice created by the helper.
void SetChannelAttribute(std::string name, const AttributeValue &value)
Set an attribute value to be propagated to each Channel created by the helper.
NetDeviceContainer Install(NodeContainer c)
Smart pointer class similar to boost::intrusive_ptr.
Hold variables of type string.
void SetDefault(std::string name, const AttributeValue &value)
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Time Seconds(double value)
Construct a Time in the indicated unit.
vector< vector< double > > readCordinatesFile(std::string node_coordinates_file_name)
vector< vector< bool > > readNxNMatrix(std::string adj_mat_file_name)
void printCoordinateArray(const char *description, vector< vector< double > > coord_array)
void printMatrix(const char *description, vector< vector< bool > > array)
Every class exported by the ns3 library is enclosed in the ns3 namespace.
list x
Random number samples.