blob: e01a5da7b4e853f773f17b27cff9ee62c7cffee4 [file] [log] [blame]
Jiewen Tana0497d82015-02-02 21:59:18 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, 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
22#ifndef NLSR_PUBLISHER_LSDB_DATASET_INTEREST_HANDLER_HPP
23#define NLSR_PUBLISHER_LSDB_DATASET_INTEREST_HANDLER_HPP
24
Ashlesh Gawande90173ad2017-08-09 15:19:50 -050025#include "tlv/adjacency-lsa.hpp"
26#include "tlv/coordinate-lsa.hpp"
27#include "tlv/name-lsa.hpp"
Nick Gordon114537f2017-08-09 14:51:37 -050028#include "lsdb.hpp"
Jiewen Tana0497d82015-02-02 21:59:18 -080029
laqinfand22da512017-05-25 17:29:53 -050030#include <ndn-cxx/mgmt/dispatcher.hpp>
Jiewen Tana0497d82015-02-02 21:59:18 -080031#include <ndn-cxx/face.hpp>
laqinfand22da512017-05-25 17:29:53 -050032#include <boost/noncopyable.hpp>
Jiewen Tana0497d82015-02-02 21:59:18 -080033
34namespace nlsr {
35
Nick Gordon114537f2017-08-09 14:51:37 -050036namespace dataset {
37 const ndn::Name::Component ADJACENCY_COMPONENT = ndn::Name::Component{"adjacencies"};
38 const ndn::Name::Component NAME_COMPONENT = ndn::Name::Component{"names"};
39 const ndn::Name::Component COORDINATE_COMPONENT = ndn::Name::Component{"coordinates"};
40} // namespace dataset
41
Nick G97e34942016-07-11 14:46:27 -050042/*!
43 \brief Class to publish all lsa dataset
laqinfand22da512017-05-25 17:29:53 -050044 \sa https://redmine.named-data.net/projects/nlsr/wiki/LSDB_DataSet
Jiewen Tana0497d82015-02-02 21:59:18 -080045 */
laqinfand22da512017-05-25 17:29:53 -050046class LsdbDatasetInterestHandler : boost::noncopyable
Jiewen Tana0497d82015-02-02 21:59:18 -080047{
48public:
49 class Error : std::runtime_error
50 {
51 public:
52 explicit
53 Error(const std::string& what)
54 : std::runtime_error(what)
55 {
56 }
57 };
58
59 LsdbDatasetInterestHandler(Lsdb& lsdb,
laqinfand22da512017-05-25 17:29:53 -050060 ndn::mgmt::Dispatcher& localHostDispatcher,
61 ndn::mgmt::Dispatcher& routerNameDispatcher,
Jiewen Tana0497d82015-02-02 21:59:18 -080062 ndn::Face& face,
Jiewen Tana0497d82015-02-02 21:59:18 -080063 ndn::KeyChain& keyChain);
64
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -050065 ndn::Name&
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050066 getRouterNameCommandPrefix()
67 {
laqinfand22da512017-05-25 17:29:53 -050068 return m_routerNamePrefix;
Muktadir R Chowdhury3ac07282016-06-17 16:30:29 -050069 }
70
71 void
72 setRouterNameCommandPrefix(const ndn::Name& routerName) {
laqinfand22da512017-05-25 17:29:53 -050073 m_routerNamePrefix = routerName;
74 m_routerNamePrefix.append(Lsdb::NAME_COMPONENT);
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050075 }
76
77private:
Nick Gordond0a7df32017-05-30 16:44:34 -050078 /*! \brief Capture-point for Interests to verify Interests are
79 * valid, and then process them.
laqinfand22da512017-05-25 17:29:53 -050080 */
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050081 void
laqinfand22da512017-05-25 17:29:53 -050082 setDispatcher(ndn::mgmt::Dispatcher& dispatcher);
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050083
laqinfand22da512017-05-25 17:29:53 -050084 /*! \brief provide adjacent status dataset
85 */
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050086 void
laqinfand22da512017-05-25 17:29:53 -050087 publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
88 ndn::mgmt::StatusDatasetContext& context);
Jiewen Tana0497d82015-02-02 21:59:18 -080089
laqinfand22da512017-05-25 17:29:53 -050090 /*! \brief provide coordinate status dataset
91 */
Jiewen Tana0497d82015-02-02 21:59:18 -080092 void
laqinfand22da512017-05-25 17:29:53 -050093 publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
94 ndn::mgmt::StatusDatasetContext& context);
95
96 /*! \brief provide name status dataset
97 */
98 void
99 publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
100 ndn::mgmt::StatusDatasetContext& context);
101
102 /*! \brief provide ladb status dataset
103 */
104 void
105 publishAllStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
106 ndn::mgmt::StatusDatasetContext& context);
Jiewen Tana0497d82015-02-02 21:59:18 -0800107
108private:
Nick Gordon114537f2017-08-09 14:51:37 -0500109 const Lsdb& m_lsdb;
laqinfand22da512017-05-25 17:29:53 -0500110 ndn::Name m_routerNamePrefix;
Jiewen Tana0497d82015-02-02 21:59:18 -0800111
laqinfand22da512017-05-25 17:29:53 -0500112 ndn::mgmt::Dispatcher& m_localhostDispatcher;
113 ndn::mgmt::Dispatcher& m_routerNameDispatcher;
Jiewen Tana0497d82015-02-02 21:59:18 -0800114};
115
Nick Gordon114537f2017-08-09 14:51:37 -0500116template<typename T> std::list<T>
117getTlvLsas(const Lsdb& lsdb);
118
119template<> std::list<tlv::AdjacencyLsa>
120getTlvLsas<tlv::AdjacencyLsa>(const Lsdb& lsdb);
121
122template<> std::list<tlv::CoordinateLsa>
123getTlvLsas<tlv::CoordinateLsa>(const Lsdb& lsdb);
124
125template<> std::list<tlv::NameLsa>
126getTlvLsas<tlv::NameLsa>(const Lsdb& lsdb);
127
Jiewen Tana0497d82015-02-02 21:59:18 -0800128} // namespace nlsr
129
130#endif // NLSR_PUBLISHER_LSDB_DATASET_INTEREST_HANDLER_HPP