blob: b6fa69ccf62c483e2a5cec30585c1bb843e48857 [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
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070032#include "ndn-net-device-link-service.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080033
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080034#include "../helper/ndn-stack-helper.hpp"
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -080035#include "cs/ndn-content-store.hpp"
Alexander Afanasyev52e9aa92011-11-15 20:23:20 -080036
Alexander Afanasyevdde1e812015-01-06 14:26:09 -080037#include <boost/property_tree/info_parser.hpp>
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070038
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080039#include "ns3/ndnSIM/NFD/daemon/fw/forwarder.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070040#include "ns3/ndnSIM/NFD/daemon/face/internal-face.hpp"
41#include "ns3/ndnSIM/NFD/daemon/face/internal-transport.hpp"
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080042#include "ns3/ndnSIM/NFD/daemon/mgmt/fib-manager.hpp"
43#include "ns3/ndnSIM/NFD/daemon/mgmt/face-manager.hpp"
44#include "ns3/ndnSIM/NFD/daemon/mgmt/strategy-choice-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
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -070050#include "ns3/ndnSIM/NFD/rib/rib-manager.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
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080055#include "ns3/ndnSIM/NFD/core/config-file.hpp"
Alexander Afanasyeva91aab42016-09-08 15:47:38 -070056
57#include <ndn-cxx/mgmt/dispatcher.hpp>
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080058
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080059NS_LOG_COMPONENT_DEFINE("ndn.L3Protocol");
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070060
61namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070062namespace ndn {
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070063
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070064const uint16_t L3Protocol::ETHERNET_FRAME_TYPE = 0x7777;
Alexander Afanasyev016a5d82013-07-15 10:41:29 -070065const uint16_t L3Protocol::IP_STACK_PORT = 9695;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070066
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080067NS_OBJECT_ENSURE_REGISTERED(L3Protocol);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070068
Alexander Afanasyev06dba7c2013-02-21 11:36:26 -080069TypeId
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080070L3Protocol::GetTypeId(void)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -070071{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -080072 static TypeId tid =
73 TypeId("ns3::ndn::L3Protocol")
74 .SetGroupName("ndn")
75 .SetParent<Object>()
76 .AddConstructor<L3Protocol>()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080077
78 .AddTraceSource("OutInterests", "OutInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070079 MakeTraceSourceAccessor(&L3Protocol::m_outInterests),
80 "ns3::ndn::L3Protocol::InterestTraceCallback")
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080081 .AddTraceSource("InInterests", "InInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070082 MakeTraceSourceAccessor(&L3Protocol::m_inInterests),
83 "ns3::ndn::L3Protocol::InterestTraceCallback")
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -080084
85 ////////////////////////////////////////////////////////////////////
86
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070087 .AddTraceSource("OutData", "OutData", MakeTraceSourceAccessor(&L3Protocol::m_outData),
88 "ns3::ndn::L3Protocol::DataTraceCallback")
89 .AddTraceSource("InData", "InData", MakeTraceSourceAccessor(&L3Protocol::m_inData),
90 "ns3::ndn::L3Protocol::DataTraceCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -080091
92 ////////////////////////////////////////////////////////////////////
93
94 .AddTraceSource("SatisfiedInterests", "SatisfiedInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070095 MakeTraceSourceAccessor(&L3Protocol::m_satisfiedInterests),
96 "ns3::ndn::L3Protocol::SatisfiedInterestsCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -080097 .AddTraceSource("TimedOutInterests", "TimedOutInterests",
Alexander Afanasyevd6453cd2015-08-20 21:45:36 -070098 MakeTraceSourceAccessor(&L3Protocol::m_timedOutInterests),
99 "ns3::ndn::L3Protocol::TimedOutInterestsCallback")
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800100 ;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700101 return tid;
102}
103
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800104class L3Protocol::Impl {
105private:
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800106 Impl()
107 {
108 // Do not modify initial config file. Use helpers to set specific NFD parameters
109 std::string initialConfig =
110 "general\n"
111 "{\n"
112 "}\n"
113 "\n"
114 "tables\n"
115 "{\n"
116 " cs_max_packets 100\n"
117 "\n"
118 " strategy_choice\n"
119 " {\n"
120 " / /localhost/nfd/strategy/best-route\n"
Alexander Afanasyevc3c7f042015-08-21 11:38:00 -0700121 " /localhost /localhost/nfd/strategy/multicast\n"
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800122 " /localhost/nfd /localhost/nfd/strategy/best-route\n"
Alexander Afanasyevc3c7f042015-08-21 11:38:00 -0700123 " /ndn/multicast /localhost/nfd/strategy/multicast\n"
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800124 " }\n"
125 "}\n"
126 "\n"
127 // "face_system\n"
128 // "{\n"
129 // "}\n"
130 "\n"
131 "authorizations\n"
132 "{\n"
133 " authorize\n"
134 " {\n"
135 " certfile any\n"
136 " privileges\n"
137 " {\n"
138 " faces\n"
139 " fib\n"
140 " strategy-choice\n"
141 " }\n"
142 " }\n"
143 "}\n"
144 "\n"
145 "rib\n"
146 "{\n"
147 " localhost_security\n"
148 " {\n"
149 " trust-anchor\n"
150 " {\n"
151 " type any\n"
152 " }\n"
153 " }\n"
154 "}\n"
155 "\n";
156
157 std::istringstream input(initialConfig);
158 boost::property_tree::read_info(input, m_config);
159 }
160
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800161 friend class L3Protocol;
162
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700163 std::shared_ptr<nfd::Forwarder> m_forwarder;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800164
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700165 std::shared_ptr<nfd::Face> m_internalFace;
166 std::shared_ptr<::ndn::Face> m_internalClientFace;
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800167 std::shared_ptr<nfd::CommandAuthenticator> m_authenticator;
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700168
169 std::shared_ptr<nfd::Face> m_internalRibFace;
170 std::shared_ptr<::ndn::Face> m_internalRibClientFace;
171
172 std::unique_ptr<::ndn::mgmt::Dispatcher> m_dispatcher;
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800173 std::unique_ptr<::ndn::mgmt::Dispatcher> m_dispatcherRib;
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700174 std::shared_ptr<nfd::FibManager> m_fibManager;
175 std::shared_ptr<nfd::FaceManager> m_faceManager;
176 std::shared_ptr<nfd::StrategyChoiceManager> m_strategyChoiceManager;
177 std::shared_ptr<nfd::ForwarderStatusManager> m_forwarderStatusManager;
178 std::shared_ptr<nfd::rib::RibManager> m_ribManager;
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800179
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800180 nfd::ConfigSection m_config;
181
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800182 Ptr<ContentStore> m_csFromNdnSim;
spirosmastorakis34eed982016-11-02 15:20:50 -0700183 PolicyCreationCallback m_policy;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800184};
185
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800186L3Protocol::L3Protocol()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800187 : m_impl(new Impl())
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700188{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800189 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700190}
191
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800192L3Protocol::~L3Protocol()
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700193{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800194 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700195}
196
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800197void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800198L3Protocol::initialize()
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800199{
200 m_impl->m_forwarder = make_shared<nfd::Forwarder>();
201
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800202 initializeManagement();
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800203
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700204 nfd::FaceTable& faceTable = m_impl->m_forwarder->getFaceTable();
205 faceTable.addReserved(nfd::face::makeNullFace(), nfd::face::FACEID_NULL);
206 faceTable.addReserved(nfd::face::makeNullFace(FaceUri("contentstore://")), nfd::face::FACEID_CONTENT_STORE);
207
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800208 if (!this->getConfig().get<bool>("ndnSIM.disable_rib_manager", false)) {
209 Simulator::ScheduleWithContext(m_node->GetId(), Seconds(0), &L3Protocol::initializeRibManager, this);
210 }
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800211
Alexander Afanasyevdc6fae82015-01-08 21:44:15 -0800212 m_impl->m_forwarder->beforeSatisfyInterest.connect(std::ref(m_satisfiedInterests));
213 m_impl->m_forwarder->beforeExpirePendingInterest.connect(std::ref(m_timedOutInterests));
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800214}
215
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800216class IgnoreSections
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800217{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800218public:
219 IgnoreSections(const std::vector<std::string>& ignored)
220 : m_ignored(ignored)
221 {
222 }
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800223
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800224 void
225 operator()(const std::string& filename, const std::string& sectionName,
226 const nfd::ConfigSection& section, bool isDryRun)
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800227
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800228 {
229 if (std::find(m_ignored.begin(), m_ignored.end(), sectionName) == m_ignored.end()) {
230 nfd::ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
231 }
232 }
233private:
234 std::vector<std::string> m_ignored;
235};
236
237void
Alexander Afanasyevca3c67e2016-09-08 15:48:23 -0700238L3Protocol::injectInterest(const Interest& interest)
239{
240 m_impl->m_internalFace->sendInterest(interest);
241}
242
243void
spirosmastorakis34eed982016-11-02 15:20:50 -0700244L3Protocol::setCsReplacementPolicy(const PolicyCreationCallback& policy)
245{
246 m_impl->m_policy = policy;
247}
248
249void
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800250L3Protocol::initializeManagement()
251{
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800252 auto& forwarder = m_impl->m_forwarder;
253 using namespace nfd;
254
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700255 std::tie(m_impl->m_internalFace, m_impl->m_internalClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
256 forwarder->getFaceTable().addReserved(m_impl->m_internalFace, face::FACEID_INTERNAL_FACE);
257 m_impl->m_dispatcher.reset(new ::ndn::mgmt::Dispatcher(*m_impl->m_internalClientFace, StackHelper::getKeyChain()));
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800258
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800259 m_impl->m_authenticator = CommandAuthenticator::create();
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800260
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700261 m_impl->m_fibManager.reset(new FibManager(forwarder->getFib(),
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800262 forwarder->getFaceTable(),
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700263 *m_impl->m_dispatcher,
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800264 *m_impl->m_authenticator));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700265
266 // Cannot be disabled for now
267 // if (!this->getConfig().get<bool>("ndnSIM.disable_face_manager", false)) {
268 m_impl->m_faceManager.reset(new FaceManager(forwarder->getFaceTable(),
269 *m_impl->m_dispatcher,
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800270 *m_impl->m_authenticator));
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700271 // }
272 // else {
273 // this->getConfig().get_child("authorizations").get_child("authorize").get_child("privileges").erase("faces");
274 // }
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800275
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800276 if (!this->getConfig().get<bool>("ndnSIM.disable_strategy_choice_manager", false)) {
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700277 m_impl->m_strategyChoiceManager.reset(new StrategyChoiceManager(forwarder->getStrategyChoice(),
278 *m_impl->m_dispatcher,
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800279 *m_impl->m_authenticator));
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800280 }
281 else {
282 this->getConfig().get_child("authorizations").get_child("authorize").get_child("privileges").erase("strategy-choice");
283 }
284
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700285 if (!this->getConfig().get<bool>("ndnSIM.disable_forwarder_status_manager", false)) {
286 m_impl->m_forwarderStatusManager.reset(new ForwarderStatusManager(*forwarder, *m_impl->m_dispatcher));
spirosmastorakis0df15ba2015-11-14 08:46:24 -0800287 }
288
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700289 ConfigFile config(&ConfigFile::ignoreUnknownSection);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800290
spirosmastorakis34eed982016-11-02 15:20:50 -0700291 // if we use NFD's CS, we have to specify a replacement policy
292 m_impl->m_csFromNdnSim = GetObject<ContentStore>();
293 if (m_impl->m_csFromNdnSim == nullptr) {
294 forwarder->getCs().setPolicy(m_impl->m_policy());
295 }
296
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800297 TablesConfigSection tablesConfig(*forwarder);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800298 tablesConfig.setConfigFile(config);
299
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800300 m_impl->m_authenticator->setConfigFile(config);
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800301
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700302 // if (!this->getConfig().get<bool>("ndnSIM.disable_face_manager", false)) {
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800303 m_impl->m_faceManager->setConfigFile(config);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700304 // }
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800305
306 // apply config
307 config.parse(m_impl->m_config, false, "ndnSIM.conf");
308
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800309 tablesConfig.ensureConfigured();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800310
311 // add FIB entry for NFD Management Protocol
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700312 Name topPrefix("/localhost/nfd");
313 auto entry = forwarder->getFib().insert(topPrefix).first;
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800314 entry->addNextHop(*(m_impl->m_internalFace), 0);
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700315 m_impl->m_dispatcher->addTopPrefix(topPrefix, false);
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800316}
317
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700318void
319L3Protocol::initializeRibManager()
320{
321 using namespace nfd;
322
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700323 std::tie(m_impl->m_internalRibFace, m_impl->m_internalRibClientFace) = face::makeInternalFace(StackHelper::getKeyChain());
324 m_impl->m_forwarder->getFaceTable().add(m_impl->m_internalRibFace);
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800325
326 m_impl->m_dispatcherRib.reset(new ::ndn::mgmt::Dispatcher(*m_impl->m_internalRibClientFace, StackHelper::getKeyChain()));
327
328 m_impl->m_ribManager = make_shared<rib::RibManager>(*(m_impl->m_dispatcherRib), *(m_impl->m_internalRibClientFace),
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700329 StackHelper::getKeyChain());
330
331 ConfigFile config([] (const std::string& filename, const std::string& sectionName,
332 const ConfigSection& section, bool isDryRun) {
333 // Ignore "log" and sections belonging to NFD,
334 // but raise an error if we're missing a handler for a "rib" section.
335 if (sectionName != "rib" || sectionName == "log") {
336 // do nothing
337 }
338 else {
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700339 // missing RIB section
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700340 ConfigFile::throwErrorOnUnknownSection(filename, sectionName, section, isDryRun);
341 }
342 });
343
344 m_impl->m_ribManager->setConfigFile(config);
345
346 // apply config
347 config.parse(m_impl->m_config, false, "ndnSIM.conf");
348
349 m_impl->m_ribManager->registerWithNfd();
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700350}
351
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800352shared_ptr<nfd::Forwarder>
353L3Protocol::getForwarder()
354{
355 return m_impl->m_forwarder;
356}
357
358shared_ptr<nfd::FibManager>
359L3Protocol::getFibManager()
360{
361 return m_impl->m_fibManager;
362}
363
364shared_ptr<nfd::StrategyChoiceManager>
365L3Protocol::getStrategyChoiceManager()
366{
367 return m_impl->m_strategyChoiceManager;
368}
369
Alexander Afanasyevdde1e812015-01-06 14:26:09 -0800370nfd::ConfigSection&
371L3Protocol::getConfig()
372{
373 return m_impl->m_config;
374}
375
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700376/*
377 * This method is called by AddAgregate and completes the aggregation
Alexander Afanasyev4aac5572012-08-09 10:49:55 -0700378 * by setting the node in the ndn stack
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700379 */
380void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800381L3Protocol::NotifyNewAggregate()
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700382{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800383 if (m_node == nullptr) {
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800384 m_node = GetObject<Node>();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800385 if (m_node != nullptr) {
Spyridon Mastorakis8fde22b2015-08-19 23:12:44 -0700386 initialize();
387
Spyridon Mastorakisde1f7732014-12-05 22:43:34 -0800388 NS_ASSERT(m_impl->m_forwarder != nullptr);
389 m_impl->m_csFromNdnSim = GetObject<ContentStore>();
390 if (m_impl->m_csFromNdnSim != nullptr) {
391 m_impl->m_forwarder->setCsFromNdnSim(m_impl->m_csFromNdnSim);
392 }
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700393 }
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800394 }
Alexander Afanasyevd9fecdd2012-06-08 16:22:24 -0700395
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800396 Object::NotifyNewAggregate();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700397}
398
Alexander Afanasyev06dba7c2013-02-21 11:36:26 -0800399void
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800400L3Protocol::DoDispose(void)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700401{
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800402 NS_LOG_FUNCTION(this);
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700403
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700404 // MUST HAPPEN BEFORE Simulator IS DESTROYED
405 m_impl.reset();
406
407 nfd::scheduler::getGlobalScheduler().cancelAllEvents();
408
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700409 m_node = 0;
Alexander Afanasyevd02a5d62011-11-21 11:01:51 -0800410
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800411 Object::DoDispose();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700412}
413
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800414nfd::FaceId
415L3Protocol::addFace(shared_ptr<Face> face)
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700416{
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800417 NS_LOG_FUNCTION(this << face.get());
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700418
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800419 m_impl->m_forwarder->addFace(face);
420
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700421 std::weak_ptr<Face> weakFace = face;
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800422
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700423 // // Connect Signals to TraceSource
424 face->afterReceiveInterest.connect([this, weakFace](const Interest& interest) {
425 shared_ptr<Face> face = weakFace.lock();
426 if (face != nullptr) {
427 this->m_inInterests(interest, *face);
428 }
429 });
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800430
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700431 face->afterReceiveData.connect([this, weakFace](const Data& data) {
432 shared_ptr<Face> face = weakFace.lock();
433 if (face != nullptr) {
434 this->m_inData(data, *face);
435 }
436 });
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700437 // TODO Add nack signals
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800438
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700439 auto tracingLink = face->getLinkService();
440 NS_LOG_LOGIC("Adding trace sources for afterSendInterest and afterSendData");
441 tracingLink->afterSendInterest.connect([this, weakFace](const Interest& interest) {
442 shared_ptr<Face> face = weakFace.lock();
443 if (face != nullptr) {
444 this->m_outInterests(interest, *face);
445 }
446 });
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700447
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700448 tracingLink->afterSendData.connect([this, weakFace](const Data& data) {
449 shared_ptr<Face> face = weakFace.lock();
450 if (face != nullptr) {
451 this->m_outData(data, *face);
452 }
453 });
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700454
Alexander Afanasyevac541b12016-09-12 19:45:53 -0700455 // TODO Add nack signals
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800456
457 return face->getId();
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700458}
459
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800460shared_ptr<Face>
461L3Protocol::getFaceById(nfd::FaceId id) const
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700462{
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800463 return m_impl->m_forwarder->getFaceTable().get(id)->shared_from_this();
Alexander Afanasyevc5a23e22011-09-07 00:37:36 -0700464}
465
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700466shared_ptr<Face>
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800467L3Protocol::getFaceByNetDevice(Ptr<NetDevice> netDevice) const
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700468{
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800469 for (auto& i : m_impl->m_forwarder->getFaceTable()) {
470 auto linkService = dynamic_cast<NetDeviceLinkService*>(i.getLinkService());
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700471 if (linkService == nullptr)
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800472 continue;
Alexander Afanasyevaebf5cf2012-08-28 17:32:17 -0700473
Alexander Afanasyeva91aab42016-09-08 15:47:38 -0700474 if (linkService->GetNetDevice() == netDevice)
Spyridon Mastorakisb0b22412016-12-07 14:33:46 -0800475 return i.shared_from_this();
Spyridon Mastorakis9760bd02014-11-12 13:32:55 -0800476 }
Spyridon Mastorakise4f0d3c2014-10-29 13:20:03 -0700477 return nullptr;
Alexander Afanasyev08d984e2011-08-13 19:20:22 -0700478}
479
Alexander Afanasyev6b2a3c02015-01-03 02:04:23 -0800480Ptr<L3Protocol>
481L3Protocol::getL3Protocol(Ptr<Object> node)
482{
483 Ptr<L3Protocol> retval = node->GetObject<L3Protocol>();
484 NS_ASSERT_MSG(retval != nullptr, "L3Protocol is not aggregated on this object");
485 return retval;
486}
487
Alexander Afanasyevbe55cf62014-12-20 17:51:09 -0800488} // namespace ndn
489} // namespace ns3