blob: 2822ae5f910987f215c47d275c38d4b1294ed999 [file] [log] [blame]
Jiewen Tana0497d82015-02-02 21:59:18 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Ashlesh Gawande85998a12017-12-07 22:22:13 -06003 * Copyright (c) 2014-2019, The University of Memphis,
Jiewen Tana0497d82015-02-02 21:59:18 -08004 * Regents of the University of California,
5 * Arizona Board of Regents.
6 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
20 **/
21
laqinfan35731852017-08-08 06:17:39 -050022 /*! \file dataset-interest-handler.hpp
23
24 This file details a class that is used by NLSRC and other command-line
25 tools to examine the state of NLSR. This class doesn't only handle interest
26 from local host, but also handle interests from remote router.
27 This system is not designed to
28 be used by routers to publish data to each other.
29 */
30
31#ifndef NLSR_PUBLISHER_DATASET_INTEREST_HANDLER_HPP
32#define NLSR_PUBLISHER_DATASET_INTEREST_HANDLER_HPP
33
34#include "route/routing-table-entry.hpp"
35#include "route/routing-table.hpp"
36#include "route/nexthop-list.hpp"
37#include "lsdb.hpp"
38#include "logger.hpp"
Jiewen Tana0497d82015-02-02 21:59:18 -080039
Ashlesh Gawande90173ad2017-08-09 15:19:50 -050040#include "tlv/adjacency-lsa.hpp"
41#include "tlv/coordinate-lsa.hpp"
42#include "tlv/name-lsa.hpp"
laqinfan35731852017-08-08 06:17:39 -050043#include "tlv/routing-table-status.hpp"
44#include "tlv/routing-table-entry.hpp"
Jiewen Tana0497d82015-02-02 21:59:18 -080045
laqinfand22da512017-05-25 17:29:53 -050046#include <ndn-cxx/mgmt/dispatcher.hpp>
Jiewen Tana0497d82015-02-02 21:59:18 -080047#include <ndn-cxx/face.hpp>
laqinfand22da512017-05-25 17:29:53 -050048#include <boost/noncopyable.hpp>
Jiewen Tana0497d82015-02-02 21:59:18 -080049
50namespace nlsr {
Nick Gordon114537f2017-08-09 14:51:37 -050051namespace dataset {
laqinfan35731852017-08-08 06:17:39 -050052const ndn::Name::Component ADJACENCY_COMPONENT = ndn::Name::Component{"adjacencies"};
53const ndn::Name::Component NAME_COMPONENT = ndn::Name::Component{"names"};
54const ndn::Name::Component COORDINATE_COMPONENT = ndn::Name::Component{"coordinates"};
Nick Gordon114537f2017-08-09 14:51:37 -050055} // namespace dataset
56
Nick G97e34942016-07-11 14:46:27 -050057/*!
laqinfan35731852017-08-08 06:17:39 -050058 \brief Class to publish all dataset
laqinfand22da512017-05-25 17:29:53 -050059 \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
laqinfan35731852017-08-08 06:17:39 -050060 \sa https://redmine.named-data.net/projects/nlsr/wiki/Routing_Table_DataSet
Jiewen Tana0497d82015-02-02 21:59:18 -080061 */
laqinfan35731852017-08-08 06:17:39 -050062class DatasetInterestHandler : boost::noncopyable
Jiewen Tana0497d82015-02-02 21:59:18 -080063{
64public:
65 class Error : std::runtime_error
66 {
67 public:
68 explicit
69 Error(const std::string& what)
70 : std::runtime_error(what)
71 {
72 }
73 };
74
Ashlesh Gawande85998a12017-12-07 22:22:13 -060075 DatasetInterestHandler(ndn::mgmt::Dispatcher& dispatcher,
76 const Lsdb& lsdb,
77 const RoutingTable& rt);
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050078
79private:
laqinfan35731852017-08-08 06:17:39 -050080 /*! \brief set dispatcher for localhost or remote router
laqinfand22da512017-05-25 17:29:53 -050081 */
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050082 void
laqinfand22da512017-05-25 17:29:53 -050083 setDispatcher(ndn::mgmt::Dispatcher& dispatcher);
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050084
laqinfana073e2e2018-01-15 21:17:24 +000085 /*! \brief generate a TLV-format of routing table entry
86 */
87 std::vector<tlv::RoutingTable>
88 getTlvRTEntries();
89
laqinfan35731852017-08-08 06:17:39 -050090 /*! \brief provide routing-table dataset
91 */
92 void
93 publishRtStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
94 ndn::mgmt::StatusDatasetContext& context);
95
laqinfand22da512017-05-25 17:29:53 -050096 /*! \brief provide adjacent status dataset
97 */
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050098 void
laqinfand22da512017-05-25 17:29:53 -050099 publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
100 ndn::mgmt::StatusDatasetContext& context);
Jiewen Tana0497d82015-02-02 21:59:18 -0800101
laqinfand22da512017-05-25 17:29:53 -0500102 /*! \brief provide coordinate status dataset
103 */
Jiewen Tana0497d82015-02-02 21:59:18 -0800104 void
laqinfand22da512017-05-25 17:29:53 -0500105 publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
106 ndn::mgmt::StatusDatasetContext& context);
107
108 /*! \brief provide name status dataset
109 */
110 void
111 publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
112 ndn::mgmt::StatusDatasetContext& context);
113
Jiewen Tana0497d82015-02-02 21:59:18 -0800114private:
laqinfan35731852017-08-08 06:17:39 -0500115 ndn::mgmt::Dispatcher& m_dispatcher;
Ashlesh Gawande85998a12017-12-07 22:22:13 -0600116 const Lsdb& m_lsdb;
laqinfan35731852017-08-08 06:17:39 -0500117
118 const std::list<RoutingTableEntry>& m_routingTableEntries;
119 const std::list<RoutingTableEntry>& m_dryRoutingTableEntries;
Jiewen Tana0497d82015-02-02 21:59:18 -0800120};
121
Nick Gordon114537f2017-08-09 14:51:37 -0500122template<typename T> std::list<T>
123getTlvLsas(const Lsdb& lsdb);
124
125template<> std::list<tlv::AdjacencyLsa>
126getTlvLsas<tlv::AdjacencyLsa>(const Lsdb& lsdb);
127
128template<> std::list<tlv::CoordinateLsa>
129getTlvLsas<tlv::CoordinateLsa>(const Lsdb& lsdb);
130
131template<> std::list<tlv::NameLsa>
132getTlvLsas<tlv::NameLsa>(const Lsdb& lsdb);
133
Jiewen Tana0497d82015-02-02 21:59:18 -0800134} // namespace nlsr
135
laqinfan35731852017-08-08 06:17:39 -0500136#endif // NLSR_PUBLISHER_DATASET_INTEREST_HANDLER_HPP