28 #include "ns3/unused.h"
39 static TypeId tid =
TypeId (
"ns3::RocketfuelTopologyReader")
57 #define REGMATCH_MAX 16
61 #define SPACE "[ \t]+"
62 #define MAYSPACE "[ \t]*"
64 #define ROCKETFUEL_MAPS_LINE \
65 START "(-*[0-9]+)" SPACE "(@[?A-Za-z0-9,+]+)" SPACE \
66 "(\\+)*" MAYSPACE "(bb)*" MAYSPACE \
67 "\\(([0-9]+)\\)" SPACE "(&[0-9]+)*" MAYSPACE \
68 "->" MAYSPACE "(<[0-9 \t<>]+>)*" MAYSPACE \
69 "(\\{-[0-9\\{\\} \t-]+\\})*" SPACE \
70 "=([A-Za-z0-9.!-]+)" SPACE "r([0-9])" \
73 #define ROCKETFUEL_WEIGHTS_LINE \
74 START "([^ \t]+)" SPACE "([^ \t]+)" SPACE "([0-9.]+)" MAYSPACE END
78 std::map<std::string, Ptr<Node> >
nodeMap;
82 std::vector <std::string>::size_type neighListSize,
83 std::string & name,
int radius)
86 NS_LOG_INFO (
"Load Node[" << uid <<
"]: location: " << loc <<
" dns: " << dns
87 <<
" bb: " << bb <<
" neighbors: " << neighListSize
88 <<
"(" <<
"%d" <<
") externals: \"%s\"(%d) "
89 <<
"name: " << name <<
" radius: " << radius);
103 unsigned int num_neigh = 0;
105 std::vector <std::string> neigh_list;
121 num_neigh_s = ::atoi (argv[4]);
125 NS_LOG_WARN (
"Negative number of neighbors given");
129 num_neigh = num_neigh_s;
136 char *stringp = argv[6];
137 while ((nbr = strsep (&stringp,
" \t")) != NULL)
139 nbr[strlen (nbr) - 1] =
'\0';
140 neigh_list.push_back (nbr + 1);
143 if (num_neigh != neigh_list.size ())
145 NS_LOG_WARN (
"Given number of neighbors = " << num_neigh <<
" != size of neighbors list = " << neigh_list.size ());
160 radius = ::atoi (&argv[9][1]);
166 PrintNodeInfo (uid, loc, dns, bb, neigh_list.size (), name, radius);
173 Ptr<Node> tmpNode = CreateObject<Node> ();
179 for (uint32_t i = 0; i < neigh_list.size (); ++i)
181 nuid = neigh_list[i];
190 Ptr<Node> tmpNode = CreateObject<Node> ();
215 double v = strtod (argv[2], &endptr);
224 if (!sname.empty () && !tname.empty ())
228 Ptr<Node> tmpNode = CreateObject<Node> ();
236 Ptr<Node> tmpNode = CreateObject<Node> ();
246 if ((iter->GetFromNode () ==
nodeMap[tname])
247 && (iter->GetToNode () ==
nodeMap[sname]))
276 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
279 ret = regexec (®ex, line,
REGMATCH_MAX, regmatch, 0);
280 if (ret != REG_NOMATCH)
291 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
294 ret = regexec (®ex, line,
REGMATCH_MAX, regmatch, 0);
295 if (ret != REG_NOMATCH)
309 std::ifstream topgen;
313 std::istringstream lineBuffer;
319 if (!topgen.is_open ())
325 while (!topgen.eof ())
336 getline (topgen, line);
337 buf = (
char *)line.c_str ();
357 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
363 if (ret == REG_NOMATCH)
365 NS_LOG_WARN (
"match failed (maps file): %s" << buf);
375 regerror (ret, ®ex, errbuf,
sizeof (errbuf));
381 if (ret == REG_NOMATCH)
383 NS_LOG_WARN (
"match failed (weights file): %s" << buf);
395 if (regmatch[i].rm_so == -1)
401 line[regmatch[i].rm_eo] =
'\0';
402 argv[i - 1] = &line[regmatch[i].rm_so];
417 NS_LOG_WARN (
"Unsupported file format (only Maps/Weights are supported)");