dataset-interest-handler.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
23 #include "nlsr.hpp"
24 #include "tlv/lsdb-status.hpp"
25 #include "logger.hpp"
26 
27 #include <ndn-cxx/mgmt/nfd/control-response.hpp>
28 #include <ndn-cxx/util/regex.hpp>
29 
30 namespace nlsr {
31 
32 INIT_LOGGER(DatasetInterestHandler);
33 
34 const ndn::PartialName ADJACENCIES_DATASET = ndn::PartialName("lsdb/adjacencies");
35 const ndn::PartialName COORDINATES_DATASET = ndn::PartialName("lsdb/coordinates");
36 const ndn::PartialName NAMES_DATASET = ndn::PartialName("lsdb/names");
37 const ndn::PartialName RT_DATASET = ndn::PartialName("routing-table");
38 
39 DatasetInterestHandler::DatasetInterestHandler(ndn::mgmt::Dispatcher& dispatcher,
40  const Lsdb& lsdb,
41  const RoutingTable& rt)
42  : m_dispatcher(dispatcher)
43  , m_lsdb(lsdb)
44  , m_routingTableEntries(rt.getRoutingTableEntry())
45  , m_dryRoutingTableEntries(rt.getDryRoutingTableEntry())
46 {
47  setDispatcher(m_dispatcher);
48 }
49 
50 void
51 DatasetInterestHandler::setDispatcher(ndn::mgmt::Dispatcher& dispatcher)
52 {
53  dispatcher.addStatusDataset(ADJACENCIES_DATASET,
54  ndn::mgmt::makeAcceptAllAuthorization(),
55  std::bind(&DatasetInterestHandler::publishAdjStatus, this, _1, _2, _3));
56  dispatcher.addStatusDataset(COORDINATES_DATASET,
57  ndn::mgmt::makeAcceptAllAuthorization(),
58  std::bind(&DatasetInterestHandler::publishCoordinateStatus, this, _1, _2, _3));
59  dispatcher.addStatusDataset(NAMES_DATASET,
60  ndn::mgmt::makeAcceptAllAuthorization(),
61  std::bind(&DatasetInterestHandler::publishNameStatus, this, _1, _2, _3));
62  dispatcher.addStatusDataset(RT_DATASET,
63  ndn::mgmt::makeAcceptAllAuthorization(),
64  std::bind(&DatasetInterestHandler::publishRtStatus, this, _1, _2, _3));
65 }
66 
67 void
68 DatasetInterestHandler::publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
69  ndn::mgmt::StatusDatasetContext& context)
70 {
71  NLSR_LOG_DEBUG("Received interest: " << interest);
72 
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++) {
77  tlv::AdjacencyLsa tlvLsa;
78  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
79  tlvLsa.setLsaInfo(*tlvLsaInfo);
80 
81  for (const Adjacent& adj : lsa->getAdl().getAdjList()) {
82  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();
92 }
93 
94 void
95 DatasetInterestHandler::publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
96  ndn::mgmt::StatusDatasetContext& context)
97 {
98  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 
102  NLSR_LOG_DEBUG("Received interest: " << interest);
103  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
104  tlv::CoordinateLsa tlvLsa;
105  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
106  tlvLsa.setLsaInfo(*tlvLsaInfo);
107 
108  tlvLsa.setHyperbolicRadius(lsa->getCorRadius());
109  tlvLsa.setHyperbolicAngle(lsa->getCorTheta());
110 
111  const ndn::Block& wire = tlvLsa.wireEncode();
112  context.append(wire);
113  }
114  context.end();
115 }
116 
117 void
118 DatasetInterestHandler::publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
119  ndn::mgmt::StatusDatasetContext& context)
120 {
121  auto lsaRange = std::make_pair<std::list<NameLsa>::const_iterator, std::list<NameLsa>::const_iterator>(
122  m_lsdb.getNameLsdb().cbegin(), m_lsdb.getNameLsdb().cend());
123  NLSR_LOG_DEBUG("Received interest: " << interest);
124  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
125  tlv::NameLsa tlvLsa;
126 
127  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
128  tlvLsa.setLsaInfo(*tlvLsaInfo);
129 
130  for (const ndn::Name& name : lsa->getNpl().getNames()) {
131  tlvLsa.addName(name);
132  }
133 
134  const ndn::Block& wire = tlvLsa.wireEncode();
135  context.append(wire);
136  }
137  context.end();
138 }
139 
140 
141 std::vector<tlv::RoutingTable>
142 DatasetInterestHandler::getTlvRTEntries()
143 {
144  std::vector<tlv::RoutingTable> rtable;
145  for (const auto& rte : m_routingTableEntries) {
146  tlv::RoutingTable tlvRoutingTable;
147  std::shared_ptr<tlv::Destination> tlvDes = tlv::makeDes(rte);
148  tlvRoutingTable.setDestination(*tlvDes);
149  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  }
155  rtable.push_back(tlvRoutingTable);
156  }
157  if (!m_dryRoutingTableEntries.empty()) {
158  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);
167  }
168  rtable.push_back(tlvRoutingTable);
169  }
170  }
171  return rtable;
172 }
173 
174 void
175 DatasetInterestHandler::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);
185  context.end();
186 }
187 
188 template<> std::list<tlv::AdjacencyLsa>
189 getTlvLsas<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  }
209  lsas.push_back(tlvLsa);
210  }
211 
212  return lsas;
213 
214 }
215 
216 template<> std::list<tlv::CoordinateLsa>
217 getTlvLsas<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 
241 template<> std::list<tlv::NameLsa>
242 getTlvLsas<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 
266 } // namespace nlsr
NextHop & setUri(const std::string &uri)
Definition: tlv/nexthop.hpp:68
Adjacency & setCost(uint64_t cost)
Definition: adjacency.hpp:97
const std::list< NameLsa > & getNameLsdb() const
Definition: lsdb.cpp:363
CoordinateLsa & setHyperbolicAngle(const std::vector< double > &hyperbolicAngle)
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
Encodes the Adjacent objects and some info using the method in TAG.
Data abstraction for Nexthop.
Definition: tlv/nexthop.hpp:43
RoutingTableStatus & addRoutingTable(const RoutingTable &routeTable)
AdjacencyLsa & addAdjacency(const Adjacency &adjacency)
NameLsa & addName(const ndn::Name &name)
Definition: name-lsa.hpp:95
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
Encodes the Name objects and some info using the method in TAG.
Definition: name-lsa.cpp:48
const ndn::PartialName COORDINATES_DATASET
#define NLSR_LOG_DEBUG(x)
Definition: logger.hpp:38
std::shared_ptr< Destination > makeDes(const RoutingTableEntry &rte)
NameLsa & setLsaInfo(const LsaInfo &lsaInfo)
Definition: name-lsa.hpp:75
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California.
Data abstraction for routing table status.
Data abstraction for CoordinateLsa.
CoordinateLsa & setHyperbolicRadius(double hyperbolicRadius)
#define INIT_LOGGER(name)
Definition: logger.hpp:35
const std::list< CoordinateLsa > & getCoordinateLsdb() const
Definition: lsdb.cpp:563
Data abstraction for RouteTableInfo.
Adjacency & setUri(const std::string &uri)
Definition: adjacency.hpp:83
const ndn::PartialName ADJACENCIES_DATASET
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
Encodes the hyperbolic coordinates and some info using the method in TAG.
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
std::shared_ptr< LsaInfo > makeLsaInfo(const Lsa &lsa)
Definition: lsa-info.cpp:170
RoutingTable & setDestination(const Destination &des)
AdjacencyLsa & setLsaInfo(const LsaInfo &lsaInfo)
Data abstraction for NameLsa.
Definition: name-lsa.hpp:47
A neighbor reachable over a Face.
Definition: adjacent.hpp:38
Copyright (c) 2014-2019, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
Copyright (c) 2014-2018, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
Data abstraction for AdjacencyLsa.
const ndn::PartialName NAMES_DATASET
DatasetInterestHandler(ndn::mgmt::Dispatcher &dispatcher, const Lsdb &lsdb, const RoutingTable &rt)
const ndn::PartialName RT_DATASET
NextHop & setCost(double cost)
Definition: tlv/nexthop.hpp:82
Data abstraction for Adjacency.
Definition: adjacency.hpp:44
const std::list< AdjLsa > & getAdjLsdb() const
Definition: lsdb.cpp:809
Adjacency & setName(const ndn::Name &name)
Definition: adjacency.hpp:69
CoordinateLsa & setLsaInfo(const LsaInfo &lsaInfo)
RoutingTable & addNexthops(const NextHop &nexthop)