Merge remote-tracking branch 'git.irl/Ilya'
diff --git a/model/annotated-topology-reader.cc b/model/annotated-topology-reader.cc
index c92aec0..4b17ba4 100644
--- a/model/annotated-topology-reader.cc
+++ b/model/annotated-topology-reader.cc
@@ -55,10 +55,10 @@
     
 TypeId AnnotatedTopologyReader::GetTypeId (void)
 {
-  static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
+    static TypeId tid = TypeId ("ns3::AnnotatedTopologyReader")
     .SetParent<Object> ()
     ;
-  return tid;
+    return tid;
 }
     
 AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path)
@@ -68,9 +68,9 @@
   , m_lrx (100.0)
   , m_lry (100.0)
 {
-  NS_LOG_FUNCTION (this);
+    NS_LOG_FUNCTION (this);
 }
-
+    
 void
 AnnotatedTopologyReader::SetBoundingBox (double ulx, double uly, double lrx, double lry)
 {
@@ -84,27 +84,27 @@
 
 AnnotatedTopologyReader::~AnnotatedTopologyReader ()
 {
-  NS_LOG_FUNCTION (this);
+    NS_LOG_FUNCTION (this);
 }
     
 NodeContainer
 AnnotatedTopologyReader::Read (void)
 {
-  ifstream topgen;
-  topgen.open (GetFileName ().c_str ());
-  NodeContainer nodes;
+    ifstream topgen;
+    topgen.open (GetFileName ().c_str ());
+    NodeContainer nodes;
         
-  if (!topgen.is_open ())
+    if ( !topgen.is_open () )
     {
       NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
-      return nodes;
+        return nodes;
     }
-
-  int linksNumber = 0;
-  int nodesNumber = 0;
         
-  string line;
-  getline (topgen,line);
+    int linksNumber = 0;
+    int nodesNumber = 0;
+        
+    string line;
+    getline (topgen,line);
   istringstream headerLineBuffer (line);
         
   int totnode;
@@ -112,22 +112,22 @@
   headerLineBuffer >> totnode;
   headerLineBuffer >> totlink;
   
-  NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
-
-  for (int i = 0; i < totlink && !topgen.eof (); i++)
+    NS_LOG_INFO ("Annotated topology should have " << totnode << " nodes and " << totlink << " links");
+        
+    for (int i = 0; i < totlink && !topgen.eof (); i++)
     {
-      getline (topgen, line);
+        getline (topgen,line);
       istringstream lineBuffer (line);
             
       string from;
       string to;
-      lineBuffer >> from;
-      lineBuffer >> to;
-
-      if ( (!from.empty ()) && (!to.empty ()) )
+        lineBuffer >> from;
+        lineBuffer >> to;
+            
+        if ( (!from.empty ()) && (!to.empty ()) )
         {
-          NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
-
+            NS_LOG_INFO ( linksNumber << " From: " << from << " to: " << to );
+                
           Ptr<Node> fromNode = Names::Find<Node> (m_path, from);
           Ptr<Node> toNode   = Names::Find<Node> (m_path, to);
           
@@ -136,7 +136,7 @@
               fromNode = CreateObject<Node> ();
               Names::Add (m_path, from, fromNode);
               nodes.Add (fromNode);
-              nodesNumber++;
+                nodesNumber++;
             }
                 
           if (toNode == 0)
@@ -144,23 +144,23 @@
               toNode = CreateObject<Node> ();
               Names::Add (m_path, to, toNode);
               nodes.Add (toNode);
-              nodesNumber++;
+                nodesNumber++;
             }
                 
           Link link (fromNode, from, toNode, to);
                 
           string dataRate;
           lineBuffer >> dataRate;
-
+            
           string ospf;
           lineBuffer >> ospf;
-
+                
           string delay;
           lineBuffer >> delay;
-
+                
           string queueSizeNode1;
           lineBuffer >> queueSizeNode1;
-          
+                
           string queueSizeNode2;
           lineBuffer >> queueSizeNode2;
 
@@ -173,65 +173,65 @@
               NS_LOG_ERROR ("File [" << GetFileName () << ":" << i+2 << " wrong format, skipping");
               continue;
             }
-          
+            
           link.SetAttribute ("DataRate", dataRate);
           link.SetAttribute ("OSPF", ospf);
           link.SetAttribute ("Delay", delay);
           link.SetAttribute ("QueueSizeNode1", queueSizeNode1);
           link.SetAttribute ("QueueSizeNode2", queueSizeNode2);
                 
-          AddLink (link);
+            AddLink (link);
                 
-          linksNumber++;
+            linksNumber++;
         }
     }
