blob: a349787ae2868a24fb77854c7fcb44c56a3cfaea [file] [log] [blame]
Alexander Afanasyev31367922015-02-09 20:51:10 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesaventoa3148082018-04-12 18:21:54 -04002/*
3 * Copyright (c) 2014-2018, Regents of the University of California,
Alexander Afanasyev31367922015-02-09 20:51:10 -08004 * 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
Junxiao Shib2600172016-07-11 08:53:53 +000026#ifndef NFD_RIB_SERVICE_HPP
27#define NFD_RIB_SERVICE_HPP
Alexander Afanasyev31367922015-02-09 20:51:10 -080028
Junxiao Shif4cfed12018-08-22 23:26:29 +000029#include "rib-manager.hpp"
30
Alexander Afanasyev31367922015-02-09 20:51:10 -080031#include "core/config-file.hpp"
Alexander Afanasyev31367922015-02-09 20:51:10 -080032
33#include <ndn-cxx/face.hpp>
Davide Pesaventoa3148082018-04-12 18:21:54 -040034#include <ndn-cxx/mgmt/dispatcher.hpp>
Davide Pesavento9f8b10e2018-08-22 08:45:37 +000035#include <ndn-cxx/mgmt/nfd/controller.hpp>
Alexander Afanasyev31367922015-02-09 20:51:10 -080036#include <ndn-cxx/security/key-chain.hpp>
37#include <ndn-cxx/transport/transport.hpp>
38
39namespace nfd {
40namespace rib {
41
Davide Pesavento9f8b10e2018-08-22 08:45:37 +000042class AutoPrefixPropagator;
Davide Pesavento9f8b10e2018-08-22 08:45:37 +000043class Readvertise;
Alexander Afanasyevc3ea5a72015-02-12 20:14:16 -080044
Alexander Afanasyev31367922015-02-09 20:51:10 -080045/**
Junxiao Shib2600172016-07-11 08:53:53 +000046 * \brief initializes and executes NFD-RIB service thread
Teng Liang04d5ce62018-08-06 10:20:24 +080047 *
Junxiao Shif4cfed12018-08-22 23:26:29 +000048 * Only one instance of this class can be created at any time.
49 * After initialization, NFD-RIB instance can be started by running the global io_service.
Alexander Afanasyev31367922015-02-09 20:51:10 -080050 */
Junxiao Shib2600172016-07-11 08:53:53 +000051class Service : noncopyable
Alexander Afanasyev31367922015-02-09 20:51:10 -080052{
53public:
Alexander Afanasyev31367922015-02-09 20:51:10 -080054 /**
Junxiao Shib2600172016-07-11 08:53:53 +000055 * \brief create NFD-RIB service
56 * \param configFile absolute or relative path of configuration file
57 * \param keyChain the KeyChain
Teng Liang04d5ce62018-08-06 10:20:24 +080058 * \throw std::logic_error Instance of rib::Service has been already constructed
59 * \throw std::logic_error Instance of rib::Service is not constructed on RIB thread
Alexander Afanasyev31367922015-02-09 20:51:10 -080060 */
Junxiao Shib2600172016-07-11 08:53:53 +000061 Service(const std::string& configFile, ndn::KeyChain& keyChain);
Alexander Afanasyev31367922015-02-09 20:51:10 -080062
63 /**
Junxiao Shib2600172016-07-11 08:53:53 +000064 * \brief create NFD-RIB service
Davide Pesavento9f8b10e2018-08-22 08:45:37 +000065 * \param configSection parsed configuration section
Junxiao Shib2600172016-07-11 08:53:53 +000066 * \param keyChain the KeyChain
67 * \note This constructor overload is more appropriate for integrated environments,
68 * such as NS-3 or android. Error messages related to configuration file
69 * will use "internal://nfd.conf" as configuration filename.
Teng Liang04d5ce62018-08-06 10:20:24 +080070 * \throw std::logic_error Instance of rib::Service has been already constructed
71 * \throw std::logic_error Instance of rib::Service is not constructed on RIB thread
Alexander Afanasyev31367922015-02-09 20:51:10 -080072 */
Davide Pesavento9f8b10e2018-08-22 08:45:37 +000073 Service(const ConfigSection& configSection, ndn::KeyChain& keyChain);
Alexander Afanasyev31367922015-02-09 20:51:10 -080074
75 /**
Alexander Afanasyevc3ea5a72015-02-12 20:14:16 -080076 * \brief Destructor
77 */
Junxiao Shib2600172016-07-11 08:53:53 +000078 ~Service();
Alexander Afanasyevc3ea5a72015-02-12 20:14:16 -080079
80 /**
Teng Liang04d5ce62018-08-06 10:20:24 +080081 * \brief Get a reference to the only instance of this class
82 * \throw std::logic_error No instance has been constructed
83 * \throw std::logic_error This function is invoked on a thread other than the RIB thread
84 */
85 static Service&
86 get();
87
Alexander Afanasyev31367922015-02-09 20:51:10 -080088private:
Ashlesh Gawandef84bac52018-08-27 07:39:31 +000089 template<typename ConfigParseFunc>
90 Service(ndn::KeyChain& keyChain, shared_ptr<ndn::Transport> localNfdTransport,
91 const ConfigParseFunc& configParse);
Junxiao Shif4cfed12018-08-22 23:26:29 +000092
93 void
94 processConfig(const ConfigSection& section, bool isDryRun, const std::string& filename);
95
96 void
97 checkConfig(const ConfigSection& section, const std::string& filename);
98
99 void
100 applyConfig(const ConfigSection& section, const std::string& filename);
101
Alexander Afanasyev31367922015-02-09 20:51:10 -0800102private:
Teng Liang04d5ce62018-08-06 10:20:24 +0800103 static Service* s_instance;
104
Alexander Afanasyev31367922015-02-09 20:51:10 -0800105 ndn::KeyChain& m_keyChain;
Junxiao Shif4cfed12018-08-22 23:26:29 +0000106 ndn::Face m_face;
107 ndn::nfd::Controller m_nfdController;
Davide Pesavento9f8b10e2018-08-22 08:45:37 +0000108
Junxiao Shif4cfed12018-08-22 23:26:29 +0000109 Rib m_rib;
110 FibUpdater m_fibUpdater;
Davide Pesavento9f8b10e2018-08-22 08:45:37 +0000111 unique_ptr<AutoPrefixPropagator> m_prefixPropagator;
112 unique_ptr<Readvertise> m_readvertiseNlsr;
Junxiao Shif4cfed12018-08-22 23:26:29 +0000113 ndn::mgmt::Dispatcher m_dispatcher;
114 RibManager m_ribManager;
Alexander Afanasyev31367922015-02-09 20:51:10 -0800115};
116
117} // namespace rib
118} // namespace nfd
119
Junxiao Shib2600172016-07-11 08:53:53 +0000120#endif // NFD_RIB_SERVICE_HPP