28 #include <ndn-cxx/util/segment-fetcher.hpp>
32 namespace autoconfig {
38 :
Base(face, keyChain, nextStageOnFailure)
47 std::cerr <<
"Trying multicast discovery..." << std::endl;
49 util::SegmentFetcher::fetch(
m_face, Interest(
"/localhost/nfd/faces/list"),
51 [
this] (
const ConstBufferPtr& data) {
52 registerHubDiscoveryPrefix(data);
54 [
this] (uint32_t code,
const std::string& msg) {
60 MulticastDiscovery::registerHubDiscoveryPrefix(
const ConstBufferPtr& buffer)
62 std::vector<uint64_t> multicastFaces;
65 while (offset < buffer->size()) {
68 std::tie(isOk, block) = Block::fromBuffer(buffer, offset);
70 std::cerr <<
"ERROR: cannot decode FaceStatus TLV" << std::endl;
74 offset += block.size();
76 nfd::FaceStatus faceStatus(block);
78 ndn::util::FaceUri uri(faceStatus.getRemoteUri());
79 if (uri.getScheme() ==
"udp4") {
80 namespace ip = boost::asio::ip;
81 boost::system::error_code ec;
82 ip::address address = ip::address::from_string(uri.getHost(), ec);
84 if (!ec && address.is_multicast()) {
85 multicastFaces.push_back(faceStatus.getFaceId());
92 if (multicastFaces.empty()) {
96 nfd::ControlParameters parameters;
98 .setName(LOCALHOP_HUB_DISCOVERY_PREFIX)
100 .setExpirationPeriod(time::seconds(30));
102 nRequestedRegs = multicastFaces.size();
105 for (
const auto& face : multicastFaces) {
106 parameters.setFaceId(face);
108 bind(&MulticastDiscovery::onRegisterSuccess,
110 bind(&MulticastDiscovery::onRegisterFailure,
117 MulticastDiscovery::onRegisterSuccess()
121 if (nRequestedRegs == nFinishedRegs) {
122 MulticastDiscovery::setStrategy();
127 MulticastDiscovery::onRegisterFailure(
const nfd::ControlResponse& response)
129 std::cerr <<
"ERROR: " << response.getText() <<
" (code: " << response.getCode() <<
")" << std::endl;
132 if (nRequestedRegs == nFinishedRegs) {
133 if (nRequestedRegs > 0) {
134 MulticastDiscovery::setStrategy();
137 " for all multicast faces, skipping multicast discovery stage");
143 MulticastDiscovery::setStrategy()
145 nfd::ControlParameters parameters;
147 .setName(LOCALHOP_HUB_DISCOVERY_PREFIX)
148 .setStrategy(
"/localhost/nfd/strategy/multicast");
150 m_controller.start<nfd::StrategyChoiceSetCommand>(parameters,
151 bind(&MulticastDiscovery::requestHubData,
this),
152 bind(&MulticastDiscovery::onSetStrategyFailure,
157 MulticastDiscovery::onSetStrategyFailure(
const nfd::ControlResponse& response)
160 LOCALHOP_HUB_DISCOVERY_PREFIX.toUri() +
" namespace (" + response.getText() +
"). "
161 "Skipping multicast discovery stage");
165 MulticastDiscovery::requestHubData()
167 Interest interest(LOCALHOP_HUB_DISCOVERY_PREFIX);
168 interest.setInterestLifetime(time::milliseconds(4000));
169 interest.setMustBeFresh(
true);
171 m_face.expressInterest(interest,
172 bind(&MulticastDiscovery::onSuccess,
this, _2),
177 MulticastDiscovery::onSuccess(Data& data)
179 const Block& content = data.getContent();
183 Block::element_const_iterator blockValue = content.find(tlv::nfd::Uri);
184 if (blockValue == content.elements_end()) {
188 std::string hubUri(reinterpret_cast<const char*>(blockValue->value()), blockValue->value_size());
Copyright (c) 2014-2016, Regents of the University of California, Arizona Board of Regents...