blob: eb56339d858ed75177da60e8f46722056360b26d [file] [log] [blame]
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2011 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Ilya Moiseenko <iliamo@cs.ucla.edu>
19 */
20
21#include "annotated-topology-reader.h"
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070022
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080023#include "ns3/nstime.h"
24#include "ns3/log.h"
25#include "ns3/assert.h"
26#include "ns3/names.h"
27#include "ns3/net-device-container.h"
28#include "ns3/point-to-point-helper.h"
29#include "ns3/point-to-point-net-device.h"
30#include "ns3/internet-stack-helper.h"
31#include "ns3/ipv4-address-helper.h"
32#include "ns3/ipv4-global-routing-helper.h"
33#include "ns3/drop-tail-queue.h"
34#include "ns3/ipv4-interface.h"
35#include "ns3/ipv4.h"
36#include "ns3/string.h"
37#include "ns3/pointer.h"
38#include "ns3/uinteger.h"
39#include "ns3/ipv4-address.h"
40
41#include "ns3/constant-position-mobility-model.h"
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080042
43#include <boost/foreach.hpp>
44#include <boost/lexical_cast.hpp>
45
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -080046#include <set>
47
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070048using namespace std;
49
50namespace ns3
51{
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070052
53NS_LOG_COMPONENT_DEFINE ("AnnotatedTopologyReader");
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070054
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080055AnnotatedTopologyReader::AnnotatedTopologyReader (const std::string &path)
56 : m_path (path)
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080057 , m_randX (0, 100.0)
58 , m_randY (0, 100.0)
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070059{
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -080060 NS_LOG_FUNCTION (this);
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070061}
62
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080063void
64AnnotatedTopologyReader::SetBoundingBox (double ulx, double uly, double lrx, double lry)
65{
66 NS_LOG_FUNCTION (this << ulx << uly << lrx << lry);
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080067
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080068 m_randX = UniformVariable (ulx, lrx);
69 m_randY = UniformVariable (uly, lry);
70}
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080071
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070072AnnotatedTopologyReader::~AnnotatedTopologyReader ()
73{
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -080074 NS_LOG_FUNCTION (this);
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070075}
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -080076
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080077Ptr<Node>
78AnnotatedTopologyReader::CreateNode (const std::string name)
79{
80 return CreateNode (name, m_randX.GetValue (), m_randX.GetValue ());
81}
82
83Ptr<Node>
84AnnotatedTopologyReader::CreateNode (const std::string name, double posX, double posY)
85{
86 Ptr<Node> node = CreateObject<Node> ();
87 Ptr<ConstantPositionMobilityModel> loc = CreateObject<ConstantPositionMobilityModel> ();
88 node->AggregateObject (loc);
89
90 loc->SetPosition (Vector (posX, posY, 0));
91
92 Names::Add (m_path, name, node);
93
94 return node;
95}
96
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070097NodeContainer
98AnnotatedTopologyReader::Read (void)
99{
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800100 ifstream topgen;
101 topgen.open (GetFileName ().c_str ());
102 NodeContainer nodes;
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700103
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800104 if ( !topgen.is_open () )
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700105 {
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800106 NS_LOG_ERROR ("Cannot open file " << GetFileName () << " for reading");
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800107 return nodes;
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700108 }
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800109
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800110 while (!topgen.eof ())
111 {
112 string line;
113 getline (topgen, line);
114
115 if (line == "router") break;
116 }
117
118 while (!topgen.eof ())
119 {
120 string line;
121 getline (topgen,line);
122 if (line[0] == '#') continue; // comments
123 if (line=="link") break; // stop reading nodes
124
125 istringstream lineBuffer (line);
126 string name, city;
127 double latitude, longitude;
128
129 lineBuffer >> name >> city >> latitude >> longitude;
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800130 Ptr<Node> node = CreateNode (name, 2*longitude, -2*latitude);
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800131 nodes.Add (node);
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800132 }
133
134 map<string, set<string> > processedLinks; // to eliminate duplications
135
136 // SeekToSection ("link");
137 while (!topgen.eof ())
138 {
139 string line;
140 getline (topgen,line);
141 if (line == "") continue;
142 if (line[0] == '#') continue; // comments
143
144 // NS_LOG_DEBUG ("Input: [" << line << "]");
145
146 istringstream lineBuffer (line);
147 string from, to, capacity, metric;
148
149 lineBuffer >> from >> to >> capacity >> metric;
150
151 if (processedLinks[to].size () != 0 &&
152 processedLinks[to].find (from) != processedLinks[to].end ())
153 {
154 continue; // duplicated link
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700155 }
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800156 processedLinks[from].insert (to);
157
158 Ptr<Node> fromNode = Names::Find<Node> (m_path, from);
159 NS_ASSERT (fromNode != 0);
160 Ptr<Node> toNode = Names::Find<Node> (m_path, to);
161 NS_ASSERT (fromNode != 0);
162
163 Link link (fromNode, from, toNode, to);
164
165 link.SetAttribute ("DataRate", capacity);
166 link.SetAttribute ("OSPF", metric);
167 // link.SetAttribute ("Delay", delay);
168 // link.SetAttribute ("QueueSizeNode1", queueSizeNode1);
169 // link.SetAttribute ("QueueSizeNode2", queueSizeNode2);
170
171 AddLink (link);
172 NS_LOG_DEBUG ("New link " << from << " <==> " << to << " / " << capacity << "Kbps with " << metric << " metric");
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700173 }
174
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800175 NS_LOG_INFO ("Annotated topology created with " << nodes.GetN () << " nodes and " << LinksSize () << " links");
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800176 topgen.close ();
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700177
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800178 ApplySettings ();
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800179
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800180 return nodes;
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700181}
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700182
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800183void
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800184AnnotatedTopologyReader::AssignIpv4Addresses (Ipv4Address base)
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800185{
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800186 Ipv4AddressHelper address (base, Ipv4Mask ("/24"));
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700187
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800188 BOOST_FOREACH (const Link &link, m_linksList)
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800189 {
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800190 address.Assign (NetDeviceContainer (link.GetFromNetDevice (),
191 link.GetToNetDevice ()));
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700192
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800193 base = Ipv4Address (base.Get () + 256);
194 address.SetBase (base, Ipv4Mask ("/24"));
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800195 }
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700196
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800197 ApplyOspfMetric ();
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800198}
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700199
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800200void
201AnnotatedTopologyReader::ApplyOspfMetric ()
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800202{
Alexander Afanasyev0777f1c2011-12-12 20:22:45 -0800203 BOOST_FOREACH (const Link &link, m_linksList)
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800204 {
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800205 uint16_t metric = boost::lexical_cast<uint16_t> (link.GetAttribute ("OSPF"));
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700206
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800207 {
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800208 Ptr<Ipv4> ipv4 = link.GetFromNode ()->GetObject<Ipv4> ();
209 NS_ASSERT (ipv4 != 0);
Alexander Afanasyev0777f1c2011-12-12 20:22:45 -0800210
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800211 int32_t interfaceId = ipv4->GetInterfaceForDevice (link.GetFromNetDevice ());
212 NS_ASSERT (interfaceId >= 0);
Alexander Afanasyev0777f1c2011-12-12 20:22:45 -0800213
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800214 ipv4->SetMetric (interfaceId,metric);
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800215 }
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700216
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800217 {
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800218 Ptr<Ipv4> ipv4 = link.GetToNode ()->GetObject<Ipv4> ();
219 NS_ASSERT (ipv4 != 0);
220
221 int32_t interfaceId = ipv4->GetInterfaceForDevice (link.GetToNetDevice ());
222 NS_ASSERT (interfaceId >= 0);
223
224 ipv4->SetMetric (interfaceId,metric);
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800225 }
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800226 }
227}
228
229void
230AnnotatedTopologyReader::ApplySettings ()
231{
232 PointToPointHelper p2p;
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800233
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800234 // temporary queue, will be changed later
235 p2p.SetQueue ("ns3::DropTailQueue",
236 "MaxPackets", StringValue("100"));
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800237
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800238 BOOST_FOREACH (Link &link, m_linksList)
239 {
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800240 string tmp;
241
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800242 NS_LOG_INFO ("DataRate = " + link.GetAttribute("DataRate")+"Kbps");
243 p2p.SetDeviceAttribute ("DataRate", StringValue(link.GetAttribute("DataRate")+"Kbps"));
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800244
245 if (link.GetAttributeFailSafe("Delay", tmp))
246 {
247 NS_LOG_INFO ("Delay = " + link.GetAttribute("Delay")+"ms");
248 p2p.SetChannelAttribute ("Delay", StringValue(link.GetAttribute("Delay")+"ms"));
249 }
250 else
251 {
252 NS_LOG_INFO ("Default delay 1ms");
253 p2p.SetChannelAttribute ("Delay", StringValue("1ms"));
254 }
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800255
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800256 NetDeviceContainer nd = p2p.Install(link.GetFromNode (), link.GetToNode ());
257 link.SetNetDevices (nd.Get (0), nd.Get (1));
258
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800259 // NS_LOG_INFO ("Queue: " << link.GetAttribute("QueueSizeNode1") << " <==> " << link.GetAttribute("QueueSizeNode2"));
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800260
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800261 if (link.GetAttributeFailSafe("QueueSizeNode1", tmp))
262 {
263 PointerValue txQueueFrom;
264 link.GetFromNetDevice ()->GetAttribute ("TxQueue", txQueueFrom);
265 NS_ASSERT (txQueueFrom.Get<DropTailQueue> () != 0);
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800266
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800267 txQueueFrom.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode1")));
268 }
269
270 if (link.GetAttributeFailSafe("QueueSizeNode2", tmp))
271 {
272 PointerValue txQueueTo;
273 link.GetToNetDevice ()->GetAttribute ("TxQueue", txQueueTo);
274 NS_ASSERT (txQueueTo.Get<DropTailQueue> () != 0);
Ilya Moiseenko7e14efa2011-12-12 17:56:22 -0800275
Alexander Afanasyeva174aa52011-12-13 01:30:32 -0800276 txQueueTo.Get<DropTailQueue> ()->SetAttribute ("MaxPackets", StringValue (link.GetAttribute("QueueSizeNode2")));
Ilya Moiseenko58d26672011-12-08 13:48:06 -0800277 }
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800278 }
Alexander Afanasyev66e6fd72011-12-12 21:34:51 -0800279}
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800280
281}