28 #include "ns3/unused.h"
39 static TypeId tid =
TypeId (
"ns3::RocketfuelTopologyReader")
41 .SetGroupName (
"TopologyReader")
62 #define REGMATCH_MAX 16
66 #define SPACE "[ \t]+"
67 #define MAYSPACE "[ \t]*"
69 #define ROCKETFUEL_MAPS_LINE \
70 START "(-*[0-9]+)" SPACE "(@[?A-Za-z0-9,+]+)" SPACE \
71 "(\\+)*" MAYSPACE "(bb)*" MAYSPACE \
72 "\\(([0-9]+)\\)" SPACE "(&[0-9]+)*" MAYSPACE \
73 "->" MAYSPACE "(<[0-9 \t<>]+>)*" MAYSPACE \
74 "(\\{-[0-9\\{\\} \t-]+\\})*" SPACE \
75 "=([A-Za-z0-9.!-]+)" SPACE "r([0-9])" \
78 #define ROCKETFUEL_WEIGHTS_LINE \
79 START "([^ \t]+)" SPACE "([^ \t]+)" SPACE "([0-9.]+)" MAYSPACE END
93 std::vector <std::string>::size_type neighListSize,
94 std::string & name,
int radius)
97 NS_LOG_INFO (
"Load Node[" << uid <<
"]: location: " << loc <<
" dns: " << dns
98 <<
" bb: " << bb <<
" neighbors: " << neighListSize
99 <<
"(" <<
"%d" <<
") externals: \"%s\"(%d) "
100 <<
"name: " << name <<
" radius: " << radius);
114 unsigned int num_neigh = 0;
116 std::vector <std::string> neigh_list;
132 num_neigh_s = ::atoi (argv[4]);
136 NS_LOG_WARN (
"Negative number of neighbors given");
140 num_neigh = num_neigh_s;
147 char *stringp = argv[6];
148 while ((nbr = strsep (&stringp,
" \t")) != NULL)
150 nbr[strlen (nbr) - 1] =
'\0';
151 neigh_list.push_back (nbr + 1);
154 if (num_neigh != neigh_list.size ())
156 NS_LOG_WARN (
"Given number of neighbors = " << num_neigh <<
" != size of neighbors list = " << neigh_list.size ());
171 radius = ::atoi (&argv[9][1]);
177 PrintNodeInfo (uid, loc, dns, bb, neigh_list.size (), name, radius);
184 Ptr<Node> tmpNode = CreateObject<Node> ();
190 for (uint32_t i = 0; i < neigh_list.size (); ++i)
192 nuid = neigh_list[i];
201 Ptr<Node> tmpNode = CreateObject<Node> ();
229 double v = strtod (argv[2], &endptr);
238 if (!sname.empty () && !tname.empty ())
242 Ptr<Node> tmpNode = CreateObject<Node> ();
250 Ptr<Node> tmpNode = CreateObject<Node> ();
260 if ((iter->GetFromNode () ==
m_nodeMap[tname])
261 && (iter->GetToNode () ==
m_nodeMap[sname]))
293 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
296 ret = regexec (®ex, line,
REGMATCH_MAX, regmatch, 0);
297 if (ret != REG_NOMATCH)
308 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
311 ret = regexec (®ex, line,
REGMATCH_MAX, regmatch, 0);
312 if (ret != REG_NOMATCH)
326 std::ifstream topgen;
330 std::istringstream lineBuffer;
336 if (!topgen.is_open ())
342 while (!topgen.eof ())
353 getline (topgen, line);
354 buf = (
char *)line.c_str ();
374 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
380 if (ret == REG_NOMATCH)
382 NS_LOG_WARN (
"match failed (maps file): %s" << buf);
392 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
398 if (ret == REG_NOMATCH)
400 NS_LOG_WARN (
"match failed (weights file): %s" << buf);
412 if (regmatch[i].rm_so == -1)
418 line[regmatch[i].rm_eo] =
'\0';
419 argv[i - 1] = &line[regmatch[i].rm_so];
434 NS_LOG_WARN (
"Unsupported file format (only Maps/Weights are supported)");
RocketfuelTopologyReader()
static TypeId GetTypeId(void)
Get the type ID.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
ConstLinksIterator LinksBegin(void) const
Returns an iterator to the the first link in this block.
std::string GetFileName(void) const
Returns the input file name.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define ROCKETFUEL_MAPS_LINE
#define NS_UNUSED(x)
Mark a local variable as unused.
NodeContainer GenerateFromMapsFile(int argc, char *argv[])
Topology read function from a file containing the nodes map.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
void AddLink(Link link)
Adds a link to the topology.
enum RF_FileType GetFileType(const char *)
Classifies the file type according to its content.
NodeContainer GenerateFromWeightsFile(int argc, char *argv[])
Topology read function from a file containing the nodes weights.
Inner class holding the details about a link between two nodes.
Interface for input file readers management.
int m_nodesNumber
Number of nodes.
static void PrintNodeInfo(std::string &uid, std::string &loc, bool dns, bool bb, std::vector< std::string >::size_type neighListSize, std::string &name, int radius)
Print node info.
virtual ~RocketfuelTopologyReader()
#define ROCKETFUEL_WEIGHTS_LINE
std::map< std::string, Ptr< Node > > m_nodeMap
Map of the nodes (name, node).
std::list< Link >::const_iterator ConstLinksIterator
Constant iterator to the list of the links.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
int m_linksNumber
Number of links.
RF_FileType
Enum of the possible file types.
virtual NodeContainer Read(void)
Main topology reading function.
void Add(NodeContainer other)
Append the contents of another NodeContainer to the end of this container.
Topology file reader (Rocketfuel-format type).
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
ConstLinksIterator LinksEnd(void) const
Returns an iterator to the the last link in this block.