NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
ndn-scenario-helper.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
20 #include "ndn-scenario-helper.hpp"
21 #include "ndn-fib-helper.hpp"
22 #include "ndn-app-helper.hpp"
23 
24 #include "ns3/ndnSIM/model/ndn-l3-protocol.hpp"
25 
26 #include "ns3/names.h"
27 #include "ns3/point-to-point-helper.h"
28 #include "ns3/string.h"
29 
30 namespace ns3 {
31 namespace ndn {
32 
34  : m_isTopologyInitialized(false)
35 {
36 }
37 
38 void
39 ScenarioHelper::createTopology(std::initializer_list<std::initializer_list<std::string>/*node clique*/> topology,
40  bool shouldInstallNdnStack)
41 {
42  if (m_isTopologyInitialized) {
43  throw std::logic_error("Topology cannot be created twice");
44  }
45 
46  PointToPointHelper p2p;
47 
48  for (auto&& clique : topology) {
49  for (auto i = clique.begin(); i != clique.end(); ++i) {
50  auto node1 = getOrCreateNode(*i);
51  for (auto j = i + 1; j != clique.end(); ++j) {
52  auto node2 = getOrCreateNode(*j);
53 
54  auto link = p2p.Install(node1, node2);
55  links[*i][*j] = link.Get(0);
56  links[*j][*i] = link.Get(1);
57  }
58  }
59  }
60 
61  if (shouldInstallNdnStack) {
62  ndnHelper.InstallAll();
63  }
64  m_isTopologyInitialized = true;
65 }
66 
67 void
69 {
70  ndnHelper.disableRibManager();
71 }
72 
73 // void
74 // ScenarioHelper::disableFaceManager()
75 // {
76 // ndnHelper.disableFaceManager();
77 // }
78 
79 void
81 {
82  ndnHelper.disableStrategyChoiceManager();
83 }
84 
85 void
87 {
89 }
90 
91 void
92 ScenarioHelper::addRoutes(std::initializer_list<ScenarioHelper::RouteInfo> routes)
93 {
94  for (auto&& route : routes) {
95  FibHelper::AddRoute(getNode(route.node1), route.prefix,
96  getFace(route.node1, route.node2), route.metric);
97  }
98 }
99 
100 void
101 ScenarioHelper::addApps(std::initializer_list<ScenarioHelper::AppInfo> apps)
102 {
103  for (auto&& app : apps) {
104  AppHelper appHelper(app.name);
105  for (auto&& param : app.params) {
106  appHelper.SetAttribute(param.first, StringValue(param.second));
107  }
108  auto installedApp = appHelper.Install(getNode(app.node));
109  installedApp.Start(Time(app.start));
110  installedApp.Stop(Time(app.end));
111  }
112 }
113 
114 Ptr<Node>
115 ScenarioHelper::getOrCreateNode(const std::string& nodeName)
116 {
117  auto node = nodes.find(nodeName);
118  if (node == nodes.end()) {
119  std::tie(node, std::ignore) = nodes.insert(std::make_pair(nodeName, CreateObject<Node>()));
120  Names::Add(nodeName, node->second);
121  }
122  return node->second;
123 }
124 
125 Ptr<Node>
126 ScenarioHelper::getNode(const std::string& nodeName)
127 {
128  auto node = nodes.find(nodeName);
129  if (node != nodes.end()) {
130  return node->second;
131  }
132 
133  throw std::invalid_argument("Node " + nodeName + " does not exist");
134 }
135 
136 shared_ptr<Face>
137 ScenarioHelper::getFace(const std::string& node1, const std::string& node2)
138 {
139  Ptr<NetDevice> netDevice = getNetDevice(node1, node2);
140  return netDevice->GetNode()->GetObject<L3Protocol>()->getFaceByNetDevice(netDevice);
141 }
142 
143 Ptr<NetDevice>
144 ScenarioHelper::getNetDevice(const std::string& node1, const std::string& node2)
145 {
146  auto i = links.find(node1);
147  if (i != links.end()) {
148  auto j = i->second.find(node2);
149  if (j != i->second.end()) {
150  return j->second;
151  }
152  }
153 
154  throw std::invalid_argument("Link between " + node1 + " and " + node2 + " does not exist");
155 }
156 
159 {
160  return ndnHelper;
161 }
162 
163 } // namespace ndn
164 } // namespace ns3
Copyright (c) 2011-2015 Regents of the University of California.
void SetAttribute(std::string name, const AttributeValue &value)
Helper function used to set the underlying application attributes.
Ptr< Node > getNode(const std::string &nodeName)
Get node.
void disableRibManager()
Disable RIB Manager.
void disableForwarderStatusManager()
Disable Forwarder Status Manager.
void createTopology(std::initializer_list< std::initializer_list< std::string >> topology, bool shouldInstallNdnStack=true)
Create topology.
static void AddRoute(Ptr< Node > node, const Name &prefix, shared_ptr< Face > face, int32_t metric)
Add forwarding entry to FIB.
Ptr< NetDevice > getNetDevice(const std::string &node1, const std::string &node2)
Get NetDevice on the node1 pointing towards node2.
void disableForwarderStatusManager()
Disable Forwarder Status Manager.
shared_ptr< Face > getFace(const std::string &node1, const std::string &node2)
Get face on the node1 pointing towards node2.
StackHelper & getStackHelper()
Get NDN stack helper, e.g., to adjust its parameters.
ApplicationContainer Install(NodeContainer c)
Install an ns3::NdnConsumer on each node of the input container configured with all the attributes se...
Helper class to install NDN stack and configure its parameters.
Copyright (c) 2011-2015 Regents of the University of California.
void disableRibManager()
Disable the RIB manager of NFD.
Ptr< FaceContainer > InstallAll() const
Install Ndn stack on all nodes in the simulation.
Implementation network-layer of NDN stack.
void addRoutes(std::initializer_list< RouteInfo > routes)
Create routes between topology nodes.
void disableStrategyChoiceManager()
Disable Face Manager.
void addApps(std::initializer_list< AppInfo > apps)
Create and install application on nodes.
A helper to make it easier to instantiate an ns3::ndn::App applications on a set of nodes...
void disableStrategyChoiceManager()
Disable Face Manager.