blob: 09f0d8cdc426bd2d90271c4393d095c9c7a63686 [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.
Alexander Afanasyev45b92d42011-08-14 23:11:38 -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.
Alexander Afanasyev45b92d42011-08-14 23:11:38 -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.
Alexander Afanasyev45b92d42011-08-14 23:11:38 -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.
Alexander Afanasyev45b92d42011-08-14 23:11:38 -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 **/
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070019
Alexander Afanasyev0c395372014-12-20 15:54:02 -080020#include "ndn-stack-helper.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080021
22#include "ns3/log.h"
23#include "ns3/names.h"
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080024#include "ns3/string.h"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080025#include "ns3/point-to-point-net-device.h"
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -070026#include "ns3/point-to-point-channel.h"
Chavoosh Ghasemi58ef8612018-09-12 15:12:49 -070027#include "ns3/node-list.h"
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -050028#include "ns3/simulator.h"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080029
Alexander Afanasyev6995bb72019-02-23 15:53:26 -050030#if HAVE_NS3_VISUALIZER
31#include "../../visualizer/model/visual-simulator-impl.h"
32#endif // HAVE_NS3_VISUALIZER
33
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080034#include "model/ndn-l3-protocol.hpp"
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080035#include "model/ndn-net-device-transport.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080036#include "utils/ndn-time.hpp"
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080037#include "utils/dummy-keychain.hpp"
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070038
39#include <limits>
40#include <map>
Alexander Afanasyevb7626842012-01-12 13:43:33 -080041#include <boost/lexical_cast.hpp>
Alexander Afanasyeva5bbe0e2011-11-22 17:28:39 -080042
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080043#include "ns3/ndnSIM/NFD/daemon/face/generic-link-service.hpp"
spirosmastorakis34eed982016-11-02 15:20:50 -070044#include "ns3/ndnSIM/NFD/daemon/table/cs-policy-priority-fifo.hpp"
45#include "ns3/ndnSIM/NFD/daemon/table/cs-policy-lru.hpp"
46
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080047NS_LOG_COMPONENT_DEFINE("ndn.StackHelper");
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070048
49namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070050namespace ndn {
Alexander Afanasyev122f3782013-02-02 00:04:40 -080051
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080052StackHelper::StackHelper()
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -050053 : m_isForwarderStatusManagerDisabled(false)
spirosmastorakis0df15ba2015-11-14 08:46:24 -080054 , m_isStrategyChoiceManagerDisabled(false)
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070055 , m_needSetDefaultRoutes(false)
56 , m_maxCsSize(100)
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070057{
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080058 setCustomNdnCxxClocks();
59
spirosmastorakis34eed982016-11-02 15:20:50 -070060 m_csPolicies.insert({"nfd::cs::lru", [] { return make_unique<nfd::cs::LruPolicy>(); }});
61 m_csPolicies.insert({"nfd::cs::priority_fifo", [] () { return make_unique<nfd::cs::PriorityFifoPolicy>(); }});
62
63 m_csPolicyCreationFunc = m_csPolicies["nfd::cs::lru"];
64
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080065 m_ndnFactory.SetTypeId("ns3::ndn::L3Protocol");
Alexander Afanasyev122f3782013-02-02 00:04:40 -080066
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080067 m_netDeviceCallbacks.push_back(
68 std::make_pair(PointToPointNetDevice::GetTypeId(),
69 MakeCallback(&StackHelper::PointToPointNetDeviceCallback, this)));
Alexander Afanasyev122f3782013-02-02 00:04:40 -080070 // default callback will be fired if non of others callbacks fit or did the job
Ilya Moiseenko25f7d4d2011-09-29 18:41:06 -070071}
Alexander Afanasyev122f3782013-02-02 00:04:40 -080072
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073StackHelper::~StackHelper()
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070074{
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070075}
76
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080077KeyChain&
78StackHelper::getKeyChain()
79{
Alexander Afanasyevdf26b5a2015-01-15 23:30:56 -080080 static ::ndn::KeyChain keyChain("pib-dummy", "tpm-dummy");
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080081 return keyChain;
82}
83
Alexander Afanasyev3a4a0b32012-06-28 14:14:22 -070084void
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080085StackHelper::setCustomNdnCxxClocks()
86{
87 ::ndn::time::setCustomClocks(make_shared<ns3::ndn::time::CustomSteadyClock>(),
88 make_shared<ns3::ndn::time::CustomSystemClock>());
89}
90
Spyridon Mastorakis588fd102014-11-20 19:50:02 -080091void
92StackHelper::SetDefaultRoutes(bool needSet)
93{
94 NS_LOG_FUNCTION(this << needSet);
95 m_needSetDefaultRoutes = needSet;
96}
97
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080098void
99StackHelper::SetStackAttributes(const std::string& attr1, const std::string& value1,
100 const std::string& attr2, const std::string& value2,
101 const std::string& attr3, const std::string& value3,
102 const std::string& attr4, const std::string& value4)
103{
104 if (attr1 != "")
105 m_ndnFactory.Set(attr1, StringValue(value1));
106 if (attr2 != "")
107 m_ndnFactory.Set(attr2, StringValue(value2));
108 if (attr3 != "")
109 m_ndnFactory.Set(attr3, StringValue(value3));
110 if (attr4 != "")
111 m_ndnFactory.Set(attr4, StringValue(value4));
112}
113
114void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800115StackHelper::setCsSize(size_t maxSize)
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800116{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800117 m_maxCsSize = maxSize;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800118}
119
spirosmastorakis34eed982016-11-02 15:20:50 -0700120void
121StackHelper::setPolicy(const std::string& policy)
122{
123 auto found = m_csPolicies.find(policy);
124 if (found != m_csPolicies.end()) {
125 m_csPolicyCreationFunc = found->second;
126 }
127 else {
128 NS_FATAL_ERROR("Cache replacement policy " << policy << " not found");
129 NS_LOG_DEBUG("Available cache replacement policies: ");
130 for (auto it = m_csPolicies.begin(); it != m_csPolicies.end(); it++) {
131 NS_LOG_DEBUG(" " << it->first);
132 }
133 }
134}
135
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500136void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800137StackHelper::Install(const NodeContainer& c) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700138{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800139 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500140 Install(*i);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800141 }
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700142}
143
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500144void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800145StackHelper::InstallAll() const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700146{
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500147 Install(NodeContainer::GetGlobal());
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700148}
149
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500150void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800151StackHelper::Install(Ptr<Node> node) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700152{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800153 if (node->GetObject<L3Protocol>() != 0) {
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700154 NS_FATAL_ERROR("Cannot re-install NDN stack on node "
155 << node->GetId());
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500156 return;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800157 }
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500158 Simulator::ScheduleWithContext(node->GetId(), Seconds(0), &StackHelper::doInstall, this, node);
Alexander Afanasyev6995bb72019-02-23 15:53:26 -0500159 ProcessWarmupEvents();
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500160}
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700161
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500162void
163StackHelper::doInstall(Ptr<Node> node) const
164{
165 // async install to ensure proper context
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800166 Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800167
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700168 if (m_isForwarderStatusManagerDisabled) {
169 ndn->getConfig().put("ndnSIM.disable_forwarder_status_manager", true);
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800170 }
171
172 if (m_isStrategyChoiceManagerDisabled) {
173 ndn->getConfig().put("ndnSIM.disable_strategy_choice_manager", true);
174 }
175
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800176 ndn->getConfig().put("tables.cs_max_packets", (m_maxCsSize == 0) ? 1 : m_maxCsSize);
177
Alexander Afanasyev8fbcc642019-07-27 16:53:37 -0400178 ndn->setCsReplacementPolicy(m_csPolicyCreationFunc);
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800179
180 // Aggregate L3Protocol on node (must be after setting ndnSIM CS)
181 node->AggregateObject(ndn);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800182
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800183 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
184 Ptr<NetDevice> device = node->GetDevice(index);
185 // This check does not make sense: LoopbackNetDevice is installed only if IP stack is installed,
186 // Normally, ndnSIM works without IP stack, so no reason to check
187 // if (DynamicCast<LoopbackNetDevice> (device) != 0)
188 // continue; // don't create face for a LoopbackNetDevice
Alexander Afanasyev11453142011-11-25 16:13:33 -0800189
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500190 this->createAndRegisterFace(node, ndn, device);
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800191 }
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700192}
193
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800194void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700195StackHelper::AddFaceCreateCallback(TypeId netDeviceType,
196 StackHelper::FaceCreateCallback callback)
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800197{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800198 m_netDeviceCallbacks.push_back(std::make_pair(netDeviceType, callback));
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800199}
200
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700201void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700202StackHelper::UpdateFaceCreateCallback(TypeId netDeviceType,
203 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700204{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800205 for (auto& i : m_netDeviceCallbacks) {
206 if (i.first == netDeviceType) {
207 i.second = callback;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800208 return;
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700209 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800210 }
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700211}
212
213void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700214StackHelper::RemoveFaceCreateCallback(TypeId netDeviceType,
215 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700216{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700217 m_netDeviceCallbacks.remove_if([&] (const std::pair<TypeId, FaceCreateCallback>& i) {
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800218 return (i.first == netDeviceType);
219 });
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700220}
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800221
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700222std::string
223constructFaceUri(Ptr<NetDevice> netDevice)
224{
225 std::string uri = "netdev://";
226 Address address = netDevice->GetAddress();
227 if (Mac48Address::IsMatchingType(address)) {
228 uri += "[" + boost::lexical_cast<std::string>(Mac48Address::ConvertFrom(address)) + "]";
229 }
230
231 return uri;
232}
233
234
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700235shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800236StackHelper::DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
237 Ptr<NetDevice> netDevice) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800238{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700239 NS_LOG_DEBUG("Creating default Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800240
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800241 // Create an ndnSIM-specific transport instance
242 ::nfd::face::GenericLinkService::Options opts;
243 opts.allowFragmentation = true;
244 opts.allowReassembly = true;
schneiderklaus5f5c9922018-07-25 20:35:03 -0700245 opts.allowCongestionMarking = true;
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800246
247 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
248
249 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
250 constructFaceUri(netDevice),
251 "netdev://[ff:ff:ff:ff:ff:ff]");
252
253 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700254 face->setMetric(1);
255
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800256 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700257 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800258 << face->getLocalUri());
Alexander Afanasyevc17e4bd2013-02-17 14:31:56 -0800259
260 return face;
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800261}
262
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700263shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800264StackHelper::PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
265 Ptr<NetDevice> device) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800266{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700267 NS_LOG_DEBUG("Creating point-to-point Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800268
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700269 Ptr<PointToPointNetDevice> netDevice = DynamicCast<PointToPointNetDevice>(device);
270 NS_ASSERT(netDevice != nullptr);
271
272 // access the other end of the link
273 Ptr<PointToPointChannel> channel = DynamicCast<PointToPointChannel>(netDevice->GetChannel());
274 NS_ASSERT(channel != nullptr);
275
276 Ptr<NetDevice> remoteNetDevice = channel->GetDevice(0);
277 if (remoteNetDevice->GetNode() == node)
278 remoteNetDevice = channel->GetDevice(1);
279
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800280 // Create an ndnSIM-specific transport instance
281 ::nfd::face::GenericLinkService::Options opts;
282 opts.allowFragmentation = true;
283 opts.allowReassembly = true;
schneiderklaus5f5c9922018-07-25 20:35:03 -0700284 opts.allowCongestionMarking = true;
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700285
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800286 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
287
288 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
289 constructFaceUri(netDevice),
290 constructFaceUri(remoteNetDevice));
291
292 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700293 face->setMetric(1);
294
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800295 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700296 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800297 << face->getLocalUri());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800298
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800299 return face;
300}
301
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500302void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800303StackHelper::Install(const std::string& nodeName) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700304{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800305 Ptr<Node> node = Names::Find<Node>(nodeName);
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500306 Install(node);
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700307}
308
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700309void
310StackHelper::Update(Ptr<Node> node)
311{
312 if (node->GetObject<L3Protocol>() == 0) {
313 Install(node);
314 return;
315 }
316
317 Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
318
319 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
320
321 Ptr<NetDevice> device = node->GetDevice(index);
322
323 if (ndn->getFaceByNetDevice(device) == nullptr) {
324 this->createAndRegisterFace(node, ndn, device);
325 }
326 }
327}
328
329void
330StackHelper::Update(const NodeContainer& c)
331{
332 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
333 Update(*i);
334 }
335}
336
337void
338StackHelper::Update(const std::string& nodeName)
339{
340 Ptr<Node> node = Names::Find<Node>(nodeName);
341 Update(node);
342}
343
344void
345StackHelper::UpdateAll()
346{
347 Update(NodeContainer::GetGlobal());
348}
349
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700350shared_ptr<Face>
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700351StackHelper::createAndRegisterFace(Ptr<Node> node, Ptr<L3Protocol> ndn, Ptr<NetDevice> device) const
352{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700353 shared_ptr<Face> face;
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700354
355 for (const auto& item : m_netDeviceCallbacks) {
356 if (device->GetInstanceTypeId() == item.first ||
357 device->GetInstanceTypeId().IsChildOf(item.first)) {
358 face = item.second(node, ndn, device);
359 if (face != 0)
360 break;
361 }
362 }
363
364 if (face == 0) {
365 face = DefaultNetDeviceCallback(node, ndn, device);
366 }
367
368 if (m_needSetDefaultRoutes) {
369 // default route with lowest priority possible
Alexander Afanasyev6995bb72019-02-23 15:53:26 -0500370 FibHelper::AddRoute(node, "/", face, std::numeric_limits<int32_t>::max());
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700371 }
372 return face;
373}
374
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800375void
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800376StackHelper::disableStrategyChoiceManager()
377{
378 m_isStrategyChoiceManagerDisabled = true;
379}
380
381void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700382StackHelper::disableForwarderStatusManager()
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800383{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700384 m_isForwarderStatusManagerDisabled = true;
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800385}
386
Chavoosh Ghasemi58ef8612018-09-12 15:12:49 -0700387void
388StackHelper::SetLinkDelayAsFaceMetric()
389{
390 for (uint32_t i = 0; i < NodeList::GetNNodes(); ++i) {
391 auto ndn = NodeList::GetNode(i)->GetObject<L3Protocol>();
392 if (ndn == nullptr)
393 continue;
394
395 for (auto& face : ndn->getForwarder()->getFaceTable()) {
396 auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
397 if (transport == nullptr)
398 continue;
399 auto p2p = dynamic_cast<PointToPointChannel*>(&(*(transport->GetNetDevice()->GetChannel())));
400 TimeValue currentDelay;
401 p2p->GetAttribute("Delay", currentDelay);
402 face.setMetric((currentDelay.Get().ToDouble(Time::S)) * 1000);
403
404 std::cout << "Node " << i << ": Face " << face.getId()
405 << " with metric " << face.getMetric() << "\n";
406 }
407 }
408}
409
Alexander Afanasyev6995bb72019-02-23 15:53:26 -0500410void
411StackHelper::ProcessWarmupEvents()
412{
413 Simulator::Stop(Seconds(0));
414#if HAVE_NS3_VISUALIZER
415 auto impl = DynamicCast<VisualSimulatorImpl>(Simulator::GetImplementation());
416 if (impl != nullptr) {
417 impl->RunRealSimulator();
418 }
419 else {
420 Simulator::Run();
421 }
422#else
423 Simulator::Run();
424#endif // HAVE_NS3_VISUALIZER
425}
426
427
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700428} // namespace ndn
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700429} // namespace ns3