-
+        
   NS_ASSERT (nodesNumber == totnode && linksNumber == totlink);
         
-  NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
-  topgen.close ();
-
+    NS_LOG_INFO ("Annotated topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
+    topgen.close ();
+        
   ApplySettings ();
   AssignCoordinates ();
   
-  return nodes;
+    return nodes;
 }
-
+    
 void
 AnnotatedTopologyReader::AssignIpv4Addresses (Ipv4Address base)
 {
   Ipv4AddressHelper address (base, Ipv4Mask ("/24"));
-
+    
   BOOST_FOREACH (const Link &link, m_linksList)
     {
       address.Assign (NetDeviceContainer (link.GetFromNetDevice (),
                                           link.GetToNetDevice ()));
-      
+        
       base = Ipv4Address (base.Get () + 256);
       address.SetBase (base, Ipv4Mask ("/24"));
-    }
-
+        }
+        
   ApplyOspfMetric ();
-}
-
+        }
+        
 void
 AnnotatedTopologyReader::ApplyOspfMetric ()
-{
-  BOOST_FOREACH (const Link &link, m_linksList)
     {
+  BOOST_FOREACH (const Link &link, m_linksList)
+        {
       uint16_t metric = boost::lexical_cast<uint16_t> (link.GetAttribute ("OSPF"));
-      
-      {
+        
+        {
         Ptr<Ipv4> ipv4 = link.GetFromNode ()->GetObject<Ipv4> ();
         NS_ASSERT (ipv4 != 0);
-
+        
         int32_t interfaceId = ipv4->GetInterfaceForDevice (link.GetFromNetDevice ());
         NS_ASSERT (interfaceId >= 0);
-
+        
         ipv4->SetMetric (interfaceId,metric);
-      }
-
-      {
+        }
+        
+        {
         Ptr<Ipv4> ipv4 = link.GetToNode ()->GetObject<Ipv4> ();
         NS_ASSERT (ipv4 != 0);
         
@@ -239,68 +239,68 @@
         NS_ASSERT (interfaceId >= 0);
 
         ipv4->SetMetric (interfaceId,metric);
-      }
     }
 }
+}
 
 void
 AnnotatedTopologyReader::ApplySettings ()
 {
   PointToPointHelper p2p;
-
+    
   // temporary queue, will be changed later
   p2p.SetQueue ("ns3::DropTailQueue",
                 "MaxPackets", StringValue("100"));
-  
+
   BOOST_FOREACH (Link &link, m_linksList)
     {
       NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate")+"Kbps");
       p2p.SetDeviceAttribute ("DataRate", StringValue(link.GetAttribute("DataRate")+"Kbps"));
-
+        
       NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay")+"ms");
       p2p.SetChannelAttribute ("Delay", StringValue(link.GetAttribute("Delay")+"ms"));
-      
+        
       NetDeviceContainer nd = p2p.Install(link.GetFromNode (), link.GetToNode ());
       link.SetNetDevices (nd.Get (0), nd.Get (1));
 
       NS_LOG_INFO ("Queue: " << link.GetAttribute("QueueSizeNode1") << " <==> " << link.GetAttribute("QueueSizeNode2"));
-      
+        
       PointerValue txQueueFrom;
       link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueueFrom);
       NS_ASSERT (txQueueFrom.Get<DropTailQueue> () != 0);
-
+        
       PointerValue txQueueTo;
       link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueueTo);
       NS_ASSERT (txQueueTo.Get<DropTailQueue> () != 0);
-      
+        
       txQueueFrom.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode1")));
       txQueueTo.  Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode2")));
-    }
-}
+        }
+        }
 
 void
 AnnotatedTopologyReader::AssignCoordinates ()
 {
   UniformVariable randX (m_ulx, m_lrx);
-  double x = 0.0;
+    double x = 0.0;
   UniformVariable randY (m_uly, m_lry);
-  double y = 0.0;
+    double y = 0.0;
 
   BOOST_FOREACH (Link &link, m_linksList)
     {
       Ptr<ConstantPositionMobilityModel> loc = link.GetFromNode ()->GetObject<ConstantPositionMobilityModel> ();
       if (loc != 0)
         continue; // no need to assign twice
-
-      loc = CreateObject<ConstantPositionMobilityModel> ();
+        
+            loc = CreateObject<ConstantPositionMobilityModel> ();
       link.GetFromNode ()->AggregateObject (loc);
         
       x = randX.GetValue();
       y = randY.GetValue();
-      NS_LOG_INFO("X = "<<x <<"Y = "<<y);
-
+        NS_LOG_INFO("X = "<<x <<"Y = "<<y);
+        
       loc->SetPosition (Vector (x, y, 0));
+        }
     }
