rib-manager.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014-2022, Regents of the University of California,
4  * Arizona Board of Regents,
5  * Colorado State University,
6  * University Pierre & Marie Curie, Sorbonne University,
7  * Washington University in St. Louis,
8  * Beijing Institute of Technology,
9  * The University of Memphis.
10  *
11  * This file is part of NFD (Named Data Networking Forwarding Daemon).
12  * See AUTHORS.md for complete list of NFD authors and contributors.
13  *
14  * NFD is free software: you can redistribute it and/or modify it under the terms
15  * of the GNU General Public License as published by the Free Software Foundation,
16  * either version 3 of the License, or (at your option) any later version.
17  *
18  * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
19  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
20  * PURPOSE. See the GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License along with
23  * NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
24  */
25 
26 #ifndef NFD_DAEMON_MGMT_RIB_MANAGER_HPP
27 #define NFD_DAEMON_MGMT_RIB_MANAGER_HPP
28 
29 #include "manager-base.hpp"
30 #include "rib/route.hpp"
31 
32 #include <ndn-cxx/mgmt/nfd/controller.hpp>
33 #include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
34 #include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
35 #include <ndn-cxx/security/validator-config.hpp>
36 #include <ndn-cxx/util/scheduler.hpp>
37 
38 namespace nfd {
39 
40 namespace rib {
41 class Rib;
42 class RibUpdate;
43 } // namespace rib
44 
49 class RibManager final : public ManagerBase
50 {
51 public:
52  RibManager(rib::Rib& rib, ndn::Face& face, ndn::KeyChain& keyChain,
53  ndn::nfd::Controller& nfdController, Dispatcher& dispatcher);
54 
58  void
59  applyLocalhostConfig(const ConfigSection& section, const std::string& filename);
60 
65  void
66  enableLocalhop(const ConfigSection& section, const std::string& filename);
67 
71  void
73 
77  void
78  applyPaConfig(const ConfigSection& section, const std::string& filename);
79 
83  void
85 
89  void
91 
92 public: // self-learning support
93  enum class SlAnnounceResult {
94  OK,
95  ERROR,
97  EXPIRED,
98  NOT_FOUND,
99  };
100 
101  using SlAnnounceCallback = std::function<void(SlAnnounceResult res)>;
102  using SlFindAnnCallback = std::function<void(std::optional<ndn::PrefixAnnouncement>)>;
103 
121  void
122  slAnnounce(const ndn::PrefixAnnouncement& pa, uint64_t faceId, time::milliseconds maxLifetime,
123  const SlAnnounceCallback& cb);
124 
143  void
144  slRenew(const Name& name, uint64_t faceId, time::milliseconds maxLifetime,
145  const SlAnnounceCallback& cb);
146 
158  void
159  slFindAnn(const Name& name, const SlFindAnnCallback& cb) const;
160 
161 private: // RIB and FibUpdater actions
162  enum class RibUpdateResult
163  {
164  OK,
165  ERROR,
166  EXPIRED,
167  };
168 
169  static SlAnnounceResult
170  getSlAnnounceResultFromRibUpdateResult(RibUpdateResult r);
171 
178  void
179  beginAddRoute(const Name& name, rib::Route route, std::optional<time::nanoseconds> expires,
180  const std::function<void(RibUpdateResult)>& done);
181 
187  void
188  beginRemoveRoute(const Name& name, const rib::Route& route,
189  const std::function<void(RibUpdateResult)>& done);
190 
191  void
192  beginRibUpdate(const rib::RibUpdate& update,
193  const std::function<void(RibUpdateResult)>& done);
194 
195 private: // management Dispatcher related
196  void
197  registerTopPrefix(const Name& topPrefix);
198 
201  void
202  registerEntry(const Name& topPrefix, const Interest& interest,
203  ControlParameters parameters,
204  const ndn::mgmt::CommandContinuation& done);
205 
208  void
209  unregisterEntry(const Name& topPrefix, const Interest& interest,
210  ControlParameters parameters,
211  const ndn::mgmt::CommandContinuation& done);
212 
215  void
216  listEntries(const Name& topPrefix, const Interest& interest,
217  ndn::mgmt::StatusDatasetContext& context);
218 
219  void
220  setFaceForSelfRegistration(const Interest& request, ControlParameters& parameters);
221 
222  ndn::mgmt::Authorization
223  makeAuthorization(const std::string& verb) final;
224 
225 private: // Face monitor
226  void
227  fetchActiveFaces();
228 
229  void
230  onFetchActiveFacesFailure(uint32_t code, const std::string& reason);
231 
233  void
234  scheduleActiveFaceFetch(const time::seconds& timeToWait);
235 
236  void
237  removeInvalidFaces(const std::vector<ndn::nfd::FaceStatus>& activeFaces);
238 
239  void
240  onNotification(const ndn::nfd::FaceEventNotification& notification);
241 
242 public:
243  static inline const Name LOCALHOP_TOP_PREFIX{"/localhop/nfd"};
244 
245 private:
246  rib::Rib& m_rib;
247  ndn::KeyChain& m_keyChain;
248  ndn::nfd::Controller& m_nfdController;
249  Dispatcher& m_dispatcher;
250 
251  ndn::nfd::FaceMonitor m_faceMonitor;
252  ndn::ValidatorConfig m_localhostValidator;
253  ndn::ValidatorConfig m_localhopValidator;
254  ndn::ValidatorConfig m_paValidator;
255  bool m_isLocalhopEnabled;
256 
257  scheduler::ScopedEventId m_activeFaceFetchEvent;
258 };
259 
260 std::ostream&
261 operator<<(std::ostream& os, RibManager::SlAnnounceResult res);
262 
263 } // namespace nfd
264 
265 #endif // NFD_DAEMON_MGMT_RIB_MANAGER_HPP
A collection of common functions shared by all NFD managers, such as communicating with the dispatche...
Implements the RIB Management of NFD Management Protocol.
Definition: rib-manager.hpp:50
void slRenew(const Name &name, uint64_t faceId, time::milliseconds maxLifetime, const SlAnnounceCallback &cb)
Renew a route created by prefix announcement from self-learning strategy.
std::function< void(SlAnnounceResult res)> SlAnnounceCallback
void registerWithNfd()
Start accepting commands and dataset requests.
Definition: rib-manager.cpp:96
void disableLocalhop()
Disallow accepting commands on /localhop/nfd/rib prefix.
Definition: rib-manager.cpp:84
RibManager(rib::Rib &rib, ndn::Face &face, ndn::KeyChain &keyChain, ndn::nfd::Controller &nfdController, Dispatcher &dispatcher)
Definition: rib-manager.cpp:49
static const Name LOCALHOP_TOP_PREFIX
void applyLocalhostConfig(const ConfigSection &section, const std::string &filename)
Apply localhost_security configuration.
Definition: rib-manager.cpp:71
void enableLocalhop(const ConfigSection &section, const std::string &filename)
Apply localhop_security configuration and allow accepting commands on /localhop/nfd/rib prefix.
Definition: rib-manager.cpp:77
void slAnnounce(const ndn::PrefixAnnouncement &pa, uint64_t faceId, time::milliseconds maxLifetime, const SlAnnounceCallback &cb)
Insert a route by prefix announcement from self-learning strategy.
std::function< void(std::optional< ndn::PrefixAnnouncement >)> SlFindAnnCallback
@ VALIDATION_FAILURE
the announcement cannot be verified against the trust schema
@ EXPIRED
the announcement has expired
@ NOT_FOUND
route does not exist (slRenew only)
@ OK
RIB and FIB have been updated.
void enableLocalFields()
Enable NDNLP IncomingFaceId field in order to support self-registration commands.
void slFindAnn(const Name &name, const SlFindAnnCallback &cb) const
Retrieve an outgoing prefix announcement for self-learning strategy.
void applyPaConfig(const ConfigSection &section, const std::string &filename)
Apply prefix_announcement_validation configuration.
Definition: rib-manager.cpp:90
Represents the Routing Information Base.
Definition: rib.hpp:62
Represents a route that will be added to or removed from a namespace.
Definition: rib-update.hpp:39
Represents a route for a name prefix.
Definition: route.hpp:43
#define NFD_PUBLIC_WITH_TESTS_ELSE_PRIVATE
Definition: common.hpp:41
Definition: common.hpp:77
boost::property_tree::ptree ConfigSection
A configuration file section.
Definition: config-file.hpp:38
std::ostream & operator<<(std::ostream &os, const Network &network)
Definition: network.cpp:83