void StrategyChoiceManager::unsetStrategy(ControlParameters& parameters, ControlResponse& response) { ndn::nfd::StrategyChoiceUnsetCommand command; if (!validateParameters(command, parameters)) { static const Name ROOT_PREFIX; if (parameters.hasName() && parameters.getName() == ROOT_PREFIX) { NFD_LOG_DEBUG("strategy-choice result: FAIL reason: unset-root"); setResponse(response, 403, "Cannot unset root prefix strategy"); } else { NFD_LOG_DEBUG("strategy-choice result: FAIL reason: malformed"); setResponse(response, 400, "Malformed command"); } return; } m_strategyChoice.erase(parameters.getName()); NFD_LOG_DEBUG("strategy-choice result: SUCCESS"); setResponse(response, 200, "Success", parameters.wireEncode()); }
void StrategyChoiceManager::setStrategy(ControlParameters& parameters, ControlResponse& response) { ndn::nfd::StrategyChoiceSetCommand command; if (!validateParameters(command, parameters)) { NFD_LOG_DEBUG("strategy-choice result: FAIL reason: malformed"); setResponse(response, 400, "Malformed command"); return; } const Name& prefix = parameters.getName(); const Name& selectedStrategy = parameters.getStrategy(); if (!m_strategyChoice.hasStrategy(selectedStrategy)) { NFD_LOG_DEBUG("strategy-choice result: FAIL reason: unknown-strategy: " << parameters.getStrategy()); setResponse(response, 504, "Unsupported strategy"); return; } if (m_strategyChoice.insert(prefix, selectedStrategy)) { NFD_LOG_DEBUG("strategy-choice result: SUCCESS"); setResponse(response, 200, "Success", parameters.wireEncode()); } else { NFD_LOG_DEBUG("strategy-choice result: FAIL reason: not-installed"); setResponse(response, 405, "Strategy not installed"); } }
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()); }
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 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")); } }
BOOST_FIXTURE_TEST_CASE(LocalControlNextHopFaceId, AuthorizedCommandFixture<LocalControlFixture>) { shared_ptr<LocalFace> dummy = make_shared<DummyLocalFace>(); BOOST_REQUIRE(dummy->isLocal()); FaceTableFixture::m_faceTable.add(dummy); ControlParameters parameters; parameters.setLocalControlFeature(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID); Block encodedParameters(parameters.wireEncode()); Name enable("/localhost/nfd/faces/enable-local-control"); enable.append(encodedParameters); shared_ptr<Interest> enableCommand(make_shared<Interest>(enable)); enableCommand->setIncomingFaceId(dummy->getId()); generateCommand(*enableCommand); TestFaceManagerCommon::m_face->onReceiveData += [this, enableCommand, encodedParameters] (const Data& response) { this->validateControlResponse(response, enableCommand->getName(), 200, "Success", encodedParameters); }; onValidatedFaceRequest(enableCommand); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(dummy->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID)); BOOST_CHECK(!dummy->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID)); TestFaceManagerCommon::m_face->onReceiveData.clear(); resetCallbackFired(); Name disable("/localhost/nfd/faces/disable-local-control"); disable.append(encodedParameters); shared_ptr<Interest> disableCommand(make_shared<Interest>(disable)); disableCommand->setIncomingFaceId(dummy->getId()); generateCommand(*disableCommand); TestFaceManagerCommon::m_face->onReceiveData += [this, disableCommand, encodedParameters] (const Data& response) { this->validateControlResponse(response, disableCommand->getName(), 200, "Success", encodedParameters); }; onValidatedFaceRequest(disableCommand); BOOST_REQUIRE(didCallbackFire()); BOOST_REQUIRE(!dummy->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID)); BOOST_CHECK(!dummy->isLocalControlHeaderEnabled(LOCAL_CONTROL_FEATURE_INCOMING_FACE_ID)); }
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 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())); }
Name ControlCommand::getRequestName(const Name& commandPrefix, const ControlParameters& parameters) const { this->validateRequest(parameters); Name name = commandPrefix; name.append(m_module).append(m_verb); name.append(parameters.wireEncode()); return name; }
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()); }
/** \brief make a Command Interest from parameters */ Interest makeCommandInterest(const ControlParameters& parameters, const Sign& sign) const { this->validateRequest(parameters); Name name = m_prefix; name.append(parameters.wireEncode()); Interest commandInterest(name); sign(commandInterest); return commandInterest; }
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()); }
void FaceManager::disableLocalControl(const Interest& request, ControlParameters& parameters) { ndn::nfd::FaceDisableLocalControlCommand command; shared_ptr<LocalFace> face; LocalControlFeature feature; if (extractLocalControlParameters(request, parameters, command, face, feature)) { face->setLocalControlHeaderFeature(feature, false); sendResponse(request.getName(), 200, "Success", parameters.wireEncode()); } }
void FaceManager::afterCreateFaceSuccess(const shared_ptr<Face>& face, const ControlParameters& parameters, const ndn::mgmt::CommandContinuation& done) { if (face->getId() != face::INVALID_FACEID) { // Face already exists NFD_LOG_TRACE("Attempted to create duplicate face of " << face->getId()); ControlParameters response = makeCreateFaceResponse(*face); done(ControlResponse(409, "Face with remote URI already exists").setBody(response.wireEncode())); return; } // If scope non-local and flags set to enable local fields, request shouldn't // have made it this far BOOST_ASSERT(face->getScope() == ndn::nfd::FACE_SCOPE_LOCAL || !parameters.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED) || (parameters.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED) && !parameters.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED))); m_faceTable.add(face); ControlParameters response = makeCreateFaceResponse(*face); done(ControlResponse(200, "OK").setBody(response.wireEncode())); }
void StrategyChoiceHelper::sendCommand(const ControlParameters& parameters, Ptr<Node> node) { NS_LOG_DEBUG("Strategy choice command was initialized"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/strategy-choice"); commandName.append("set"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); StackHelper::getKeyChain().sign(*command); Ptr<L3Protocol> l3protocol = node->GetObject<L3Protocol>(); l3protocol->injectInterest(*command); }
void FibHelper::RemoveNextHop(const ControlParameters& parameters, Ptr<Node> node) { Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/fib"); commandName.append("remove-nexthop"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); command->setCanBePrefix(false); StackHelper::getKeyChain().sign(*command); Ptr<L3Protocol> l3protocol = node->GetObject<L3Protocol>(); l3protocol->injectInterest(*command); }
BOOST_FIXTURE_TEST_CASE(LocalControlNextHopFaceIdNonLocal, AuthorizedCommandFixture<LocalControlFixture>) { shared_ptr<DummyFace> dummy = make_shared<DummyFace>(); BOOST_REQUIRE(!dummy->isLocal()); FaceTableFixture::m_faceTable.add(dummy); ControlParameters parameters; parameters.setLocalControlFeature(LOCAL_CONTROL_FEATURE_NEXT_HOP_FACE_ID); Block encodedParameters(parameters.wireEncode()); Name enable("/localhost/nfd/faces/enable-local-control"); enable.append(encodedParameters); shared_ptr<Interest> enableCommand(make_shared<Interest>(enable)); enableCommand->setIncomingFaceId(dummy->getId()); generateCommand(*enableCommand); TestFaceManagerCommon::m_face->onReceiveData += bind(&LocalControlFixture::validateControlResponse, this, _1, enableCommand->getName(), 412, "Face is non-local"); onValidatedFaceRequest(enableCommand); BOOST_REQUIRE(didCallbackFire()); TestFaceManagerCommon::m_face->onReceiveData.clear(); resetCallbackFired(); Name disable("/localhost/nfd/faces/disable-local-control"); disable.append(encodedParameters); shared_ptr<Interest> disableCommand(make_shared<Interest>(disable)); disableCommand->setIncomingFaceId(dummy->getId()); generateCommand(*disableCommand); TestFaceManagerCommon::m_face->onReceiveData += bind(&LocalControlFixture::validateControlResponse, this, _1, disableCommand->getName(), 412, "Face is non-local"); onValidatedFaceRequest(disableCommand); BOOST_REQUIRE(didCallbackFire()); }
void RibManager::onUnRegSuccess(const shared_ptr<const Interest>& request, const ControlParameters& parameters, const Route& route) { ControlResponse response; response.setCode(200); response.setText("Success"); response.setBody(parameters.wireEncode()); NFD_LOG_TRACE("onUnRegSuccess: unregistered " << route); if (static_cast<bool>(request)) { sendResponse(request->getName(), response); } }
void FibHelper::AddNextHop(const ControlParameters& parameters, Ptr<Node> node) { NS_LOG_DEBUG("Add Next Hop command was initialized"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/fib"); commandName.append("add-nexthop"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); StackHelper::getKeyChain().sign(*command); Ptr<L3Protocol> l3protocol = node->GetObject<L3Protocol>(); shared_ptr<nfd::FibManager> fibManager = l3protocol->getFibManager(); fibManager->onFibRequest(*command); }
void RibManager::sendSuccessResponse(const shared_ptr<const Interest>& request, const ControlParameters& parameters) { if (!static_cast<bool>(request)) { return; } ControlResponse response; response.setCode(200); response.setText("Success"); response.setBody(parameters.wireEncode()); if (static_cast<bool>(request)) { sendResponse(request->getName(), response); } }
void FibHelper::RemoveNextHop(const ControlParameters& parameters, Ptr<Node> node) { NS_LOG_DEBUG("Remove Next Hop command was initialized"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/fib"); commandName.append("remove-nexthop"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); StackHelper::getKeyChain().sign(*command); Ptr<L3Protocol> L3protocol = node->GetObject<L3Protocol>(); shared_ptr<nfd::FibManager> fibManager = L3protocol->getFibManager(); // fibManager->addInterestRule(commandName.toUri(), key, *keyChain.getPublicKey (key)); fibManager->onFibRequest(*command); }
BOOST_FIXTURE_TEST_CASE(ValidatedFaceRequestDestroyFace, AuthorizedCommandFixture<ValidatedFaceRequestFixture>) { ControlParameters parameters; parameters.setUri("tcp://127.0.0.1"); 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); onValidatedFaceRequest(command); BOOST_CHECK(didDestroyFaceFire()); }
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 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"); } }
BOOST_FIXTURE_TEST_CASE(UnsupportedCommand, AuthorizedCommandFixture<FaceManagerFixture>) { ControlParameters parameters; Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/faces"); commandName.append("unsupported"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); generateCommand(*command); getFace()->onReceiveData += bind(&FaceManagerFixture::validateControlResponse, this, _1, command->getName(), 501, "Unsupported command"); getManager().onFaceRequest(*command); BOOST_REQUIRE(didCallbackFire()); }
BOOST_FIXTURE_TEST_CASE(CreateFaceMissingUri, AuthorizedCommandFixture<FaceFixture>) { ControlParameters parameters; 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); getFace()->onReceiveData += bind(&FaceFixture::validateControlResponse, this, _1, command->getName(), 400, "Malformed command"); createFace(*command, parameters); BOOST_REQUIRE(didCallbackFire()); }
BOOST_FIXTURE_TEST_CASE(CreateFaceBadUri, 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); getFace()->onReceiveData += [this, command] (const Data& response) { this->validateControlResponse(response, command->getName(), 400, "Malformed command"); }; createFace(*command, parameters); BOOST_REQUIRE(didCallbackFire()); }
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()); }
BOOST_FIXTURE_TEST_CASE(UnsignedCommand, AllStrategiesFixture) { ControlParameters parameters; parameters.setName("/test"); parameters.setStrategy("/localhost/nfd/strategy/best-route"); Block encodedParameters(parameters.wireEncode()); Name commandName("/localhost/nfd/strategy-choice"); commandName.append("set"); commandName.append(encodedParameters); shared_ptr<Interest> command(make_shared<Interest>(commandName)); getFace()->onReceiveData += bind(&StrategyChoiceManagerFixture::validateControlResponse, this, _1, command->getName(), 401, "Signature required"); getManager().onStrategyChoiceRequest(*command); BOOST_REQUIRE(didCallbackFire()); }
BOOST_FIXTURE_TEST_CASE(OnConnectFailed, 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); getFace()->onReceiveData += bind(&FaceFixture::validateControlResponse, this, _1, command->getName(), 408, "unit-test-reason"); onConnectFailed(command->getName(), "unit-test-reason"); BOOST_REQUIRE(didCallbackFire()); BOOST_CHECK_EQUAL(didReceiveNotication(), false); }