void FibManager::removeNextHop(const Name& topPrefix, const Interest& interest, ControlParameters parameters, const ndn::mgmt::CommandContinuation& done) { setFaceForSelfRegistration(interest, parameters); NFD_LOG_TRACE("remove-nexthop prefix: " << parameters.getName() << " faceid: " << parameters.getFaceId()); auto face = m_getFace(parameters.getFaceId()); if (static_cast<bool>(face)) { auto entry = m_fib.findExactMatch(parameters.getName()); if (static_cast<bool>(entry)) { entry->removeNextHop(face); NFD_LOG_DEBUG("remove-nexthop result: OK prefix: " << parameters.getName() << " faceid: " << parameters.getFaceId()); if (!entry->hasNextHops()) { m_fib.erase(*entry); } } else { NFD_LOG_DEBUG("remove-nexthop result: OK"); } } else { NFD_LOG_DEBUG("remove-nexthop result: OK"); } done(ControlResponse(200, "Success").setBody(parameters.wireEncode())); }
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 FibManager::addNextHop(const Name& topPrefix, const Interest& interest, ControlParameters parameters, const ndn::mgmt::CommandContinuation& done) { setFaceForSelfRegistration(interest, parameters); const Name& prefix = parameters.getName(); FaceId faceId = parameters.getFaceId(); uint64_t cost = parameters.getCost(); NFD_LOG_TRACE("add-nexthop prefix: " << prefix << " faceid: " << faceId << " cost: " << cost); auto face = m_getFace(faceId); if (static_cast<bool>(face)) { auto entry = m_fib.insert(prefix).first; entry->addNextHop(face, cost); NFD_LOG_DEBUG("add-nexthop result: OK" << " prefix:" << prefix << " faceid: " << faceId << " cost: " << cost); return done(ControlResponse(200, "Success").setBody(parameters.wireEncode())); } else { NFD_LOG_INFO("add-nexthop result: FAIL reason: unknown-faceid: " << faceId); return done(ControlResponse(410, "Face not found")); } }
void FaceDestroyCommand::validateRequest(const ControlParameters& parameters) const { this->ControlCommand::validateRequest(parameters); if (parameters.getFaceId() == 0) { BOOST_THROW_EXCEPTION(ArgumentError("FaceId must not be zero")); } }
void RibUnregisterCommand::validateResponse(const ControlParameters& parameters) const { this->ControlCommand::validateResponse(parameters); if (parameters.getFaceId() == 0) { BOOST_THROW_EXCEPTION(ArgumentError("FaceId must not be zero")); } }
void RibRegisterCommand::validateResponse(const ControlParameters& parameters) const { this->ControlCommand::validateResponse(parameters); if (parameters.getFaceId() == INVALID_FACE_ID) { BOOST_THROW_EXCEPTION(ArgumentError("FaceId must be valid")); } }
virtual void validateResponse(const ControlParameters& parameters) const { this->ControlCommand::validateResponse(parameters); if (parameters.getFaceId() == 0) { throw ArgumentError("FaceId must not be zero"); } }
void FibManager::removeNextHop(ControlParameters& parameters, ControlResponse& response) { ndn::nfd::FibRemoveNextHopCommand command; if (!validateParameters(command, parameters)) { NFD_LOG_DEBUG("remove-nexthop result: FAIL reason: malformed"); setResponse(response, 400, "Malformed command"); return; } NFD_LOG_TRACE("remove-nexthop prefix: " << parameters.getName() << " faceid: " << parameters.getFaceId()); shared_ptr<Face> faceToRemove = m_getFace(parameters.getFaceId()); if (static_cast<bool>(faceToRemove)) { shared_ptr<fib::Entry> entry = m_managedFib.findExactMatch(parameters.getName()); if (static_cast<bool>(entry)) { entry->removeNextHop(faceToRemove); NFD_LOG_DEBUG("remove-nexthop result: OK prefix: " << parameters.getName() << " faceid: " << parameters.getFaceId()); if (!entry->hasNextHops()) { m_managedFib.erase(*entry); } } else { NFD_LOG_DEBUG("remove-nexthop result: OK, but entry for face id " << parameters.getFaceId() << " not found"); } } else { NFD_LOG_DEBUG("remove-nexthop result: OK, but face id " << parameters.getFaceId() << " not found"); } setResponse(response, 200, "Success", parameters.wireEncode()); }
void FaceManager::destroyFace(const ControlParameters& parameters, const ndn::mgmt::CommandContinuation& done) { Face* face = m_faceTable.get(parameters.getFaceId()); if (face != nullptr) { face->close(); } done(ControlResponse(200, "OK").setBody(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 Nfdc::fibAddNextHop(const ControlParameters& faceCreateResult) { ControlParameters ribParameters; ribParameters .setName(m_name) .setCost(m_cost) .setFaceId(faceCreateResult.getFaceId()); m_controller.start<FibAddNextHopCommand>(ribParameters, bind(&Nfdc::onSuccess, this, _1, "Nexthop insertion succeeded"), bind(&Nfdc::onError, this, _1, _2, "Nexthop insertion failed")); }
void Nfdc::ribRegisterPrefix(const ControlParameters& faceCreateResult) { ControlParameters ribParameters; ribParameters .setName(m_name) .setCost(m_cost) .setFlags(m_flags) .setOrigin(m_origin) .setFaceId(faceCreateResult.getFaceId()); if (m_expires != DEFAULT_EXPIRATION_PERIOD) ribParameters.setExpirationPeriod(m_expires); m_controller.start<RibRegisterCommand>(ribParameters, bind(&Nfdc::onSuccess, this, _1, "Successful in name registration"), bind(&Nfdc::onError, this, _1, _2, "Failed in name registration")); }
void FibManager::addNextHop(ControlParameters& parameters, ControlResponse& response) { ndn::nfd::FibAddNextHopCommand command; if (!validateParameters(command, parameters)) { NFD_LOG_DEBUG("add-nexthop result: FAIL reason: malformed"); setResponse(response, 400, "Malformed command"); return; } const Name& prefix = parameters.getName(); FaceId faceId = parameters.getFaceId(); uint64_t cost = parameters.getCost(); NFD_LOG_TRACE("add-nexthop prefix: " << prefix << " faceid: " << faceId << " cost: " << cost); shared_ptr<Face> nextHopFace = m_getFace(faceId); if (static_cast<bool>(nextHopFace)) { shared_ptr<fib::Entry> entry = m_managedFib.insert(prefix).first; entry->addNextHop(nextHopFace, cost); NFD_LOG_DEBUG("add-nexthop result: OK" << " prefix:" << prefix << " faceid: " << faceId << " cost: " << cost); setResponse(response, 200, "Success", parameters.wireEncode()); } else { NFD_LOG_DEBUG("add-nexthop result: FAIL reason: unknown-faceid: " << faceId); setResponse(response, 410, "Face not found"); } }
void FaceManager::destroyFace(const Interest& request, ControlParameters& parameters) { const Name& requestName = request.getName(); ndn::nfd::FaceDestroyCommand command; if (!validateParameters(command, parameters)) { sendResponse(requestName, 400, "Malformed command"); return; } shared_ptr<Face> target = m_faceTable.get(parameters.getFaceId()); if (static_cast<bool>(target)) { target->close(); } sendResponse(requestName, 200, "Success", parameters.wireEncode()); }
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); }
void FaceManager::updateFace(const Interest& interest, const ControlParameters& parameters, const ndn::mgmt::CommandContinuation& done) { FaceId faceId = parameters.getFaceId(); if (faceId == 0) { // Self-update auto incomingFaceIdTag = interest.getTag<lp::IncomingFaceIdTag>(); if (incomingFaceIdTag == nullptr) { NFD_LOG_TRACE("unable to determine face for self-update"); done(ControlResponse(404, "No FaceId specified and IncomingFaceId not available")); return; } faceId = *incomingFaceIdTag; } Face* face = m_faceTable.get(faceId); if (face == nullptr) { NFD_LOG_TRACE("invalid face specified"); done(ControlResponse(404, "Specified face does not exist")); return; } // Verify validity of requested changes ControlParameters response; bool areParamsValid = true; if (parameters.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED) && parameters.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED) && face->getScope() != ndn::nfd::FACE_SCOPE_LOCAL) { NFD_LOG_TRACE("received request to enable local fields on non-local face"); areParamsValid = false; response.setFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED, parameters.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED)); } // check whether the requested FacePersistency change is valid if it's present if (parameters.hasFacePersistency()) { auto persistency = parameters.getFacePersistency(); if (!face->getTransport()->canChangePersistencyTo(persistency)) { NFD_LOG_TRACE("cannot change face persistency to " << persistency); areParamsValid = false; response.setFacePersistency(persistency); } } if (!areParamsValid) { done(ControlResponse(409, "Invalid properties specified").setBody(response.wireEncode())); return; } // All specified properties are valid, so make changes if (parameters.hasFacePersistency()) { face->setPersistency(parameters.getFacePersistency()); } updateLinkServiceOptions(*face, parameters); // Prepare and send ControlResponse response = makeUpdateFaceResponse(*face); done(ControlResponse(200, "OK").setBody(response.wireEncode())); }