28 #include <boost/lexical_cast.hpp>
30 #include <ndn-cxx/encoding/tlv-nfd.hpp>
34 using nfd::ControlParameters;
43 , m_controller(controller)
48 MulticastDiscovery::doStart()
50 nfd::FaceQueryFilter filter;
51 filter.setLinkType(nfd::LINK_TYPE_MULTI_ACCESS);
53 m_controller.fetch<nfd::FaceQueryDataset>(
55 [
this] (
const auto& dataset) { registerHubDiscoveryPrefix(dataset); },
56 [
this] (uint32_t code,
const std::string& reason) {
57 fail(
"Error " + to_string(code) +
" when querying multi-access faces: " + reason);
62 MulticastDiscovery::registerHubDiscoveryPrefix(
const std::vector<nfd::FaceStatus>& dataset)
64 if (dataset.empty()) {
65 fail(
"No multi-access faces available");
69 m_nRegs = dataset.size();
73 for (
const auto& faceStatus : dataset) {
74 ControlParameters parameters;
76 .setFaceId(faceStatus.getFaceId())
80 m_controller.start<nfd::RibRegisterCommand>(
82 [
this] (
const auto&) {
86 [
this, faceStatus] (
const auto& resp) {
87 std::cerr <<
"Error " << resp.getCode() <<
" when registering hub discovery prefix "
88 <<
"for face " << faceStatus.getFaceId() <<
" (" << faceStatus.getRemoteUri()
89 <<
"): " << resp.getText() << std::endl;
97 MulticastDiscovery::afterReg()
99 if (m_nRegSuccess + m_nRegFailure < m_nRegs) {
102 if (m_nRegSuccess > 0) {
106 fail(
"Cannot register hub discovery prefix for any face");
111 MulticastDiscovery::setStrategy()
113 ControlParameters parameters;
115 .setStrategy(
"/localhost/nfd/strategy/multicast");
117 m_controller.start<nfd::StrategyChoiceSetCommand>(
119 [
this] (
const auto&) { requestHubData(); },
120 [
this] (
const auto& resp) {
121 fail(
"Error " + to_string(resp.getCode()) +
" when setting multicast strategy: " + resp.getText());
126 MulticastDiscovery::requestHubData()
129 interest.setCanBePrefix(
true);
130 interest.setMustBeFresh(
true);
133 m_face.expressInterest(interest,
134 [
this] (
const Interest&,
const Data& data) {
135 const Block& content = data.getContent();
138 auto i = content.find(tlv::nfd::Uri);
139 if (i == content.elements_end()) {
140 fail(
"Malformed hub Data: missing Uri element");
144 provideHubFaceUri(std::string(
reinterpret_cast<const char*
>(i->value()), i->value_size()));
146 [
this] (
const Interest&,
const lp::Nack& nack) {
147 fail(
"Nack-" + boost::lexical_cast<std::string>(nack.getReason()) +
" when retrieving hub Data");
149 [
this] (
const Interest&) {
150 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