blob: a64c94057c7fe967a94c82639f19af2fc1cf580a [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 Shif7ea1502023-06-23 04:30:19 +00003 * Copyright (c) 2014-2023, 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
Junxiao Shif7ea1502023-06-23 04:30:19 +000071 int
72 getExitCode() const
73 {
74 return m_exitCode;
75 }
76
Vince Lehmanc439d662015-04-27 10:56:00 -050077private:
78 void
79 runNextStep();
80
81 /**
82 * \brief Adds a name prefix to be advertised in NLSR's Name LSA
83 *
84 * cmd format:
85 * name
86 *
87 */
88 void
Junxiao Shia3a63972022-01-24 02:03:41 +000089 advertiseName(ndn::Name name, bool wantSave);
Vince Lehmanc439d662015-04-27 10:56:00 -050090
91 /**
92 * \brief Removes a name prefix from NLSR's Name LSA
93 *
94 * cmd format:
95 * name
96 *
97 */
98 void
Junxiao Shia3a63972022-01-24 02:03:41 +000099 withdrawName(ndn::Name name, bool wantDelete);
Vince Lehmanc439d662015-04-27 10:56:00 -0500100
101 void
102 sendNamePrefixUpdate(const ndn::Name& name,
103 const ndn::Name::Component& verb,
Saurab Dulal7526cee2018-01-31 18:14:10 +0000104 const std::string& info,
105 bool saveFlag);
Vince Lehmanc439d662015-04-27 10:56:00 -0500106
107 void
108 onControlResponse(const std::string& info, const ndn::Data& data);
109
110private:
111 void
112 fetchAdjacencyLsas();
113
114 void
115 fetchCoordinateLsas();
116
117 void
118 fetchNameLsas();
119
Junxiao Shia3a63972022-01-24 02:03:41 +0000120 template<class T>
Vince Lehmanc439d662015-04-27 10:56:00 -0500121 void
122 fetchFromLsdb(const ndn::Name::Component& datasetType,
123 const std::function<void(const T&)>& recordLsa);
124
Ashlesh Gawande57a87172020-05-09 19:47:06 -0700125 void
126 recordLsa(const nlsr::Lsa& lsa);
127
128 void
129 fetchRtables();
130
Junxiao Shia3a63972022-01-24 02:03:41 +0000131 template<class T>
Vince Lehmanc439d662015-04-27 10:56:00 -0500132 void
laqinfan35731852017-08-08 06:17:39 -0500133 fetchFromRt(const std::function<void(const T&)>& recordLsa);
134
Junxiao Shia3a63972022-01-24 02:03:41 +0000135 template<class T>
laqinfan35731852017-08-08 06:17:39 -0500136 void
Vince Lehmanc439d662015-04-27 10:56:00 -0500137 onFetchSuccess(const ndn::ConstBufferPtr& data,
138 const std::function<void(const T&)>& recordLsa);
139
140 void
141 onTimeout(uint32_t errorCode, const std::string& error);
142
Vince Lehmanc439d662015-04-27 10:56:00 -0500143 void
Ashlesh Gawande0421bc62020-05-08 20:42:19 -0700144 recordRtable(const nlsr::RoutingTableStatus& rts);
laqinfan35731852017-08-08 06:17:39 -0500145
146 void
Vince Lehmanc439d662015-04-27 10:56:00 -0500147 printLsdb();
148
laqinfan35731852017-08-08 06:17:39 -0500149 void
150 printRT();
151
152 void
153 printAll();
154
Vince Lehmanc439d662015-04-27 10:56:00 -0500155private:
Junxiao Shia3a63972022-01-24 02:03:41 +0000156 std::string m_programName;
157 ndn::Name m_routerPrefix;
158 std::unique_ptr<ndn::security::Validator> m_validator;
159 ndn::KeyChain m_keyChain;
160 ndn::Face& m_face;
161
Vince Lehmanc439d662015-04-27 10:56:00 -0500162 struct Router
163 {
164 std::string adjacencyLsaString;
165 std::string coordinateLsaString;
166 std::string nameLsaString;
167 };
Ashlesh Gawande0db4d4d2020-02-05 20:30:02 -0800168 std::map<ndn::Name, Router> m_routers;
laqinfana073e2e2018-01-15 21:17:24 +0000169 std::string m_rtString;
Vince Lehmanc439d662015-04-27 10:56:00 -0500170 std::deque<std::function<void()>> m_fetchSteps;
Junxiao Shif7ea1502023-06-23 04:30:19 +0000171
172 int m_exitCode = 0;
Vince Lehmanc439d662015-04-27 10:56:00 -0500173};
174
175} // namespace nlsrc
176
177#endif // NLSR_TOOLS_NLSRC_HPP