blob: 6fe9d4f3997cef6d46d32f01ade9b29ee0b11b15 [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#include "dataset-interest-handler.hpp"
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050023#include "nlsr.hpp"
Ashlesh Gawande90173ad2017-08-09 15:19:50 -050024#include "tlv/lsdb-status.hpp"
Nick Gordon114537f2017-08-09 14:51:37 -050025#include "logger.hpp"
Jiewen Tana0497d82015-02-02 21:59:18 -080026
Junxiao Shi3e5120c2016-09-10 16:58:34 +000027#include <ndn-cxx/mgmt/nfd/control-response.hpp>
Jiewen Tana0497d82015-02-02 21:59:18 -080028#include <ndn-cxx/util/regex.hpp>
29
30namespace nlsr {
31
dmcoomescf8d0ed2017-02-21 11:39:01 -060032INIT_LOGGER(DatasetInterestHandler);
Ashlesh Gawande90173ad2017-08-09 15:19:50 -050033
laqinfand22da512017-05-25 17:29:53 -050034const ndn::PartialName ADJACENCIES_DATASET = ndn::PartialName("lsdb/adjacencies");
35const ndn::PartialName COORDINATES_DATASET = ndn::PartialName("lsdb/coordinates");
36const ndn::PartialName NAMES_DATASET = ndn::PartialName("lsdb/names");
laqinfan35731852017-08-08 06:17:39 -050037const ndn::PartialName RT_DATASET = ndn::PartialName("routing-table");
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050038
Ashlesh Gawande85998a12017-12-07 22:22:13 -060039DatasetInterestHandler::DatasetInterestHandler(ndn::mgmt::Dispatcher& dispatcher,
40 const Lsdb& lsdb,
41 const RoutingTable& rt)
42 : m_dispatcher(dispatcher)
43 , m_lsdb(lsdb)
laqinfan35731852017-08-08 06:17:39 -050044 , m_routingTableEntries(rt.getRoutingTableEntry())
45 , m_dryRoutingTableEntries(rt.getDryRoutingTableEntry())
Jiewen Tana0497d82015-02-02 21:59:18 -080046{
laqinfan35731852017-08-08 06:17:39 -050047 setDispatcher(m_dispatcher);
Jiewen Tana0497d82015-02-02 21:59:18 -080048}
49
50void
laqinfan35731852017-08-08 06:17:39 -050051DatasetInterestHandler::setDispatcher(ndn::mgmt::Dispatcher& dispatcher)
Jiewen Tana0497d82015-02-02 21:59:18 -080052{
laqinfand22da512017-05-25 17:29:53 -050053 dispatcher.addStatusDataset(ADJACENCIES_DATASET,
54 ndn::mgmt::makeAcceptAllAuthorization(),
laqinfan35731852017-08-08 06:17:39 -050055 std::bind(&DatasetInterestHandler::publishAdjStatus, this, _1, _2, _3));
laqinfand22da512017-05-25 17:29:53 -050056 dispatcher.addStatusDataset(COORDINATES_DATASET,
57 ndn::mgmt::makeAcceptAllAuthorization(),
laqinfan35731852017-08-08 06:17:39 -050058 std::bind(&DatasetInterestHandler::publishCoordinateStatus, this, _1, _2, _3));
laqinfand22da512017-05-25 17:29:53 -050059 dispatcher.addStatusDataset(NAMES_DATASET,
60 ndn::mgmt::makeAcceptAllAuthorization(),
laqinfan35731852017-08-08 06:17:39 -050061 std::bind(&DatasetInterestHandler::publishNameStatus, this, _1, _2, _3));
62 dispatcher.addStatusDataset(RT_DATASET,
laqinfand22da512017-05-25 17:29:53 -050063 ndn::mgmt::makeAcceptAllAuthorization(),
laqinfan35731852017-08-08 06:17:39 -050064 std::bind(&DatasetInterestHandler::publishRtStatus, this, _1, _2, _3));
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050065}
66
67void
laqinfan35731852017-08-08 06:17:39 -050068DatasetInterestHandler::publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
69 ndn::mgmt::StatusDatasetContext& context)
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050070{
dmcoomes5bcb39e2017-10-31 15:07:55 -050071 NLSR_LOG_DEBUG("Received interest: " << interest);
Nick Gordon114537f2017-08-09 14:51:37 -050072
73 auto lsaRange = std::make_pair<std::list<AdjLsa>::const_iterator,
74 std::list<AdjLsa>::const_iterator>(
75 m_lsdb.getAdjLsdb().cbegin(), m_lsdb.getAdjLsdb().cend());
76 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
laqinfand22da512017-05-25 17:29:53 -050077 tlv::AdjacencyLsa tlvLsa;
Nick Gordon114537f2017-08-09 14:51:37 -050078 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
laqinfand22da512017-05-25 17:29:53 -050079 tlvLsa.setLsaInfo(*tlvLsaInfo);
80
Nick Gordon114537f2017-08-09 14:51:37 -050081 for (const Adjacent& adj : lsa->getAdl().getAdjList()) {
laqinfand22da512017-05-25 17:29:53 -050082 tlv::Adjacency tlvAdj;
83 tlvAdj.setName(adj.getName());
84 tlvAdj.setUri(adj.getFaceUri().toString());
85 tlvAdj.setCost(adj.getLinkCost());
86 tlvLsa.addAdjacency(tlvAdj);
87 }
88 const ndn::Block& wire = tlvLsa.wireEncode();
89 context.append(wire);
90 }
91 context.end();
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050092}
93
94void
laqinfan35731852017-08-08 06:17:39 -050095DatasetInterestHandler::publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
96 ndn::mgmt::StatusDatasetContext& context)
Vince Lehmand6bb3fa2015-04-24 14:21:39 -050097{
Nick Gordon114537f2017-08-09 14:51:37 -050098 auto lsaRange = std::make_pair<std::list<CoordinateLsa>::const_iterator,
99 std::list<CoordinateLsa>::const_iterator>(
100 m_lsdb.getCoordinateLsdb().cbegin(), m_lsdb.getCoordinateLsdb().cend());
101
dmcoomes5bcb39e2017-10-31 15:07:55 -0500102 NLSR_LOG_DEBUG("Received interest: " << interest);
Nick Gordon114537f2017-08-09 14:51:37 -0500103 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
laqinfand22da512017-05-25 17:29:53 -0500104 tlv::CoordinateLsa tlvLsa;
Nick Gordon114537f2017-08-09 14:51:37 -0500105 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
laqinfand22da512017-05-25 17:29:53 -0500106 tlvLsa.setLsaInfo(*tlvLsaInfo);
Jiewen Tana0497d82015-02-02 21:59:18 -0800107
Nick Gordon114537f2017-08-09 14:51:37 -0500108 tlvLsa.setHyperbolicRadius(lsa->getCorRadius());
109 tlvLsa.setHyperbolicAngle(lsa->getCorTheta());
laqinfand22da512017-05-25 17:29:53 -0500110
111 const ndn::Block& wire = tlvLsa.wireEncode();
112 context.append(wire);
Jiewen Tana0497d82015-02-02 21:59:18 -0800113 }
laqinfand22da512017-05-25 17:29:53 -0500114 context.end();
Vince Lehmand6bb3fa2015-04-24 14:21:39 -0500115}
116
117void
laqinfan35731852017-08-08 06:17:39 -0500118DatasetInterestHandler::publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
119 ndn::mgmt::StatusDatasetContext& context)
Vince Lehmand6bb3fa2015-04-24 14:21:39 -0500120{
Nick Gordon114537f2017-08-09 14:51:37 -0500121 auto lsaRange = std::make_pair<std::list<NameLsa>::const_iterator, std::list<NameLsa>::const_iterator>(
122 m_lsdb.getNameLsdb().cbegin(), m_lsdb.getNameLsdb().cend());
dmcoomes5bcb39e2017-10-31 15:07:55 -0500123 NLSR_LOG_DEBUG("Received interest: " << interest);
Nick Gordon114537f2017-08-09 14:51:37 -0500124 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
laqinfand22da512017-05-25 17:29:53 -0500125 tlv::NameLsa tlvLsa;
Jiewen Tana0497d82015-02-02 21:59:18 -0800126
Nick Gordon114537f2017-08-09 14:51:37 -0500127 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
laqinfand22da512017-05-25 17:29:53 -0500128 tlvLsa.setLsaInfo(*tlvLsaInfo);
129
Nick Gordon114537f2017-08-09 14:51:37 -0500130 for (const ndn::Name& name : lsa->getNpl().getNames()) {
laqinfand22da512017-05-25 17:29:53 -0500131 tlvLsa.addName(name);
132 }
133
134 const ndn::Block& wire = tlvLsa.wireEncode();
135 context.append(wire);
Jiewen Tana0497d82015-02-02 21:59:18 -0800136 }
laqinfand22da512017-05-25 17:29:53 -0500137 context.end();
Jiewen Tana0497d82015-02-02 21:59:18 -0800138}
139
laqinfan35731852017-08-08 06:17:39 -0500140
laqinfana073e2e2018-01-15 21:17:24 +0000141std::vector<tlv::RoutingTable>
142DatasetInterestHandler::getTlvRTEntries()
143{
144 std::vector<tlv::RoutingTable> rtable;
laqinfan35731852017-08-08 06:17:39 -0500145 for (const auto& rte : m_routingTableEntries) {
laqinfana073e2e2018-01-15 21:17:24 +0000146 tlv::RoutingTable tlvRoutingTable;
laqinfan35731852017-08-08 06:17:39 -0500147 std::shared_ptr<tlv::Destination> tlvDes = tlv::makeDes(rte);
148 tlvRoutingTable.setDestination(*tlvDes);
laqinfan35731852017-08-08 06:17:39 -0500149 for (const auto& nh : rte.getNexthopList().getNextHops()) {
150 tlv::NextHop tlvNexthop;
151 tlvNexthop.setUri(nh.getConnectingFaceUri());
152 tlvNexthop.setCost(nh.getRouteCost());
153 tlvRoutingTable.addNexthops(tlvNexthop);
154 }
laqinfana073e2e2018-01-15 21:17:24 +0000155 rtable.push_back(tlvRoutingTable);
laqinfan35731852017-08-08 06:17:39 -0500156 }
157 if (!m_dryRoutingTableEntries.empty()) {
laqinfana073e2e2018-01-15 21:17:24 +0000158 for (const auto& dryRte : m_dryRoutingTableEntries) {
159 tlv::RoutingTable tlvRoutingTable;
160 std::shared_ptr<tlv::Destination> tlvDes = tlv::makeDes(dryRte);
161 tlvRoutingTable.setDestination(*tlvDes);
162 for (const auto& nh : dryRte.getNexthopList().getNextHops()) {
163 tlv::NextHop tlvNexthop;
164 tlvNexthop.setUri(nh.getConnectingFaceUri());
165 tlvNexthop.setCost(nh.getRouteCost());
166 tlvRoutingTable.addNexthops(tlvNexthop);
laqinfan35731852017-08-08 06:17:39 -0500167 }
laqinfana073e2e2018-01-15 21:17:24 +0000168 rtable.push_back(tlvRoutingTable);
169 }
laqinfand22da512017-05-25 17:29:53 -0500170 }
laqinfana073e2e2018-01-15 21:17:24 +0000171 return rtable;
172}
Jiewen Tana0497d82015-02-02 21:59:18 -0800173
laqinfana073e2e2018-01-15 21:17:24 +0000174void
175DatasetInterestHandler::publishRtStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
176 ndn::mgmt::StatusDatasetContext& context)
177{
178 NLSR_LOG_DEBUG("Received interest: " << interest);
179 tlv::RoutingTableStatus rtStatus;
180 for (const tlv::RoutingTable& rt : getTlvRTEntries()) {
181 rtStatus.addRoutingTable(rt);
182 }
183 const ndn::Block& wire = rtStatus.wireEncode();
184 context.append(wire);
laqinfand22da512017-05-25 17:29:53 -0500185 context.end();
Jiewen Tana0497d82015-02-02 21:59:18 -0800186}
187
Nick Gordon114537f2017-08-09 14:51:37 -0500188template<> std::list<tlv::AdjacencyLsa>
189getTlvLsas<tlv::AdjacencyLsa>(const Lsdb& lsdb)
190{
191 std::list<tlv::AdjacencyLsa> lsas;
192
193 auto lsaRange = std::make_pair<std::list<AdjLsa>::const_iterator,
194 std::list<AdjLsa>::const_iterator>(
195 lsdb.getAdjLsdb().cbegin(), lsdb.getAdjLsdb().cend());
196 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
197 tlv::AdjacencyLsa tlvLsa;
198
199 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
200 tlvLsa.setLsaInfo(*tlvLsaInfo);
201
202 for (const Adjacent& adj : lsa->getAdl().getAdjList()) {
203 tlv::Adjacency tlvAdj;
204 tlvAdj.setName(adj.getName());
205 tlvAdj.setUri(adj.getFaceUri().toString());
206 tlvAdj.setCost(adj.getLinkCost());
207 tlvLsa.addAdjacency(tlvAdj);
208 }
Nick Gordon114537f2017-08-09 14:51:37 -0500209 lsas.push_back(tlvLsa);
210 }
211
212 return lsas;
213
214}
215
216template<> std::list<tlv::CoordinateLsa>
217getTlvLsas<tlv::CoordinateLsa>(const Lsdb& lsdb)
218{
219 std::list<tlv::CoordinateLsa> lsas;
220
221 auto lsaRange = std::make_pair<std::list<CoordinateLsa>::const_iterator,
222 std::list<CoordinateLsa>::const_iterator>(
223 lsdb.getCoordinateLsdb().cbegin(), lsdb.getCoordinateLsdb().cend());
224
225 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
226 tlv::CoordinateLsa tlvLsa;
227
228 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
229 tlvLsa.setLsaInfo(*tlvLsaInfo);
230
231 tlvLsa.setHyperbolicRadius(lsa->getCorRadius());
232 tlvLsa.setHyperbolicAngle(lsa->getCorTheta());
233
234 lsas.push_back(tlvLsa);
235 }
236
237 return lsas;
238
239}
240
241template<> std::list<tlv::NameLsa>
242getTlvLsas<tlv::NameLsa>(const Lsdb& lsdb)
243{
244 std::list<tlv::NameLsa> lsas;
245
246 auto lsaRange = std::make_pair<std::list<NameLsa>::const_iterator,
247 std::list<NameLsa>::const_iterator>(
248 lsdb.getNameLsdb().cbegin(), lsdb.getNameLsdb().cend());
249 for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
250 tlv::NameLsa tlvLsa;
251
252 std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
253 tlvLsa.setLsaInfo(*tlvLsaInfo);
254
255 for (const ndn::Name& name : lsa->getNpl().getNames()) {
256 tlvLsa.addName(name);
257 }
258
259 lsas.push_back(tlvLsa);
260 }
261
262 return lsas;
263
264}
265
Jiewen Tana0497d82015-02-02 21:59:18 -0800266} // namespace nlsr