blob: 3b5571a3f7f4eb3cfdd36a402ea8b1682e822e12 [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"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080027
28#include "model/ndn-l3-protocol.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070029#include "model/ndn-net-device-link-service.hpp"
30#include "model/null-transport.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080031#include "utils/ndn-time.hpp"
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080032#include "utils/dummy-keychain.hpp"
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080033#include "model/cs/ndn-content-store.hpp"
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070034
35#include <limits>
36#include <map>
Alexander Afanasyevb7626842012-01-12 13:43:33 -080037#include <boost/lexical_cast.hpp>
Alexander Afanasyeva5bbe0e2011-11-22 17:28:39 -080038
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080039NS_LOG_COMPONENT_DEFINE("ndn.StackHelper");
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070040
41namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070042namespace ndn {
Alexander Afanasyev122f3782013-02-02 00:04:40 -080043
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080044StackHelper::StackHelper()
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070045 : m_isRibManagerDisabled(false)
46 // , m_isFaceManagerDisabled(false)
47 , m_isForwarderStatusManagerDisabled(false)
spirosmastorakis0df15ba2015-11-14 08:46:24 -080048 , m_isStrategyChoiceManagerDisabled(false)
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070049 , m_needSetDefaultRoutes(false)
50 , m_maxCsSize(100)
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070051{
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080052 setCustomNdnCxxClocks();
53
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080054 m_ndnFactory.SetTypeId("ns3::ndn::L3Protocol");
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080055 m_contentStoreFactory.SetTypeId("ns3::ndn::cs::Lru");
Alexander Afanasyev122f3782013-02-02 00:04:40 -080056
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080057 m_netDeviceCallbacks.push_back(
58 std::make_pair(PointToPointNetDevice::GetTypeId(),
59 MakeCallback(&StackHelper::PointToPointNetDeviceCallback, this)));
Alexander Afanasyev122f3782013-02-02 00:04:40 -080060 // default callback will be fired if non of others callbacks fit or did the job
Ilya Moiseenko25f7d4d2011-09-29 18:41:06 -070061}
Alexander Afanasyev122f3782013-02-02 00:04:40 -080062
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080063StackHelper::~StackHelper()
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070064{
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070065}
66
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080067KeyChain&
68StackHelper::getKeyChain()
69{
Alexander Afanasyevdf26b5a2015-01-15 23:30:56 -080070 static ::ndn::KeyChain keyChain("pib-dummy", "tpm-dummy");
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080071 return keyChain;
72}
73
Alexander Afanasyev3a4a0b32012-06-28 14:14:22 -070074void
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080075StackHelper::setCustomNdnCxxClocks()
76{
77 ::ndn::time::setCustomClocks(make_shared<ns3::ndn::time::CustomSteadyClock>(),
78 make_shared<ns3::ndn::time::CustomSystemClock>());
79}
80
Spyridon Mastorakis588fd102014-11-20 19:50:02 -080081void
82StackHelper::SetDefaultRoutes(bool needSet)
83{
84 NS_LOG_FUNCTION(this << needSet);
85 m_needSetDefaultRoutes = needSet;
86}
87
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080088void
89StackHelper::SetStackAttributes(const std::string& attr1, const std::string& value1,
90 const std::string& attr2, const std::string& value2,
91 const std::string& attr3, const std::string& value3,
92 const std::string& attr4, const std::string& value4)
93{
94 if (attr1 != "")
95 m_ndnFactory.Set(attr1, StringValue(value1));
96 if (attr2 != "")
97 m_ndnFactory.Set(attr2, StringValue(value2));
98 if (attr3 != "")
99 m_ndnFactory.Set(attr3, StringValue(value3));
100 if (attr4 != "")
101 m_ndnFactory.Set(attr4, StringValue(value4));
102}
103
104void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800105StackHelper::SetOldContentStore(const std::string& contentStore, const std::string& attr1,
106 const std::string& value1, const std::string& attr2,
107 const std::string& value2, const std::string& attr3,
108 const std::string& value3, const std::string& attr4,
109 const std::string& value4)
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800110{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800111 m_maxCsSize = 0;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800112
113 m_contentStoreFactory.SetTypeId(contentStore);
114 if (attr1 != "")
115 m_contentStoreFactory.Set(attr1, StringValue(value1));
116 if (attr2 != "")
117 m_contentStoreFactory.Set(attr2, StringValue(value2));
118 if (attr3 != "")
119 m_contentStoreFactory.Set(attr3, StringValue(value3));
120 if (attr4 != "")
121 m_contentStoreFactory.Set(attr4, StringValue(value4));
122}
123
124void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800125StackHelper::setCsSize(size_t maxSize)
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800126{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800127 m_maxCsSize = maxSize;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800128}
129
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700130Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800131StackHelper::Install(const NodeContainer& c) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700132{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800133 Ptr<FaceContainer> faces = Create<FaceContainer>();
134 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
135 faces->AddAll(Install(*i));
136 }
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700137 return faces;
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700138}
139
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700140Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800141StackHelper::InstallAll() const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700142{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800143 return Install(NodeContainer::GetGlobal());
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700144}
145
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700146Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800147StackHelper::Install(Ptr<Node> node) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700148{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800149 Ptr<FaceContainer> faces = Create<FaceContainer>();
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800150
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800151 if (node->GetObject<L3Protocol>() != 0) {
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700152 NS_FATAL_ERROR("Cannot re-install NDN stack on node "
153 << node->GetId());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800154 return 0;
155 }
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700156
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800157 Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800158
159 if (m_isRibManagerDisabled) {
160 ndn->getConfig().put("ndnSIM.disable_rib_manager", true);
161 }
162
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700163 // if (m_isFaceManagerDisabled) {
164 // ndn->getConfig().put("ndnSIM.disable_face_manager", true);
165 // }
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800166
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700167 if (m_isForwarderStatusManagerDisabled) {
168 ndn->getConfig().put("ndnSIM.disable_forwarder_status_manager", true);
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800169 }
170
171 if (m_isStrategyChoiceManagerDisabled) {
172 ndn->getConfig().put("ndnSIM.disable_strategy_choice_manager", true);
173 }
174
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800175 ndn->getConfig().put("tables.cs_max_packets", (m_maxCsSize == 0) ? 1 : m_maxCsSize);
176
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800177 // Create and aggregate content store if NFD's contest store has been disabled
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800178 if (m_maxCsSize == 0) {
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800179 ndn->AggregateObject(m_contentStoreFactory.Create<ContentStore>());
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800180 }
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800181
182 // Aggregate L3Protocol on node (must be after setting ndnSIM CS)
183 node->AggregateObject(ndn);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800184
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800185 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
186 Ptr<NetDevice> device = node->GetDevice(index);
187 // This check does not make sense: LoopbackNetDevice is installed only if IP stack is installed,
188 // Normally, ndnSIM works without IP stack, so no reason to check
189 // if (DynamicCast<LoopbackNetDevice> (device) != 0)
190 // continue; // don't create face for a LoopbackNetDevice
Alexander Afanasyev11453142011-11-25 16:13:33 -0800191
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700192 faces->Add(this->createAndRegisterFace(node, ndn, device));
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800193 }
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800194
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700195 return faces;
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700196}
197
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800198void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700199StackHelper::AddFaceCreateCallback(TypeId netDeviceType,
200 StackHelper::FaceCreateCallback callback)
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800201{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800202 m_netDeviceCallbacks.push_back(std::make_pair(netDeviceType, callback));
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800203}
204
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700205void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700206StackHelper::UpdateFaceCreateCallback(TypeId netDeviceType,
207 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700208{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800209 for (auto& i : m_netDeviceCallbacks) {
210 if (i.first == netDeviceType) {
211 i.second = callback;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800212 return;
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700213 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800214 }
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700215}
216
217void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700218StackHelper::RemoveFaceCreateCallback(TypeId netDeviceType,
219 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700220{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700221 m_netDeviceCallbacks.remove_if([&] (const std::pair<TypeId, FaceCreateCallback>& i) {
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800222 return (i.first == netDeviceType);
223 });
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700224}
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800225
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700226std::string
227constructFaceUri(Ptr<NetDevice> netDevice)
228{
229 std::string uri = "netdev://";
230 Address address = netDevice->GetAddress();
231 if (Mac48Address::IsMatchingType(address)) {
232 uri += "[" + boost::lexical_cast<std::string>(Mac48Address::ConvertFrom(address)) + "]";
233 }
234
235 return uri;
236}
237
238
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700239shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800240StackHelper::DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
241 Ptr<NetDevice> netDevice) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800242{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700243 NS_LOG_DEBUG("Creating default Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800244
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700245 auto netDeviceLink = make_unique<NetDeviceLinkService>(node, netDevice);
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700246 auto transport = make_unique<NullTransport>(constructFaceUri(netDevice), "netdev://[ff:ff:ff:ff:ff:ff]");
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700247 auto face = std::make_shared<Face>(std::move(netDeviceLink), std::move(transport));
248 face->setMetric(1);
249
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800250 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700251 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800252 << face->getLocalUri());
Alexander Afanasyevc17e4bd2013-02-17 14:31:56 -0800253
254 return face;
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800255}
256
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700257shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800258StackHelper::PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
259 Ptr<NetDevice> device) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800260{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700261 NS_LOG_DEBUG("Creating point-to-point Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800262
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700263 Ptr<PointToPointNetDevice> netDevice = DynamicCast<PointToPointNetDevice>(device);
264 NS_ASSERT(netDevice != nullptr);
265
266 // access the other end of the link
267 Ptr<PointToPointChannel> channel = DynamicCast<PointToPointChannel>(netDevice->GetChannel());
268 NS_ASSERT(channel != nullptr);
269
270 Ptr<NetDevice> remoteNetDevice = channel->GetDevice(0);
271 if (remoteNetDevice->GetNode() == node)
272 remoteNetDevice = channel->GetDevice(1);
273
274 auto netDeviceLink = make_unique<NetDeviceLinkService>(node, netDevice);
275
276 auto transport = make_unique<NullTransport>(constructFaceUri(netDevice), constructFaceUri(remoteNetDevice));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700277 auto face = std::make_shared<Face>(std::move(netDeviceLink), std::move(transport));
278 face->setMetric(1);
279
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800280 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700281 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800282 << face->getLocalUri());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800283
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800284 return face;
285}
286
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700287Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800288StackHelper::Install(const std::string& nodeName) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700289{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800290 Ptr<Node> node = Names::Find<Node>(nodeName);
291 return Install(node);
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700292}
293
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700294void
295StackHelper::Update(Ptr<Node> node)
296{
297 if (node->GetObject<L3Protocol>() == 0) {
298 Install(node);
299 return;
300 }
301
302 Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
303
304 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
305
306 Ptr<NetDevice> device = node->GetDevice(index);
307
308 if (ndn->getFaceByNetDevice(device) == nullptr) {
309 this->createAndRegisterFace(node, ndn, device);
310 }
311 }
312}
313
314void
315StackHelper::Update(const NodeContainer& c)
316{
317 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
318 Update(*i);
319 }
320}
321
322void
323StackHelper::Update(const std::string& nodeName)
324{
325 Ptr<Node> node = Names::Find<Node>(nodeName);
326 Update(node);
327}
328
329void
330StackHelper::UpdateAll()
331{
332 Update(NodeContainer::GetGlobal());
333}
334
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700335shared_ptr<Face>
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700336StackHelper::createAndRegisterFace(Ptr<Node> node, Ptr<L3Protocol> ndn, Ptr<NetDevice> device) const
337{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700338 shared_ptr<Face> face;
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700339
340 for (const auto& item : m_netDeviceCallbacks) {
341 if (device->GetInstanceTypeId() == item.first ||
342 device->GetInstanceTypeId().IsChildOf(item.first)) {
343 face = item.second(node, ndn, device);
344 if (face != 0)
345 break;
346 }
347 }
348
349 if (face == 0) {
350 face = DefaultNetDeviceCallback(node, ndn, device);
351 }
352
353 if (m_needSetDefaultRoutes) {
354 // default route with lowest priority possible
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700355 FibHelper::AddRoute(node, "/", face, std::numeric_limits<int32_t>::max());
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700356 }
357 return face;
358}
359
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800360void
361StackHelper::disableRibManager()
362{
363 m_isRibManagerDisabled = true;
364}
365
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700366// void
367// StackHelper::disableFaceManager()
368// {
369// m_isFaceManagerDisabled = true;
370// }
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800371
372void
373StackHelper::disableStrategyChoiceManager()
374{
375 m_isStrategyChoiceManagerDisabled = true;
376}
377
378void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700379StackHelper::disableForwarderStatusManager()
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800380{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700381 m_isForwarderStatusManagerDisabled = true;
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800382}
383
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700384} // namespace ndn
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700385} // namespace ns3