void RibManager::unregisterEntry(const shared_ptr<const Interest>& request, ControlParameters& params) { ndn::nfd::RibUnregisterCommand command; // Passing all parameters gives error in validation, // so passing only the required arguments. ControlParameters parameters; parameters.setName(params.getName()); if (params.hasFaceId()) { parameters.setFaceId(params.getFaceId()); } if (params.hasOrigin()) { parameters.setOrigin(params.getOrigin()); } if (!validateParameters(command, parameters)) { NFD_LOG_DEBUG("unregister result: FAIL reason: malformed"); if (static_cast<bool>(request)) { sendResponse(request->getName(), 400, "Malformed command"); } return; } bool isSelfRegistration = (!parameters.hasFaceId() || parameters.getFaceId() == 0); if (isSelfRegistration) { shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request->getTag<lp::IncomingFaceIdTag>(); if (incomingFaceIdTag == nullptr) { sendResponse(request->getName(), 503, "requested self-registration, but IncomingFaceId is unavailable"); return; } parameters.setFaceId(*incomingFaceIdTag); } // Respond since command is valid and authorized sendSuccessResponse(request, parameters); Route route; route.faceId = parameters.getFaceId(); route.origin = parameters.getOrigin(); NFD_LOG_INFO("Removing route " << parameters.getName() << " nexthop=" << route.faceId << " origin=" << route.origin); RibUpdate update; update.setAction(RibUpdate::UNREGISTER) .setName(parameters.getName()) .setRoute(route); m_managedRib.beginApplyUpdate(update, bind(&RibManager::onRibUpdateSuccess, this, update), bind(&RibManager::onRibUpdateFailure, this, update, _1, _2)); }
void FibManager::onValidatedFibRequest(const shared_ptr<const Interest>& request) { const Name& command = request->getName(); const Name::Component& verb = command[COMMAND_PREFIX.size()]; const Name::Component& parameterComponent = command[COMMAND_PREFIX.size() + 1]; SignedVerbDispatchTable::const_iterator verbProcessor = m_signedVerbDispatch.find(verb); if (verbProcessor != m_signedVerbDispatch.end()) { ControlParameters parameters; if (!extractParameters(parameterComponent, parameters) || !parameters.hasFaceId()) { NFD_LOG_DEBUG("command result: malformed verb: " << verb); sendResponse(command, 400, "Malformed command"); return; } if (parameters.getFaceId() == 0) { parameters.setFaceId(request->getIncomingFaceId()); } NFD_LOG_DEBUG("command result: processing verb: " << verb); ControlResponse response; (verbProcessor->second)(this, parameters, response); sendResponse(command, response); } else { NFD_LOG_DEBUG("command result: unsupported verb: " << verb); sendResponse(command, 501, "Unsupported command"); } }
void Nfdc::fibAddNextHop() { m_name = m_commandLineArguments[0]; ControlParameters parameters; parameters .setName(m_name) .setCost(m_cost); if (!isValidUri(m_commandLineArguments[1])) { try { //So the uri is not valid, may be a faceId is provided. m_faceId = boost::lexical_cast<int>(m_commandLineArguments[1]); } catch (const std::exception& e) { std::cerr << "No valid faceUri or faceId is provided"<< std::endl; return; } parameters.setFaceId(m_faceId); fibAddNextHop(parameters); } else { ControlParameters faceParameters; faceParameters.setUri(m_commandLineArguments[1]); m_controller.start<FaceCreateCommand>(faceParameters, bind(&Nfdc::fibAddNextHop, this, _1), bind(&Nfdc::onError, this, _1, _2, "Face creation failed")); } }
void Nfdc::ribRegisterPrefix() { m_name = m_commandLineArguments[0]; ControlParameters parameters; parameters .setName(m_name) .setCost(m_cost) .setFlags(m_flags) .setOrigin(m_origin); if (m_expires != DEFAULT_EXPIRATION_PERIOD) parameters.setExpirationPeriod(m_expires); if (!isValidUri(m_commandLineArguments[1])) { try { //So the uri is not valid, may be a faceId is provided. m_faceId = boost::lexical_cast<int>(m_commandLineArguments[1]); } catch (const std::exception& e) { std::cerr << "No valid faceUri or faceId is provided"<< std::endl; return; } parameters.setFaceId(m_faceId); ribRegisterPrefix(parameters); } else { ControlParameters faceParameters; faceParameters.setUri(m_commandLineArguments[1]); m_controller.start<FaceCreateCommand>(faceParameters, bind(&Nfdc::ribRegisterPrefix, this, _1), bind(&Nfdc::onError, this, _1, _2, "Face creation failed")); } }
BOOST_FIXTURE_TEST_CASE(DestroyFace, AuthorizedCommandFixture<FaceFixture>) { shared_ptr<DummyFace> dummy(make_shared<DummyFace>()); FaceTableFixture::m_faceTable.add(dummy); ControlParameters parameters; parameters.setFaceId(dummy->getId()); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/faces"); commandName.append("destroy"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); generateCommand(*command); ndn::nfd::FaceEventNotification expectedFaceEvent; expectedFaceEvent.setKind(ndn::nfd::FACE_EVENT_DESTROYED) .setFaceId(dummy->getId()) .setRemoteUri(dummy->getRemoteUri().toString()) .setLocalUri(dummy->getLocalUri().toString()) .setFlags(0); getFace()->onReceiveData += bind(&FaceFixture::callbackDispatch, this, _1, command->getName(), 200, "Success", ref(encodedParameters), expectedFaceEvent); destroyFace(*command, parameters); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(didReceiveNotication()); }
virtual void applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } }
void FibRemoveNextHopCommand::applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } }
void FaceUpdateCommand::applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } }
void FaceCreateCommand::applyDefaultsToRequest(ControlParameters& parameters) const { parameters.setFaceId(0); if (!parameters.hasFacePersistency()) { parameters.setFacePersistency(FacePersistency::FACE_PERSISTENCY_PERSISTENT); } }
virtual void applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } if (!parameters.hasOrigin()) { parameters.setOrigin(ROUTE_ORIGIN_APP); } }
void RibUnregisterCommand::applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } if (!parameters.hasOrigin()) { parameters.setOrigin(ROUTE_ORIGIN_APP); } }
void FaceManager::onCreated(const Name& requestName, ControlParameters& parameters, const shared_ptr<Face>& newFace) { addCreatedFaceToForwarder(newFace); parameters.setFaceId(newFace->getId()); parameters.setUri(newFace->getRemoteUri().toString()); sendResponse(requestName, 200, "Success", parameters.wireEncode()); }
void Nfdc::faceDestroy(const ControlParameters& faceCreateResult) { ControlParameters faceParameters; faceParameters.setFaceId(faceCreateResult.getFaceId()); m_controller.start<FaceDestroyCommand>(faceParameters, bind(&Nfdc::onSuccess, this, _1, "Face destroy succeeded"), bind(&Nfdc::onError, this, _1, _2, "Face destroy failed")); }
void FibManager::setFaceForSelfRegistration(const Interest& request, ControlParameters& parameters) { bool isSelfRegistration = (parameters.getFaceId() == 0); if (isSelfRegistration) { shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request.getTag<lp::IncomingFaceIdTag>(); // NDNLPv2 says "application MUST be prepared to receive a packet without IncomingFaceId field", // but it's fine to assert IncomingFaceId is available, because InternalFace lives inside NFD // and is initialized synchronously with IncomingFaceId field enabled. BOOST_ASSERT(incomingFaceIdTag != nullptr); parameters.setFaceId(*incomingFaceIdTag); } }
void FibHelper::AddRoute(Ptr<Node> node, const Name& prefix, shared_ptr<Face> face, int32_t metric) { NS_LOG_LOGIC("[" << node->GetId() << "]$ route add " << prefix << " via " << face->getLocalUri() << " metric " << metric); ControlParameters parameters; parameters.setName(prefix); parameters.setFaceId(face->getId()); parameters.setCost(metric); AddNextHop(parameters, node); }
void FibHelper::RemoveRoute(Ptr<Node> node, const Name& prefix, shared_ptr<Face> face) { // Get L3Protocol object Ptr<L3Protocol> L3protocol = node->GetObject<L3Protocol>(); // Get the forwarder instance shared_ptr<nfd::Forwarder> m_forwarder = L3protocol->getForwarder(); ControlParameters parameters; parameters.setName(prefix); parameters.setFaceId(face->getId()); RemoveNextHop(parameters, node); }
void RibRegisterCommand::applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } if (!parameters.hasOrigin()) { parameters.setOrigin(ROUTE_ORIGIN_APP); } if (!parameters.hasCost()) { parameters.setCost(0); } if (!parameters.hasFlags()) { parameters.setFlags(ROUTE_FLAG_CHILD_INHERIT); } }
void FibHelper::AddRoute(Ptr<Node> node, const Name& prefix, shared_ptr<Face> face, int32_t metric) { NS_LOG_LOGIC("[" << node->GetId() << "]$ route add " << prefix << " via " << face->getLocalUri() << " metric " << metric); // Get L3Protocol object Ptr<L3Protocol> L3protocol = node->GetObject<L3Protocol>(); // Get the forwarder instance shared_ptr<nfd::Forwarder> m_forwarder = L3protocol->getForwarder(); ControlParameters parameters; parameters.setName(prefix); parameters.setFaceId(face->getId()); parameters.setCost(metric); AddNextHop(parameters, node); }
static ControlParameters makeUpdateFaceResponse(const Face& face) { ControlParameters params; params.setFaceId(face.getId()) .setFacePersistency(face.getPersistency()); auto linkService = dynamic_cast<face::GenericLinkService*>(face.getLinkService()); if (linkService != nullptr) { const auto& options = linkService->getOptions(); params.setBaseCongestionMarkingInterval(options.baseCongestionMarkingInterval) .setDefaultCongestionThreshold(options.defaultCongestionThreshold) .setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, options.allowLocalFields, false) .setFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED, options.reliabilityOptions.isEnabled, false) .setFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED, options.allowCongestionMarking, false); } return params; }
void Nfdc::faceDestroy() { ControlParameters parameters; const std::string& faceName = m_commandLineArguments[0]; FaceIdFetcher::start(m_face, m_controller, faceName, false, [this] (const uint32_t faceId) { ControlParameters faceParameters; faceParameters.setFaceId(faceId); m_controller.start<FaceDestroyCommand>(faceParameters, bind(&Nfdc::onSuccess, this, _1, "Face destroy succeeded"), bind(&Nfdc::onError, this, _1, _2, "Face destroy failed")); }, bind(&Nfdc::onObtainFaceIdFailure, this, _1)); }
BOOST_FIXTURE_TEST_CASE(OnCreated, AuthorizedCommandFixture<FaceFixture>) { ControlParameters parameters; parameters.setUri("tcp://127.0.0.1"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/faces"); commandName.append("create"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); generateCommand(*command); ControlParameters resultParameters; resultParameters.setUri("dummy://"); resultParameters.setFaceId(FACEID_RESERVED_MAX + 1); shared_ptr<DummyFace> dummy(make_shared<DummyFace>()); ndn::nfd::FaceEventNotification expectedFaceEvent; expectedFaceEvent.setKind(ndn::nfd::FACE_EVENT_CREATED) .setFaceId(FACEID_RESERVED_MAX + 1) .setRemoteUri(dummy->getRemoteUri().toString()) .setLocalUri(dummy->getLocalUri().toString()) .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL) .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT); Block encodedResultParameters(resultParameters.wireEncode()); getFace()->onReceiveData += [this, command, encodedResultParameters, expectedFaceEvent] (const Data& response) { this->callbackDispatch(response,command->getName(), 200, "Success", encodedResultParameters, expectedFaceEvent); }; onCreated(command->getName(), parameters, dummy); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(didReceiveNotication()); }
BOOST_FIXTURE_TEST_CASE(OnCreated, AuthorizedCommandFixture<FaceFixture>) { ControlParameters parameters; parameters.setUri("tcp://127.0.0.1"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/faces"); commandName.append("create"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); generateCommand(*command); ControlParameters resultParameters; resultParameters.setUri("tcp://127.0.0.1"); resultParameters.setFaceId(1); shared_ptr<DummyFace> dummy(make_shared<DummyFace>()); ndn::nfd::FaceEventNotification expectedFaceEvent; expectedFaceEvent.setKind(ndn::nfd::FACE_EVENT_CREATED) .setFaceId(1) .setRemoteUri(dummy->getRemoteUri().toString()) .setLocalUri(dummy->getLocalUri().toString()) .setFlags(0); Block encodedResultParameters(resultParameters.wireEncode()); getFace()->onReceiveData += bind(&FaceFixture::callbackDispatch, this, _1, command->getName(), 200, "Success", encodedResultParameters, expectedFaceEvent); onCreated(command->getName(), parameters, dummy); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(didReceiveNotication()); }
BOOST_FIXTURE_TEST_CASE(DestroyFace, AuthorizedCommandFixture<FaceFixture>) { shared_ptr<DummyFace> dummy(make_shared<DummyFace>()); FaceTableFixture::m_faceTable.add(dummy); ControlParameters parameters; parameters.setFaceId(dummy->getId()); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/faces"); commandName.append("destroy"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); generateCommand(*command); ndn::nfd::FaceEventNotification expectedFaceEvent; expectedFaceEvent.setKind(ndn::nfd::FACE_EVENT_DESTROYED) .setFaceId(dummy->getId()) .setRemoteUri(dummy->getRemoteUri().toString()) .setLocalUri(dummy->getLocalUri().toString()) .setFaceScope(ndn::nfd::FACE_SCOPE_NON_LOCAL) .setFacePersistency(ndn::nfd::FACE_PERSISTENCY_PERSISTENT); getFace()->onReceiveData += [this, command, encodedParameters, expectedFaceEvent] (const Data& response) { this->callbackDispatch(response,command->getName(), 200, "Success", encodedParameters, expectedFaceEvent); }; destroyFace(*command, parameters); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(didReceiveNotication()); }
virtual void applyDefaultsToRequest(ControlParameters& parameters) const { if (!parameters.hasFaceId()) { parameters.setFaceId(0); } if (!parameters.hasOrigin()) { parameters.setOrigin(ROUTE_ORIGIN_APP); } if (!parameters.hasCost()) { parameters.setCost(0); } if (!parameters.hasFlags()) { parameters.setFlags(ROUTE_FLAG_CHILD_INHERIT); } if (!parameters.hasExpirationPeriod()) { if (parameters.getFaceId() == 0) { parameters.setExpirationPeriod(time::milliseconds::max()); } else { parameters.setExpirationPeriod(time::hours(1)); } } }
void RibManager::registerEntry(const shared_ptr<const Interest>& request, ControlParameters& parameters) { ndn::nfd::RibRegisterCommand command; if (!validateParameters(command, parameters)) { NFD_LOG_DEBUG("register result: FAIL reason: malformed"); if (static_cast<bool>(request)) { sendResponse(request->getName(), 400, "Malformed command"); } return; } bool isSelfRegistration = (!parameters.hasFaceId() || parameters.getFaceId() == 0); if (isSelfRegistration) { shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = request->getTag<lp::IncomingFaceIdTag>(); if (incomingFaceIdTag == nullptr) { sendResponse(request->getName(), 503, "requested self-registration, but IncomingFaceId is unavailable"); return; } parameters.setFaceId(*incomingFaceIdTag); } // Respond since command is valid and authorized sendSuccessResponse(request, parameters); Route route; route.faceId = parameters.getFaceId(); route.origin = parameters.getOrigin(); route.cost = parameters.getCost(); route.flags = parameters.getFlags(); if (parameters.hasExpirationPeriod() && parameters.getExpirationPeriod() != time::milliseconds::max()) { route.expires = time::steady_clock::now() + parameters.getExpirationPeriod(); // Schedule a new event, the old one will be cancelled during rib insertion. scheduler::EventId eventId = scheduler::schedule(parameters.getExpirationPeriod(), bind(&Rib::onRouteExpiration, &m_managedRib, parameters.getName(), route)); NFD_LOG_TRACE("Scheduled unregistration at: " << route.expires << " with EventId: " << eventId); // Set the NewEventId of this entry route.setExpirationEvent(eventId); } else { route.expires = time::steady_clock::TimePoint::max(); } NFD_LOG_INFO("Adding route " << parameters.getName() << " nexthop=" << route.faceId << " origin=" << route.origin << " cost=" << route.cost); RibUpdate update; update.setAction(RibUpdate::REGISTER) .setName(parameters.getName()) .setRoute(route); m_managedRib.beginApplyUpdate(update, bind(&RibManager::onRibUpdateSuccess, this, update), bind(&RibManager::onRibUpdateFailure, this, update, _1, _2)); m_registeredFaces.insert(route.faceId); }