lsdb-dataset-interest-handler.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
30 
31 #include "nlsr.hpp"
32 #include "tlv/lsdb-status.hpp"
33 #include "logger.hpp"
34 
35 #include <ndn-cxx/face.hpp>
36 #include <ndn-cxx/mgmt/nfd/control-response.hpp>
37 #include <ndn-cxx/util/regex.hpp>
38 
39 namespace nlsr {
40 
41 INIT_LOGGER("LsdbDatasetInterestHandler");
42 
43 const ndn::PartialName ADJACENCIES_DATASET = ndn::PartialName("lsdb/adjacencies");
44 const ndn::PartialName COORDINATES_DATASET = ndn::PartialName("lsdb/coordinates");
45 const ndn::PartialName NAMES_DATASET = ndn::PartialName("lsdb/names");
46 const ndn::PartialName LISTS_DATASET = ndn::PartialName("lsdb/list");
47 
49  ndn::mgmt::Dispatcher& localHostDispatcher,
50  ndn::mgmt::Dispatcher& routerNameDispatcher,
51  ndn::Face& face,
52  ndn::KeyChain& keyChain)
53  : m_lsdb(lsdb)
54  , m_localhostDispatcher(localHostDispatcher)
55  , m_routerNameDispatcher(routerNameDispatcher)
56 {
57  NLSR_LOG_DEBUG("Setting dispatcher for lsdb status dataset:");
58  setDispatcher(m_localhostDispatcher);
59  setDispatcher(m_routerNameDispatcher);
60 }
61 
62 void
63 LsdbDatasetInterestHandler::setDispatcher(ndn::mgmt::Dispatcher& dispatcher)
64 {
65  dispatcher.addStatusDataset(ADJACENCIES_DATASET,
66  ndn::mgmt::makeAcceptAllAuthorization(),
67  std::bind(&LsdbDatasetInterestHandler::publishAdjStatus, this, _1, _2, _3));
68  dispatcher.addStatusDataset(COORDINATES_DATASET,
69  ndn::mgmt::makeAcceptAllAuthorization(),
70  std::bind(&LsdbDatasetInterestHandler::publishCoordinateStatus, this, _1, _2, _3));
71  dispatcher.addStatusDataset(NAMES_DATASET,
72  ndn::mgmt::makeAcceptAllAuthorization(),
73  std::bind(&LsdbDatasetInterestHandler::publishNameStatus, this, _1, _2, _3));
74  dispatcher.addStatusDataset(LISTS_DATASET,
75  ndn::mgmt::makeAcceptAllAuthorization(),
76  std::bind(&LsdbDatasetInterestHandler::publishAllStatus, this, _1, _2, _3));
77 }
78 
79 void
80 LsdbDatasetInterestHandler::publishAdjStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
81  ndn::mgmt::StatusDatasetContext& context)
82 {
83  NLSR_LOG_DEBUG("Received interest: " << interest);
84 
85  auto lsaRange = std::make_pair<std::list<AdjLsa>::const_iterator,
86  std::list<AdjLsa>::const_iterator>(
87  m_lsdb.getAdjLsdb().cbegin(), m_lsdb.getAdjLsdb().cend());
88  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
89  tlv::AdjacencyLsa tlvLsa;
90  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
91  tlvLsa.setLsaInfo(*tlvLsaInfo);
92 
93  for (const Adjacent& adj : lsa->getAdl().getAdjList()) {
94  tlv::Adjacency tlvAdj;
95  tlvAdj.setName(adj.getName());
96  tlvAdj.setUri(adj.getFaceUri().toString());
97  tlvAdj.setCost(adj.getLinkCost());
98  tlvLsa.addAdjacency(tlvAdj);
99  }
100  const ndn::Block& wire = tlvLsa.wireEncode();
101  context.append(wire);
102  }
103  context.end();
104 }
105 
106 void
107 LsdbDatasetInterestHandler::publishCoordinateStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
108  ndn::mgmt::StatusDatasetContext& context)
109 {
110  auto lsaRange = std::make_pair<std::list<CoordinateLsa>::const_iterator,
111  std::list<CoordinateLsa>::const_iterator>(
112  m_lsdb.getCoordinateLsdb().cbegin(), m_lsdb.getCoordinateLsdb().cend());
113 
114  NLSR_LOG_DEBUG("Received interest: " << interest);
115  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
116  tlv::CoordinateLsa tlvLsa;
117  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
118  tlvLsa.setLsaInfo(*tlvLsaInfo);
119 
120  tlvLsa.setHyperbolicRadius(lsa->getCorRadius());
121  tlvLsa.setHyperbolicAngle(lsa->getCorTheta());
122 
123  const ndn::Block& wire = tlvLsa.wireEncode();
124  context.append(wire);
125  }
126  context.end();
127 }
128 
129 void
130 LsdbDatasetInterestHandler::publishNameStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
131  ndn::mgmt::StatusDatasetContext& context)
132 {
133  auto lsaRange = std::make_pair<std::list<NameLsa>::const_iterator, std::list<NameLsa>::const_iterator>(
134  m_lsdb.getNameLsdb().cbegin(), m_lsdb.getNameLsdb().cend());
135  NLSR_LOG_DEBUG("Received interest: " << interest);
136  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
137  tlv::NameLsa tlvLsa;
138 
139  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
140  tlvLsa.setLsaInfo(*tlvLsaInfo);
141 
142  for (const ndn::Name& name : lsa->getNpl().getNames()) {
143  tlvLsa.addName(name);
144  }
145 
146  const ndn::Block& wire = tlvLsa.wireEncode();
147  context.append(wire);
148  }
149  context.end();
150 }
151 
152 void
153 LsdbDatasetInterestHandler::publishAllStatus(const ndn::Name& topPrefix, const ndn::Interest& interest,
154  ndn::mgmt::StatusDatasetContext& context)
155 {
156  NLSR_LOG_DEBUG("Received interest: " << interest);
157  tlv::LsdbStatus lsdbStatus;
158  for (const tlv::AdjacencyLsa& tlvLsa : getTlvLsas<tlv::AdjacencyLsa>(m_lsdb)) {
159  lsdbStatus.addAdjacencyLsa(tlvLsa);
160  }
161 
162  for (const tlv::CoordinateLsa& tlvLsa : getTlvLsas<tlv::CoordinateLsa>(m_lsdb)) {
163  lsdbStatus.addCoordinateLsa(tlvLsa);
164  }
165 
166  for (const tlv::NameLsa& tlvLsa : getTlvLsas<tlv::NameLsa>(m_lsdb)) {
167  lsdbStatus.addNameLsa(tlvLsa);
168  }
169  const ndn::Block& wire = lsdbStatus.wireEncode();
170  context.append(wire);
171  context.end();
172 }
173 
174 template<> std::list<tlv::AdjacencyLsa>
175 getTlvLsas<tlv::AdjacencyLsa>(const Lsdb& lsdb)
176 {
177  std::list<tlv::AdjacencyLsa> lsas;
178 
179  auto lsaRange = std::make_pair<std::list<AdjLsa>::const_iterator,
180  std::list<AdjLsa>::const_iterator>(
181  lsdb.getAdjLsdb().cbegin(), lsdb.getAdjLsdb().cend());
182  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
183  tlv::AdjacencyLsa tlvLsa;
184 
185  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
186  tlvLsa.setLsaInfo(*tlvLsaInfo);
187 
188  for (const Adjacent& adj : lsa->getAdl().getAdjList()) {
189  tlv::Adjacency tlvAdj;
190  tlvAdj.setName(adj.getName());
191  tlvAdj.setUri(adj.getFaceUri().toString());
192  tlvAdj.setCost(adj.getLinkCost());
193  tlvLsa.addAdjacency(tlvAdj);
194  }
195 
196  lsas.push_back(tlvLsa);
197  }
198 
199  return lsas;
200 
201 }
202 
203 template<> std::list<tlv::CoordinateLsa>
204 getTlvLsas<tlv::CoordinateLsa>(const Lsdb& lsdb)
205 {
206  std::list<tlv::CoordinateLsa> lsas;
207 
208  auto lsaRange = std::make_pair<std::list<CoordinateLsa>::const_iterator,
209  std::list<CoordinateLsa>::const_iterator>(
210  lsdb.getCoordinateLsdb().cbegin(), lsdb.getCoordinateLsdb().cend());
211 
212  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
213  tlv::CoordinateLsa tlvLsa;
214 
215  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
216  tlvLsa.setLsaInfo(*tlvLsaInfo);
217 
218  tlvLsa.setHyperbolicRadius(lsa->getCorRadius());
219  tlvLsa.setHyperbolicAngle(lsa->getCorTheta());
220 
221  lsas.push_back(tlvLsa);
222  }
223 
224  return lsas;
225 
226 }
227 
228 template<> std::list<tlv::NameLsa>
229 getTlvLsas<tlv::NameLsa>(const Lsdb& lsdb)
230 {
231  std::list<tlv::NameLsa> lsas;
232 
233  auto lsaRange = std::make_pair<std::list<NameLsa>::const_iterator,
234  std::list<NameLsa>::const_iterator>(
235  lsdb.getNameLsdb().cbegin(), lsdb.getNameLsdb().cend());
236  for (auto lsa = lsaRange.first; lsa != lsaRange.second; lsa++) {
237  tlv::NameLsa tlvLsa;
238 
239  std::shared_ptr<tlv::LsaInfo> tlvLsaInfo = tlv::makeLsaInfo(*lsa);
240  tlvLsa.setLsaInfo(*tlvLsaInfo);
241 
242  for (const ndn::Name& name : lsa->getNpl().getNames()) {
243  tlvLsa.addName(name);
244  }
245 
246  lsas.push_back(tlvLsa);
247  }
248 
249  return lsas;
250 
251 }
252 
253 
254 } // namespace nlsr
Adjacency & setCost(uint64_t cost)
Definition: adjacency.hpp:97
const std::list< NameLsa > & getNameLsdb() const
Definition: lsdb.cpp:370
LsdbStatus & addNameLsa(const NameLsa &nameLsa)
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.
AdjacencyLsa & addAdjacency(const Adjacency &adjacency)
NameLsa & addName(const ndn::Name &name)
Definition: name-lsa.hpp:95
LsdbDatasetInterestHandler(Lsdb &lsdb, ndn::mgmt::Dispatcher &localHostDispatcher, ndn::mgmt::Dispatcher &routerNameDispatcher, ndn::Face &face, ndn::KeyChain &keyChain)
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:41
NameLsa & setLsaInfo(const LsaInfo &lsaInfo)
Definition: name-lsa.hpp:75
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
Encodes the LSA objects and some info for each LSA using the method in TAG.
Definition: lsdb-status.cpp:50
Copyright (c) 2014-2017, The University of Memphis, Regents of the University of California.
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:571
Adjacency & setUri(const std::string &uri)
Definition: adjacency.hpp:83
const ndn::PartialName ADJACENCIES_DATASET
const ndn::PartialName LISTS_DATASET
size_t wireEncode(ndn::EncodingImpl< TAG > &block) const
Encodes the hyperbolic coordinates and some info using the method in TAG.
std::shared_ptr< LsaInfo > makeLsaInfo(const Lsa &lsa)
Definition: lsa-info.cpp:174
AdjacencyLsa & setLsaInfo(const LsaInfo &lsaInfo)
LsdbStatus & addAdjacencyLsa(const AdjacencyLsa &adjacencyLsa)
Definition: lsdb-status.hpp:79
Data abstraction for NameLsa.
Definition: name-lsa.hpp:47
A neighbor reachable over a Face.
Definition: adjacent.hpp:38
Copyright (c) 2014-2017, The University of Memphis, Regents of the University of California, Arizona Board of Regents.
LsdbStatus & addCoordinateLsa(const CoordinateLsa &coordinateLsa)
Data abstraction for AdjacencyLsa.
Data abstraction for LsdbStatus.
Definition: lsdb-status.hpp:50
const ndn::PartialName NAMES_DATASET
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)