void FaceManager::createFace(const ControlParameters& parameters, const ndn::mgmt::CommandContinuation& done) { FaceUri remoteUri; if (!remoteUri.parse(parameters.getUri())) { NFD_LOG_TRACE("failed to parse remote URI: " << parameters.getUri()); done(ControlResponse(400, "Malformed command")); return; } if (!remoteUri.isCanonical()) { NFD_LOG_TRACE("received non-canonical remote URI: " << remoteUri.toString()); done(ControlResponse(400, "Non-canonical remote URI")); return; } optional<FaceUri> localUri; if (parameters.hasLocalUri()) { localUri = FaceUri{}; if (!localUri->parse(parameters.getLocalUri())) { NFD_LOG_TRACE("failed to parse local URI: " << parameters.getLocalUri()); done(ControlResponse(400, "Malformed command")); return; } if (!localUri->isCanonical()) { NFD_LOG_TRACE("received non-canonical local URI: " << localUri->toString()); done(ControlResponse(400, "Non-canonical local URI")); return; } } face::ProtocolFactory* factory = m_faceSystem.getFactoryByScheme(remoteUri.getScheme()); if (factory == nullptr) { NFD_LOG_TRACE("received create request for unsupported protocol: " << remoteUri.getScheme()); done(ControlResponse(406, "Unsupported protocol")); return; } face::FaceParams faceParams; faceParams.persistency = parameters.getFacePersistency(); if (parameters.hasBaseCongestionMarkingInterval()) { faceParams.baseCongestionMarkingInterval = parameters.getBaseCongestionMarkingInterval(); } if (parameters.hasDefaultCongestionThreshold()) { faceParams.defaultCongestionThreshold = parameters.getDefaultCongestionThreshold(); } if (parameters.hasMtu()) { faceParams.mtu = parameters.getMtu(); } faceParams.wantLocalFields = parameters.hasFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED) && parameters.getFlagBit(ndn::nfd::BIT_LOCAL_FIELDS_ENABLED); faceParams.wantLpReliability = parameters.hasFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED) && parameters.getFlagBit(ndn::nfd::BIT_LP_RELIABILITY_ENABLED); if (parameters.hasFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED)) { faceParams.wantCongestionMarking = parameters.getFlagBit(ndn::nfd::BIT_CONGESTION_MARKING_ENABLED); } try { factory->createFace({remoteUri, localUri, faceParams}, [this, parameters, done] (const auto& face) { this->afterCreateFaceSuccess(face, parameters, done); }, [done] (uint32_t status, const std::string& reason) { NFD_LOG_DEBUG("Face creation failed: " << reason); done(ControlResponse(status, reason)); }); } catch (const std::runtime_error& error) { NFD_LOG_ERROR("Face creation failed: " << error.what()); done(ControlResponse(500, "Face creation failed due to internal error")); return; } catch (const std::logic_error& error) { NFD_LOG_ERROR("Face creation failed: " << error.what()); done(ControlResponse(500, "Face creation failed due to internal error")); return; } }
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())); }