blob: 2f066dc15d66b46b4ec470796316b35c840fb84e [file] [log] [blame]
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
3 * Copyright (c) 2011-2015 Regents of the University of California.
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -07004 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08005 * This file is part of ndnSIM. See AUTHORS for complete list of ndnSIM authors and
6 * contributors.
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -07007 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -08008 * ndnSIM is free software: you can redistribute it and/or modify it under the terms
9 * of the GNU General Public License as published by the Free Software Foundation,
10 * either version 3 of the License, or (at your option) any later version.
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070011 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080012 * ndnSIM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
13 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 * PURPOSE. See the GNU General Public License for more details.
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070015 *
Alexander Afanasyev60a7b622014-12-20 17:04:07 -080016 * You should have received a copy of the GNU General Public License along with
17 * ndnSIM, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
18 **/
19
20// Based on the code by Hajime Tazaki <tazaki@sfc.wide.ad.jp>
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070021
22#ifndef __ANNOTATED_TOPOLOGY_READER_H__
23#define __ANNOTATED_TOPOLOGY_READER_H__
24
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -070025#include "ns3/topology-reader.h"
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070026#include "ns3/random-variable-stream.h"
Alexander Afanasyev7dbdcaf2011-12-13 21:40:37 -080027#include "ns3/object-factory.h"
Alexander Afanasyev59090db2020-02-21 16:37:43 -050028#include "ns3/node-container.h"
Ilya Moiseenko58d26672011-12-08 13:48:06 -080029
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080030namespace ns3 {
31
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070032/**
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080033 * \brief This class reads annotated topology and apply settings to the corresponding nodes and
34 *links
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080035 *
36 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080037class AnnotatedTopologyReader : public TopologyReader {
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -070038public:
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080039 /**
40 * \brief Constructor
41 *
42 * \param path ns3::Names path
Alexander Afanasyev011b8592011-12-21 14:45:27 -080043 * \param scale Scaling factor for coordinates in input file
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080044 *
45 * \see ns3::Names class
46 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047 AnnotatedTopologyReader(const std::string& path = "", double scale = 1.0);
48 virtual ~AnnotatedTopologyReader();
49
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080050 /**
51 * \brief Main annotated topology reading function.
52 *
53 * This method opens an input stream and reads topology file with annotations.
54 *
55 * \return the container of the nodes created (or empty container if there was an error)
56 */
Alexander Afanasyev5beb35a2011-12-21 16:45:13 -080057 virtual NodeContainer
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080058 Read();
Alexander Afanasyev5beb35a2011-12-21 16:45:13 -080059
60 /**
61 * \brief Get nodes read by the reader
62 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -070063 virtual NodeContainer
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080064 GetNodes() const;
65
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080066 /**
Ilya Moiseenkoad9e8ab2012-01-11 19:58:34 -080067 * \brief Get links read by the reader
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080068 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -070069 virtual const std::list<Link>&
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070 GetLinks() const;
71
Ilya Moiseenkoad9e8ab2012-01-11 19:58:34 -080072 /**
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -080073 * \brief Assign IPv4 addresses to all links
74 *
75 * Note, IPv4 stack should be installed on all nodes prior this call
76 *
77 * Every link will receive /24 netmask
78 *
79 * \param base Starting IPv4 address (second link will have base+256)
80 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -070081 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080082 AssignIpv4Addresses(Ipv4Address base);
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080083
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -080084 /**
85 * \brief Set bounding box where nodes will be randomly places (if positions are unspecified)
86 * \param ulx Upper left x coordinate
87 * \param uly Upper left y coordinate
88 * \param lrx Lower right x coordinate
89 * \param lry Lower right y coordinate
90 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -070091 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080092 SetBoundingBox(double ulx, double uly, double lrx, double lry);
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -080093
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -080094 /**
95 * \brief Set mobility model to be used on nodes
96 * \param model class name of the model
97 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -070098 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080099 SetMobilityModel(const std::string& model);
Alexander Afanasyev7dbdcaf2011-12-13 21:40:37 -0800100
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800101 /**
102 * \brief Apply OSPF metric on Ipv4 (if exists) and Ccnx (if exists) stacks
103 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -0700104 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800105 ApplyOspfMetric();
Alexander Afanasyev8e0d2812012-01-19 22:38:14 -0800106
Alexander Afanasyeved78b632012-01-25 19:26:43 -0800107 /**
108 * \brief Save positions (e.g., after manual modification using visualizer)
109 */
Alexander Afanasyev455e4412013-05-11 12:51:11 -0700110 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800111 SaveTopology(const std::string& file);
Alexander Afanasyeved78b632012-01-25 19:26:43 -0800112
Alexander Afanasyev455e4412013-05-11 12:51:11 -0700113 /**
114 * \brief Save topology in graphviz format (.dot file)
115 */
116 virtual void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800117 SaveGraphviz(const std::string& file);
118
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800119protected:
120 Ptr<Node>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800121 CreateNode(const std::string name, uint32_t systemId);
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800122
123 Ptr<Node>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800124 CreateNode(const std::string name, double posX, double posY, uint32_t systemId);
125
Alexander Afanasyev7dbdcaf2011-12-13 21:40:37 -0800126protected:
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800127 /**
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800128 * \brief This method applies setting to corresponding nodes and links
129 * NetDeviceContainer must be allocated
130 * NodeContainer from Read method
131 */
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800132 void
133 ApplySettings();
134
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800135protected:
136 std::string m_path;
Alexander Afanasyev5beb35a2011-12-21 16:45:13 -0800137 NodeContainer m_nodes;
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800138
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800139private:
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800140 AnnotatedTopologyReader(const AnnotatedTopologyReader&);
141 AnnotatedTopologyReader&
142 operator=(const AnnotatedTopologyReader&);
Alexander Afanasyev8633d5d2011-12-12 18:02:31 -0800143
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -0700144 Ptr<UniformRandomVariable> m_randX;
145 Ptr<UniformRandomVariable> m_randY;
Alexander Afanasyev7dbdcaf2011-12-13 21:40:37 -0800146
147 ObjectFactory m_mobilityFactory;
Alexander Afanasyev011b8592011-12-21 14:45:27 -0800148 double m_scale;
Alexander Afanasyevff6e3692012-07-30 00:11:02 -0700149
150 uint32_t m_requiredPartitions;
Ilya Moiseenko7dd43be2011-08-18 18:57:12 -0700151};
Alexander Afanasyevae3b7c32011-12-13 13:20:06 -0800152}
Ilya Moiseenko1eff17d2011-08-17 10:55:53 -0700153
154#endif