blob: 8271587d0ee085219f73fc9d64662fe01ba285b8 [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 Afanasyevab1d5602011-08-17 19:17:18 -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 Afanasyevab1d5602011-08-17 19:17:18 -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 Afanasyevab1d5602011-08-17 19:17:18 -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 Afanasyevab1d5602011-08-17 19:17:18 -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 Afanasyev08d984e2011-08-13 19:20:22 -070019
Alexander Afanasyev0c395372014-12-20 15:54:02 -080020#include "ndn-l3-protocol.hpp"
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070021
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070022#include "ns3/packet.h"
Alexander Afanasyev45b92d42011-08-14 23:11:38 -070023#include "ns3/node.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070024#include "ns3/log.h"
25#include "ns3/callback.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070026#include "ns3/uinteger.h"
27#include "ns3/trace-source-accessor.h"
28#include "ns3/object-vector.h"
Alexander Afanasyevcbe92ae2011-12-16 13:06:18 -080029#include "ns3/pointer.h"
Alexander Afanasyev4975f732011-12-20 17:52:19 -080030#include "ns3/simulator.h"
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070031
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080032#include "ndn-net-device-transport.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080033
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080034#include "../helper/ndn-stack-helper.hpp"
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -080035
Alexander Afanasyevdde1e812015-01-06 14:26:09 -080036#include <boost/property_tree/info_parser.hpp>
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070037
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080038#include "ns3/ndnSIM/NFD/daemon/fw/forwarder.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070039#include "ns3/ndnSIM/NFD/daemon/face/internal-face.hpp"
40#include "ns3/ndnSIM/NFD/daemon/face/internal-transport.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080041#include "ns3/ndnSIM/NFD/daemon/mgmt/fib-manager.hpp"
42#include "ns3/ndnSIM/NFD/daemon/mgmt/face-manager.hpp"
43#include "ns3/ndnSIM/NFD/daemon/mgmt/strategy-choice-manager.hpp"
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -050044#include "ns3/ndnSIM/NFD/daemon/mgmt/cs-manager.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070045#include "ns3/ndnSIM/NFD/daemon/mgmt/forwarder-status-manager.hpp"
46// #include "ns3/ndnSIM/NFD/daemon/mgmt/general-config-section.hpp"
47#include "ns3/ndnSIM/NFD/daemon/mgmt/tables-config-section.hpp"
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -080048#include "ns3/ndnSIM/NFD/daemon/mgmt/command-authenticator.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070049
Alexander Afanasyev11dfcb72019-07-27 17:47:32 -040050#include "ns3/ndnSIM/NFD/daemon/rib/service.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080051
52#include "ns3/ndnSIM/NFD/daemon/face/null-face.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070053#include "ns3/ndnSIM/NFD/daemon/face/internal-face.hpp"
54
Alexander Afanasyev11dfcb72019-07-27 17:47:32 -040055#include "ns3/ndnSIM/NFD/daemon/common/global.hpp"
56#include "ns3/ndnSIM/NFD/daemon/common/config-file.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070057
58#include <ndn-cxx/mgmt/dispatcher.hpp>
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080059
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080060NS_LOG_COMPONENT_DEFINE("ndn.L3Protocol");
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070061
62namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070063namespace ndn {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070064
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070065const uint16_t L3Protocol::ETHERNET_FRAME_TYPE = 0x7777;
Alexander Afanasyev016a5d82013-07-15 10:41:29 -070066const uint16_t L3Protocol::IP_STACK_PORT = 9695;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070067
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080068NS_OBJECT_ENSURE_REGISTERED(L3Protocol);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070069
Alexander Afanasyev06dba7c2013-02-21 11:36:26 -080070TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080071L3Protocol::GetTypeId(void)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070072{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080073 static TypeId tid =
74 TypeId("ns3::ndn::L3Protocol")
75 .SetGroupName("ndn")
76 .SetParent<Object>()
77 .AddConstructor<L3Protocol>()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080078
79 .AddTraceSource("OutInterests", "OutInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070080 MakeTraceSourceAccessor(&L3Protocol::m_outInterests),
81 "ns3::ndn::L3Protocol::InterestTraceCallback")
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080082 .AddTraceSource("InInterests", "InInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070083 MakeTraceSourceAccessor(&L3Protocol::m_inInterests),
84 "ns3::ndn::L3Protocol::InterestTraceCallback")
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080085
86 ////////////////////////////////////////////////////////////////////
87
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070088 .AddTraceSource("OutData", "OutData", MakeTraceSourceAccessor(&L3Protocol::m_outData),
89 "ns3::ndn::L3Protocol::DataTraceCallback")
90 .AddTraceSource("InData", "InData", MakeTraceSourceAccessor(&L3Protocol::m_inData),
91 "ns3::ndn::L3Protocol::DataTraceCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -080092
93 ////////////////////////////////////////////////////////////////////
94
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -080095 .AddTraceSource("OutNack", "OutNack", MakeTraceSourceAccessor(&L3Protocol::m_outNack),
96 "ns3::ndn::L3Protocol::NackTraceCallback")
97 .AddTraceSource("InNack", "InNack", MakeTraceSourceAccessor(&L3Protocol::m_inNack),
98 "ns3::ndn::L3Protocol::NackTraceCallback")
99
100 ////////////////////////////////////////////////////////////////////
101
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800102 .AddTraceSource("SatisfiedInterests", "SatisfiedInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -0700103 MakeTraceSourceAccessor(&L3Protocol::m_satisfiedInterests),
104 "ns3::ndn::L3Protocol::SatisfiedInterestsCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800105 .AddTraceSource("TimedOutInterests", "TimedOutInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -0700106 MakeTraceSourceAccessor(&L3Protocol::m_timedOutInterests),
107 "ns3::ndn::L3Protocol::TimedOutInterestsCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800108 ;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700109 return tid;
110}
111
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800112class L3Protocol::Impl {
113private:
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800114 Impl()
115 {
116 // Do not modify initial config file. Use helpers to set specific NFD parameters
117 std::string initialConfig =
118 "general\n"
119 "{\n"
120 "}\n"
121 "\n"
122 "tables\n"
123 "{\n"
124 " cs_max_packets 100\n"
125 "\n"
126 " strategy_choice\n"
127 " {\n"
128 " / /localhost/nfd/strategy/best-route\n"
Alexander Afanasyevc3c7f042015-08-21 11:38:00 -0700129 " /localhost /localhost/nfd/strategy/multicast\n"
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800130 " /localhost/nfd /localhost/nfd/strategy/best-route\n"
Alexander Afanasyevc3c7f042015-08-21 11:38:00 -0700131 " /ndn/multicast /localhost/nfd/strategy/multicast\n"
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800132 " }\n"
133 "}\n"
134 "\n"
135 // "face_system\n"
136 // "{\n"
137 // "}\n"
138 "\n"
139 "authorizations\n"
140 "{\n"
141 " authorize\n"
142 " {\n"
143 " certfile any\n"
144 " privileges\n"
145 " {\n"
146 " faces\n"
147 " fib\n"
148 " strategy-choice\n"
149 " }\n"
150 " }\n"
151 "}\n"
152 "\n"
153 "rib\n"
154 "{\n"
155 " localhost_security\n"
156 " {\n"
157 " trust-anchor\n"
158 " {\n"
159 " type any\n"
160 " }\n"
161 " }\n"
162 "}\n"
163 "\n";
164
165 std::istringstream input(initialConfig);
166 boost::property_tree::read_info(input, m_config);
167 }
168
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800169 friend class L3Protocol;
170
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500171 // note that shared_ptr needed for Python bindings
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800172
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500173 std::shared_ptr<::nfd::Forwarder> m_forwarder;
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500174 std::unique_ptr<::nfd::FaceTable> m_faceTable;
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500175 std::unique_ptr<::nfd::face::FaceSystem> m_faceSystem;
176
177 std::shared_ptr<::nfd::face::Face> m_internalFace;
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700178 std::shared_ptr<::ndn::Face> m_internalClientFace;
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700179 std::unique_ptr<::ndn::mgmt::Dispatcher> m_dispatcher;
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500180 std::shared_ptr<::nfd::CommandAuthenticator> m_authenticator;
181 std::unique_ptr<::nfd::ForwarderStatusManager> m_forwarderStatusManager;
182 std::unique_ptr<::nfd::FaceManager> m_faceManager;
183 std::shared_ptr<::nfd::FibManager> m_fibManager;
184 std::unique_ptr<::nfd::CsManager> m_csManager;
185 std::unique_ptr<::nfd::StrategyChoiceManager> m_strategyChoiceManager;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800186
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500187 std::shared_ptr<::nfd::face::Face> m_internalFaceForInjects;
188 std::shared_ptr<::ndn::Face> m_internalClientFaceForInjects;
189
190 std::shared_ptr<::nfd::Face> m_internalRibFace;
191 std::shared_ptr<::ndn::Face> m_internalRibClientFace;
192 std::unique_ptr<::nfd::rib::Service> m_ribService;
Spyridon Mastorakisf6d32852017-09-27 20:28:52 -0700193
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800194 nfd::ConfigSection m_config;
195
spirosmastorakis34eed982016-11-02 15:20:50 -0700196 PolicyCreationCallback m_policy;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800197};
198
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800199L3Protocol::L3Protocol()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800200 : m_impl(new Impl())
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700201{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800202 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700203}
204
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800205L3Protocol::~L3Protocol()
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700206{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800207 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700208}
209
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800210void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800211L3Protocol::initialize()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800212{
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500213 m_impl->m_faceTable = make_unique<::nfd::FaceTable>();
214 m_impl->m_forwarder = make_shared<::nfd::Forwarder>(*m_impl->m_faceTable);
215 m_impl->m_faceSystem = make_unique<::nfd::face::FaceSystem>(*m_impl->m_faceTable, nullptr);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800216
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800217 initializeManagement();
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500218 initializeRibManager();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800219
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800220 m_impl->m_forwarder->beforeSatisfyInterest.connect(std::ref(m_satisfiedInterests));
221 m_impl->m_forwarder->beforeExpirePendingInterest.connect(std::ref(m_timedOutInterests));
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800222}
223
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800224class IgnoreSections
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800225{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800226public:
227 IgnoreSections(const std::vector<std::string>& ignored)
228 : m_ignored(ignored)
229 {
230 }
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800231
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800232 void
233 operator()(const std::string& filename, const std::string& sectionName,
234 const nfd::ConfigSection& section, bool isDryRun)
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800235
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800236 {
237 if (std::find(m_ignored.begin(), m_ignored.end(), sectionName) == m_ignored.end()) {
238 nfd::ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
239 }
240 }
241private:
242 std::vector<std::string> m_ignored;
243};
244
245void
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700246L3Protocol::injectInterest(const Interest& interest)
247{
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500248 m_impl->m_internalClientFaceForInjects->expressInterest(interest, nullptr, nullptr, nullptr);
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700249}
250
251void
spirosmastorakis34eed982016-11-02 15:20:50 -0700252L3Protocol::setCsReplacementPolicy(const PolicyCreationCallback& policy)
253{
254 m_impl->m_policy = policy;
255}
256
257void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800258L3Protocol::initializeManagement()
259{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800260 auto& forwarder = m_impl->m_forwarder;
261 using namespace nfd;
262
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700263 std::tie(m_impl->m_internalFace, m_impl->m_internalClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500264 m_impl->m_faceTable->addReserved(m_impl->m_internalFace, face::FACEID_INTERNAL_FACE);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800265
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500266 std::tie(m_impl->m_internalFaceForInjects, m_impl->m_internalClientFaceForInjects) = face::makeInternalFace(StackHelper::getKeyChain());
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500267 m_impl->m_faceTable->addReserved(m_impl->m_internalFaceForInjects, face::FACEID_INTERNAL_FACE + 1);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800268
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500269 m_impl->m_dispatcher = make_unique<::ndn::mgmt::Dispatcher>(*m_impl->m_internalClientFace, StackHelper::getKeyChain());
270 m_impl->m_authenticator = ::nfd::CommandAuthenticator::create();
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700271
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500272 if (!this->getConfig().get<bool>("ndnSIM.disable_forwarder_status_manager", false)) {
273 m_impl->m_forwarderStatusManager = make_unique<::nfd::ForwarderStatusManager>(*m_impl->m_forwarder, *m_impl->m_dispatcher);
274 }
275 m_impl->m_faceManager = make_unique<::nfd::FaceManager>(*m_impl->m_faceSystem, *m_impl->m_dispatcher, *m_impl->m_authenticator);
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500276 m_impl->m_fibManager = make_shared<::nfd::FibManager>(m_impl->m_forwarder->getFib(), *m_impl->m_faceTable,
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500277 *m_impl->m_dispatcher, *m_impl->m_authenticator);
278 m_impl->m_csManager = make_unique<::nfd::CsManager>(m_impl->m_forwarder->getCs(), m_impl->m_forwarder->getCounters(),
279 *m_impl->m_dispatcher, *m_impl->m_authenticator);
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800280 if (!this->getConfig().get<bool>("ndnSIM.disable_strategy_choice_manager", false)) {
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500281 m_impl->m_strategyChoiceManager = make_unique<::nfd::StrategyChoiceManager>(m_impl->m_forwarder->getStrategyChoice(),
282 *m_impl->m_dispatcher, *m_impl->m_authenticator);
283
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800284 }
285 else {
286 this->getConfig().get_child("authorizations").get_child("authorize").get_child("privileges").erase("strategy-choice");
287 }
288
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700289 ConfigFile config(&ConfigFile::ignoreUnknownSection);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800290
Alexander Afanasyev8fbcc642019-07-27 16:53:37 -0400291 forwarder->getCs().setPolicy(m_impl->m_policy());
spirosmastorakis34eed982016-11-02 15:20:50 -0700292
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800293 TablesConfigSection tablesConfig(*forwarder);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800294 tablesConfig.setConfigFile(config);
295
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800296 m_impl->m_authenticator->setConfigFile(config);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800297
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700298 // if (!this->getConfig().get<bool>("ndnSIM.disable_face_manager", false)) {
Alexander Afanasyeve93e8b02018-05-08 20:10:01 -0400299 m_impl->m_faceSystem->setConfigFile(config);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700300 // }
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800301
302 // apply config
303 config.parse(m_impl->m_config, false, "ndnSIM.conf");
304
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800305 tablesConfig.ensureConfigured();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800306
307 // add FIB entry for NFD Management Protocol
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700308 Name topPrefix("/localhost/nfd");
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500309 auto entry = m_impl->m_forwarder->getFib().insert(topPrefix).first;
310 m_impl->m_forwarder->getFib().addOrUpdateNextHop(*entry, *m_impl->m_internalFace, 0);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700311 m_impl->m_dispatcher->addTopPrefix(topPrefix, false);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800312}
313
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700314void
315L3Protocol::initializeRibManager()
316{
317 using namespace nfd;
318
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700319 std::tie(m_impl->m_internalRibFace, m_impl->m_internalRibClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500320 m_impl->m_faceTable->add(m_impl->m_internalRibFace);
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800321
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500322 m_impl->m_ribService = make_unique<rib::Service>(m_impl->m_config,
323 std::ref(*m_impl->m_internalRibClientFace),
324 std::ref(StackHelper::getKeyChain()));
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700325}
326
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800327shared_ptr<nfd::Forwarder>
328L3Protocol::getForwarder()
329{
330 return m_impl->m_forwarder;
331}
332
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500333nfd::FaceTable&
334L3Protocol::getFaceTable()
335{
336 return *m_impl->m_faceTable;
337}
338
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800339shared_ptr<nfd::FibManager>
340L3Protocol::getFibManager()
341{
342 return m_impl->m_fibManager;
343}
344
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500345nfd::StrategyChoiceManager&
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800346L3Protocol::getStrategyChoiceManager()
347{
Alexander Afanasyevdc3c3a32019-02-17 20:17:32 -0500348 return *m_impl->m_strategyChoiceManager;
349}
350
351::nfd::rib::Service&
352L3Protocol::getRibService()
353{
354 return *m_impl->m_ribService;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800355}
356
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800357nfd::ConfigSection&
358L3Protocol::getConfig()
359{
360 return m_impl->m_config;
361}
362
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700363/*
364 * This method is called by AddAgregate and completes the aggregation
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700365 * by setting the node in the ndn stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700366 */
367void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800368L3Protocol::NotifyNewAggregate()
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700369{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800370 if (m_node == nullptr) {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800371 m_node = GetObject<Node>();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800372 if (m_node != nullptr) {
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700373 initialize();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700374 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800375 }
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700376
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800377 Object::NotifyNewAggregate();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700378}
379
Alexander Afanasyev06dba7c2013-02-21 11:36:26 -0800380void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800381L3Protocol::DoDispose(void)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700382{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800383 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700384
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700385 // MUST HAPPEN BEFORE Simulator IS DESTROYED
386 m_impl.reset();
387
Alexander Afanasyev11dfcb72019-07-27 17:47:32 -0400388 nfd::resetGlobalScheduler();
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700389
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700390 m_node = 0;
Alexander Afanasyevd02a5d62011-11-21 11:01:51 -0800391
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800392 Object::DoDispose();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700393}
394
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800395nfd::FaceId
396L3Protocol::addFace(shared_ptr<Face> face)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700397{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800398 NS_LOG_FUNCTION(this << face.get());
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700399
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500400 m_impl->m_faceTable->add(face);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800401
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700402 std::weak_ptr<Face> weakFace = face;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800403
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700404 // // Connect Signals to TraceSource
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500405 face->afterReceiveInterest.connect([this, weakFace](const Interest& interest, const nfd::EndpointId&) {
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700406 shared_ptr<Face> face = weakFace.lock();
407 if (face != nullptr) {
408 this->m_inInterests(interest, *face);
409 }
410 });
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800411
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500412 face->afterReceiveData.connect([this, weakFace](const Data& data, const nfd::EndpointId&) {
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700413 shared_ptr<Face> face = weakFace.lock();
414 if (face != nullptr) {
415 this->m_inData(data, *face);
416 }
417 });
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800418
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500419 face->afterReceiveNack.connect([this, weakFace](const lp::Nack& nack, const nfd::EndpointId&) {
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800420 shared_ptr<Face> face = weakFace.lock();
421 if (face != nullptr) {
422 this->m_inNack(nack, *face);
423 }
424 });
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800425
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700426 auto tracingLink = face->getLinkService();
427 NS_LOG_LOGIC("Adding trace sources for afterSendInterest and afterSendData");
428 tracingLink->afterSendInterest.connect([this, weakFace](const Interest& interest) {
429 shared_ptr<Face> face = weakFace.lock();
430 if (face != nullptr) {
431 this->m_outInterests(interest, *face);
432 }
433 });
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700434
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700435 tracingLink->afterSendData.connect([this, weakFace](const Data& data) {
436 shared_ptr<Face> face = weakFace.lock();
437 if (face != nullptr) {
438 this->m_outData(data, *face);
439 }
440 });
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700441
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800442 tracingLink->afterSendNack.connect([this, weakFace](const lp::Nack& nack) {
443 shared_ptr<Face> face = weakFace.lock();
444 if (face != nullptr) {
445 this->m_outNack(nack, *face);
446 }
447 });
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800448
449 return face->getId();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700450}
451
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800452shared_ptr<Face>
453L3Protocol::getFaceById(nfd::FaceId id) const
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700454{
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500455 return m_impl->m_faceTable->get(id)->shared_from_this();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700456}
457
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700458shared_ptr<Face>
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800459L3Protocol::getFaceByNetDevice(Ptr<NetDevice> netDevice) const
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700460{
Alexander Afanasyev59090db2020-02-21 16:37:43 -0500461 for (auto& i : *m_impl->m_faceTable) {
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800462 auto transport = dynamic_cast<NetDeviceTransport*>(i.getTransport());
463 if (transport == nullptr)
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800464 continue;
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700465
Spyridon Mastorakis5ea33222016-12-07 14:33:53 -0800466 if (transport->GetNetDevice() == netDevice)
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800467 return i.shared_from_this();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800468 }
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700469 return nullptr;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700470}
471
Alexander Afanasyev6b2a3c02015-01-03 02:04:23 -0800472Ptr<L3Protocol>
473L3Protocol::getL3Protocol(Ptr<Object> node)
474{
475 Ptr<L3Protocol> retval = node->GetObject<L3Protocol>();
476 NS_ASSERT_MSG(retval != nullptr, "L3Protocol is not aggregated on this object");
477 return retval;
478}
479
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800480} // namespace ndn
481} // namespace ns3