blob: 8391843fd4d578061d46de8abbe5cb77f8849142 [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"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080028
29#include "model/ndn-l3-protocol.hpp"
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080030#include "model/ndn-net-device-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
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080039#include "ns3/ndnSIM/NFD/daemon/face/generic-link-service.hpp"
spirosmastorakis34eed982016-11-02 15:20:50 -070040#include "ns3/ndnSIM/NFD/daemon/table/cs-policy-priority-fifo.hpp"
41#include "ns3/ndnSIM/NFD/daemon/table/cs-policy-lru.hpp"
42
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080043NS_LOG_COMPONENT_DEFINE("ndn.StackHelper");
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070044
45namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070046namespace ndn {
Alexander Afanasyev122f3782013-02-02 00:04:40 -080047
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080048StackHelper::StackHelper()
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070049 : m_isRibManagerDisabled(false)
50 // , m_isFaceManagerDisabled(false)
51 , m_isForwarderStatusManagerDisabled(false)
spirosmastorakis0df15ba2015-11-14 08:46:24 -080052 , m_isStrategyChoiceManagerDisabled(false)
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070053 , m_needSetDefaultRoutes(false)
54 , m_maxCsSize(100)
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070055{
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080056 setCustomNdnCxxClocks();
57
spirosmastorakis34eed982016-11-02 15:20:50 -070058 m_csPolicies.insert({"nfd::cs::lru", [] { return make_unique<nfd::cs::LruPolicy>(); }});
59 m_csPolicies.insert({"nfd::cs::priority_fifo", [] () { return make_unique<nfd::cs::PriorityFifoPolicy>(); }});
60
61 m_csPolicyCreationFunc = m_csPolicies["nfd::cs::lru"];
62
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080063 m_ndnFactory.SetTypeId("ns3::ndn::L3Protocol");
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080064 m_contentStoreFactory.SetTypeId("ns3::ndn::cs::Lru");
Alexander Afanasyev122f3782013-02-02 00:04:40 -080065
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080066 m_netDeviceCallbacks.push_back(
67 std::make_pair(PointToPointNetDevice::GetTypeId(),
68 MakeCallback(&StackHelper::PointToPointNetDeviceCallback, this)));
Alexander Afanasyev122f3782013-02-02 00:04:40 -080069 // default callback will be fired if non of others callbacks fit or did the job
Ilya Moiseenko25f7d4d2011-09-29 18:41:06 -070070}
Alexander Afanasyev122f3782013-02-02 00:04:40 -080071
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080072StackHelper::~StackHelper()
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070073{
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070074}
75
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080076KeyChain&
77StackHelper::getKeyChain()
78{
Alexander Afanasyevdf26b5a2015-01-15 23:30:56 -080079 static ::ndn::KeyChain keyChain("pib-dummy", "tpm-dummy");
Alexander Afanasyev34e13f32014-12-14 15:13:28 -080080 return keyChain;
81}
82
Alexander Afanasyev3a4a0b32012-06-28 14:14:22 -070083void
Spyridon Mastorakis86edf6f2014-11-14 19:27:18 -080084StackHelper::setCustomNdnCxxClocks()
85{
86 ::ndn::time::setCustomClocks(make_shared<ns3::ndn::time::CustomSteadyClock>(),
87 make_shared<ns3::ndn::time::CustomSystemClock>());
88}
89
Spyridon Mastorakis588fd102014-11-20 19:50:02 -080090void
91StackHelper::SetDefaultRoutes(bool needSet)
92{
93 NS_LOG_FUNCTION(this << needSet);
94 m_needSetDefaultRoutes = needSet;
95}
96
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080097void
98StackHelper::SetStackAttributes(const std::string& attr1, const std::string& value1,
99 const std::string& attr2, const std::string& value2,
100 const std::string& attr3, const std::string& value3,
101 const std::string& attr4, const std::string& value4)
102{
103 if (attr1 != "")
104 m_ndnFactory.Set(attr1, StringValue(value1));
105 if (attr2 != "")
106 m_ndnFactory.Set(attr2, StringValue(value2));
107 if (attr3 != "")
108 m_ndnFactory.Set(attr3, StringValue(value3));
109 if (attr4 != "")
110 m_ndnFactory.Set(attr4, StringValue(value4));
111}
112
113void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800114StackHelper::SetOldContentStore(const std::string& contentStore, const std::string& attr1,
115 const std::string& value1, const std::string& attr2,
116 const std::string& value2, const std::string& attr3,
117 const std::string& value3, const std::string& attr4,
118 const std::string& value4)
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800119{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800120 m_maxCsSize = 0;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800121
122 m_contentStoreFactory.SetTypeId(contentStore);
123 if (attr1 != "")
124 m_contentStoreFactory.Set(attr1, StringValue(value1));
125 if (attr2 != "")
126 m_contentStoreFactory.Set(attr2, StringValue(value2));
127 if (attr3 != "")
128 m_contentStoreFactory.Set(attr3, StringValue(value3));
129 if (attr4 != "")
130 m_contentStoreFactory.Set(attr4, StringValue(value4));
131}
132
133void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800134StackHelper::setCsSize(size_t maxSize)
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800135{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800136 m_maxCsSize = maxSize;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800137}
138
spirosmastorakis34eed982016-11-02 15:20:50 -0700139void
140StackHelper::setPolicy(const std::string& policy)
141{
142 auto found = m_csPolicies.find(policy);
143 if (found != m_csPolicies.end()) {
144 m_csPolicyCreationFunc = found->second;
145 }
146 else {
147 NS_FATAL_ERROR("Cache replacement policy " << policy << " not found");
148 NS_LOG_DEBUG("Available cache replacement policies: ");
149 for (auto it = m_csPolicies.begin(); it != m_csPolicies.end(); it++) {
150 NS_LOG_DEBUG(" " << it->first);
151 }
152 }
153}
154
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700155Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800156StackHelper::Install(const NodeContainer& c) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700157{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800158 Ptr<FaceContainer> faces = Create<FaceContainer>();
159 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
160 faces->AddAll(Install(*i));
161 }
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700162 return faces;
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700163}
164
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700165Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800166StackHelper::InstallAll() const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700167{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800168 return Install(NodeContainer::GetGlobal());
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700169}
170
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700171Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800172StackHelper::Install(Ptr<Node> node) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700173{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800174 Ptr<FaceContainer> faces = Create<FaceContainer>();
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800175
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800176 if (node->GetObject<L3Protocol>() != 0) {
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700177 NS_FATAL_ERROR("Cannot re-install NDN stack on node "
178 << node->GetId());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800179 return 0;
180 }
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700181
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800182 Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800183
184 if (m_isRibManagerDisabled) {
185 ndn->getConfig().put("ndnSIM.disable_rib_manager", true);
186 }
187
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700188 // if (m_isFaceManagerDisabled) {
189 // ndn->getConfig().put("ndnSIM.disable_face_manager", true);
190 // }
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800191
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700192 if (m_isForwarderStatusManagerDisabled) {
193 ndn->getConfig().put("ndnSIM.disable_forwarder_status_manager", true);
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800194 }
195
196 if (m_isStrategyChoiceManagerDisabled) {
197 ndn->getConfig().put("ndnSIM.disable_strategy_choice_manager", true);
198 }
199
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800200 ndn->getConfig().put("tables.cs_max_packets", (m_maxCsSize == 0) ? 1 : m_maxCsSize);
201
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800202 // Create and aggregate content store if NFD's contest store has been disabled
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800203 if (m_maxCsSize == 0) {
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800204 ndn->AggregateObject(m_contentStoreFactory.Create<ContentStore>());
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800205 }
spirosmastorakis34eed982016-11-02 15:20:50 -0700206 // if NFD's CS is enabled, check if a replacement policy has been specified
207 else {
208 ndn->setCsReplacementPolicy(m_csPolicyCreationFunc);
209 }
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800210
211 // Aggregate L3Protocol on node (must be after setting ndnSIM CS)
212 node->AggregateObject(ndn);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800213
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800214 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
215 Ptr<NetDevice> device = node->GetDevice(index);
216 // This check does not make sense: LoopbackNetDevice is installed only if IP stack is installed,
217 // Normally, ndnSIM works without IP stack, so no reason to check
218 // if (DynamicCast<LoopbackNetDevice> (device) != 0)
219 // continue; // don't create face for a LoopbackNetDevice
Alexander Afanasyev11453142011-11-25 16:13:33 -0800220
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700221 faces->Add(this->createAndRegisterFace(node, ndn, device));
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800222 }
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800223
Alexander Afanasyev0ab833e2011-08-18 15:49:13 -0700224 return faces;
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700225}
226
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800227void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700228StackHelper::AddFaceCreateCallback(TypeId netDeviceType,
229 StackHelper::FaceCreateCallback callback)
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800230{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800231 m_netDeviceCallbacks.push_back(std::make_pair(netDeviceType, callback));
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800232}
233
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700234void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700235StackHelper::UpdateFaceCreateCallback(TypeId netDeviceType,
236 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700237{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800238 for (auto& i : m_netDeviceCallbacks) {
239 if (i.first == netDeviceType) {
240 i.second = callback;
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800241 return;
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700242 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800243 }
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700244}
245
246void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700247StackHelper::RemoveFaceCreateCallback(TypeId netDeviceType,
248 FaceCreateCallback callback)
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700249{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700250 m_netDeviceCallbacks.remove_if([&] (const std::pair<TypeId, FaceCreateCallback>& i) {
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800251 return (i.first == netDeviceType);
252 });
Alexander Afanasyev2a269f72013-06-06 22:59:33 -0700253}
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800254
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700255std::string
256constructFaceUri(Ptr<NetDevice> netDevice)
257{
258 std::string uri = "netdev://";
259 Address address = netDevice->GetAddress();
260 if (Mac48Address::IsMatchingType(address)) {
261 uri += "[" + boost::lexical_cast<std::string>(Mac48Address::ConvertFrom(address)) + "]";
262 }
263
264 return uri;
265}
266
267
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700268shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800269StackHelper::DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
270 Ptr<NetDevice> netDevice) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800271{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700272 NS_LOG_DEBUG("Creating default Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800273
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800274 // Create an ndnSIM-specific transport instance
275 ::nfd::face::GenericLinkService::Options opts;
276 opts.allowFragmentation = true;
277 opts.allowReassembly = true;
schneiderklaus5f5c9922018-07-25 20:35:03 -0700278 opts.allowCongestionMarking = true;
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800279
280 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
281
282 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
283 constructFaceUri(netDevice),
284 "netdev://[ff:ff:ff:ff:ff:ff]");
285
286 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700287 face->setMetric(1);
288
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800289 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700290 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800291 << face->getLocalUri());
Alexander Afanasyevc17e4bd2013-02-17 14:31:56 -0800292
293 return face;
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800294}
295
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700296shared_ptr<Face>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800297StackHelper::PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol> ndn,
298 Ptr<NetDevice> device) const
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800299{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700300 NS_LOG_DEBUG("Creating point-to-point Face on node " << node->GetId());
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800301
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700302 Ptr<PointToPointNetDevice> netDevice = DynamicCast<PointToPointNetDevice>(device);
303 NS_ASSERT(netDevice != nullptr);
304
305 // access the other end of the link
306 Ptr<PointToPointChannel> channel = DynamicCast<PointToPointChannel>(netDevice->GetChannel());
307 NS_ASSERT(channel != nullptr);
308
309 Ptr<NetDevice> remoteNetDevice = channel->GetDevice(0);
310 if (remoteNetDevice->GetNode() == node)
311 remoteNetDevice = channel->GetDevice(1);
312
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800313 // Create an ndnSIM-specific transport instance
314 ::nfd::face::GenericLinkService::Options opts;
315 opts.allowFragmentation = true;
316 opts.allowReassembly = true;
schneiderklaus5f5c9922018-07-25 20:35:03 -0700317 opts.allowCongestionMarking = true;
Alexander Afanasyeva9d889b2016-09-08 18:34:25 -0700318
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800319 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
320
321 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
322 constructFaceUri(netDevice),
323 constructFaceUri(remoteNetDevice));
324
325 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700326 face->setMetric(1);
327
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800328 ndn->addFace(face);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700329 NS_LOG_LOGIC("Node " << node->GetId() << ": added Face as face #"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800330 << face->getLocalUri());
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800331
Alexander Afanasyev122f3782013-02-02 00:04:40 -0800332 return face;
333}
334
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700335Ptr<FaceContainer>
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800336StackHelper::Install(const std::string& nodeName) const
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700337{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800338 Ptr<Node> node = Names::Find<Node>(nodeName);
339 return Install(node);
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700340}
341
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700342void
343StackHelper::Update(Ptr<Node> node)
344{
345 if (node->GetObject<L3Protocol>() == 0) {
346 Install(node);
347 return;
348 }
349
350 Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
351
352 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
353
354 Ptr<NetDevice> device = node->GetDevice(index);
355
356 if (ndn->getFaceByNetDevice(device) == nullptr) {
357 this->createAndRegisterFace(node, ndn, device);
358 }
359 }
360}
361
362void
363StackHelper::Update(const NodeContainer& c)
364{
365 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
366 Update(*i);
367 }
368}
369
370void
371StackHelper::Update(const std::string& nodeName)
372{
373 Ptr<Node> node = Names::Find<Node>(nodeName);
374 Update(node);
375}
376
377void
378StackHelper::UpdateAll()
379{
380 Update(NodeContainer::GetGlobal());
381}
382
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700383shared_ptr<Face>
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700384StackHelper::createAndRegisterFace(Ptr<Node> node, Ptr<L3Protocol> ndn, Ptr<NetDevice> device) const
385{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700386 shared_ptr<Face> face;
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700387
388 for (const auto& item : m_netDeviceCallbacks) {
389 if (device->GetInstanceTypeId() == item.first ||
390 device->GetInstanceTypeId().IsChildOf(item.first)) {
391 face = item.second(node, ndn, device);
392 if (face != 0)
393 break;
394 }
395 }
396
397 if (face == 0) {
398 face = DefaultNetDeviceCallback(node, ndn, device);
399 }
400
401 if (m_needSetDefaultRoutes) {
402 // default route with lowest priority possible
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700403 FibHelper::AddRoute(node, "/", face, std::numeric_limits<int32_t>::max());
Spyridon Mastorakis21226ae2015-03-31 18:03:11 -0700404 }
405 return face;
406}
407
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800408void
409StackHelper::disableRibManager()
410{
411 m_isRibManagerDisabled = true;
412}
413
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700414// void
415// StackHelper::disableFaceManager()
416// {
417// m_isFaceManagerDisabled = true;
418// }
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800419
420void
421StackHelper::disableStrategyChoiceManager()
422{
423 m_isStrategyChoiceManagerDisabled = true;
424}
425
426void
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700427StackHelper::disableForwarderStatusManager()
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800428{
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700429 m_isForwarderStatusManagerDisabled = true;
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800430}
431
Chavoosh Ghasemi58ef8612018-09-12 15:12:49 -0700432void
433StackHelper::SetLinkDelayAsFaceMetric()
434{
435 for (uint32_t i = 0; i < NodeList::GetNNodes(); ++i) {
436 auto ndn = NodeList::GetNode(i)->GetObject<L3Protocol>();
437 if (ndn == nullptr)
438 continue;
439
440 for (auto& face : ndn->getForwarder()->getFaceTable()) {
441 auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
442 if (transport == nullptr)
443 continue;
444 auto p2p = dynamic_cast<PointToPointChannel*>(&(*(transport->GetNetDevice()->GetChannel())));
445 TimeValue currentDelay;
446 p2p->GetAttribute("Delay", currentDelay);
447 face.setMetric((currentDelay.Get().ToDouble(Time::S)) * 1000);
448
449 std::cout << "Node " << i << ": Face " << face.getId()
450 << " with metric " << face.getMetric() << "\n";
451 }
452 }
453}
454
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700455} // namespace ndn
Alexander Afanasyev45b92d42011-08-14 23:11:38 -0700456} // namespace ns3