blob: 99a441c4f8eaed75a4360e798691aea95220730a [file] [log] [blame]
Vince Lehmanc439d662015-04-27 10:56:00 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawande0421bc62020-05-08 20:42:19 -07002/*
Junxiao Shia3a63972022-01-24 02:03:41 +00003 * Copyright (c) 2014-2022, The University of Memphis,
Vince Lehmanc439d662015-04-27 10:56:00 -05004 * 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/>.
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070020 */
Vince Lehmanc439d662015-04-27 10:56:00 -050021
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -080022#include "lsa/adj-lsa.hpp"
23#include "lsa/coordinate-lsa.hpp"
24#include "lsa/name-lsa.hpp"
Ashlesh Gawande0421bc62020-05-08 20:42:19 -070025#include "route/routing-table.hpp"
laqinfan35731852017-08-08 06:17:39 -050026
Vince Lehmanc439d662015-04-27 10:56:00 -050027#include <boost/noncopyable.hpp>
28#include <ndn-cxx/face.hpp>
29#include <ndn-cxx/security/key-chain.hpp>
Junxiao Shia3a63972022-01-24 02:03:41 +000030#include <ndn-cxx/security/validator.hpp>
Vince Lehmanc439d662015-04-27 10:56:00 -050031
32#include <deque>
33#include <map>
34#include <stdexcept>
35
36#ifndef NLSR_TOOLS_NLSRC_HPP
37#define NLSR_TOOLS_NLSRC_HPP
38
39namespace nlsrc {
40
41class Nlsrc : boost::noncopyable
42{
43public:
44 explicit
Junxiao Shia3a63972022-01-24 02:03:41 +000045 Nlsrc(std::string programName, ndn::Face& face);
Vince Lehmanc439d662015-04-27 10:56:00 -050046
47 void
Junxiao Shia3a63972022-01-24 02:03:41 +000048 printUsage() const;
49
50 const ndn::Name&
51 getRouterPrefix() const
52 {
53 return m_routerPrefix;
54 }
55
56 void
57 setRouterPrefix(ndn::Name prefix);
58
59 void
60 disableValidator();
61
62 bool
63 enableValidator(const std::string& filename);
Vince Lehmanc439d662015-04-27 10:56:00 -050064
65 void
laqinfan35731852017-08-08 06:17:39 -050066 getStatus(const std::string& command);
Vince Lehmanc439d662015-04-27 10:56:00 -050067
68 bool
Junxiao Shia3a63972022-01-24 02:03:41 +000069 dispatch(ndn::span<std::string> subcommand);
Vince Lehmanc439d662015-04-27 10:56:00 -050070
71private:
72 void
73 runNextStep();
74
75 /**
76 * \brief Adds a name prefix to be advertised in NLSR's Name LSA
77 *
78 * cmd format:
79 * name
80 *
81 */
82 void
Junxiao Shia3a63972022-01-24 02:03:41 +000083 advertiseName(ndn::Name name, bool wantSave);
Vince Lehmanc439d662015-04-27 10:56:00 -050084
85 /**
86 * \brief Removes a name prefix from NLSR's Name LSA
87 *
88 * cmd format:
89 * name
90 *
91 */
92 void
Junxiao Shia3a63972022-01-24 02:03:41 +000093 withdrawName(ndn::Name name, bool wantDelete);
Vince Lehmanc439d662015-04-27 10:56:00 -050094
95 void
96 sendNamePrefixUpdate(const ndn::Name& name,
97 const ndn::Name::Component& verb,
Saurab Dulal7526cee2018-01-31 18:14:10 +000098 const std::string& info,
99 bool saveFlag);
Vince Lehmanc439d662015-04-27 10:56:00 -0500100
101 void
102 onControlResponse(const std::string& info, const ndn::Data& data);
103
104private:
105 void
106 fetchAdjacencyLsas();
107
108 void
109 fetchCoordinateLsas();
110
111 void
112 fetchNameLsas();
113
Junxiao Shia3a63972022-01-24 02:03:41 +0000114 template<class T>
Vince Lehmanc439d662015-04-27 10:56:00 -0500115 void
116 fetchFromLsdb(const ndn::Name::Component& datasetType,
117 const std::function<void(const T&)>& recordLsa);
118
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700119 void
120 recordLsa(const nlsr::Lsa& lsa);
121
122 void
123 fetchRtables();
124
Junxiao Shia3a63972022-01-24 02:03:41 +0000125 template<class T>
Vince Lehmanc439d662015-04-27 10:56:00 -0500126 void
laqinfan35731852017-08-08 06:17:39 -0500127 fetchFromRt(const std::function<void(const T&)>& recordLsa);
128
Junxiao Shia3a63972022-01-24 02:03:41 +0000129 template<class T>
laqinfan35731852017-08-08 06:17:39 -0500130 void
Vince Lehmanc439d662015-04-27 10:56:00 -0500131 onFetchSuccess(const ndn::ConstBufferPtr& data,
132 const std::function<void(const T&)>& recordLsa);
133
134 void
135 onTimeout(uint32_t errorCode, const std::string& error);
136
Vince Lehmanc439d662015-04-27 10:56:00 -0500137 void
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700138 recordRtable(const nlsr::RoutingTableStatus& rts);
laqinfan35731852017-08-08 06:17:39 -0500139
140 void
Vince Lehmanc439d662015-04-27 10:56:00 -0500141 printLsdb();
142
laqinfan35731852017-08-08 06:17:39 -0500143 void
144 printRT();
145
146 void
147 printAll();
148
Vince Lehmanc439d662015-04-27 10:56:00 -0500149private:
Junxiao Shia3a63972022-01-24 02:03:41 +0000150 std::string m_programName;
151 ndn::Name m_routerPrefix;
152 std::unique_ptr<ndn::security::Validator> m_validator;
153 ndn::KeyChain m_keyChain;
154 ndn::Face& m_face;
155
Vince Lehmanc439d662015-04-27 10:56:00 -0500156 struct Router
157 {
158 std::string adjacencyLsaString;
159 std::string coordinateLsaString;
160 std::string nameLsaString;
161 };
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800162 std::map<ndn::Name, Router> m_routers;
laqinfana073e2e2018-01-15 21:17:24 +0000163 std::string m_rtString;
Vince Lehmanc439d662015-04-27 10:56:00 -0500164 std::deque<std::function<void()>> m_fetchSteps;
Vince Lehmanc439d662015-04-27 10:56:00 -0500165};
166
167} // namespace nlsrc
168
169#endif // NLSR_TOOLS_NLSRC_HPP