blob: 169c9ec9bdca4e1b88c4ff2669c0c3ba445f6395 [file] [log] [blame]
Alexander Afanasyev3ecec502014-04-16 13:42:44 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento9f8b10e2018-08-22 08:45:37 +00002/*
3 * Copyright (c) 2014-2018, Regents of the University of California,
Junxiao Shi1e46be32015-01-08 20:18:05 -07004 * 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.
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070010 *
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/>.
Vince12e49462014-06-09 13:29:32 -050024 */
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070025
26#ifndef NFD_RIB_RIB_MANAGER_HPP
27#define NFD_RIB_RIB_MANAGER_HPP
28
Yanbiao Lid7c96362015-01-30 23:58:24 -080029#include "auto-prefix-propagator.hpp"
Vince Lehman76c751c2014-11-18 17:36:38 -060030#include "fib-updater.hpp"
Nick Gordon9fcf1232017-03-10 22:30:20 +000031#include "rib.hpp"
32
33#include "core/config-file.hpp"
34#include "core/manager-base.hpp"
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070035
Alexander Afanasyev4a771362014-04-24 21:29:33 -070036#include <ndn-cxx/security/validator-config.hpp>
Junxiao Shi25c6ce42016-09-09 13:49:59 +000037#include <ndn-cxx/mgmt/nfd/controller.hpp>
Nick Gordon9fcf1232017-03-10 22:30:20 +000038#include <ndn-cxx/mgmt/nfd/face-event-notification.hpp>
39#include <ndn-cxx/mgmt/nfd/face-monitor.hpp>
Davide Pesaventod396b612017-02-20 22:11:50 -050040#include <ndn-cxx/util/scheduler-scoped-event-id.hpp>
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070041
42namespace nfd {
43namespace rib {
44
Junxiao Shif4cfed12018-08-22 23:26:29 +000045/**
46 * @brief Serve commands and datasets in NFD RIB management protocol.
47 */
Yanbiao Licf0db022016-01-29 00:54:25 -080048class RibManager : public nfd::ManagerBase
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070049{
50public:
Yingdi Yue5224e92014-04-29 18:04:02 -070051 class Error : public std::runtime_error
52 {
53 public:
Junxiao Shif4cfed12018-08-22 23:26:29 +000054 using std::runtime_error::runtime_error;
Yingdi Yue5224e92014-04-29 18:04:02 -070055 };
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070056
Junxiao Shif4cfed12018-08-22 23:26:29 +000057 RibManager(Rib& rib, ndn::Face& face, ndn::nfd::Controller& nfdController, Dispatcher& dispatcher);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070058
Junxiao Shif4cfed12018-08-22 23:26:29 +000059 /**
60 * @brief Apply localhost_security configuration.
61 */
62 void
63 applyLocalhostConfig(const ConfigSection& section, const std::string& filename);
Vince Lehman26b215c2014-08-17 15:00:41 -050064
Junxiao Shif4cfed12018-08-22 23:26:29 +000065 /**
66 * @brief Apply localhop_security configuration and allow accepting commands on
67 * /localhop/nfd/rib prefix.
68 */
69 void
70 enableLocalhop(const ConfigSection& section, const std::string& filename);
71
72 /**
73 * @brief Disallow accepting commands on /localhop/nfd/rib prefix.
74 */
75 void
76 disableLocalhop();
77
78 /**
79 * @brief Start accepting commands and dataset requests.
80 */
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070081 void
82 registerWithNfd();
83
Junxiao Shif4cfed12018-08-22 23:26:29 +000084 /**
85 * @brief Enable NDNLP IncomingFaceId field in order to support self-registration commands.
86 */
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070087 void
Eric Newberryecc45cb2016-11-08 19:57:12 +000088 enableLocalFields();
Alexander Afanasyev3ecec502014-04-16 13:42:44 -070089
Junxiao Shi52009042018-09-10 12:33:56 +000090private: // RIB and FibUpdater actions
91 enum class RibUpdateResult
92 {
93 OK,
94 ERROR,
95 EXPIRED,
96 };
97
98 /** \brief Start adding a route to RIB and FIB.
99 * \param name route name
100 * \param route route parameters; may contain absolute expiration time
101 * \param expires relative expiration time; if specified, overwrites \c route.expires
102 * \param done completion callback
103 */
Vince Lehman76c751c2014-11-18 17:36:38 -0600104 void
Junxiao Shi52009042018-09-10 12:33:56 +0000105 beginAddRoute(const Name& name, Route route, optional<time::nanoseconds> expires,
106 const std::function<void(RibUpdateResult)>& done);
107
108 /** \brief Start removing a route from RIB and FIB.
109 * \param name route name
110 * \param route route parameters
111 * \param done completion callback
112 */
113 void
114 beginRemoveRoute(const Name& name, const Route& route,
115 const std::function<void(RibUpdateResult)>& done);
Vince Lehman4387e782014-06-19 16:57:45 -0500116
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700117 void
Junxiao Shi52009042018-09-10 12:33:56 +0000118 beginRibUpdate(const RibUpdate& update, const std::function<void(RibUpdateResult)>& done);
Vince Lehman76c751c2014-11-18 17:36:38 -0600119
Junxiao Shi52009042018-09-10 12:33:56 +0000120private: // management Dispatcher related
Vince Lehman76c751c2014-11-18 17:36:38 -0600121 void
Yanbiao Licf0db022016-01-29 00:54:25 -0800122 registerTopPrefix(const Name& topPrefix);
123
Junxiao Shi52009042018-09-10 12:33:56 +0000124 /** \brief Serve rib/register command.
125 */
Yanbiao Licf0db022016-01-29 00:54:25 -0800126 void
127 registerEntry(const Name& topPrefix, const Interest& interest,
128 ControlParameters parameters,
129 const ndn::mgmt::CommandContinuation& done);
Junxiao Shia3295742014-05-16 22:40:10 -0700130
Junxiao Shi52009042018-09-10 12:33:56 +0000131 /** \brief Serve rib/unregister command.
132 */
Junxiao Shia3295742014-05-16 22:40:10 -0700133 void
Yanbiao Licf0db022016-01-29 00:54:25 -0800134 unregisterEntry(const Name& topPrefix, const Interest& interest,
135 ControlParameters parameters,
136 const ndn::mgmt::CommandContinuation& done);
Yingdi Yue5224e92014-04-29 18:04:02 -0700137
Junxiao Shi52009042018-09-10 12:33:56 +0000138 /** \brief Serve rib/list dataset.
139 */
Yingdi Yue5224e92014-04-29 18:04:02 -0700140 void
Yanbiao Licf0db022016-01-29 00:54:25 -0800141 listEntries(const Name& topPrefix, const Interest& interest,
142 ndn::mgmt::StatusDatasetContext& context);
Yingdi Yue5224e92014-04-29 18:04:02 -0700143
144 void
Yanbiao Licf0db022016-01-29 00:54:25 -0800145 setFaceForSelfRegistration(const Interest& request, ControlParameters& parameters);
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700146
Nick Gordon9fcf1232017-03-10 22:30:20 +0000147 ndn::mgmt::Authorization
Junxiao Shi21738402016-08-19 19:48:00 +0000148 makeAuthorization(const std::string& verb) override;
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700149
Yanbiao Licf0db022016-01-29 00:54:25 -0800150private: // Face monitor
Vince Lehman26b215c2014-08-17 15:00:41 -0500151 void
Vince Lehmancd613c52014-07-30 14:34:49 -0500152 fetchActiveFaces();
153
154 void
Weiwei Liu6e21cdb2016-09-29 15:16:23 -0700155 onFetchActiveFacesFailure(uint32_t code, const std::string& reason);
Vince Lehmancd613c52014-07-30 14:34:49 -0500156
Yanbiao Licf0db022016-01-29 00:54:25 -0800157 void
158 onFaceDestroyedEvent(uint64_t faceId);
159
Vince Lehman281ded72014-08-21 12:17:08 -0500160PUBLIC_WITH_TESTS_ELSE_PRIVATE:
Yanbiao Licf0db022016-01-29 00:54:25 -0800161 void
162 scheduleActiveFaceFetch(const time::seconds& timeToWait);
163
164 /**
165 * @brief remove invalid faces
166 *
Weiwei Liu6e21cdb2016-09-29 15:16:23 -0700167 * @param status Face dataset
Vince Lehman26b215c2014-08-17 15:00:41 -0500168 */
169 void
Weiwei Liu6e21cdb2016-09-29 15:16:23 -0700170 removeInvalidFaces(const std::vector<ndn::nfd::FaceStatus>& activeFaces);
Vince Lehman26b215c2014-08-17 15:00:41 -0500171
Yanbiao Licf0db022016-01-29 00:54:25 -0800172 /**
173 * @brief response to face events
174 *
175 * @param notification
176 */
177 void
Nick Gordon9fcf1232017-03-10 22:30:20 +0000178 onNotification(const ndn::nfd::FaceEventNotification& notification);
Yanbiao Licf0db022016-01-29 00:54:25 -0800179
180private:
Davide Pesavento9f8b10e2018-08-22 08:45:37 +0000181 Rib& m_rib;
182 ndn::nfd::Controller& m_nfdController;
Junxiao Shif4cfed12018-08-22 23:26:29 +0000183 Dispatcher& m_dispatcher;
184
Yanbiao Licf0db022016-01-29 00:54:25 -0800185 ndn::nfd::FaceMonitor m_faceMonitor;
Yingdi Yue5224e92014-04-29 18:04:02 -0700186 ndn::ValidatorConfig m_localhostValidator;
187 ndn::ValidatorConfig m_localhopValidator;
Junxiao Shif4cfed12018-08-22 23:26:29 +0000188 bool m_isLocalhopEnabled;
Vince Lehman4387e782014-06-19 16:57:45 -0500189
Vince Lehman76c751c2014-11-18 17:36:38 -0600190private:
Davide Pesaventod396b612017-02-20 22:11:50 -0500191 scheduler::ScopedEventId m_activeFaceFetchEvent;
Vince Lehman26b215c2014-08-17 15:00:41 -0500192
193 typedef std::set<uint64_t> FaceIdSet;
194 /** \brief contains FaceIds with one or more Routes in the RIB
195 */
196 FaceIdSet m_registeredFaces;
Alexander Afanasyev3ecec502014-04-16 13:42:44 -0700197};
198
199} // namespace rib
200} // namespace nfd
201
202#endif // NFD_RIB_RIB_MANAGER_HPP