28 #include <boost/lexical_cast.hpp>
30 #include <ndn-cxx/encoding/tlv-nfd.hpp>
31 #include <ndn-cxx/mgmt/nfd/control-command.hpp>
32 #include <ndn-cxx/mgmt/nfd/status-dataset.hpp>
36 using nfd::ControlParameters;
45 , m_controller(controller)
50 MulticastDiscovery::doStart()
52 nfd::FaceQueryFilter filter;
53 filter.setLinkType(nfd::LINK_TYPE_MULTI_ACCESS);
55 m_controller.fetch<nfd::FaceQueryDataset>(
57 [
this] (
const auto& dataset) { registerHubDiscoveryPrefix(dataset); },
58 [
this] (uint32_t code,
const std::string& reason) {
59 fail(
"Error " + std::to_string(code) +
" when querying multi-access faces: " + reason);
64 MulticastDiscovery::registerHubDiscoveryPrefix(
const std::vector<nfd::FaceStatus>& dataset)
66 if (dataset.empty()) {
67 fail(
"No multi-access faces available");
71 m_nRegs = dataset.size();
75 for (
const auto& faceStatus : dataset) {
76 ControlParameters parameters;
78 .setFaceId(faceStatus.getFaceId())
82 m_controller.start<nfd::RibRegisterCommand>(
84 [
this] (
const auto&) {
88 [
this, faceStatus] (
const auto& resp) {
89 std::cerr <<
"Error " << resp.getCode() <<
" when registering hub discovery prefix "
90 <<
"for face " << faceStatus.getFaceId() <<
" (" << faceStatus.getRemoteUri()
91 <<
"): " << resp.getText() << std::endl;
99 MulticastDiscovery::afterReg()
101 if (m_nRegSuccess + m_nRegFailure < m_nRegs) {
104 if (m_nRegSuccess > 0) {
108 fail(
"Cannot register hub discovery prefix for any face");
113 MulticastDiscovery::setStrategy()
115 ControlParameters parameters;
117 .setStrategy(
"/localhost/nfd/strategy/multicast");
119 m_controller.start<nfd::StrategyChoiceSetCommand>(
121 [
this] (
const auto&) { requestHubData(); },
122 [
this] (
const auto& resp) {
123 fail(
"Error " + std::to_string(resp.getCode()) +
" when setting multicast strategy: " + resp.getText());
128 MulticastDiscovery::requestHubData()
131 interest.setCanBePrefix(
true);
132 interest.setMustBeFresh(
true);
135 m_face.expressInterest(interest,
136 [
this] (
const Interest&,
const Data& data) {
137 const Block& content = data.getContent();
140 auto i = content.find(tlv::nfd::Uri);
141 if (i == content.elements_end()) {
142 fail(
"Malformed hub Data: missing Uri element");
146 provideHubFaceUri(std::string(
reinterpret_cast<const char*
>(i->value()), i->value_size()));
148 [
this] (
const Interest&,
const lp::Nack& nack) {
149 fail(
"Nack-" + boost::lexical_cast<std::string>(nack.getReason()) +
" when retrieving hub Data");
151 [
this] (
const Interest&) {
152 fail(
"Timeout when retrieving hub Data");
MulticastDiscovery(Face &face, nfd::Controller &controller)
void provideHubFaceUri(const std::string &s)
Parse HUB FaceUri from string and declare success.
void fail(const std::string &msg)
constexpr uint64_t HUB_DISCOVERY_ROUTE_COST
const Name HUB_DISCOVERY_PREFIX
constexpr time::milliseconds HUB_DISCOVERY_INTEREST_LIFETIME
constexpr time::milliseconds HUB_DISCOVERY_ROUTE_EXPIRATION