-}
 
 }
diff --git a/model/annotated-topology-reader.h b/model/annotated-topology-reader.h
index 6eec5ad..6346b6a 100644
--- a/model/annotated-topology-reader.h
+++ b/model/annotated-topology-reader.h
@@ -27,18 +27,18 @@
 {
     
 /**
- * \brief This class reads annotated topology and apply settings to the corresponding nodes and links
- * Input File Format
- * 1st line is     NumberOfNodes    TAB     NumberofLinks
- * Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS TAB OSPF   TAB    DelayMiliseconds   TAB   QueueSizeInPacketsNode1     TAB    QueueSizeInPacketsNode2 
- *
- */
+* \brief This class reads annotated topology and apply settings to the corresponding nodes and links
+* Input File Format
+* 1st line is     NumberOfNodes    TAB     NumberofLinks
+* Nth line is     NodeID1  TAB    NodeID2   TAB  DataRateKBPS TAB OSPF   TAB    DelayMiliseconds   TAB   QueueSizeInPacketsNode1     TAB    QueueSizeInPacketsNode2    TAB    X-coordinate-node1     TAB    Y-coordinate-node1  TAB    X-coordinate-node2     TAB    Y-coordinate-node2
+*
+*/
 class AnnotatedTopologyReader : public TopologyReader
 {
 public:
-  typedef std::list< Link >::iterator LinksIterator;
-  static TypeId GetTypeId (void);
-
+    typedef std::list< Link >::iterator LinksIterator;
+    static TypeId GetTypeId (void);
+        
   /**
    * \brief Constructor
    *
@@ -47,19 +47,19 @@
    * \see ns3::Names class
    */
   AnnotatedTopologyReader (const std::string &path="");
-  virtual ~AnnotatedTopologyReader ();
-
-  /**
-   * \brief Main annotated topology reading function.
-   *
-   * This method opens an input stream and reads topology file with annotations.
-   *
-   * \return the container of the nodes created (or empty container if there was an error)
-   */
+    virtual ~AnnotatedTopologyReader ();
+        
+    /**
+    * \brief Main annotated topology reading function.
+    *
+    * This method opens an input stream and reads topology file with annotations.
+    *
+    * \return the container of the nodes created (or empty container if there was an error)
+    */
   virtual
   NodeContainer Read (void);
-
-  /**
+    
+    /**
    * \brief Set bounding box for the nodes
    */
   void
@@ -79,17 +79,17 @@
   
 private:
   /**
-   * \brief This method applies setting to corresponding nodes and links
-   * NetDeviceContainer must be allocated
-   * NodeContainer from Read method
-   */
+     * \brief This method applies setting to corresponding nodes and links
+     * NetDeviceContainer must be allocated
+     * NodeContainer from Read method
+     */
   void ApplySettings ();
   void AssignCoordinates ();
   void ApplyOspfMetric ();
-  
+    
 private:
-  AnnotatedTopologyReader (const AnnotatedTopologyReader&);
-  AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
+    AnnotatedTopologyReader (const AnnotatedTopologyReader&);
+    AnnotatedTopologyReader& operator= (const AnnotatedTopologyReader&);
 
   std::string m_path;
   double m_ulx;
diff --git a/model/rocketfuel-weights-reader.cc b/model/rocketfuel-weights-reader.cc
index 67559d5..30d0780 100644
--- a/model/rocketfuel-weights-reader.cc
+++ b/model/rocketfuel-weights-reader.cc
@@ -78,128 +78,7 @@
     std::map<std::string, Ptr<Node> > nodeMap;
     
     NodeContainer
-    RocketfuelWeightsReader::GenerateFromMapsFile (int argc, char *argv[])
-    {
-        std::string uid;
-        std::string loc;
-        std::string ptr;
-        std::string name;
-        std::string nuid;
-        bool dns = false;
-        bool bb = false;
-        int num_neigh_s = 0;
-        unsigned int num_neigh = 0;
-        int radius = 0;
-        std::vector <std::string> neigh_list;
-        NodeContainer nodes;
-        
-        uid = argv[0];
-        loc = argv[1];
-        
-        if (argv[2])
-        {
-            dns = true;
-        }
-        
-        if (argv[3])
-        {
-            bb = true;
-        }
-        
-        num_neigh_s = ::atoi (argv[4]);
-        if (num_neigh_s < 0)
-        {
-            num_neigh = 0;
-            NS_LOG_WARN ("Negative number of neighbors given");
-        }
-        else
-        {
-            num_neigh = num_neigh_s;
-        }
-        
-        /* neighbors */
-        if (argv[6])
-        {
-            char *nbr;
-            char *stringp = argv[6];
-            while ((nbr = strsep (&stringp, " \t")) != NULL)
-            {
-                nbr[strlen (nbr) - 1] = '\0';
-                neigh_list.push_back (nbr + 1);
-            }
-        }
-        if (num_neigh != neigh_list.size ())
-        {
-            NS_LOG_WARN ("Given number of neighbors = " << num_neigh << " != size of neighbors list = " << neigh_list.size ());
-        }
-        
-        /* externs */
-        if (argv[7])
-        {
-            //      euid = argv[7];
-        }
-        
-        /* name */
-        if (argv[8])
-        {
-            name = argv[8];
-        }
-        
-        radius = ::atoi (&argv[9][1]);
-        if (radius > 0)
-        {
-            return nodes;
-        }
-        
-        /* uid @loc [+] [bb] (num_neigh) [&ext] -> <nuid-1> <nuid-2> ... {-euid} ... =name[!] rn */
-        NS_LOG_INFO ("Load Node[" << uid << "]: location: " << loc << " dns: " << dns
-                     << " bb: " << bb << " neighbors: " << neigh_list.size ()
-                     << "(" << "%d" << ") externals: \"%s\"(%d) "
-                     << "name: " << name << " radius: " << radius);
-        
-        //cast bb and dns to void, to suppress variable set but not used compiler warning
-        //in optimized builds
-        (void) bb;
-        (void) dns;
-        
-        // Create node and link
-        if (!uid.empty ())
-        {
-            if (nodeMap[uid] == 0)
-            {
-                Ptr<Node> tmpNode = CreateObject<Node> ();
-                nodeMap[uid] = tmpNode;
-                nodes.Add (tmpNode);
-                nodesNumber++;
-            }
-            
-            for (uint32_t i = 0; i < neigh_list.size (); ++i)
-            {
-                nuid = neigh_list[i];
-                
-                if (nuid.empty ())
-                {
-                    return nodes;
-                }
-                
-                if (nodeMap[nuid] == 0)
-                {
-                    Ptr<Node> tmpNode = CreateObject<Node> ();
-                    nodeMap[nuid] = tmpNode;
-                    nodes.Add (tmpNode);
-                    nodesNumber++;
-                }
-                NS_LOG_INFO (linksNumber << ":" << nodesNumber << " From: " << uid << " to: " << nuid);
-                Link link (nodeMap[uid], uid, nodeMap[nuid], nuid);
-                AddLink (link);
-                linksNumber++;
-            }
-        }
-        return nodes;
-    }
-    
-    NodeContainer
-    RocketfuelWeightsReader::GenerateFromWeightsFile (int argc, char *argv[])
+    RocketfuelWeightsReader::GenerateFromWeightsFile (int argc, char *argv[], char *argl[])
     {
         /* uid @loc [+] [bb] (num_neigh) [&ext] -> <nuid-1> <nuid-2> ... {-euid} ... =name[!] rn */
         std::string sname;
@@ -210,6 +89,7 @@
         sname = argv[0];
         tname = argv[1];
         double v = strtod (argv[2], &endptr); // weight
+        double l = strtod (argl[2], &endptr); //latency
         // cast v to void , to suppress 'v' set but not used compiler warning
         //(void) v;
         
@@ -255,10 +135,19 @@
             if (!found)
             {
                 Link link (nodeMap[sname], sname, nodeMap[tname], tname);
+                
                 std::ostringstream s;
                 s << std::setprecision(2) << v;
                 std::string ss = s.str();
                 link.SetAttribute ("OSPF", ss);
+                
+                std::ostringstream s2;
+                s2 << std::setprecision(2) << l;
+                std::string ss2 = s2.str();
+                link.SetAttribute("Latency", ss2);
+                NS_LOG_INFO("Written Latency = " << ss2);
+                
+                
                 AddLink (link);
                 linksNumber++;
             }
@@ -307,16 +196,29 @@
         return RF_UNKNOWN;
     }
     
-    
     NodeContainer
     RocketfuelWeightsReader::Read (void)
     {
+        NodeContainer nodes;
+        NS_LOG_INFO("Not implemented");
+        return nodes;
+    }
+    
+    NodeContainer
+    RocketfuelWeightsReader::Read (std::string latenciesFile)
+    {
         std::ifstream topgen;
         topgen.open (GetFileName ().c_str ());
         NodeContainer nodes;
         
+        std::ifstream latencies;
+        latencies.open(latenciesFile.c_str());
+        
         std::istringstream lineBuffer;
+        std::istringstream lineBuffer2;
         std::string line;
+        std::string line2;
+        
         int lineNumber = 0;
         enum RF_FileType ftype = RF_UNKNOWN;
         char errbuf[512];
@@ -327,19 +229,31 @@
             return nodes;
         }
         
+        if (!latencies.is_open ())
+        {
+            NS_LOG_WARN ("Couldn't open Latencies file " << latenciesFile);
+            return nodes;
+        }
+        
         while (!topgen.eof ())
         {
             int ret;
             int argc;
             char *argv[REGMATCH_MAX];
+            char *argl[REGMATCH_MAX];
             char *buf;
+            char *buf2;
             
             lineNumber++;
             line.clear ();
+            line2.clear ();
             lineBuffer.clear ();
+            lineBuffer2.clear ();
             
             getline (topgen, line);
+            getline (latencies, line2);
             buf = (char *)line.c_str ();
+            buf2 = (char *)line2.c_str ();
             
             if (lineNumber == 1)
             {
@@ -383,6 +297,7 @@
                 }
                 
                 ret = regexec (&regex, buf, REGMATCH_MAX, regmatch, 0);
+                regexec (&regex, buf2, REGMATCH_MAX, regmatch, 0);
                 if (ret == REG_NOMATCH)
                 {
                     NS_LOG_WARN ("match failed (weights file): %s" << buf);
@@ -392,6 +307,7 @@
             }
             
             line = buf;
+            line2 = buf2;
             argc = 0;
             
             /* regmatch[0] is the entire strings that matched */
@@ -400,22 +316,26 @@
                 if (regmatch[i].rm_so == -1)
                 {
                     argv[i - 1] = NULL;
+                    argl[i - 1] = NULL;
                 }
                 else
                 {
                     line[regmatch[i].rm_eo] = '\0';
+                    line2[regmatch[i].rm_eo] = '\0';
                     argv[i - 1] = &line[regmatch[i].rm_so];
+                    argl[i - 1] = &line2[regmatch[i].rm_so];
                     argc = i;
                 }
             }
             
             if (ftype == RF_MAPS)
             {
-                nodes.Add (GenerateFromMapsFile (argc, argv));
+                NS_LOG_INFO("MAPS FILE is not supported");
+                //nodes.Add (GenerateFromMapsFile (argc, argv));
             }
             else if (ftype == RF_WEIGHTS)
             {
-                nodes.Add (GenerateFromWeightsFile (argc, argv));
+                nodes.Add (GenerateFromWeightsFile (argc, argv, argl));
             }
             else
             {
@@ -427,7 +347,7 @@
         
         
         topgen.close ();
-        
+        latencies.close ();
         NS_LOG_INFO ("Rocketfuel topology created with " << nodesNumber << " nodes and " << linksNumber << " links");
         return nodes;
     }
@@ -486,7 +406,11 @@
         for ( iter2 = this->LinksBegin (); iter2 != this->LinksEnd (); iter2++, i++ )
         {
             p2p.SetDeviceAttribute("DataRate", StringValue("9920000Kbps"));
-            p2p.SetChannelAttribute("Delay", StringValue("10ms"));
+            //p2p.SetChannelAttribute("Delay", StringValue("10ms"));
+            NS_LOG_INFO("Latency = " + iter2->GetAttribute("Latency")+"ms");
+            p2p.SetChannelAttribute("Delay", StringValue(iter2->GetAttribute("Latency")+"ms"));
+            
+
             p2p.SetQueue("ns3::DropTailQueue","MaxPackets",StringValue("100"));
             ndc[i] = p2p.Install(nc[i]);
             
diff --git a/model/rocketfuel-weights-reader.h b/model/rocketfuel-weights-reader.h
index bea3bff..9b89a92 100644
--- a/model/rocketfuel-weights-reader.h
+++ b/model/rocketfuel-weights-reader.h
@@ -77,6 +77,8 @@
          *
          * \return the container of the nodes created (or empty container if there was an error)
          */
+        NodeContainer Read (std::string latenciesFile);
+        
         virtual NodeContainer Read (void);
         
         void ApplySettings(NetDeviceContainer* ndc, NodeContainer* nc);
@@ -84,12 +86,9 @@
     private:
         RocketfuelWeightsReader (const RocketfuelWeightsReader&);
         RocketfuelWeightsReader& operator= (const RocketfuelWeightsReader&);
-        // Parser for the *.cch file available at:
-        // http://www.cs.washington.edu/research/networking/rocketfuel/maps/rocketfuel_maps_cch.tar.gz
-        NodeContainer GenerateFromMapsFile (int argc, char *argv[]);
         // Parser for the weights.* file available at:
         // http://www.cs.washington.edu/research/networking/rocketfuel/maps/weights-dist.tar.gz
-        NodeContainer GenerateFromWeightsFile (int argc, char *argv[]);
+        NodeContainer GenerateFromWeightsFile (int argc, char *argv[], char *argl[]);
         
         enum RF_FileType
         {