src: decouple classes from Nlsr object

refs: #1952, #2803, #3960, #4288

Change-Id: Ibe3ac3820f11e8107ee4b13e510d53c27467a6cb
This commit is contained in:
Ashlesh Gawande committed 2019-02-01 14:23:55 -06:00
1 parent 7e3f6d75c8
commit 85998a1dc9
63 files changed
+1122 -1447

No files matched your search

+8 -7
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -50,6 +50,7 @@ SyncLogicHandler::SyncLogicHandler(ndn::Face& face, const IsLsaNew& isLsaNew,
, m_isLsaNew(isLsaNew)
, m_confParam(conf)
{
createSyncLogic(conf.getSyncPrefix());
}
void
@@ -122,21 +123,21 @@ SyncLogicHandler::processUpdateFromSync(const ndn::Name& originRouter,
Lsa::Type lsaType;
std::istringstream(updateName.get(updateName.size()-1).toUri()) >> lsaType;
NLSR_LOG_DEBUG("Received sync update with higher " << lsaType
<< " sequence number than entry in LSDB");
NLSR_LOG_DEBUG("Received sync update with higher " << lsaType <<
" sequence number than entry in LSDB");
if (m_isLsaNew(originRouter, lsaType, seqNo)) {
if (lsaType == Lsa::Type::ADJACENCY && seqNo != 0 &&
m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
NLSR_LOG_ERROR("Got an update for adjacency LSA when hyperbolic routing"
<< " is enabled. Not going to fetch.");
NLSR_LOG_ERROR("Got an update for adjacency LSA when hyperbolic routing " <<
"is enabled. Not going to fetch.");
return;
}
if (lsaType == Lsa::Type::COORDINATE && seqNo != 0 &&
m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
NLSR_LOG_ERROR("Got an update for coordinate LSA when link-state"
<< " is enabled. Not going to fetch.");
NLSR_LOG_ERROR("Got an update for coordinate LSA when link-state " <<
"is enabled. Not going to fetch.");
return;
}
(*onNewLsa)(updateName, seqNo);
+12 -5
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -76,11 +76,13 @@ public:
void
publishRoutingUpdate(const Lsa::Type& type, const uint64_t& seqNo);
/*! \brief Create and configure a Logic object to enable ChronoSync for this NLSR.
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
/*! \brief Create and configure a Logic object to enable Sync for this NLSR.
*
* In a typical situation this only needs to be called once, when NLSR starts.
* \param syncPrefix The sync prefix you want this ChronoSync to use
* \param syncInterestLifetime ChronoSync sends a periodic sync interest every \p syncInterestLifetime / 2 ms
* \param syncPrefix The sync prefix you want this Sync to use
* \param syncInterestLifetime ChronoSync/PSync sends a periodic sync interest every
* \p syncInterestLifetime / 2 ms
* \sa Nlsr::initialize
*/
void
@@ -88,10 +90,15 @@ public:
const ndn::time::milliseconds& syncInterestLifetime =
ndn::time::milliseconds(SYNC_INTEREST_LIFETIME_DEFAULT));
/*! \brief Callback from Sync protocol
*
* In a typical situation this only needs to be called once, when NLSR starts.
* \param updateName The prefix for which sync reports an update
* \param highSeq The latest sequence number of the update
*/
void
processUpdate(const ndn::Name& updateName, uint64_t highSeq);
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
/*! \brief Simple function to glue Name components together
*/
void
+42 -32
View File
@@ -20,7 +20,6 @@
**/
#include "conf-file-processor.hpp"
#include "conf-parameter.hpp"
#include "adjacent.hpp"
#include "utility/name-helper.hpp"
#include "update/prefix-update-processor.hpp"
@@ -134,6 +133,12 @@ private:
bool m_isRequired;
};
ConfFileProcessor::ConfFileProcessor(ConfParameter& confParam)
: m_confFileName(confParam.getConfFileName())
, m_confParam(confParam)
{
}
bool
ConfFileProcessor::processConfFile()
{
@@ -220,7 +225,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
std::string router = section.get<std::string>("router");
ndn::Name networkName(network);
if (!networkName.empty()) {
m_nlsr.getConfParameter().setNetwork(networkName);
m_confParam.setNetwork(networkName);
}
else {
std::cerr << " Network can not be null or empty or in bad URI format :(!" << std::endl;
@@ -228,7 +233,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
}
ndn::Name siteName(site);
if (!siteName.empty()) {
m_nlsr.getConfParameter().setSiteName(siteName);
m_confParam.setSiteName(siteName);
}
else {
std::cerr << "Site can not be null or empty or in bad URI format:( !" << std::endl;
@@ -236,7 +241,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
}
ndn::Name routerName(router);
if (!routerName.empty()) {
m_nlsr.getConfParameter().setRouterName(routerName);
m_confParam.setRouterName(routerName);
}
else {
std::cerr << " Router name can not be null or empty or in bad URI format:( !" << std::endl;
@@ -252,7 +257,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
uint32_t lsaRefreshTime = section.get<uint32_t>("lsa-refresh-time", LSA_REFRESH_TIME_DEFAULT);
if (lsaRefreshTime >= LSA_REFRESH_TIME_MIN && lsaRefreshTime <= LSA_REFRESH_TIME_MAX) {
m_nlsr.getConfParameter().setLsaRefreshTime(lsaRefreshTime);
m_confParam.setLsaRefreshTime(lsaRefreshTime);
}
else {
std::cerr << "Wrong value for lsa-refresh-time ";
@@ -265,8 +270,8 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
// router-dead-interval
uint32_t routerDeadInterval = section.get<uint32_t>("router-dead-interval", (2*lsaRefreshTime));
if (routerDeadInterval > m_nlsr.getConfParameter().getLsaRefreshTime()) {
m_nlsr.getConfParameter().setRouterDeadInterval(routerDeadInterval);
if (routerDeadInterval > m_confParam.getLsaRefreshTime()) {
m_confParam.setRouterDeadInterval(routerDeadInterval);
}
else {
std::cerr << "Value of router-dead-interval must be larger than lsa-refresh-time" << std::endl;
@@ -277,7 +282,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
int lifetime = section.get<int>("lsa-interest-lifetime", LSA_INTEREST_LIFETIME_DEFAULT);
if (lifetime >= LSA_INTEREST_LIFETIME_MIN && lifetime <= LSA_INTEREST_LIFETIME_MAX) {
m_nlsr.getConfParameter().setLsaInterestLifetime(ndn::time::seconds(lifetime));
m_confParam.setLsaInterestLifetime(ndn::time::seconds(lifetime));
}
else {
std::cerr << "Wrong value for lsa-interest-timeout. "
@@ -290,10 +295,10 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
// sync-protocol
std::string syncProtocol = section.get<std::string>("sync-protocol", "chronosync");
if (syncProtocol == "chronosync") {
m_nlsr.getConfParameter().setSyncProtocol(SYNC_PROTOCOL_CHRONOSYNC);
m_confParam.setSyncProtocol(SYNC_PROTOCOL_CHRONOSYNC);
}
else if (syncProtocol == "psync") {
m_nlsr.getConfParameter().setSyncProtocol(SYNC_PROTOCOL_PSYNC);
m_confParam.setSyncProtocol(SYNC_PROTOCOL_PSYNC);
}
else {
std::cerr << "Sync protocol " << syncProtocol << " is not supported!"
@@ -302,10 +307,11 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
}
// sync-interest-lifetime
uint32_t syncInterestLifetime = section.get<uint32_t>("sync-interest-lifetime", SYNC_INTEREST_LIFETIME_DEFAULT);
uint32_t syncInterestLifetime = section.get<uint32_t>("sync-interest-lifetime",
SYNC_INTEREST_LIFETIME_DEFAULT);
if (syncInterestLifetime >= SYNC_INTEREST_LIFETIME_MIN &&
syncInterestLifetime <= SYNC_INTEREST_LIFETIME_MAX) {
m_nlsr.getConfParameter().setSyncInterestLifetime(syncInterestLifetime);
m_confParam.setSyncInterestLifetime(syncInterestLifetime);
}
else {
std::cerr << "Wrong value for sync-interest-lifetime. "
@@ -323,7 +329,7 @@ ConfFileProcessor::processConfSectionGeneral(const ConfigSection& section)
std::ofstream testOutFile;
testOutFile.open(testFileName.c_str());
if (testOutFile.is_open() && testOutFile.good()) {
m_nlsr.getConfParameter().setSeqFileDir(seqDir);
m_confParam.setSeqFileDir(seqDir);
}
else {
std::cerr << "User does not have read and write permission on the directory";
@@ -359,7 +365,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
int retrials = section.get<int>("hello-retries", HELLO_RETRIES_DEFAULT);
if (retrials >= HELLO_RETRIES_MIN && retrials <= HELLO_RETRIES_MAX) {
m_nlsr.getConfParameter().setInterestRetryNumber(retrials);
m_confParam.setInterestRetryNumber(retrials);
}
else {
std::cerr << "Wrong value for hello-retries." << std::endl;
@@ -373,7 +379,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
uint32_t timeOut = section.get<uint32_t>("hello-timeout", HELLO_TIMEOUT_DEFAULT);
if (timeOut >= HELLO_TIMEOUT_MIN && timeOut <= HELLO_TIMEOUT_MAX) {
m_nlsr.getConfParameter().setInterestResendTime(timeOut);
m_confParam.setInterestResendTime(timeOut);
}
else {
std::cerr << "Wrong value for hello-timeout. ";
@@ -387,7 +393,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
uint32_t interval = section.get<uint32_t>("hello-interval", HELLO_INTERVAL_DEFAULT);
if (interval >= HELLO_INTERVAL_MIN && interval <= HELLO_INTERVAL_MAX) {
m_nlsr.getConfParameter().setInfoInterestInterval(interval);
m_confParam.setInfoInterestInterval(interval);
}
else {
std::cerr << "Wrong value for hello-interval. ";
@@ -401,7 +407,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
// adj-lsa-build-interval
ConfigurationVariable<uint32_t> adjLsaBuildInterval("adj-lsa-build-interval",
std::bind(&ConfParameter::setAdjLsaBuildInterval,
&m_nlsr.getConfParameter(), _1));
&m_confParam, _1));
adjLsaBuildInterval.setMinAndMaxValue(ADJ_LSA_BUILD_INTERVAL_MIN, ADJ_LSA_BUILD_INTERVAL_MAX);
adjLsaBuildInterval.setOptional(ADJ_LSA_BUILD_INTERVAL_DEFAULT);
@@ -411,7 +417,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
// Set the retry count for fetching the FaceStatus dataset
ConfigurationVariable<uint32_t> faceDatasetFetchTries("face-dataset-fetch-tries",
std::bind(&ConfParameter::setFaceDatasetFetchTries,
&m_nlsr.getConfParameter(),
&m_confParam,
_1));
faceDatasetFetchTries.setMinAndMaxValue(FACE_DATASET_FETCH_TRIES_MIN,
@@ -425,7 +431,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
// Set the interval between FaceStatus dataset fetch attempts.
ConfigurationVariable<uint32_t> faceDatasetFetchInterval("face-dataset-fetch-interval",
bind(&ConfParameter::setFaceDatasetFetchInterval,
&m_nlsr.getConfParameter(),
&m_confParam,
_1));
faceDatasetFetchInterval.setMinAndMaxValue(FACE_DATASET_FETCH_INTERVAL_MIN,
@@ -439,7 +445,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
// first-hello-interval
ConfigurationVariable<uint32_t> firstHelloInterval("first-hello-interval",
std::bind(&ConfParameter::setFirstHelloInterval,
&m_nlsr.getConfParameter(), _1));
&m_confParam, _1));
firstHelloInterval.setMinAndMaxValue(FIRST_HELLO_INTERVAL_MIN, FIRST_HELLO_INTERVAL_MAX);
firstHelloInterval.setOptional(FIRST_HELLO_INTERVAL_DEFAULT);
@@ -484,7 +490,7 @@ ConfFileProcessor::processConfSectionNeighbors(const ConfigSection& section)
ndn::Name neighborName(name);
if (!neighborName.empty()) {
Adjacent adj(name, faceUri, linkCost, Adjacent::STATUS_INACTIVE, 0, 0);
m_nlsr.getAdjacencyList().insert(adj);
m_confParam.getAdjacencyList().insert(adj);
}
else {
std::cerr << " Wrong command format ! [name /nbr/name/ \n face-uri /uri\n]";
@@ -507,13 +513,13 @@ ConfFileProcessor::processConfSectionHyperbolic(const ConfigSection& section)
std::string state = section.get<std::string>("state", "off");
if (boost::iequals(state, "off")) {
m_nlsr.getConfParameter().setHyperbolicState(HYPERBOLIC_STATE_OFF);
m_confParam.setHyperbolicState(HYPERBOLIC_STATE_OFF);
}
else if (boost::iequals(state, "on")) {
m_nlsr.getConfParameter().setHyperbolicState(HYPERBOLIC_STATE_ON);
m_confParam.setHyperbolicState(HYPERBOLIC_STATE_ON);
}
else if (state == "dry-run") {
m_nlsr.getConfParameter().setHyperbolicState(HYPERBOLIC_STATE_DRY_RUN);
m_confParam.setHyperbolicState(HYPERBOLIC_STATE_DRY_RUN);
}
else {
std::cerr << "Wrong format for hyperbolic state." << std::endl;
@@ -542,10 +548,10 @@ ConfFileProcessor::processConfSectionHyperbolic(const ConfigSection& section)
}
}
if (!m_nlsr.getConfParameter().setCorR(radius)) {
if (!m_confParam.setCorR(radius)) {
return false;
}
m_nlsr.getConfParameter().setCorTheta(angles);
m_confParam.setCorTheta(angles);
}
catch (const std::exception& ex) {
std::cerr << ex.what() << std::endl;
@@ -566,7 +572,7 @@ ConfFileProcessor::processConfSectionFib(const ConfigSection& section)
if (maxFacesPerPrefix >= MAX_FACES_PER_PREFIX_MIN &&
maxFacesPerPrefix <= MAX_FACES_PER_PREFIX_MAX)
{
m_nlsr.getConfParameter().setMaxFacesPerPrefix(maxFacesPerPrefix);
m_confParam.setMaxFacesPerPrefix(maxFacesPerPrefix);
}
else {
std::cerr << "Wrong value for max-faces-per-prefix. ";
@@ -578,7 +584,7 @@ ConfFileProcessor::processConfSectionFib(const ConfigSection& section)
// routing-calc-interval
ConfigurationVariable<uint32_t> routingCalcInterval("routing-calc-interval",
std::bind(&ConfParameter::setRoutingCalcInterval,
&m_nlsr.getConfParameter(), _1));
&m_confParam, _1));
routingCalcInterval.setMinAndMaxValue(ROUTING_CALC_INTERVAL_MIN, ROUTING_CALC_INTERVAL_MAX);
routingCalcInterval.setOptional(ROUTING_CALC_INTERVAL_DEFAULT);
@@ -599,7 +605,7 @@ ConfFileProcessor::processConfSectionAdvertising(const ConfigSection& section)
std::string prefix = tn->second.data();
ndn::Name namePrefix(prefix);
if (!namePrefix.empty()) {
m_nlsr.getNamePrefixList().insert(namePrefix);
m_confParam.getNamePrefixList().insert(namePrefix);
}
else {
std::cerr << " Wrong command format ! [prefix /name/prefix] or bad URI" << std::endl;
@@ -625,11 +631,11 @@ ConfFileProcessor::processConfSectionSecurity(const ConfigSection& section)
return false;
}
m_nlsr.loadValidator(it->second, m_confFileName);
m_confParam.getValidator().load(it->second, m_confFileName);
it++;
if (it != section.end() && it->first == "prefix-update-validator") {
m_nlsr.getPrefixUpdateProcessor().loadValidator(it->second, m_confFileName);
m_confParam.getPrefixUpdateValidator().load(it->second, m_confFileName);
it++;
for (; it != section.end(); it++) {
@@ -650,7 +656,11 @@ ConfFileProcessor::processConfSectionSecurity(const ConfigSection& section)
return false;
}
m_nlsr.loadCertToPublish(*idCert);
m_confParam.getCertStore().insert(*idCert);
m_confParam.getValidator().loadAnchor("Authoritative-Certificate",
ndn::security::v2::Certificate(*idCert));
m_confParam.getPrefixUpdateValidator().loadAnchor("Authoritative-Certificate",
ndn::security::v2::Certificate(*idCert));
}
}
+4 -8
View File
@@ -22,7 +22,7 @@
#define NLSR_CONF_FILE_PROCESSOR_HPP
#include "common.hpp"
#include "nlsr.hpp"
#include "conf-parameter.hpp"
#include <boost/algorithm/string.hpp>
#include <boost/property_tree/info_parser.hpp>
@@ -46,11 +46,7 @@ namespace nlsr {
class ConfFileProcessor
{
public:
ConfFileProcessor(Nlsr& nlsr, const std::string& cfile)
: m_confFileName(cfile)
, m_nlsr(nlsr)
{
}
ConfFileProcessor(ConfParameter& confParam);
/*! \brief Load and parse the configuration file, then populate NLSR.
*
@@ -125,8 +121,8 @@ private:
private:
/*! m_confFileName The full path of the configuration file to parse. */
std::string m_confFileName;
/*! m_nlsr The NLSR object to configure upon successful parsing. */
Nlsr& m_nlsr;
/*! m_confParam The ConfFileProcessor object to configure as parsing is done. */
ConfParameter& m_confParam;
/*! m_io For canonization of faceUri. */
boost::asio::io_service m_io;
};
+32 -8
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -31,6 +31,30 @@ INIT_LOGGER(ConfParameter);
// To be changed when breaking changes are made to sync
const uint64_t ConfParameter::SYNC_VERSION = 6;
ConfParameter::ConfParameter(ndn::Face& face, const std::string& confFileName)
: m_confFileName(confFileName)
, m_lsaRefreshTime(LSA_REFRESH_TIME_DEFAULT)
, m_adjLsaBuildInterval(ADJ_LSA_BUILD_INTERVAL_DEFAULT)
, m_firstHelloInterval(FIRST_HELLO_INTERVAL_DEFAULT)
, m_routingCalcInterval(ROUTING_CALC_INTERVAL_DEFAULT)
, m_faceDatasetFetchInterval(ndn::time::seconds(static_cast<int>(FACE_DATASET_FETCH_INTERVAL_DEFAULT)))
, m_lsaInterestLifetime(ndn::time::seconds(static_cast<int>(LSA_INTEREST_LIFETIME_DEFAULT)))
, m_routerDeadInterval(2 * LSA_REFRESH_TIME_DEFAULT)
, m_interestRetryNumber(HELLO_RETRIES_DEFAULT)
, m_interestResendTime(HELLO_TIMEOUT_DEFAULT)
, m_infoInterestInterval(HELLO_INTERVAL_DEFAULT)
, m_hyperbolicState(HYPERBOLIC_STATE_OFF)
, m_corR(0)
, m_maxFacesPerPrefix(MAX_FACES_PER_PREFIX_MIN)
, m_syncInterestLifetime(ndn::time::milliseconds(SYNC_INTEREST_LIFETIME_DEFAULT))
, m_syncProtocol(SYNC_PROTOCOL_CHRONOSYNC)
, m_adjl()
, m_npl()
, m_validator(std::make_unique<ndn::security::v2::CertificateFetcherDirectFetch>(face))
, m_prefixUpdateValidator(std::make_unique<ndn::security::v2::CertificateFetcherDirectFetch>(face))
{
}
void
ConfParameter::writeLog()
{
@@ -38,8 +62,8 @@ ConfParameter::writeLog()
NLSR_LOG_INFO("Site Name: " << m_siteName);
NLSR_LOG_INFO("Network: " << m_network);
NLSR_LOG_INFO("Router Prefix: " << m_routerPrefix);
NLSR_LOG_INFO("ChronoSync sync Prefix: " << m_chronosyncPrefix);
NLSR_LOG_INFO("ChronoSync LSA prefix: " << m_lsaPrefix);
NLSR_LOG_INFO("Sync Prefix: " << m_syncPrefix);
NLSR_LOG_INFO("Sync LSA prefix: " << m_lsaPrefix);
NLSR_LOG_INFO("Hello Interest retry number: " << m_interestRetryNumber);
NLSR_LOG_INFO("Hello Interest resend second: " << m_interestResendTime);
NLSR_LOG_INFO("Info Interest interval: " << m_infoInterestInterval);
@@ -67,11 +91,11 @@ ConfParameter::setNetwork(const ndn::Name& networkName)
{
m_network = networkName;
m_chronosyncPrefix.append("localhop");
m_chronosyncPrefix.append(m_network);
m_chronosyncPrefix.append("nlsr");
m_chronosyncPrefix.append("sync");
m_chronosyncPrefix.appendVersion(SYNC_VERSION);
m_syncPrefix.append("localhop");
m_syncPrefix.append(m_network);
m_syncPrefix.append("nlsr");
m_syncPrefix.append("sync");
m_syncPrefix.appendVersion(SYNC_VERSION);
m_lsaPrefix.append("localhop");
m_lsaPrefix.append(m_network);
+53 -21
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -25,10 +25,15 @@
#include "common.hpp"
#include "logger.hpp"
#include "test-access-control.hpp"
#include "adjacency-list.hpp"
#include "name-prefix-list.hpp"
#include "security/certificate-store.hpp"
#include <iostream>
#include <boost/cstdint.hpp>
#include <ndn-cxx/face.hpp>
#include <ndn-cxx/security/validator-config.hpp>
#include <ndn-cxx/security/v2/certificate-fetcher-direct-fetch.hpp>
#include <ndn-cxx/util/time.hpp>
namespace nlsr {
@@ -133,23 +138,12 @@ class ConfParameter
{
public:
ConfParameter()
: m_lsaRefreshTime(LSA_REFRESH_TIME_DEFAULT)
, m_adjLsaBuildInterval(ADJ_LSA_BUILD_INTERVAL_DEFAULT)
, m_firstHelloInterval(FIRST_HELLO_INTERVAL_DEFAULT)
, m_routingCalcInterval(ROUTING_CALC_INTERVAL_DEFAULT)
, m_faceDatasetFetchInterval(ndn::time::seconds(static_cast<int>(FACE_DATASET_FETCH_INTERVAL_DEFAULT)))
, m_lsaInterestLifetime(ndn::time::seconds(static_cast<int>(LSA_INTEREST_LIFETIME_DEFAULT)))
, m_routerDeadInterval(2 * LSA_REFRESH_TIME_DEFAULT)
, m_interestRetryNumber(HELLO_RETRIES_DEFAULT)
, m_interestResendTime(HELLO_TIMEOUT_DEFAULT)
, m_infoInterestInterval(HELLO_INTERVAL_DEFAULT)
, m_hyperbolicState(HYPERBOLIC_STATE_OFF)
, m_corR(0)
, m_maxFacesPerPrefix(MAX_FACES_PER_PREFIX_MIN)
, m_syncInterestLifetime(ndn::time::milliseconds(SYNC_INTEREST_LIFETIME_DEFAULT))
, m_syncProtocol(SYNC_PROTOCOL_CHRONOSYNC)
ConfParameter(ndn::Face& face, const std::string& confFileName = "nlsr.conf");
const std::string&
getConfFileName()
{
return m_confFileName;
}
void
@@ -199,11 +193,10 @@ public:
return m_routerPrefix;
}
const ndn::Name&
getChronosyncPrefix() const
getSyncPrefix() const
{
return m_chronosyncPrefix;
return m_syncPrefix;
}
const ndn::Name&
@@ -434,10 +427,43 @@ public:
return m_syncInterestLifetime;
}
AdjacencyList&
getAdjacencyList()
{
return m_adjl;
}
NamePrefixList&
getNamePrefixList()
{
return m_npl;
}
ndn::security::ValidatorConfig&
getValidator()
{
return m_validator;
}
ndn::security::ValidatorConfig&
getPrefixUpdateValidator()
{
return m_prefixUpdateValidator;
}
security::CertificateStore&
getCertStore()
{
return m_certStore;
}
/*! \brief Dump the current state of all attributes to the log.
*/
void
writeLog();
private:
std::string m_confFileName;
ndn::Name m_routerName;
ndn::Name m_siteName;
ndn::Name m_network;
@@ -445,7 +471,7 @@ private:
ndn::Name m_routerPrefix;
ndn::Name m_lsaRouterPrefix;
ndn::Name m_chronosyncPrefix;
ndn::Name m_syncPrefix;
ndn::Name m_lsaPrefix;
uint32_t m_lsaRefreshTime;
@@ -478,6 +504,12 @@ private:
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
static const uint64_t SYNC_VERSION;
AdjacencyList m_adjl;
NamePrefixList m_npl;
ndn::security::ValidatorConfig m_validator;
ndn::security::ValidatorConfig m_prefixUpdateValidator;
security::CertificateStore m_certStore;
};
} // namespace nlsr
+62 -60
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -32,9 +32,17 @@ INIT_LOGGER(HelloProtocol);
const std::string HelloProtocol::INFO_COMPONENT = "INFO";
const std::string HelloProtocol::NLSR_COMPONENT = "nlsr";
HelloProtocol::HelloProtocol(Nlsr& nlsr, ndn::Scheduler& scheduler)
: m_nlsr(nlsr)
, m_scheduler(scheduler)
HelloProtocol::HelloProtocol(ndn::Face& face, ndn::KeyChain& keyChain,
ndn::security::SigningInfo& signingInfo,
ConfParameter& confParam, RoutingTable& routingTable,
Lsdb& lsdb)
: m_face(face)
, m_scheduler(m_face.getIoService())
, m_keyChain(keyChain)
, m_signingInfo(signingInfo)
, m_confParam(confParam)
, m_routingTable(routingTable)
, m_lsdb(lsdb)
{
}
@@ -42,46 +50,40 @@ void
HelloProtocol::expressInterest(const ndn::Name& interestName, uint32_t seconds)
{
NLSR_LOG_DEBUG("Expressing Interest :" << interestName);
ndn::Interest i(interestName);
i.setInterestLifetime(ndn::time::seconds(seconds));
i.setMustBeFresh(true);
i.setCanBePrefix(true);
m_nlsr.getNlsrFace().expressInterest(i,
std::bind(&HelloProtocol::onContent, this, _1, _2),
[this] (const ndn::Interest& interest,
const ndn::lp::Nack& nack)
{
NDN_LOG_TRACE("Received Nack with reason " <<
nack.getReason());
NDN_LOG_TRACE("Treating as timeout");
processInterestTimedOut(interest);
},
std::bind(&HelloProtocol::processInterestTimedOut,
this, _1));
ndn::Interest interest(interestName);
interest.setInterestLifetime(ndn::time::seconds(seconds));
interest.setMustBeFresh(true);
interest.setCanBePrefix(true);
m_face.expressInterest(interest,
std::bind(&HelloProtocol::onContent, this, _1, _2),
[this] (const ndn::Interest& interest, const ndn::lp::Nack& nack)
{
NDN_LOG_TRACE("Received Nack with reason " << nack.getReason());
NDN_LOG_TRACE("Treating as timeout");
processInterestTimedOut(interest);
},
std::bind(&HelloProtocol::processInterestTimedOut, this, _1));
// increment SENT_HELLO_INTEREST
hpIncrementSignal(Statistics::PacketType::SENT_HELLO_INTEREST);
}
void
HelloProtocol::sendScheduledInterest(uint32_t seconds)
HelloProtocol::sendScheduledInterest()
{
std::list<Adjacent> adjList = m_nlsr.getAdjacencyList().getAdjList();
for (std::list<Adjacent>::iterator it = adjList.begin(); it != adjList.end();
++it) {
for (const auto& adjacent : m_confParam.getAdjacencyList().getAdjList()) {
// If this adjacency has a Face, just proceed as usual.
if((*it).getFaceId() != 0) {
if(adjacent.getFaceId() != 0) {
// interest name: /<neighbor>/NLSR/INFO/<router>
ndn::Name interestName = (*it).getName() ;
ndn::Name interestName = adjacent.getName() ;
interestName.append(NLSR_COMPONENT);
interestName.append(INFO_COMPONENT);
interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode());
expressInterest(interestName,
m_nlsr.getConfParameter().getInterestResendTime());
interestName.append(m_confParam.getRouterPrefix().wireEncode());
expressInterest(interestName, m_confParam.getInterestResendTime());
NLSR_LOG_DEBUG("Sending scheduled interest: " << interestName);
}
}
scheduleInterest(m_nlsr.getConfParameter().getInfoInterestInterval());
scheduleInterest(m_confParam.getInfoInterestInterval());
}
void
@@ -90,7 +92,9 @@ HelloProtocol::scheduleInterest(uint32_t seconds)
NLSR_LOG_DEBUG("Scheduling HELLO Interests in " << ndn::time::seconds(seconds));
m_scheduler.scheduleEvent(ndn::time::seconds(seconds),
std::bind(&HelloProtocol::sendScheduledInterest, this, seconds));
[this] {
sendScheduledInterest();
});
}
void
@@ -113,22 +117,22 @@ HelloProtocol::processInterest(const ndn::Name& name,
ndn::Name neighbor;
neighbor.wireDecode(interestName.get(-1).blockFromValue());
NLSR_LOG_DEBUG("Neighbor: " << neighbor);
if (m_nlsr.getAdjacencyList().isNeighbor(neighbor)) {
if (m_confParam.getAdjacencyList().isNeighbor(neighbor)) {
std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>();
data->setName(ndn::Name(interest.getName()).appendVersion());
data->setFreshnessPeriod(ndn::time::seconds(10)); // 10 sec
data->setContent(reinterpret_cast<const uint8_t*>(INFO_COMPONENT.c_str()),
INFO_COMPONENT.size());
INFO_COMPONENT.size());
m_nlsr.getKeyChain().sign(*data, m_nlsr.getSigningInfo());
m_keyChain.sign(*data, m_signingInfo);
NLSR_LOG_DEBUG("Sending out data for name: " << interest.getName());
m_nlsr.getNlsrFace().put(*data);
m_face.put(*data);
// increment SENT_HELLO_DATA
hpIncrementSignal(Statistics::PacketType::SENT_HELLO_DATA);
auto adjacent = m_nlsr.getAdjacencyList().findAdjacent(neighbor);
auto adjacent = m_confParam.getAdjacencyList().findAdjacent(neighbor);
// If this neighbor was previously inactive, send our own hello interest, too
if (adjacent->getStatus() == Adjacent::STATUS_INACTIVE) {
// We can only do that if the neighbor currently has a face.
@@ -137,9 +141,8 @@ HelloProtocol::processInterest(const ndn::Name& name,
ndn::Name interestName(neighbor);
interestName.append(NLSR_COMPONENT);
interestName.append(INFO_COMPONENT);
interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode());
expressInterest(interestName,
m_nlsr.getConfParameter().getInterestResendTime());
interestName.append(m_confParam.getRouterPrefix().wireEncode());
expressInterest(interestName, m_confParam.getInterestResendTime());
}
}
}
@@ -156,31 +159,30 @@ HelloProtocol::processInterestTimedOut(const ndn::Interest& interest)
}
ndn::Name neighbor = interestName.getPrefix(-3);
NLSR_LOG_DEBUG("Neighbor: " << neighbor);
m_nlsr.getAdjacencyList().incrementTimedOutInterestCount(neighbor);
m_confParam.getAdjacencyList().incrementTimedOutInterestCount(neighbor);
Adjacent::Status status = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
Adjacent::Status status = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
uint32_t infoIntTimedOutCount =
m_nlsr.getAdjacencyList().getTimedOutInterestCount(neighbor);
m_confParam.getAdjacencyList().getTimedOutInterestCount(neighbor);
NLSR_LOG_DEBUG("Status: " << status);
NLSR_LOG_DEBUG("Info Interest Timed out: " << infoIntTimedOutCount);
if (infoIntTimedOutCount < m_nlsr.getConfParameter().getInterestRetryNumber()) {
if (infoIntTimedOutCount < m_confParam.getInterestRetryNumber()) {
// interest name: /<neighbor>/NLSR/INFO/<router>
ndn::Name interestName(neighbor);
interestName.append(NLSR_COMPONENT);
interestName.append(INFO_COMPONENT);
interestName.append(m_nlsr.getConfParameter().getRouterPrefix().wireEncode());
interestName.append(m_confParam.getRouterPrefix().wireEncode());
NLSR_LOG_DEBUG("Resending interest: " << interestName);
expressInterest(interestName,
m_nlsr.getConfParameter().getInterestResendTime());
expressInterest(interestName, m_confParam.getInterestResendTime());
}
else if ((status == Adjacent::STATUS_ACTIVE) &&
(infoIntTimedOutCount == m_nlsr.getConfParameter().getInterestRetryNumber())) {
m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_INACTIVE);
(infoIntTimedOutCount == m_confParam.getInterestRetryNumber())) {
m_confParam.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_INACTIVE);
NLSR_LOG_DEBUG("Neighbor: " << neighbor << " status changed to INACTIVE");
m_nlsr.getLsdb().scheduleAdjLsaBuild();
m_lsdb.scheduleAdjLsaBuild();
}
}
@@ -196,10 +198,10 @@ HelloProtocol::onContent(const ndn::Interest& interest, const ndn::Data& data)
NLSR_LOG_DEBUG("Data signed with: " << data.getSignature().getKeyLocator().getName());
}
}
m_nlsr.getValidator().validate(data,
std::bind(&HelloProtocol::onContentValidated, this, _1),
std::bind(&HelloProtocol::onContentValidationFailed,
this, _1, _2));
m_confParam.getValidator().validate(data,
std::bind(&HelloProtocol::onContentValidated, this, _1),
std::bind(&HelloProtocol::onContentValidationFailed,
this, _1, _2));
}
void
@@ -212,20 +214,20 @@ HelloProtocol::onContentValidated(const ndn::Data& data)
if (dataName.get(-3).toUri() == INFO_COMPONENT) {
ndn::Name neighbor = dataName.getPrefix(-4);
Adjacent::Status oldStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
m_nlsr.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_ACTIVE);
m_nlsr.getAdjacencyList().setTimedOutInterestCount(neighbor, 0);
Adjacent::Status newStatus = m_nlsr.getAdjacencyList().getStatusOfNeighbor(neighbor);
Adjacent::Status oldStatus = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
m_confParam.getAdjacencyList().setStatusOfNeighbor(neighbor, Adjacent::STATUS_ACTIVE);
m_confParam.getAdjacencyList().setTimedOutInterestCount(neighbor, 0);
Adjacent::Status newStatus = m_confParam.getAdjacencyList().getStatusOfNeighbor(neighbor);
NLSR_LOG_DEBUG("Neighbor : " << neighbor);
NLSR_LOG_DEBUG("Old Status: " << oldStatus << " New Status: " << newStatus);
// change in Adjacency list
if ((oldStatus - newStatus) != 0) {
if (m_nlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) {
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
m_routingTable.scheduleRoutingTableCalculation();
}
else {
m_nlsr.getLsdb().scheduleAdjLsaBuild();
m_lsdb.scheduleAdjLsaBuild();
}
}
}
+17 -10
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -24,6 +24,9 @@
#include "statistics.hpp"
#include "test-access-control.hpp"
#include "conf-parameter.hpp"
#include "lsdb.hpp"
#include "route/routing-table.hpp"
#include <ndn-cxx/util/signal.hpp>
#include <ndn-cxx/face.hpp>
@@ -31,15 +34,16 @@
#include <ndn-cxx/mgmt/nfd/control-response.hpp>
#include <ndn-cxx/util/scheduler.hpp>
#include <ndn-cxx/security/v2/validation-error.hpp>
#include <ndn-cxx/security/validator-config.hpp>
namespace nlsr {
class Nlsr;
class HelloProtocol
{
public:
HelloProtocol(Nlsr& nlsr, ndn::Scheduler& scheduler);
HelloProtocol(ndn::Face& face, ndn::KeyChain& keyChain,
ndn::security::SigningInfo& signingInfo,
ConfParameter& confParam, RoutingTable& routingTable, Lsdb& lsdb);
/*! \brief Schedules a Hello Interest event.
*
@@ -68,19 +72,17 @@ public:
expressInterest(const ndn::Name& interestNamePrefix, uint32_t seconds);
/*! \brief Sends Hello Interests to all neighbors
*
* \param seconds (ignored)
*
* This function is called as part of a schedule to regularly
* determine the adjacency status of neighbors. This function
* creates and sends a Hello Interest to each neighbor in
* Nlsr::m_adjacencyList. If the neighbor has not been contacted
* before and curerntly has no Face in NFD, this method will call a
* before and currently has no Face in NFD, this method will call a
* different pipeline that creates the Face first, then registers
* prefixes.
*/
void
sendScheduledInterest(uint32_t seconds);
sendScheduledInterest();
/*! \brief Processes a Hello Interest from a neighbor.
*
@@ -172,8 +174,13 @@ private:
registerPrefixes(const ndn::Name& adjName, const std::string& faceUri,
double linkCost, const ndn::time::milliseconds& timeout);
private:
Nlsr& m_nlsr;
ndn::Scheduler& m_scheduler;
ndn::Face& m_face;
ndn::Scheduler m_scheduler;
ndn::security::v2::KeyChain& m_keyChain;
ndn::security::SigningInfo& m_signingInfo;
ConfParameter& m_confParam;
RoutingTable& m_routingTable;
Lsdb& m_lsdb;
static const std::string INFO_COMPONENT;
static const std::string NLSR_COMPONENT;
+1 -21
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -260,26 +260,6 @@ AdjLsa::deserialize(const std::string& content) noexcept
return true;
}
void
AdjLsa::addNptEntries(Nlsr& pnlsr)
{
// Only add NPT entries if this is an adj LSA from another router.
if (getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix()) {
// Pass the originating router as both the name to register and
// where it came from.
pnlsr.getNamePrefixTable().addEntry(getOrigRouter(), getOrigRouter());
}
}
void
AdjLsa::removeNptEntries(Nlsr& pnlsr)
{
if (getOrigRouter() != pnlsr.getConfParameter().getRouterPrefix()) {
pnlsr.getNamePrefixTable().removeEntry(getOrigRouter(), getOrigRouter());
}
}
void
AdjLsa::writeLog() const
{
+1 -14
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -33,8 +33,6 @@
namespace nlsr {
class Nlsr;
class Lsa
{
public:
@@ -286,17 +284,6 @@ public:
bool
isEqualContent(const AdjLsa& alsa) const;
/*! \brief Installs this LSA's name prefixes into the NPT.
\param pnlsr The NLSR top-level whose NPT you want to install the
entries into.
*/
void
addNptEntries(Nlsr& pnlsr);
void
removeNptEntries(Nlsr& pnlsr);
void
writeLog() const override;
+112 -106
View File
@@ -37,25 +37,34 @@ const ndn::time::seconds Lsdb::GRACE_PERIOD = ndn::time::seconds(10);
const ndn::time::steady_clock::TimePoint Lsdb::DEFAULT_LSA_RETRIEVAL_DEADLINE =
ndn::time::steady_clock::TimePoint::min();
Lsdb::Lsdb(Nlsr& nlsr, ndn::Scheduler& scheduler)
: m_nlsr(nlsr)
, m_scheduler(scheduler)
, m_sync(m_nlsr.getNlsrFace(),
Lsdb::Lsdb(ndn::Face& face, ndn::KeyChain& keyChain,
ndn::security::SigningInfo& signingInfo, ConfParameter& confParam,
NamePrefixTable& namePrefixTable, RoutingTable& routingTable)
: m_face(face)
, m_scheduler(face.getIoService())
, m_signingInfo(signingInfo)
, m_confParam(confParam)
, m_namePrefixTable(namePrefixTable)
, m_routingTable(routingTable)
, m_sync(m_face,
[this] (const ndn::Name& routerName, const Lsa::Type& lsaType,
const uint64_t& sequenceNumber) {
return isLsaNew(routerName, lsaType, sequenceNumber);
}, m_nlsr.getConfParameter())
, m_lsaStorage(scheduler)
, m_lsaRefreshTime(0)
, m_adjLsaBuildInterval(ADJ_LSA_BUILD_INTERVAL_DEFAULT)
, m_sequencingManager()
}, m_confParam)
, m_lsaStorage(m_scheduler)
, m_lsaRefreshTime(ndn::time::seconds(m_confParam.getLsaRefreshTime()))
, m_thisRouterPrefix(m_confParam.getRouterPrefix().toUri())
, m_adjLsaBuildInterval(m_confParam.getAdjLsaBuildInterval())
, m_sequencingManager(m_confParam.getSeqFileDir(), m_confParam.getHyperbolicState())
, m_onNewLsaConnection(m_sync.onNewLsa->connect(
[this] (const ndn::Name& updateName, uint64_t sequenceNumber) {
ndn::Name lsaInterest{updateName};
lsaInterest.appendNumber(sequenceNumber);
expressInterest(lsaInterest, 0);
}))
, m_segmentPublisher(m_nlsr.getNlsrFace(), m_nlsr.getKeyChain())
, m_segmentPublisher(m_face, keyChain)
, m_isBuildAdjLsaSheduled(false)
, m_adjBuildCount(0)
{
}
@@ -86,7 +95,7 @@ Lsdb::onFetchLsaError(uint32_t errorCode,
// immediately since at the least the LSA Interest lifetime has elapsed.
// Otherwise, it is necessary to delay the Interest re-expression to prevent
// the potential for constant Interest flooding.
ndn::time::seconds delay = m_nlsr.getConfParameter().getLsaInterestLifetime();
ndn::time::seconds delay = m_confParam.getLsaInterestLifetime();
if (errorCode == ndn::util::SegmentFetcher::ErrorCode::INTEREST_TIMEOUT) {
delay = ndn::time::seconds(0);
@@ -143,10 +152,10 @@ nameLsaCompareByKey(const NameLsa& nlsa1, const ndn::Name& key)
bool
Lsdb::buildAndInstallOwnNameLsa()
{
NameLsa nameLsa(m_nlsr.getConfParameter().getRouterPrefix(),
NameLsa nameLsa(m_confParam.getRouterPrefix(),
m_sequencingManager.getNameLsaSeq() + 1,
getLsaExpirationTimePoint(),
m_nlsr.getNamePrefixList());
m_confParam.getNamePrefixList());
m_sequencingManager.increaseNameLsaSeq();
m_sequencingManager.writeSeqNoToFile();
@@ -206,20 +215,20 @@ Lsdb::installNameLsa(NameLsa& nlsa)
nlsa.writeLog();
NLSR_LOG_TRACE("nlsa.getOrigRouter(): " << nlsa.getOrigRouter());
NLSR_LOG_TRACE("m_nlsr.getConfParameter().getRouterPrefix(): " << m_nlsr.getConfParameter().getRouterPrefix());
NLSR_LOG_TRACE("m_confParam.getRouterPrefix(): " << m_confParam.getRouterPrefix());
if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
// If this name LSA is from another router, add the advertised
// prefixes to the NPT.
m_nlsr.getNamePrefixTable().addEntry(nlsa.getOrigRouter(),
m_namePrefixTable.addEntry(nlsa.getOrigRouter(),
nlsa.getOrigRouter());
for (const auto& name : nlsa.getNpl().getNames()) {
if (name != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().addEntry(name, nlsa.getOrigRouter());
if (name != m_confParam.getRouterPrefix()) {
m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
}
}
}
if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -250,9 +259,9 @@ Lsdb::installNameLsa(NameLsa& nlsa)
std::inserter(namesToAdd, namesToAdd.begin()));
for (const auto& name : namesToAdd) {
chkNameLsa->addName(name);
if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (name != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().addEntry(name, nlsa.getOrigRouter());
if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
if (name != m_confParam.getRouterPrefix()) {
m_namePrefixTable.addEntry(name, nlsa.getOrigRouter());
}
}
}
@@ -266,14 +275,14 @@ Lsdb::installNameLsa(NameLsa& nlsa)
for (const auto& name : namesToRemove) {
NLSR_LOG_DEBUG("Removing name LSA no longer advertised: " << name);
chkNameLsa->removeName(name);
if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (name != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().removeEntry(name, nlsa.getOrigRouter());
if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
if (name != m_confParam.getRouterPrefix()) {
m_namePrefixTable.removeEntry(name, nlsa.getOrigRouter());
}
}
}
if (nlsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (nlsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = nlsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -314,13 +323,12 @@ Lsdb::removeNameLsa(const ndn::Name& key)
(*it).writeLog();
// If the requested name LSA is not ours, we also need to remove
// its entries from the NPT.
if ((*it).getOrigRouter() !=
m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().removeEntry((*it).getOrigRouter(),
(*it).getOrigRouter());
if ((*it).getOrigRouter() != m_confParam.getRouterPrefix()) {
m_namePrefixTable.removeEntry((*it).getOrigRouter(), (*it).getOrigRouter());
for (const auto& name : it->getNpl().getNames()) {
if (name != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().removeEntry(name, it->getOrigRouter());
if (name != m_confParam.getRouterPrefix()) {
m_namePrefixTable.removeEntry(name, it->getOrigRouter());
}
}
}
@@ -372,14 +380,14 @@ corLsaCompareByKey(const CoordinateLsa& clsa, const ndn::Name& key)
bool
Lsdb::buildAndInstallOwnCoordinateLsa()
{
CoordinateLsa corLsa(m_nlsr.getConfParameter().getRouterPrefix(),
CoordinateLsa corLsa(m_confParam.getRouterPrefix(),
m_sequencingManager.getCorLsaSeq() + 1,
getLsaExpirationTimePoint(),
m_nlsr.getConfParameter().getCorR(),
m_nlsr.getConfParameter().getCorTheta());
m_confParam.getCorR(),
m_confParam.getCorTheta());
// Sync coordinate LSAs if using HR or HR dry run.
if (m_nlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_sequencingManager.increaseCorLsaSeq();
m_sequencingManager.writeSeqNoToFile();
m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
@@ -445,15 +453,15 @@ Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
addCoordinateLsa(clsa);
// Register the LSA's origin router prefix
if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().addEntry(clsa.getOrigRouter(),
if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
m_namePrefixTable.addEntry(clsa.getOrigRouter(),
clsa.getOrigRouter());
}
if (m_nlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_routingTable.scheduleRoutingTableCalculation();
}
// Set the expiration time for the new LSA.
if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -473,12 +481,12 @@ Lsdb::installCoordinateLsa(CoordinateLsa& clsa)
if (!chkCorLsa->isEqualContent(clsa)) {
chkCorLsa->setCorRadius(clsa.getCorRadius());
chkCorLsa->setCorTheta(clsa.getCorTheta());
if (m_nlsr.getConfParameter().getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
if (m_confParam.getHyperbolicState() >= HYPERBOLIC_STATE_ON) {
m_routingTable.scheduleRoutingTableCalculation();
}
}
// If this is an LSA from another router, refresh its expiration time.
if (clsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (clsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = clsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -519,8 +527,8 @@ Lsdb::removeCoordinateLsa(const ndn::Name& key)
NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
it->writeLog();
if (it->getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
m_nlsr.getNamePrefixTable().removeEntry(it->getOrigRouter(), it->getOrigRouter());
if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
}
m_corLsdb.erase(it);
@@ -572,19 +580,19 @@ adjLsaCompareByKey(AdjLsa& alsa, const ndn::Name& key)
void
Lsdb::scheduleAdjLsaBuild()
{
m_nlsr.incrementAdjBuildCount();
m_adjBuildCount++;
if (m_nlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) {
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
// Don't build adjacency LSAs in hyperbolic routing
NLSR_LOG_DEBUG("Adjacency LSA not built. Currently in hyperbolic routing state.");
return;
}
if (m_nlsr.getIsBuildAdjLsaSheduled() == false) {
if (m_isBuildAdjLsaSheduled == false) {
NLSR_LOG_DEBUG("Scheduling Adjacency LSA build in " << m_adjLsaBuildInterval);
m_scheduler.scheduleEvent(m_adjLsaBuildInterval, std::bind(&Lsdb::buildAdjLsa, this));
m_nlsr.setIsBuildAdjLsaSheduled(true);
m_isBuildAdjLsaSheduled = true;
}
}
@@ -593,15 +601,15 @@ Lsdb::buildAdjLsa()
{
NLSR_LOG_TRACE("Lsdb::buildAdjLsa called");
m_nlsr.setIsBuildAdjLsaSheduled(false);
m_isBuildAdjLsaSheduled = false;
if (m_nlsr.getAdjacencyList().isAdjLsaBuildable(m_nlsr.getConfParameter().getInterestRetryNumber())) {
if (m_confParam.getAdjacencyList().isAdjLsaBuildable(m_confParam.getInterestRetryNumber())) {
int adjBuildCount = m_nlsr.getAdjBuildCount();
int adjBuildCount = m_adjBuildCount;
// Only do the adjLsa build if there's one scheduled
if (adjBuildCount > 0) {
// It only makes sense to do the adjLsa build if we have neighbors
if (m_nlsr.getAdjacencyList().getNumOfActiveNeighbor() > 0) {
if (m_confParam.getAdjacencyList().getNumOfActiveNeighbor() > 0) {
NLSR_LOG_DEBUG("Building and installing own Adj LSA");
buildAndInstallOwnAdjLsa();
}
@@ -612,26 +620,26 @@ Lsdb::buildAdjLsa()
else {
NLSR_LOG_DEBUG("Removing own Adj LSA; no ACTIVE neighbors");
// Get this router's key
ndn::Name key = m_nlsr.getConfParameter().getRouterPrefix();
ndn::Name key = m_confParam.getRouterPrefix();
key.append(std::to_string(Lsa::Type::ADJACENCY));
removeAdjLsa(key);
// Recompute routing table after removal
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
m_routingTable.scheduleRoutingTableCalculation();
}
// In the case that during building the adj LSA, the FIB has to
// wait on an Interest response, the number of scheduled adj LSA
// builds could change, so we shouldn't just set it to 0.
m_nlsr.setAdjBuildCount(m_nlsr.getAdjBuildCount() - adjBuildCount);
m_adjBuildCount = m_adjBuildCount - adjBuildCount;
}
}
// We are still waiting to know the adjacency status of some
// neighbor, so schedule a build for later (when all that has
// hopefully finished)
else {
m_nlsr.setIsBuildAdjLsaSheduled(true);
int schedulingTime = m_nlsr.getConfParameter().getInterestRetryNumber() *
m_nlsr.getConfParameter().getInterestResendTime();
m_isBuildAdjLsaSheduled = true;
int schedulingTime = m_confParam.getInterestRetryNumber() *
m_confParam.getInterestResendTime();
m_scheduler.scheduleEvent(ndn::time::seconds(schedulingTime),
std::bind(&Lsdb::buildAdjLsa, this));
}
@@ -646,6 +654,13 @@ Lsdb::addAdjLsa(AdjLsa& alsa)
alsa.getKey()));
if (it == m_adjLsdb.end()) {
m_adjLsdb.push_back(alsa);
// Add any new name prefixes to the NPT
// Only add NPT entries if this is an adj LSA from another router.
if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
// Pass the originating router as both the name to register and
// where it came from.
m_namePrefixTable.addEntry(alsa.getOrigRouter(), alsa.getOrigRouter());
}
return true;
}
return false;
@@ -699,10 +714,9 @@ Lsdb::installAdjLsa(AdjLsa& alsa)
NLSR_LOG_DEBUG("Adding Adj Lsa");
alsa.writeLog();
addAdjLsa(alsa);
// Add any new name prefixes to the NPT
alsa.addNptEntries(m_nlsr);
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
m_routingTable.scheduleRoutingTableCalculation();
if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -724,9 +738,9 @@ Lsdb::installAdjLsa(AdjLsa& alsa)
if (!chkAdjLsa->isEqualContent(alsa)) {
chkAdjLsa->getAdl().reset();
chkAdjLsa->getAdl().addAdjacents(alsa.getAdl());
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
m_routingTable.scheduleRoutingTableCalculation();
}
if (alsa.getOrigRouter() != m_nlsr.getConfParameter().getRouterPrefix()) {
if (alsa.getOrigRouter() != m_confParam.getRouterPrefix()) {
ndn::time::system_clock::Duration duration = alsa.getExpirationTimePoint() -
ndn::time::system_clock::now();
timeToExpire = ndn::time::duration_cast<ndn::time::seconds>(duration);
@@ -745,14 +759,14 @@ Lsdb::installAdjLsa(AdjLsa& alsa)
bool
Lsdb::buildAndInstallOwnAdjLsa()
{
AdjLsa adjLsa(m_nlsr.getConfParameter().getRouterPrefix(),
AdjLsa adjLsa(m_confParam.getRouterPrefix(),
m_sequencingManager.getAdjLsaSeq() + 1,
getLsaExpirationTimePoint(),
m_nlsr.getAdjacencyList().getNumOfActiveNeighbor(),
m_nlsr.getAdjacencyList());
m_confParam.getAdjacencyList().getNumOfActiveNeighbor(),
m_confParam.getAdjacencyList());
//Sync adjacency LSAs if link-state or dry-run HR is enabled.
if (m_nlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_ON) {
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_ON) {
m_sequencingManager.increaseAdjLsaSeq();
m_sequencingManager.writeSeqNoToFile();
m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq());
@@ -769,8 +783,10 @@ Lsdb::removeAdjLsa(const ndn::Name& key)
std::bind(adjLsaCompareByKey, _1, key));
if (it != m_adjLsdb.end()) {
NLSR_LOG_DEBUG("Deleting Adj Lsa");
(*it).writeLog();
(*it).removeNptEntries(m_nlsr);
it->writeLog();
if (it->getOrigRouter() != m_confParam.getRouterPrefix()) {
m_namePrefixTable.removeEntry(it->getOrigRouter(), it->getOrigRouter());
}
m_adjLsdb.erase(it);
return true;
}
@@ -795,18 +811,6 @@ Lsdb::getAdjLsdb() const
return m_adjLsdb;
}
void
Lsdb::setLsaRefreshTime(const ndn::time::seconds& lsaRefreshTime)
{
m_lsaRefreshTime = lsaRefreshTime;
}
void
Lsdb::setThisRouterPrefix(std::string trp)
{
m_thisRouterPrefix = trp;
}
// This function determines whether a name LSA should be refreshed
// or expired. The conditions for getting refreshed are: it is still
// in the LSDB, it hasn't been updated by something else already (as
@@ -892,7 +896,7 @@ Lsdb::expireOrRefreshAdjLsa(const ndn::Name& lsaKey, uint64_t seqNo)
}
// We have changed the contents of the LSDB, so we have to
// schedule a routing calculation
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
m_routingTable.scheduleRoutingTableCalculation();
}
}
}
@@ -921,7 +925,7 @@ Lsdb::expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
NLSR_LOG_DEBUG("Deleting Coordinate Lsa");
chkCorLsa->writeLog();
chkCorLsa->setLsSeqNo(chkCorLsa->getLsSeqNo() + 1);
if (m_nlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_sequencingManager.setCorLsaSeq(chkCorLsa->getLsSeqNo());
}
@@ -934,7 +938,7 @@ Lsdb::expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
chkCorLsa->getLsSeqNo(),
m_lsaRefreshTime));
// Only sync coordinate LSAs if link-state routing is disabled
if (m_nlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_sequencingManager.writeSeqNoToFile();
m_sync.publishRoutingUpdate(Lsa::Type::COORDINATE, m_sequencingManager.getCorLsaSeq());
}
@@ -944,8 +948,8 @@ Lsdb::expireOrRefreshCoordinateLsa(const ndn::Name& lsaKey,
NLSR_LOG_DEBUG("Other's Cor LSA, so removing from LSDB");
removeCoordinateLsa(lsaKey);
}
if (m_nlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) {
m_nlsr.getRoutingTable().scheduleRoutingTableCalculation(m_nlsr);
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
m_routingTable.scheduleRoutingTableCalculation();
}
}
}
@@ -981,11 +985,11 @@ Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
ndn::Interest interest(interestName);
ndn::util::SegmentFetcher::Options options;
options.interestLifetime = m_nlsr.getConfParameter().getLsaInterestLifetime();
options.interestLifetime = m_confParam.getLsaInterestLifetime();
NLSR_LOG_DEBUG("Fetching Data for LSA: " << interestName << " Seq number: " << seqNo);
auto fetcher = ndn::util::SegmentFetcher::start(m_nlsr.getNlsrFace(),
interest, m_nlsr.getValidator(), options);
auto fetcher = ndn::util::SegmentFetcher::start(m_face, interest,
m_confParam.getValidator(), options);
auto it = m_fetchers.insert(fetcher).first;
@@ -1002,7 +1006,9 @@ Lsdb::expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
});
m_lsaStorage.connectToFetcher(*fetcher);
m_nlsr.connectToFetcher(*fetcher);
fetcher->afterSegmentValidated.connect([this] (const ndn::Data& data) {
afterSegmentValidatedSignal(data);
});
// increment a specific SENT_LSA_INTEREST
Lsa::Type lsaType;
@@ -1046,12 +1052,12 @@ Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
int32_t lsaPosition = util::getNameComponentPosition(interestName, chkString);
// Forms the name of the router that the Interest packet came from.
ndn::Name originRouter = m_nlsr.getConfParameter().getNetwork();
ndn::Name originRouter = m_confParam.getNetwork();
originRouter.append(interestName.getSubName(lsaPosition + 1,
interestName.size() - lsaPosition - 3));
// if the interest is for this router's LSA
if (originRouter == m_nlsr.getConfParameter().getRouterPrefix() && lsaPosition >= 0) {
if (originRouter == m_confParam.getRouterPrefix() && lsaPosition >= 0) {
uint64_t seqNo = interestName[-1].toNumber();
NLSR_LOG_DEBUG("LSA sequence number from interest: " << seqNo);
@@ -1077,7 +1083,7 @@ Lsdb::processInterest(const ndn::Name& name, const ndn::Interest& interest)
const ndn::Data* lsaSegment = m_lsaStorage.getLsaSegment(interest);
if (lsaSegment != nullptr) {
NLSR_LOG_TRACE("Found data in lsa storage. Sending the data for " << interest.getName());
m_nlsr.getNlsrFace().put(*lsaSegment);
m_face.put(*lsaSegment);
}
else {
NLSR_LOG_TRACE(interest << " was not found in this lsa storage.");
@@ -1098,14 +1104,14 @@ Lsdb::processInterestForNameLsa(const ndn::Interest& interest,
// increment RCV_NAME_LSA_INTEREST
lsaIncrementSignal(Statistics::PacketType::RCV_NAME_LSA_INTEREST);
NLSR_LOG_DEBUG("nameLsa interest " << interest << " received");
NameLsa* nameLsa = m_nlsr.getLsdb().findNameLsa(lsaKey);
NameLsa* nameLsa = findNameLsa(lsaKey);
if (nameLsa != nullptr) {
NLSR_LOG_TRACE("Verifying SeqNo for NameLsa is same as requested.");
if (nameLsa->getLsSeqNo() == seqNo) {
std::string content = nameLsa->serialize();
m_segmentPublisher.publish(interest.getName(), interest.getName(),
ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
m_lsaRefreshTime, m_nlsr.getSigningInfo());
m_lsaRefreshTime, m_signingInfo);
lsaIncrementSignal(Statistics::PacketType::SENT_NAME_LSA_DATA);
}
@@ -1128,20 +1134,20 @@ Lsdb::processInterestForAdjacencyLsa(const ndn::Interest& interest,
const ndn::Name& lsaKey,
uint64_t seqNo)
{
if (m_nlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) {
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
NLSR_LOG_ERROR("Received interest for an adjacency LSA when hyperbolic routing is enabled");
}
lsaIncrementSignal(Statistics::PacketType::RCV_ADJ_LSA_INTEREST);
NLSR_LOG_DEBUG("AdjLsa interest " << interest << " received");
AdjLsa* adjLsa = m_nlsr.getLsdb().findAdjLsa(lsaKey);
AdjLsa* adjLsa = findAdjLsa(lsaKey);
if (adjLsa != nullptr) {
NLSR_LOG_TRACE("Verifying SeqNo for AdjLsa is same as requested.");
if (adjLsa->getLsSeqNo() == seqNo) {
std::string content = adjLsa->serialize();
m_segmentPublisher.publish(interest.getName(), interest.getName(),
ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
m_lsaRefreshTime, m_nlsr.getSigningInfo());
m_lsaRefreshTime, m_signingInfo);
lsaIncrementSignal(Statistics::PacketType::SENT_ADJ_LSA_DATA);
}
@@ -1164,20 +1170,20 @@ Lsdb::processInterestForCoordinateLsa(const ndn::Interest& interest,
const ndn::Name& lsaKey,
uint64_t seqNo)
{
if (m_nlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF) {
NLSR_LOG_ERROR("Received Interest for a coordinate LSA when link-state routing is enabled");
}
lsaIncrementSignal(Statistics::PacketType::RCV_COORD_LSA_INTEREST);
NLSR_LOG_DEBUG("CoordinateLsa interest " << interest << " received");
CoordinateLsa* corLsa = m_nlsr.getLsdb().findCoordinateLsa(lsaKey);
CoordinateLsa* corLsa = findCoordinateLsa(lsaKey);
if (corLsa != nullptr) {
NLSR_LOG_TRACE("Verifying SeqNo for CoordinateLsa is same as requested.");
if (corLsa->getLsSeqNo() == seqNo) {
std::string content = corLsa->serialize();
m_segmentPublisher.publish(interest.getName(), interest.getName(),
ndn::encoding::makeStringBlock(ndn::tlv::Content, content),
m_lsaRefreshTime, m_nlsr.getSigningInfo());
m_lsaRefreshTime, m_signingInfo);
lsaIncrementSignal(Statistics::PacketType::SENT_COORD_LSA_DATA);
}
@@ -1202,7 +1208,7 @@ Lsdb::onContentValidated(const std::shared_ptr<const ndn::Data>& data)
if (lsaPosition >= 0) {
// Extracts the prefix of the originating router from the data.
ndn::Name originRouter = m_nlsr.getConfParameter().getNetwork();
ndn::Name originRouter = m_confParam.getNetwork();
originRouter.append(dataName.getSubName(lsaPosition + 1, dataName.size() - lsaPosition - 3));
uint64_t seqNo = dataName[-1].toNumber();
@@ -1285,7 +1291,7 @@ Lsdb::getLsaExpirationTimePoint()
{
ndn::time::system_clock::TimePoint expirationTimePoint = ndn::time::system_clock::now();
expirationTimePoint = expirationTimePoint +
ndn::time::seconds(m_nlsr.getConfParameter().getRouterDeadInterval());
ndn::time::seconds(m_confParam.getRouterDeadInterval());
return expirationTimePoint;
}
+25 -18
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -29,6 +29,7 @@
#include "test-access-control.hpp"
#include "communication/sync-logic-handler.hpp"
#include "statistics.hpp"
#include "route/name-prefix-table.hpp"
#include <ndn-cxx/security/key-chain.hpp>
#include <ndn-cxx/util/signal.hpp>
@@ -42,12 +43,12 @@
namespace nlsr {
class Nlsr;
class Lsdb
{
public:
Lsdb(Nlsr& nlsr, ndn::Scheduler& scheduler);
Lsdb(ndn::Face& face, ndn::KeyChain& keyChain,
ndn::security::SigningInfo& signingInfo, ConfParameter& confParam,
NamePrefixTable& namePrefixTable, RoutingTable& routingTable);
~Lsdb();
@@ -202,21 +203,9 @@ public:
return m_sequencingManager;
}
LsaSegmentStorage&
getLsaStorage()
{
return m_lsaStorage;
}
void
writeAdjLsdbLog();
void
setLsaRefreshTime(const ndn::time::seconds& lsaRefreshTime);
void
setThisRouterPrefix(std::string trp);
void
expressInterest(const ndn::Name& interestName, uint32_t timeoutCount,
ndn::time::steady_clock::TimePoint deadline = DEFAULT_LSA_RETRIEVAL_DEADLINE);
@@ -230,6 +219,12 @@ public:
void
processInterest(const ndn::Name& name, const ndn::Interest& interest);
bool
getIsBuildAdjLsaSheduled()
{
return m_isBuildAdjLsaSheduled;
}
private:
/* \brief Add a name LSA to the LSDB if it isn't already there.
\param nlsa The candidade name LSA.
@@ -392,13 +387,22 @@ public:
static const ndn::Name::Component NAME_COMPONENT;
ndn::util::signal::Signal<Lsdb, Statistics::PacketType> lsaIncrementSignal;
ndn::util::signal::Signal<Lsdb, const ndn::Data&> afterSegmentValidatedSignal;
private:
Nlsr& m_nlsr;
ndn::Scheduler& m_scheduler;
ndn::Face& m_face;
ndn::Scheduler m_scheduler;
ndn::security::SigningInfo& m_signingInfo;
ConfParameter& m_confParam;
NamePrefixTable& m_namePrefixTable;
RoutingTable& m_routingTable;
SyncLogicHandler m_sync;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
LsaSegmentStorage m_lsaStorage;
private:
std::list<NameLsa> m_nameLsdb;
std::list<AdjLsa> m_adjLsdb;
std::list<CoordinateLsa> m_corLsdb;
@@ -423,6 +427,9 @@ private:
std::set<std::shared_ptr<ndn::util::SegmentFetcher>> m_fetchers;
psync::SegmentPublisher m_segmentPublisher;
bool m_isBuildAdjLsaSheduled;
int64_t m_adjBuildCount;
};
} // namespace nlsr
+16 -5
View File
@@ -19,6 +19,7 @@
* NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
**/
#include "conf-file-processor.hpp"
#include "nlsr-runner.hpp"
#include "version.hpp"
@@ -82,15 +83,25 @@ main(int argc, char** argv)
}
}
nlsr::NlsrRunner runner(configFileName);
boost::asio::io_service ioService;
ndn::Face face(ioService);
nlsr::ConfParameter confParam(face, configFileName);
nlsr::ConfFileProcessor configProcessor(confParam);
if (!configProcessor.processConfFile()) {
std::cerr << "Error in configuration file processing" << std::endl;
return 2;
}
confParam.buildRouterPrefix();
confParam.writeLog();
nlsr::NlsrRunner runner(face, confParam);
try {
runner.run();
}
catch (const nlsr::NlsrRunner::ConfFileError& e) {
std::cerr << e.what() << std::endl;
return 2;
}
catch (const std::exception& e) {
std::cerr << "FATAL: " << getExtendedErrorMessage(e) << std::endl;
return 1;
+5 -13
View File
@@ -20,31 +20,23 @@
**/
#include "nlsr-runner.hpp"
#include "conf-file-processor.hpp"
namespace nlsr {
NlsrRunner::NlsrRunner(const std::string& configFileName)
: m_scheduler(m_ioService)
, m_face(m_ioService)
, m_nlsr(m_ioService, m_scheduler, m_face, m_keyChain)
NlsrRunner::NlsrRunner(ndn::Face& face, ConfParameter& confParam)
: m_face(face)
, m_confParam(confParam)
, m_nlsr(m_face, m_keyChain, m_confParam)
{
m_nlsr.setConfFileName(configFileName);
}
void
NlsrRunner::run()
{
ConfFileProcessor configProcessor(m_nlsr, m_nlsr.getConfFileName());
if (!configProcessor.processConfFile()) {
BOOST_THROW_EXCEPTION(ConfFileError("Error in configuration file processing"));
}
m_nlsr.initialize();
try {
m_nlsr.startEventLoop();
m_face.processEvents();
}
catch (...) {
m_nlsr.getFib().clean();
+4 -13
View File
@@ -23,13 +23,11 @@
#define NLSR_NLSR_RUNNER_HPP
#include "nlsr.hpp"
#include "conf-parameter.hpp"
#include <ndn-cxx/face.hpp>
#include <ndn-cxx/util/scheduler.hpp>
// boost needs to be included after ndn-cxx, otherwise there will be conflict with _1, _2, ...
#include <boost/asio/io_service.hpp>
namespace nlsr {
/*! \brief A wrapper class to instantiate and configure an NLSR object.
@@ -43,14 +41,8 @@ namespace nlsr {
class NlsrRunner
{
public:
class ConfFileError : public std::invalid_argument
{
public:
using std::invalid_argument::invalid_argument;
};
explicit
NlsrRunner(const std::string& configFileName);
NlsrRunner(ndn::Face& face, ConfParameter& confParam);
/*! \brief Instantiate, configure, and start the NLSR process.
*
@@ -67,10 +59,9 @@ public:
run();
private:
boost::asio::io_service m_ioService;
ndn::Scheduler m_scheduler;
ndn::Face m_face;
ndn::Face& m_face;
ndn::KeyChain m_keyChain;
ConfParameter& m_confParam;
Nlsr m_nlsr;
};
+87 -140
View File
@@ -39,46 +39,42 @@ INIT_LOGGER(Nlsr);
const ndn::Name Nlsr::LOCALHOST_PREFIX = ndn::Name("/localhost/nlsr");
Nlsr::Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain)
: m_nlsrFace(face)
, m_scheduler(scheduler)
Nlsr::Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam)
: m_face(face)
, m_scheduler(face.getIoService())
, m_keyChain(keyChain)
, m_confParam()
, m_adjacencyList()
, m_namePrefixList()
, m_configFileName("nlsr.conf")
, m_nlsrLsdb(*this, scheduler)
, m_adjBuildCount(0)
, m_isBuildAdjLsaSheduled(false)
, m_isRouteCalculationScheduled(false)
, m_isRoutingTableCalculating(false)
, m_routingTable(scheduler)
, m_fib(m_nlsrFace, scheduler, m_adjacencyList, m_confParam, m_keyChain)
, m_namePrefixTable(*this, m_routingTable.afterRoutingChange)
, m_dispatcher(m_nlsrFace, m_keyChain)
, m_datasetHandler(m_nlsrLsdb,
m_routingTable,
m_dispatcher,
m_nlsrFace,
m_keyChain)
, m_helloProtocol(*this, scheduler)
, m_validator(std::make_unique<ndn::security::v2::CertificateFetcherDirectFetch>(m_nlsrFace))
, m_controller(m_nlsrFace, m_keyChain)
, m_faceDatasetController(m_nlsrFace, m_keyChain)
, m_confParam(confParam)
, m_adjacencyList(confParam.getAdjacencyList())
, m_namePrefixList(confParam.getNamePrefixList())
, m_validator(m_confParam.getValidator())
, m_fib(m_face, m_scheduler, m_adjacencyList, m_confParam, m_keyChain)
, m_routingTable(m_scheduler, m_fib, m_lsdb, m_namePrefixTable, m_confParam)
, m_namePrefixTable(m_fib, m_routingTable, m_routingTable.afterRoutingChange)
, m_lsdb(m_face, m_keyChain, m_signingInfo,
m_confParam, m_namePrefixTable, m_routingTable)
, m_afterSegmentValidatedConnection(m_lsdb.afterSegmentValidatedSignal.connect(
std::bind(&Nlsr::afterFetcherSignalEmitted, this, _1)))
, m_dispatcher(m_face, m_keyChain)
, m_datasetHandler(m_dispatcher, m_lsdb, m_routingTable)
, m_helloProtocol(m_face, m_keyChain, m_signingInfo, confParam, m_routingTable, m_lsdb)
, m_certStore(m_confParam.getCertStore())
, m_controller(m_face, m_keyChain)
, m_faceDatasetController(m_face, m_keyChain)
, m_prefixUpdateProcessor(m_dispatcher,
m_nlsrFace,
m_confParam.getPrefixUpdateValidator(),
m_namePrefixList,
m_nlsrLsdb,
m_configFileName)
m_lsdb,
m_confParam.getConfFileName())
, m_nfdRibCommandProcessor(m_dispatcher,
m_namePrefixList,
m_nlsrLsdb)
, m_statsCollector(m_nlsrLsdb, m_helloProtocol)
, m_faceMonitor(m_nlsrFace)
, m_firstHelloInterval(FIRST_HELLO_INTERVAL_DEFAULT)
m_lsdb)
, m_statsCollector(m_lsdb, m_helloProtocol)
, m_faceMonitor(m_face)
{
m_faceMonitor.onNotification.connect(std::bind(&Nlsr::onFaceEventNotification, this, _1));
m_faceMonitor.start();
setStrategies();
}
void
@@ -103,13 +99,11 @@ Nlsr::setInfoInterestFilter()
NLSR_LOG_DEBUG("Setting interest filter for Hello interest: " << name);
m_nlsrFace.setInterestFilter(ndn::InterestFilter(name).allowLoopback(false),
std::bind(&HelloProtocol::processInterest,
&m_helloProtocol, _1, _2),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(name).allowLoopback(false),
std::bind(&HelloProtocol::processInterest, &m_helloProtocol, _1, _2),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
}
void
@@ -119,16 +113,13 @@ Nlsr::setLsaInterestFilter()
NLSR_LOG_DEBUG("Setting interest filter for LsaPrefix: " << name);
m_nlsrFace.setInterestFilter(ndn::InterestFilter(name).allowLoopback(false),
std::bind(&Lsdb::processInterest,
&m_nlsrLsdb, _1, _2),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(name).allowLoopback(false),
std::bind(&Lsdb::processInterest, &m_lsdb, _1, _2),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
}
void
Nlsr::addDispatcherTopPrefix(const ndn::Name& topPrefix)
{
@@ -147,7 +138,7 @@ Nlsr::setStrategies()
const std::string strategy("ndn:/localhost/nfd/strategy/multicast");
m_fib.setStrategy(m_confParam.getLsaPrefix(), strategy, 0);
m_fib.setStrategy(m_confParam.getChronosyncPrefix(), strategy, 0);
m_fib.setStrategy(m_confParam.getSyncPrefix(), strategy, 0);
}
void
@@ -162,15 +153,6 @@ Nlsr::loadCertToPublish(const ndn::security::v2::Certificate& certificate)
ndn::security::v2::Certificate(certificate));
}
void
Nlsr::connectToFetcher(ndn::util::SegmentFetcher& fetcher)
{
NLSR_LOG_TRACE("NLSR: Connect to SegmentFetcher.");
fetcher.afterSegmentValidated.connect(std::bind(&Nlsr::afterFetcherSignalEmitted,
this, _1));
}
void
Nlsr::afterFetcherSignalEmitted(const ndn::Data& lsaSegment)
{
@@ -194,13 +176,11 @@ Nlsr::publishCertFromCache(const ndn::Name& keyName)
NLSR_LOG_TRACE(*cert);
ndn::Name certName = ndn::security::v2::extractKeyNameFromCertName(cert->getName());
NLSR_LOG_TRACE("Setting interest filter for: " << certName);
m_nlsrFace.setInterestFilter(ndn::InterestFilter(certName).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest,
this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(certName).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest, this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
if (!cert->getKeyName().equals(cert->getSignature().getKeyLocator().getName())) {
publishCertFromCache(cert->getSignature().getKeyLocator().getName());
@@ -215,29 +195,17 @@ void
Nlsr::initialize()
{
NLSR_LOG_DEBUG("Initializing Nlsr");
m_confParam.buildRouterPrefix();
m_datasetHandler.setRouterNameCommandPrefix(m_confParam.getRouterPrefix());
m_nlsrLsdb.setLsaRefreshTime(ndn::time::seconds(m_confParam.getLsaRefreshTime()));
m_nlsrLsdb.setThisRouterPrefix(m_confParam.getRouterPrefix().toUri());
m_fib.setEntryRefreshTime(2 * m_confParam.getLsaRefreshTime());
m_nlsrLsdb.getSequencingManager().setSeqFileDirectory(m_confParam.getSeqFileDir());
m_nlsrLsdb.getSequencingManager().initiateSeqNoFromFile(m_confParam.getHyperbolicState());
m_nlsrLsdb.getSyncLogicHandler().createSyncLogic(m_confParam.getChronosyncPrefix(),
m_confParam.getSyncInterestLifetime());
// Logging start
m_confParam.writeLog();
m_adjacencyList.writeLog();
NLSR_LOG_DEBUG(m_namePrefixList);
// Logging end
initializeKey();
setStrategies();
NLSR_LOG_DEBUG("Default NLSR identity: " << m_signingInfo.getSignerName());
// Can be moved to HelloProtocol and Lsdb ctor if initializeKey is set
// earlier in the Nlsr constructor so as to set m_signingInfo
setInfoInterestFilter();
setLsaInterestFilter();
@@ -250,23 +218,18 @@ Nlsr::initialize()
enableIncomingFaceIdIndication();
// Set event intervals
setFirstHelloInterval(m_confParam.getFirstHelloInterval());
m_nlsrLsdb.setAdjLsaBuildInterval(m_confParam.getAdjLsaBuildInterval());
m_routingTable.setRoutingCalcInterval(m_confParam.getRoutingCalcInterval());
m_nlsrLsdb.buildAndInstallOwnNameLsa();
m_lsdb.buildAndInstallOwnNameLsa();
// Install coordinate LSAs if using HR or dry-run HR.
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
m_nlsrLsdb.buildAndInstallOwnCoordinateLsa();
m_lsdb.buildAndInstallOwnCoordinateLsa();
}
registerKeyPrefix();
registerLocalhostPrefix();
registerRouterPrefix();
m_helloProtocol.scheduleInterest(m_firstHelloInterval);
m_helloProtocol.scheduleInterest(m_confParam.getFirstHelloInterval());
// Need to set direct neighbors' costs to 0 for hyperbolic routing
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
@@ -334,79 +297,69 @@ Nlsr::initializeKey()
nlsrInstanceName);
loadCertToPublish(certificate);
m_defaultCertName = certificate.getName();
}
void
Nlsr::registerKeyPrefix()
{
// Start listening for the interest of this router's NLSR certificate
ndn::Name nlsrKeyPrefix = getConfParameter().getRouterPrefix();
ndn::Name nlsrKeyPrefix = m_confParam.getRouterPrefix();
nlsrKeyPrefix.append("nlsr");
nlsrKeyPrefix.append("KEY");
m_nlsrFace.setInterestFilter(ndn::InterestFilter(nlsrKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest,
this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(nlsrKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest, this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
// Start listening for the interest of this router's certificate
ndn::Name routerKeyPrefix = getConfParameter().getRouterPrefix();
ndn::Name routerKeyPrefix = m_confParam.getRouterPrefix();
routerKeyPrefix.append("KEY");
m_nlsrFace.setInterestFilter(ndn::InterestFilter(routerKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest,
this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(routerKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest, this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
// Start listening for the interest of this router's operator's certificate
ndn::Name operatorKeyPrefix = getConfParameter().getNetwork();
operatorKeyPrefix.append(getConfParameter().getSiteName());
ndn::Name operatorKeyPrefix = m_confParam.getNetwork();
operatorKeyPrefix.append(m_confParam.getSiteName());
operatorKeyPrefix.append(std::string("%C1.Operator"));
m_nlsrFace.setInterestFilter(ndn::InterestFilter(operatorKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest,
this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(operatorKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest, this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
// Start listening for the interest of this router's site's certificate
ndn::Name siteKeyPrefix = getConfParameter().getNetwork();
siteKeyPrefix.append(getConfParameter().getSiteName());
ndn::Name siteKeyPrefix = m_confParam.getNetwork();
siteKeyPrefix.append(m_confParam.getSiteName());
siteKeyPrefix.append("KEY");
m_nlsrFace.setInterestFilter(ndn::InterestFilter(siteKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest,
this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo,
ndn::nfd::ROUTE_FLAG_CAPTURE);
m_face.setInterestFilter(ndn::InterestFilter(siteKeyPrefix).allowLoopback(false),
std::bind(&Nlsr::onKeyInterest, this, _1, _2),
std::bind(&Nlsr::onKeyPrefixRegSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1),
m_signingInfo, ndn::nfd::ROUTE_FLAG_CAPTURE);
}
void
Nlsr::registerLocalhostPrefix()
{
m_nlsrFace.registerPrefix(LOCALHOST_PREFIX,
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1));
m_face.registerPrefix(LOCALHOST_PREFIX,
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1));
}
void
Nlsr::registerRouterPrefix()
{
m_nlsrFace.registerPrefix(ndn::Name(m_confParam.getRouterPrefix()).append("nlsr"),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1));
m_face.registerPrefix(ndn::Name(m_confParam.getRouterPrefix()).append("nlsr"),
std::bind(&Nlsr::onRegistrationSuccess, this, _1),
std::bind(&Nlsr::registrationFailed, this, _1));
}
void
@@ -422,7 +375,7 @@ Nlsr::onKeyInterest(const ndn::Name& name, const ndn::Interest& interest)
return; // cert is not found
}
m_nlsrFace.put(*cert);
m_face.put(*cert);
}
void
@@ -470,10 +423,10 @@ Nlsr::onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNo
adjacent->setInterestTimedOutNo(m_confParam.getInterestRetryNumber());
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
getRoutingTable().scheduleRoutingTableCalculation(*this);
m_routingTable.scheduleRoutingTableCalculation();
}
else {
m_nlsrLsdb.scheduleAdjLsaBuild();
m_lsdb.scheduleAdjLsaBuild();
}
}
}
@@ -502,10 +455,10 @@ Nlsr::onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNo
registerAdjacencyPrefixes(*adjacent, ndn::time::milliseconds::max());
if (m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF) {
getRoutingTable().scheduleRoutingTableCalculation(*this);
m_routingTable.scheduleRoutingTableCalculation();
}
else {
m_nlsrLsdb.scheduleAdjLsaBuild();
m_lsdb.scheduleAdjLsaBuild();
}
}
break;
@@ -570,7 +523,7 @@ Nlsr::registerAdjacencyPrefixes(const Adjacent& adj,
m_fib.registerPrefix(adjName, faceUri, linkCost,
timeout, ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
m_fib.registerPrefix(m_confParam.getChronosyncPrefix(),
m_fib.registerPrefix(m_confParam.getSyncPrefix(),
faceUri, linkCost, timeout,
ndn::nfd::ROUTE_FLAG_CAPTURE, 0);
@@ -649,10 +602,4 @@ Nlsr::onFaceIdIndicationFailure(const ndn::nfd::ControlResponse& cr)
NLSR_LOG_DEBUG(os.str());
}
void
Nlsr::startEventLoop()
{
m_nlsrFace.processEvents();
}
} // namespace nlsr
+24 -230
View File
@@ -80,7 +80,7 @@ public:
}
};
Nlsr(boost::asio::io_service& ioService, ndn::Scheduler& scheduler, ndn::Face& face, ndn::KeyChain& keyChain);
Nlsr(ndn::Face& face, ndn::KeyChain& keyChain, ConfParameter& confParam);
void
registrationFailed(const ndn::Name& name);
@@ -102,147 +102,12 @@ public:
void
addDispatcherTopPrefix(const ndn::Name& topPrefix);
void
startEventLoop();
std::string
getConfFileName() const
{
return m_configFileName;
}
void
setConfFileName(const std::string& fileName)
{
m_configFileName = fileName;
}
ConfParameter&
getConfParameter()
{
return m_confParam;
}
const ConfParameter&
getConfParameter() const
{
return m_confParam;
}
AdjacencyList&
getAdjacencyList()
{
return m_adjacencyList;
}
const AdjacencyList&
getAdjacencyList() const
{
return m_adjacencyList;
}
NamePrefixList&
getNamePrefixList()
{
return m_namePrefixList;
}
const NamePrefixList&
getNamePrefixList() const
{
return m_namePrefixList;
}
ndn::Face&
getNlsrFace()
{
return m_nlsrFace;
}
Lsdb&
getLsdb()
{
return m_nlsrLsdb;
}
RoutingTable&
getRoutingTable()
{
return m_routingTable;
}
NamePrefixTable&
getNamePrefixTable()
{
return m_namePrefixTable;
}
Fib&
getFib()
{
return m_fib;
}
long int
getAdjBuildCount()
{
return m_adjBuildCount;
}
void
incrementAdjBuildCount()
{
m_adjBuildCount++;
}
void
setAdjBuildCount(int64_t abc)
{
m_adjBuildCount = abc;
}
bool
getIsBuildAdjLsaSheduled()
{
return m_isBuildAdjLsaSheduled;
}
void
setIsBuildAdjLsaSheduled(bool iabls)
{
m_isBuildAdjLsaSheduled = iabls;
}
bool
getIsRoutingTableCalculating()
{
return m_isRoutingTableCalculating;
}
void
setIsRoutingTableCalculating(bool irtc)
{
m_isRoutingTableCalculating = irtc;
}
bool
getIsRouteCalculationScheduled()
{
return m_isRouteCalculationScheduled;
}
void
setIsRouteCalculationScheduled(bool ircs)
{
m_isRouteCalculationScheduled = ircs;
}
DatasetInterestHandler&
getDatasetHandler()
{
return m_datasetHandler;
}
void
initialize();
@@ -298,9 +163,6 @@ public:
void
loadCertToPublish(const ndn::security::v2::Certificate& certificate);
void
connectToFetcher(ndn::util::SegmentFetcher& fetcher);
/*! \brief Callback when SegmentFetcher retrieves a segment.
*/
void
@@ -316,19 +178,6 @@ public:
void
initializeKey();
void
loadValidator(boost::property_tree::ptree section,
const std::string& filename)
{
m_validator.load(section, filename);
}
ndn::security::ValidatorConfig&
getValidator()
{
return m_validator;
}
/*! \brief Find a certificate
*
* Find a certificate that NLSR has. First it checks against the
@@ -346,57 +195,9 @@ public:
return cert;
}
ndn::security::v2::KeyChain&
getKeyChain()
{
return m_keyChain;
}
const ndn::Name&
getDefaultCertName()
{
return m_defaultCertName;
}
const ndn::security::SigningInfo&
getSigningInfo()
{
return m_signingInfo;
}
update::PrefixUpdateProcessor&
getPrefixUpdateProcessor()
{
return m_prefixUpdateProcessor;
}
update::NfdRibCommandProcessor&
getNfdRibCommandProcessor()
{
return m_nfdRibCommandProcessor;
}
ndn::mgmt::Dispatcher&
getDispatcher()
{
return m_dispatcher;
}
void
setStrategies();
uint32_t
getFirstHelloInterval() const
{
return m_firstHelloInterval;
}
StatsCollector&
getStatsCollector()
{
return m_statsCollector;
}
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
security::CertificateStore&
@@ -436,12 +237,6 @@ private:
void
onFaceEventNotification(const ndn::nfd::FaceEventNotification& faceEventNotification);
void
setFirstHelloInterval(uint32_t interval)
{
m_firstHelloInterval = interval;
}
void
scheduleDatasetFetch();
@@ -465,49 +260,48 @@ public:
static const ndn::Name LOCALHOST_PREFIX;
private:
ndn::Face& m_nlsrFace;
ndn::Scheduler& m_scheduler;
ndn::Face& m_face;
ndn::Scheduler m_scheduler;
ndn::security::v2::KeyChain& m_keyChain;
ConfParameter m_confParam;
AdjacencyList m_adjacencyList;
NamePrefixList m_namePrefixList;
std::string m_configFileName;
Lsdb m_nlsrLsdb;
int64_t m_adjBuildCount;
bool m_isBuildAdjLsaSheduled;
bool m_isRouteCalculationScheduled;
bool m_isRoutingTableCalculating;
RoutingTable m_routingTable;
Fib m_fib;
NamePrefixTable m_namePrefixTable;
ndn::mgmt::Dispatcher m_dispatcher;
DatasetInterestHandler m_datasetHandler;
ConfParameter& m_confParam;
AdjacencyList& m_adjacencyList;
NamePrefixList& m_namePrefixList;
bool m_isDaemonProcess;
ndn::security::ValidatorConfig& m_validator;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
HelloProtocol m_helloProtocol;
Fib m_fib;
RoutingTable m_routingTable;
NamePrefixTable m_namePrefixTable;
Lsdb m_lsdb;
ndn::security::ValidatorConfig m_validator;
private:
ndn::util::signal::ScopedConnection m_afterSegmentValidatedConnection;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
ndn::mgmt::Dispatcher m_dispatcher;
DatasetInterestHandler m_datasetHandler;
HelloProtocol m_helloProtocol;
private:
/*! \brief Where NLSR stores certificates it claims to be
* authoritative for. Usually the router certificate.
*/
security::CertificateStore m_certStore;
security::CertificateStore& m_certStore;
ndn::nfd::Controller m_controller;
ndn::nfd::Controller m_faceDatasetController;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
ndn::security::SigningInfo m_signingInfo;
ndn::Name m_defaultCertName;
update::PrefixUpdateProcessor m_prefixUpdateProcessor;
update::NfdRibCommandProcessor m_nfdRibCommandProcessor;
StatsCollector m_statsCollector;
private:
ndn::nfd::FaceMonitor m_faceMonitor;
uint32_t m_firstHelloInterval;
friend class NlsrRunner;
};
+6 -8
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -36,13 +36,11 @@ const ndn::PartialName COORDINATES_DATASET = ndn::PartialName("lsdb/coordinates"
const ndn::PartialName NAMES_DATASET = ndn::PartialName("lsdb/names");
const ndn::PartialName RT_DATASET = ndn::PartialName("routing-table");
DatasetInterestHandler::DatasetInterestHandler(const Lsdb& lsdb,
const RoutingTable& rt,
ndn::mgmt::Dispatcher& dispatcher,
const ndn::Face& face,
const ndn::KeyChain& keyChain)
: m_lsdb(lsdb)
, m_dispatcher(dispatcher)
DatasetInterestHandler::DatasetInterestHandler(ndn::mgmt::Dispatcher& dispatcher,
const Lsdb& lsdb,
const RoutingTable& rt)
: m_dispatcher(dispatcher)
, m_lsdb(lsdb)
, m_routingTableEntries(rt.getRoutingTableEntry())
, m_dryRoutingTableEntries(rt.getDryRoutingTableEntry())
{
+5 -21
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -72,23 +72,9 @@ public:
}
};
DatasetInterestHandler(const Lsdb& lsdb,
const RoutingTable& rt,
ndn::mgmt::Dispatcher& dispatcher,
const ndn::Face& face,
const ndn::KeyChain& keyChain);
ndn::Name&
getRouterNameCommandPrefix()
{
return m_routerNamePrefix;
}
void
setRouterNameCommandPrefix(const ndn::Name& routerName) {
m_routerNamePrefix = routerName;
m_routerNamePrefix.append(Lsdb::NAME_COMPONENT);
}
DatasetInterestHandler(ndn::mgmt::Dispatcher& dispatcher,
const Lsdb& lsdb,
const RoutingTable& rt);
private:
/*! \brief set dispatcher for localhost or remote router
@@ -126,10 +112,8 @@ private:
ndn::mgmt::StatusDatasetContext& context);
private:
const Lsdb& m_lsdb;
ndn::Name m_routerNamePrefix;
ndn::mgmt::Dispatcher& m_dispatcher;
const Lsdb& m_lsdb;
const std::list<RoutingTableEntry>& m_routingTableEntries;
const std::list<RoutingTableEntry>& m_dryRoutingTableEntries;
+2 -2
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -38,7 +38,7 @@ const uint64_t Fib::GRACE_PERIOD = 10;
Fib::Fib(ndn::Face& face, ndn::Scheduler& scheduler, AdjacencyList& adjacencyList,
ConfParameter& conf, ndn::security::v2::KeyChain& keyChain)
: m_scheduler(scheduler)
, m_refreshTime(0)
, m_refreshTime(2 * conf.getLsaRefreshTime())
, m_controller(face, keyChain)
, m_adjacencyList(adjacencyList)
, m_confParameter(conf)
+1 -3
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -54,8 +54,6 @@ namespace detail {
} // namespace detail
class Nlsr;
class Map
{
public:
+11 -11
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -33,9 +33,10 @@ namespace nlsr {
INIT_LOGGER(route.NamePrefixTable);
NamePrefixTable::NamePrefixTable(Nlsr& nlsr,
NamePrefixTable::NamePrefixTable(Fib& fib, RoutingTable& routingTable,
std::unique_ptr<AfterRoutingChange>& afterRoutingChangeSignal)
: m_nlsr(nlsr)
: m_fib(fib)
, m_routingTable(routingTable)
{
m_afterRoutingChangeConnection = afterRoutingChangeSignal->connect(
[this] (const std::list<RoutingTableEntry>& entries) {
@@ -70,8 +71,7 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
// There isn't currently a routing table entry in the pool for this name
if (rtpeItr == m_rtpool.end()) {
// See if there is a routing table entry available we could use
RoutingTableEntry* routeEntryPtr = m_nlsr.getRoutingTable()
.findRoutingTableEntry(destRouter);
RoutingTableEntry* routeEntryPtr = m_routingTable.findRoutingTableEntry(destRouter);
// We have to create a new routing table entry
if (routeEntryPtr == nullptr) {
@@ -102,7 +102,7 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
// If this entry has next hops, we need to inform the FIB
if (npte->getNexthopList().size() > 0) {
NLSR_LOG_TRACE("Updating FIB with next hops for " << npte->getNamePrefix());
m_nlsr.getFib().update(name, npte->getNexthopList());
m_fib.update(name, npte->getNexthopList());
}
// The routing table may recalculate and add a routing table entry
// with no next hops to replace an existing routing table entry. In
@@ -112,7 +112,7 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
// calculation may add next hops.
else {
NLSR_LOG_TRACE(npte->getNamePrefix() << " has no next hops; removing from FIB");
m_nlsr.getFib().remove(name);
m_fib.remove(name);
}
}
else {
@@ -124,11 +124,11 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
if ((*nameItr)->getNexthopList().size() > 0) {
NLSR_LOG_TRACE("Updating FIB with next hops for " << (**nameItr));
m_nlsr.getFib().update(name, (*nameItr)->getNexthopList());
m_fib.update(name, (*nameItr)->getNexthopList());
}
else {
NLSR_LOG_TRACE(npte->getNamePrefix() << " has no next hops; removing from FIB");
m_nlsr.getFib().remove(name);
m_fib.remove(name);
}
}
// Add the reference to this NPT to the RTPE.
@@ -189,13 +189,13 @@ NamePrefixTable::removeEntry(const ndn::Name& name, const ndn::Name& destRouter)
NLSR_LOG_TRACE(**nameItr << " has no routing table entries;"
<< " removing from table and FIB");
m_table.erase(nameItr);
m_nlsr.getFib().remove(name);
m_fib.remove(name);
}
else {
NLSR_LOG_TRACE(**nameItr << " has other routing table entries;"
<< " updating FIB with next hops");
(*nameItr)->generateNhlfromRteList();
m_nlsr.getFib().update(name, (*nameItr)->getNexthopList());
m_fib.update(name, (*nameItr)->getNexthopList());
}
}
else {
+6 -4
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -26,12 +26,12 @@
#include "routing-table-pool-entry.hpp"
#include "signals.hpp"
#include "test-access-control.hpp"
#include "route/fib.hpp"
#include <list>
#include <unordered_map>
namespace nlsr {
class Nlsr;
class NamePrefixTable
{
@@ -41,7 +41,8 @@ public:
using NptEntryList = std::list<std::shared_ptr<NamePrefixTableEntry>>;
using const_iterator = NptEntryList::const_iterator;
NamePrefixTable(Nlsr& nlsr, std::unique_ptr<AfterRoutingChange>& afterRoutingChangeSignal);
NamePrefixTable(Fib& fib, RoutingTable& routingTable,
std::unique_ptr<AfterRoutingChange>& afterRoutingChangeSignal);
~NamePrefixTable();
@@ -124,7 +125,8 @@ PUBLIC_WITH_TESTS_ELSE_PRIVATE:
NptEntryList m_table;
private:
Nlsr& m_nlsr;
Fib& m_fib;
RoutingTable& m_routingTable;
ndn::util::signal::Connection m_afterRoutingChangeConnection;
};
+19 -22
View File
@@ -22,7 +22,6 @@
#include "routing-table-calculator.hpp"
#include "lsdb.hpp"
#include "map.hpp"
#include "lsa.hpp"
#include "nexthop.hpp"
#include "nlsr.hpp"
#include "logger.hpp"
@@ -57,21 +56,17 @@ RoutingTableCalculator::initMatrix()
}
void
RoutingTableCalculator::makeAdjMatrix(Nlsr& pnlsr, Map& pMap)
RoutingTableCalculator::makeAdjMatrix(const std::list<AdjLsa>& adjLsaList, Map& pMap)
{
std::list<AdjLsa> adjLsdb = pnlsr.getLsdb().getAdjLsdb();
// For each LSA represented in the map
for (std::list<AdjLsa>::iterator it = adjLsdb.begin(); it != adjLsdb.end() ; it++) {
for (const auto& adjLsa : adjLsaList) {
ndn::optional<int32_t> row = pMap.getMappingNoByRouterName(adjLsa.getOrigRouter());
ndn::optional<int32_t> row = pMap.getMappingNoByRouterName((*it).getOrigRouter());
std::list<Adjacent> adl = (*it).getAdl().getAdjList();
std::list<Adjacent> adl = adjLsa.getAdl().getAdjList();
// For each adjacency represented in the LSA
for (std::list<Adjacent>::iterator itAdl = adl.begin(); itAdl != adl.end() ; itAdl++) {
ndn::optional<int32_t> col = pMap.getMappingNoByRouterName((*itAdl).getName());
double cost = (*itAdl).getLinkCost();
for (const auto& adjacent : adl) {
ndn::optional<int32_t> col = pMap.getMappingNoByRouterName(adjacent.getName());
double cost = adjacent.getLinkCost();
if (row && col && *row < static_cast<int32_t>(m_nRouters)
&& *col < static_cast<int32_t>(m_nRouters))
@@ -224,24 +219,25 @@ RoutingTableCalculator::freeLinksCosts()
}
void
LinkStateRoutingTableCalculator::calculatePath(Map& pMap,
RoutingTable& rt, Nlsr& pnlsr)
LinkStateRoutingTableCalculator::calculatePath(Map& pMap, RoutingTable& rt,
ConfParameter& confParam,
const std::list<AdjLsa>& adjLsaList)
{
NLSR_LOG_DEBUG("LinkStateRoutingTableCalculator::calculatePath Called");
allocateAdjMatrix();
initMatrix();
makeAdjMatrix(pnlsr, pMap);
makeAdjMatrix(adjLsaList, pMap);
writeAdjMatrixLog(pMap);
ndn::optional<int32_t> sourceRouter =
pMap.getMappingNoByRouterName(pnlsr.getConfParameter().getRouterPrefix());
pMap.getMappingNoByRouterName(confParam.getRouterPrefix());
allocateParent(); // These two matrices are used in Dijkstra's algorithm.
allocateDistance(); //
// We only bother to do the calculation if we have a router by that name.
if (sourceRouter && pnlsr.getConfParameter().getMaxFacesPerPrefix() == 1) {
if (sourceRouter && confParam.getMaxFacesPerPrefix() == 1) {
// In the single path case we can simply run Dijkstra's algorithm.
doDijkstraPathCalculation(*sourceRouter);
// Inform the routing table of the new next hops.
addAllLsNextHopsToRoutingTable(pnlsr, rt, pMap, *sourceRouter);
addAllLsNextHopsToRoutingTable(confParam.getAdjacencyList(), rt, pMap, *sourceRouter);
}
else {
// Multi Path
@@ -257,7 +253,7 @@ LinkStateRoutingTableCalculator::calculatePath(Map& pMap,
// Do Dijkstra's algorithm using the current neighbor as your start.
doDijkstraPathCalculation(*sourceRouter);
// Update the routing table with the calculations.
addAllLsNextHopsToRoutingTable(pnlsr, rt, pMap, *sourceRouter);
addAllLsNextHopsToRoutingTable(confParam.getAdjacencyList(), rt, pMap, *sourceRouter);
}
freeLinks();
freeLinksCosts();
@@ -318,8 +314,9 @@ LinkStateRoutingTableCalculator::doDijkstraPathCalculation(int sourceRouter)
}
void
LinkStateRoutingTableCalculator::addAllLsNextHopsToRoutingTable(Nlsr& pnlsr, RoutingTable& rt,
Map& pMap, uint32_t sourceRouter)
LinkStateRoutingTableCalculator::addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies,
RoutingTable& rt, Map& pMap,
uint32_t sourceRouter)
{
NLSR_LOG_DEBUG("LinkStateRoutingTableCalculator::addAllNextHopsToRoutingTable Called");
@@ -341,7 +338,7 @@ LinkStateRoutingTableCalculator::addAllLsNextHopsToRoutingTable(Nlsr& pnlsr, Rou
ndn::optional<ndn::Name> nextHopRouterName= pMap.getRouterNameByMappingNo(nextHopRouter);
if (nextHopRouterName) {
std::string nextHopFace =
pnlsr.getAdjacencyList().getAdjacent(*nextHopRouterName).getFaceUri().toString();
adjacencies.getAdjacent(*nextHopRouterName).getFaceUri().toString();
// Add next hop to routing table
NextHop nh(nextHopFace, routeCost);
rt.addNextHop(*(pMap.getRouterNameByMappingNo(i)), nh);
+7 -6
View File
@@ -23,6 +23,8 @@
#define NLSR_ROUTING_TABLE_CALCULATOR_HPP
#include "common.hpp"
#include "lsa.hpp"
#include "conf-parameter.hpp"
#include <list>
#include <iostream>
@@ -34,7 +36,6 @@ namespace nlsr {
class Map;
class RoutingTable;
class Nlsr;
class RoutingTableCalculator
{
@@ -56,12 +57,11 @@ protected:
initMatrix();
/*! \brief Constructs an adj. matrix to calculate with.
\param pnlsr The NLSR object that contains the LSAs that we need to iterate
over.
\param adjLsaList The Adjacency Lsa list.
\param pMap The map to populate with the adj. data.
*/
void
makeAdjMatrix(Nlsr& pnlsr, Map& pMap);
makeAdjMatrix(const std::list<AdjLsa>& adjLsaList, Map& pMap);
void
writeAdjMatrixLog(const Map& map) const;
@@ -137,7 +137,8 @@ public:
}
void
calculatePath(Map& pMap, RoutingTable& rt, Nlsr& pnlsr);
calculatePath(Map& pMap, RoutingTable& rt, ConfParameter& confParam,
const std::list<AdjLsa>& adjLsaList);
private:
/*! \brief Performs a Dijkstra's calculation over the adjacency matrix.
@@ -168,7 +169,7 @@ private:
isNotExplored(int* Q, int u, int start, int element);
void
addAllLsNextHopsToRoutingTable(Nlsr& pnlsr, RoutingTable& rt,
addAllLsNextHopsToRoutingTable(AdjacencyList& adjacencies, RoutingTable& rt,
Map& pMap, uint32_t sourceRouter);
/*! \brief Determines a destination's next hop.
+64 -62
View File
@@ -35,39 +35,44 @@ namespace nlsr {
INIT_LOGGER(route.RoutingTable);
RoutingTable::RoutingTable(ndn::Scheduler& scheduler)
RoutingTable::RoutingTable(ndn::Scheduler& scheduler, Fib& fib, Lsdb& lsdb,
NamePrefixTable& namePrefixTable, ConfParameter& confParam)
: afterRoutingChange{std::make_unique<AfterRoutingChange>()}
, m_scheduler(scheduler)
, m_fib(fib)
, m_lsdb(lsdb)
, m_namePrefixTable(namePrefixTable)
, m_NO_NEXT_HOP{-12345}
, m_routingCalcInterval{static_cast<uint32_t>(ROUTING_CALC_INTERVAL_DEFAULT)}
, m_routingCalcInterval{confParam.getRoutingCalcInterval()}
, m_isRoutingTableCalculating(false)
, m_isRouteCalculationScheduled(false)
, m_confParam(confParam)
{
}
void
RoutingTable::calculate(Nlsr& pnlsr)
RoutingTable::calculate()
{
pnlsr.getLsdb().writeCorLsdbLog();
pnlsr.getLsdb().writeNameLsdbLog();
pnlsr.getLsdb().writeAdjLsdbLog();
pnlsr.getNamePrefixTable().writeLog();
if (pnlsr.getIsRoutingTableCalculating() == false) {
//setting routing table calculation
pnlsr.setIsRoutingTableCalculating(true);
m_lsdb.writeCorLsdbLog();
m_lsdb.writeNameLsdbLog();
m_lsdb.writeAdjLsdbLog();
m_namePrefixTable.writeLog();
if (m_isRoutingTableCalculating == false) {
// setting routing table calculation
m_isRoutingTableCalculating = true;
bool isHrEnabled = pnlsr.getConfParameter().getHyperbolicState() != HYPERBOLIC_STATE_OFF;
bool isHrEnabled = m_confParam.getHyperbolicState() != HYPERBOLIC_STATE_OFF;
if ((!isHrEnabled
&&
pnlsr.getLsdb()
.doesLsaExist(ndn::Name{pnlsr.getConfParameter().getRouterPrefix()}
if ((!isHrEnabled &&
m_lsdb
.doesLsaExist(ndn::Name{m_confParam.getRouterPrefix()}
.append(std::to_string(Lsa::Type::ADJACENCY)), Lsa::Type::ADJACENCY))
||
(isHrEnabled
&&
pnlsr.getLsdb()
.doesLsaExist(ndn::Name{pnlsr.getConfParameter().getRouterPrefix()}
(isHrEnabled &&
m_lsdb
.doesLsaExist(ndn::Name{m_confParam.getRouterPrefix()}
.append(std::to_string(Lsa::Type::COORDINATE)), Lsa::Type::COORDINATE))) {
if (pnlsr.getIsBuildAdjLsaSheduled() != 1) {
if (m_lsdb.getIsBuildAdjLsaSheduled() != 1) {
NLSR_LOG_TRACE("Clearing old routing table");
clearRoutingTable();
// for dry run options
@@ -76,24 +81,24 @@ RoutingTable::calculate(Nlsr& pnlsr)
NLSR_LOG_DEBUG("Calculating routing table");
// calculate Link State routing
if ((pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_OFF)
|| (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN)) {
calculateLsRoutingTable(pnlsr);
if ((m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_OFF)
|| (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN)) {
calculateLsRoutingTable();
}
// calculate hyperbolic
if (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_ON) {
calculateHypRoutingTable(pnlsr, false);
// calculate hyperbolic routing
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_ON) {
calculateHypRoutingTable(false);
}
//calculate dry hyperbolic routing
if (pnlsr.getConfParameter().getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
calculateHypRoutingTable(pnlsr, true);
// calculate dry hyperbolic routing
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
calculateHypRoutingTable(true);
}
// Inform the NPT that updates have been made
NLSR_LOG_DEBUG("Calling Update NPT With new Route");
(*afterRoutingChange)(m_rTable);
writeLog(pnlsr.getConfParameter().getHyperbolicState());
pnlsr.getNamePrefixTable().writeLog();
pnlsr.getFib().writeLog();
writeLog();
m_namePrefixTable.writeLog();
m_fib.writeLog();
}
else {
NLSR_LOG_DEBUG("Adjacency building is scheduled, so"
@@ -108,61 +113,60 @@ RoutingTable::calculate(Nlsr& pnlsr)
// need to update NPT here
NLSR_LOG_DEBUG("Calling Update NPT With new Route");
(*afterRoutingChange)(m_rTable);
writeLog(pnlsr.getConfParameter().getHyperbolicState());
pnlsr.getNamePrefixTable().writeLog();
pnlsr.getFib().writeLog();
//debugging purpose end
writeLog();
m_namePrefixTable.writeLog();
m_fib.writeLog();
// debugging purpose end
}
pnlsr.setIsRouteCalculationScheduled(false); //clear scheduled flag
pnlsr.setIsRoutingTableCalculating(false); //unsetting routing table calculation
m_isRouteCalculationScheduled = false; // clear scheduled flag
m_isRoutingTableCalculating = false; // unsetting routing table calculation
}
else {
scheduleRoutingTableCalculation(pnlsr);
scheduleRoutingTableCalculation();
}
}
void
RoutingTable::calculateLsRoutingTable(Nlsr& nlsr)
RoutingTable::calculateLsRoutingTable()
{
NLSR_LOG_DEBUG("RoutingTable::calculateLsRoutingTable Called");
Map map;
map.createFromAdjLsdb(nlsr.getLsdb().getAdjLsdb().begin(), nlsr.getLsdb().getAdjLsdb().end());
map.createFromAdjLsdb(m_lsdb.getAdjLsdb().begin(), m_lsdb.getAdjLsdb().end());
map.writeLog();
size_t nRouters = map.getMapSize();
LinkStateRoutingTableCalculator calculator(nRouters);
calculator.calculatePath(map, *this, nlsr);
calculator.calculatePath(map, *this, m_confParam, m_lsdb.getAdjLsdb());
}
void
RoutingTable::calculateHypRoutingTable(Nlsr& nlsr, bool isDryRun)
RoutingTable::calculateHypRoutingTable(bool isDryRun)
{
Map map;
map.createFromCoordinateLsdb(nlsr.getLsdb().getCoordinateLsdb().begin(),
nlsr.getLsdb().getCoordinateLsdb().end());
map.createFromCoordinateLsdb(m_lsdb.getCoordinateLsdb().begin(),
m_lsdb.getCoordinateLsdb().end());
map.writeLog();
size_t nRouters = map.getMapSize();
HyperbolicRoutingCalculator calculator(nRouters, isDryRun,
nlsr.getConfParameter().getRouterPrefix());
HyperbolicRoutingCalculator calculator(nRouters, isDryRun, m_confParam.getRouterPrefix());
calculator.calculatePath(map, *this, nlsr.getLsdb(), nlsr.getAdjacencyList());
calculator.calculatePath(map, *this, m_lsdb, m_confParam.getAdjacencyList());
}
void
RoutingTable::scheduleRoutingTableCalculation(Nlsr& pnlsr)
RoutingTable::scheduleRoutingTableCalculation()
{
if (pnlsr.getIsRouteCalculationScheduled() != true) {
if (m_isRouteCalculationScheduled != true) {
NLSR_LOG_DEBUG("Scheduling routing table calculation in " << m_routingCalcInterval);
m_scheduler.scheduleEvent(m_routingCalcInterval,
std::bind(&RoutingTable::calculate, this, std::ref(pnlsr)));
std::bind(&RoutingTable::calculate, this));
pnlsr.setIsRouteCalculationScheduled(true);
m_isRouteCalculationScheduled = true;
}
}
@@ -202,23 +206,21 @@ RoutingTable::findRoutingTableEntry(const ndn::Name& destRouter)
}
void
RoutingTable::writeLog(int hyperbolicState)
RoutingTable::writeLog()
{
NLSR_LOG_DEBUG("---------------Routing Table------------------");
for (std::list<RoutingTableEntry>::iterator it = m_rTable.begin() ;
it != m_rTable.end(); ++it) {
NLSR_LOG_DEBUG("Destination: " << (*it).getDestination());
for (const auto& rte : m_rTable) {
NLSR_LOG_DEBUG("Destination: " << rte.getDestination());
NLSR_LOG_DEBUG("Nexthops: ");
(*it).getNexthopList().writeLog();
rte.getNexthopList().writeLog();
}
if (hyperbolicState == HYPERBOLIC_STATE_DRY_RUN) {
if (m_confParam.getHyperbolicState() == HYPERBOLIC_STATE_DRY_RUN) {
NLSR_LOG_DEBUG("--------Hyperbolic Routing Table(Dry)---------");
for (std::list<RoutingTableEntry>::iterator it = m_dryTable.begin() ;
it != m_dryTable.end(); ++it) {
NLSR_LOG_DEBUG("Destination: " << (*it).getDestination());
for (const auto& rte : m_dryTable) {
NLSR_LOG_DEBUG("Destination: " << rte.getDestination());
NLSR_LOG_DEBUG("Nexthops: ");
(*it).getNexthopList().writeLog();
rte.getNexthopList().writeLog();
}
}
}
+17 -9
View File
@@ -25,6 +25,8 @@
#include "conf-parameter.hpp"
#include "routing-table-entry.hpp"
#include "signals.hpp"
#include "lsdb.hpp"
#include "route/fib.hpp"
#include <iostream>
#include <utility>
@@ -34,22 +36,21 @@
namespace nlsr {
class Nlsr;
class NextHop;
class RoutingTable : boost::noncopyable
{
public:
explicit
RoutingTable(ndn::Scheduler& scheduler);
RoutingTable(ndn::Scheduler& scheduler, Fib& fib, Lsdb& lsdb,
NamePrefixTable& namePrefixTable, ConfParameter& confParam);
/*! \brief Calculates a list of next hops for each router in the network.
* \param nlsr The NLSR object that contains the LSAs needed for adj. info.
*
* Calculates the list of next hops to every other router in the network.
*/
void
calculate(Nlsr& nlsr);
calculate();
/*! \brief Adds a next hop to a routing table entry.
* \param destRouter The destination router whose RTE we want to modify.
@@ -70,10 +71,9 @@ public:
/*! \brief Schedules a calculation event in the event scheduler only
* if one isn't already scheduled.
* \param pnlsr The NLSR whose scheduling status is needed.
*/
void
scheduleRoutingTableCalculation(Nlsr& pnlsr);
scheduleRoutingTableCalculation();
int
getNoNextHop()
@@ -114,11 +114,11 @@ public:
private:
/*! \brief Calculates a link-state routing table. */
void
calculateLsRoutingTable(Nlsr& pnlsr);
calculateLsRoutingTable();
/*! \brief Calculates a HR routing table. */
void
calculateHypRoutingTable(Nlsr& pnlsr, bool isDryRun);
calculateHypRoutingTable(bool isDryRun);
void
clearRoutingTable();
@@ -127,7 +127,7 @@ private:
clearDryRoutingTable();
void
writeLog(int hyperbolicState);
writeLog();
public:
std::unique_ptr<AfterRoutingChange> afterRoutingChange;
@@ -137,12 +137,20 @@ PUBLIC_WITH_TESTS_ELSE_PRIVATE:
private:
ndn::Scheduler& m_scheduler;
Fib& m_fib;
Lsdb& m_lsdb;
NamePrefixTable& m_namePrefixTable;
const int m_NO_NEXT_HOP;
std::list<RoutingTableEntry> m_dryTable;
ndn::time::seconds m_routingCalcInterval;
bool m_isRoutingTableCalculating;
bool m_isRouteCalculationScheduled;
ConfParameter& m_confParam;
};
} // namespace nlsr
+15 -5
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -34,6 +34,16 @@ namespace nlsr {
INIT_LOGGER(SequencingManager);
SequencingManager::SequencingManager(std::string filePath, int hypState)
: m_nameLsaSeq(0)
, m_adjLsaSeq(0)
, m_corLsaSeq(0)
, m_hyperbolicState(hypState)
{
setSeqFileDirectory(filePath);
initiateSeqNoFromFile();
}
void
SequencingManager::writeSeqNoToFile() const
{
@@ -48,7 +58,7 @@ SequencingManager::writeSeqNoToFile() const
}
void
SequencingManager::initiateSeqNoFromFile(int hypState)
SequencingManager::initiateSeqNoFromFile()
{
NLSR_LOG_DEBUG("Seq File Name: " << m_seqFileNameWithPath);
std::ifstream inputFile(m_seqFileNameWithPath.c_str());
@@ -87,7 +97,7 @@ SequencingManager::initiateSeqNoFromFile(int hypState)
m_nameLsaSeq += 10;
// Increment the adjacency LSA seq. no. if link-state or dry HR is enabled
if (hypState != HYPERBOLIC_STATE_ON) {
if (m_hyperbolicState != HYPERBOLIC_STATE_ON) {
if (m_corLsaSeq != 0) {
NLSR_LOG_WARN("This router was previously configured for hyperbolic"
<< " routing without clearing the seq. no. file.");
@@ -97,7 +107,7 @@ SequencingManager::initiateSeqNoFromFile(int hypState)
}
// Similarly, increment the coordinate LSA seq. no only if link-state is disabled.
if (hypState != HYPERBOLIC_STATE_OFF) {
if (m_hyperbolicState != HYPERBOLIC_STATE_OFF) {
if (m_adjLsaSeq != 0) {
NLSR_LOG_WARN("This router was previously configured for link-state"
<< " routing without clearing the seq. no. file.");
@@ -110,7 +120,7 @@ SequencingManager::initiateSeqNoFromFile(int hypState)
}
void
SequencingManager::setSeqFileDirectory(std::string filePath)
SequencingManager::setSeqFileDirectory(const std::string& filePath)
{
m_seqFileNameWithPath = filePath;
+14 -14
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -22,26 +22,21 @@
#ifndef NLSR_SEQUENCING_MANAGER_HPP
#define NLSR_SEQUENCING_MANAGER_HPP
#include <list>
#include <string>
#include <boost/cstdint.hpp>
#include "conf-parameter.hpp"
#include "test-access-control.hpp"
#include <ndn-cxx/face.hpp>
#include "conf-parameter.hpp"
#include <list>
#include <string>
#include <boost/cstdint.hpp>
namespace nlsr {
class SequencingManager
{
public:
SequencingManager()
: m_nameLsaSeq(0)
, m_adjLsaSeq(0)
, m_corLsaSeq(0)
, m_seqFileNameWithPath()
{
}
SequencingManager(std::string filePath, int hypState);
uint64_t
getNameLsaSeq() const
@@ -100,9 +95,11 @@ public:
void
writeSeqNoToFile() const;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
void
initiateSeqNoFromFile(int hypState);
initiateSeqNoFromFile();
private:
/*! \brief Set the sequence file directory
If the string is empty, home directory is set as sequence file directory
@@ -110,7 +107,7 @@ public:
\param filePath The directory where sequence file will be stored
*/
void
setSeqFileDirectory(std::string filePath);
setSeqFileDirectory(const std::string& filePath);
void
writeLog() const;
@@ -120,6 +117,9 @@ private:
uint64_t m_adjLsaSeq;
uint64_t m_corLsaSeq;
std::string m_seqFileNameWithPath;
PUBLIC_WITH_TESTS_ELSE_PRIVATE:
int m_hyperbolicState;
};
} // namespace nlsr
+1 -1
View File
@@ -64,7 +64,7 @@ CommandManagerBase::advertiseAndInsertPrefix(const ndn::Name& prefix,
NLSR_LOG_INFO("Advertising name: " << castParams.getName() << "\n");
m_lsdb.buildAndInstallOwnNameLsa();
if (castParams.hasFlags() && castParams.getFlags() == PREFIX_FLAG) {
NLSR_LOG_INFO("Saving name to the configuration file");
NLSR_LOG_INFO("Saving name to the configuration file ");
if (afterAdvertise(castParams.getName()) == true) {
return done(ndn::nfd::ControlResponse(205, "OK").setBody(parameters.wireEncode()));
}
+6 -6
View File
@@ -51,11 +51,11 @@ getSignerFromTag(const ndn::Interest& interest)
}
PrefixUpdateProcessor::PrefixUpdateProcessor(ndn::mgmt::Dispatcher& dispatcher,
ndn::Face& face,
ndn::security::ValidatorConfig& validator,
NamePrefixList& namePrefixList,
Lsdb& lsdb, const std::string& configFileName)
: CommandManagerBase(dispatcher, namePrefixList, lsdb, "prefix-update")
, m_validator(std::make_unique<ndn::security::v2::CertificateFetcherDirectFetch>(face))
, m_validator(validator)
, m_configFileName(configFileName)
{
NLSR_LOG_DEBUG("Setting dispatcher to capture Interests for: "
@@ -178,14 +178,14 @@ PrefixUpdateProcessor::addOrDeletePrefix(const ndn::Name& prefix, bool addPrefix
}
ndn::optional<bool>
PrefixUpdateProcessor::afterAdvertise(const ndn::Name& prefix) {
PrefixUpdateProcessor::afterAdvertise(const ndn::Name& prefix)
{
return addOrDeletePrefix(prefix, true);
}
ndn::optional<bool>
PrefixUpdateProcessor::afterWithdraw(const ndn::Name& prefix) {
PrefixUpdateProcessor::afterWithdraw(const ndn::Name& prefix)
{
return addOrDeletePrefix(prefix, false);
}
+2 -2
View File
@@ -44,7 +44,7 @@ class PrefixUpdateProcessor : public CommandManagerBase
{
public:
PrefixUpdateProcessor(ndn::mgmt::Dispatcher& dispatcher,
ndn::Face& face,
ndn::security::ValidatorConfig& validator,
NamePrefixList& namePrefixList,
Lsdb& lsdb, const std::string& configFileName);
@@ -95,7 +95,7 @@ private:
makeAuthorization();
private:
ndn::security::ValidatorConfig m_validator;
ndn::security::ValidatorConfig& m_validator;
const std::string& m_configFileName;
};
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -20,7 +20,7 @@
**/
#include "communication/sync-logic-handler.hpp"
#include "test-common.hpp"
#include "../test-common.hpp"
#include "common.hpp"
#include "nlsr.hpp"
#include "lsa.hpp"
@@ -32,58 +32,41 @@ namespace test {
using std::shared_ptr;
template<int32_t Protocol>
class SyncLogicFixture : public UnitTestTimeFixture
{
public:
SyncLogicFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, conf(face)
, confProcessor(conf, Protocol)
, testIsLsaNew([] (const ndn::Name& name, const Lsa::Type& lsaType,
const uint64_t sequenceNumber) {
return true;
})
, CONFIG_NETWORK("/ndn")
, CONFIG_SITE("/site")
, CONFIG_ROUTER_NAME("/%C1.Router/this-router")
, OTHER_ROUTER_NAME("/%C1.Router/other-router/")
, sync(face, testIsLsaNew, conf)
, updateNamePrefix(this->conf.getLsaPrefix().toUri() +
this->conf.getSiteName().toUri() +
"/%C1.Router/other-router/")
{
nlsr.getConfParameter().setNetwork(CONFIG_NETWORK);
nlsr.getConfParameter().setSiteName(CONFIG_SITE);
nlsr.getConfParameter().setRouterName(CONFIG_ROUTER_NAME);
nlsr.getConfParameter().buildRouterPrefix();
conf.setNetwork(CONFIG_NETWORK);
conf.setSiteName(CONFIG_SITE);
conf.setRouterName(CONFIG_ROUTER_NAME);
conf.buildRouterPrefix();
addIdentity(conf.getRouterPrefix());
}
template <int32_t N>
void
setSyncProtocol()
{
nlsr.getConfParameter().setSyncProtocol(N);
conf.setSyncProtocol(N);
}
template <int32_t N>
void
receiveUpdate(std::string prefix, uint64_t seqNo, SyncLogicHandler& p_sync)
receiveUpdate(const std::string& prefix, uint64_t seqNo)
{
this->advanceClocks(ndn::time::milliseconds(1), 10);
face.sentInterests.clear();
if (N == SYNC_PROTOCOL_CHRONOSYNC) {
if (Protocol == SYNC_PROTOCOL_CHRONOSYNC) {
std::vector<chronosync::MissingDataInfo> updates;
updates.push_back({ndn::Name(prefix).appendNumber(1), 0, seqNo});
p_sync.m_syncLogic->onChronoSyncUpdate(updates);
sync.m_syncLogic->onChronoSyncUpdate(updates);
}
else {
std::vector<psync::MissingDataInfo> updates;
updates.push_back({ndn::Name(prefix), 0, seqNo});
p_sync.m_syncLogic->onPSyncUpdate(updates);
sync.m_syncLogic->onPSyncUpdate(updates);
}
this->advanceClocks(ndn::time::milliseconds(1), 10);
@@ -91,50 +74,43 @@ public:
public:
ndn::util::DummyClientFace face;
Nlsr nlsr;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
SyncLogicHandler::IsLsaNew testIsLsaNew;
SyncLogicHandler sync;
const std::string CONFIG_NETWORK;
const std::string CONFIG_SITE;
const std::string CONFIG_ROUTER_NAME;
const std::string OTHER_ROUTER_NAME;
const std::string updateNamePrefix;
const std::vector<Lsa::Type> lsaTypes = {Lsa::Type::NAME, Lsa::Type::ADJACENCY,
Lsa::Type::COORDINATE};
};
using boost::mpl::int_;
using Protocols = boost::mpl::vector<int_<SYNC_PROTOCOL_CHRONOSYNC>, int_<SYNC_PROTOCOL_PSYNC>>;
using mpl_::int_;
using Protocols = boost::mpl::vector<int_<SYNC_PROTOCOL_CHRONOSYNC>,
int_<SYNC_PROTOCOL_PSYNC>>;
BOOST_FIXTURE_TEST_SUITE(TestSyncLogicHandler, SyncLogicFixture)
BOOST_AUTO_TEST_SUITE(TestSyncLogicHandler)
/* Tests that when SyncLogicHandler receives an LSA of either Name or
Adjacency type that appears to be newer, it will emit to its signal
with those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherLS, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(UpdateForOtherLS, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
SyncLogicHandler sync{face, testIsLsaNew, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
std::vector<Lsa::Type> lsaTypes = {Lsa::Type::NAME, Lsa::Type::ADJACENCY};
uint64_t syncSeqNo = 1;
for (const Lsa::Type& lsaType : lsaTypes) {
std::string updateName = conf.getLsaPrefix().toUri() + CONFIG_SITE
+ OTHER_ROUTER_NAME + std::to_string(lsaType);
std::string updateName = this->updateNamePrefix + std::to_string(lsaType);
// Actual testing done here -- signal function callback
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
ndn::util::signal::ScopedConnection connection = this->sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_CHECK_EQUAL(ndn::Name{updateName}, routerName);
BOOST_CHECK_EQUAL(sequenceNumber, syncSeqNo);
});
receiveUpdate<SyncProtocol::value>(updateName, syncSeqNo, sync);
this->receiveUpdate(updateName, syncSeqNo);
}
}
@@ -142,29 +118,23 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherLS, SyncProtocol, Protocols)
either Coordinate or Name type that appears to be newer, it will
emit to its signal with those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherHR, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(UpdateForOtherHR, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
conf.setHyperbolicState(HYPERBOLIC_STATE_ON);
SyncLogicHandler sync{face, testIsLsaNew, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
this->conf.setHyperbolicState(HYPERBOLIC_STATE_ON);
uint64_t syncSeqNo = 1;
std::vector<Lsa::Type> lsaTypes = {Lsa::Type::NAME, Lsa::Type::COORDINATE};
for (const Lsa::Type& lsaType : lsaTypes) {
std::string updateName = conf.getLsaPrefix().toUri() + CONFIG_SITE
+ OTHER_ROUTER_NAME + std::to_string(lsaType);
std::string updateName = this->updateNamePrefix + std::to_string(lsaType);
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
ndn::util::signal::ScopedConnection connection = this->sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_CHECK_EQUAL(ndn::Name{updateName}, routerName);
BOOST_CHECK_EQUAL(sequenceNumber, syncSeqNo);
});
receiveUpdate<SyncProtocol::value>(updateName, syncSeqNo, sync);
this->receiveUpdate(updateName, syncSeqNo);
}
}
@@ -172,28 +142,22 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherHR, SyncProtocol, Protocols)
any type that appears to be newer, it will emit to its signal with
those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherHRDry, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(UpdateForOtherHRDry, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
this->conf.setHyperbolicState(HYPERBOLIC_STATE_DRY_RUN);
conf.setHyperbolicState(HYPERBOLIC_STATE_DRY_RUN);
uint64_t syncSeqNo = 1;
SyncLogicHandler sync{face, testIsLsaNew, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
for (const Lsa::Type& lsaType : this->lsaTypes) {
std::string updateName = this->updateNamePrefix + std::to_string(lsaType);
for (const Lsa::Type& lsaType : lsaTypes) {
uint64_t syncSeqNo = 1;
std::string updateName = conf.getLsaPrefix().toUri() + CONFIG_SITE
+ OTHER_ROUTER_NAME + std::to_string(lsaType);
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
ndn::util::signal::ScopedConnection connection = this->sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_CHECK_EQUAL(ndn::Name{updateName}, routerName);
BOOST_CHECK_EQUAL(sequenceNumber, syncSeqNo);
});
receiveUpdate<SyncProtocol::value>(updateName, syncSeqNo, sync);
this->receiveUpdate(updateName, syncSeqNo);
}
}
@@ -201,27 +165,24 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(UpdateForOtherHRDry, SyncProtocol, Protocols)
details matching this router's details, it will *not* emit to its
signal those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(NoUpdateForSelf, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(NoUpdateForSelf, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
const uint64_t sequenceNumber = 1;
SyncLogicHandler sync{face, testIsLsaNew, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
for (const Lsa::Type& lsaType : lsaTypes) {
for (const Lsa::Type& lsaType : this->lsaTypes) {
// To ensure that we get correctly-separated components, create
// and modify a Name to hand off.
ndn::Name updateName = ndn::Name{conf.getLsaPrefix()};
updateName.append(CONFIG_SITE).append(CONFIG_ROUTER_NAME).append(std::to_string(lsaType));
ndn::Name updateName = ndn::Name{this->conf.getLsaPrefix()};
updateName.append(this->conf.getSiteName())
.append(this->conf.getRouterName())
.append(std::to_string(lsaType));
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
ndn::util::signal::ScopedConnection connection = this->sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_FAIL("Updates for self should not be emitted!");
});
receiveUpdate<SyncProtocol::value>(updateName.toUri(), sequenceNumber, sync);
this->receiveUpdate(updateName.toUri(), sequenceNumber);
}
}
@@ -229,25 +190,20 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(NoUpdateForSelf, SyncProtocol, Protocols)
details that do not match the expected format, it will *not* emit
to its signal those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(MalformedUpdate, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(MalformedUpdate, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
const uint64_t sequenceNumber = 1;
SyncLogicHandler sync{face, testIsLsaNew, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
for (const Lsa::Type& lsaType : this->lsaTypes) {
ndn::Name updateName{this->conf.getSiteName()};
updateName.append(this->conf.getRouterName()).append(std::to_string(lsaType));
for (const Lsa::Type& lsaType : lsaTypes) {
ndn::Name updateName{CONFIG_SITE};
updateName.append(CONFIG_ROUTER_NAME).append(std::to_string(lsaType));
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
ndn::util::signal::ScopedConnection connection = this->sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_FAIL("Malformed updates should not be emitted!");
});
receiveUpdate<SyncProtocol::value>(updateName.toUri(), sequenceNumber, sync);
this->receiveUpdate(updateName.toUri(), sequenceNumber);
}
}
@@ -255,73 +211,64 @@ BOOST_AUTO_TEST_CASE_TEMPLATE(MalformedUpdate, SyncProtocol, Protocols)
details that do not appear to be new, it will *not* emit to its
signal those LSA details.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(LsaNotNew, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(LsaNotNew, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
auto testLsaAlwaysFalse = [] (const ndn::Name& routerName, const Lsa::Type& lsaType,
const uint64_t& sequenceNumber) {
const uint64_t& sequenceNumber) {
return false;
};
const uint64_t sequenceNumber = 1;
SyncLogicHandler sync{face, testLsaAlwaysFalse, conf};
sync.createSyncLogic(conf.getChronosyncPrefix());
SyncLogicHandler sync{this->face, testLsaAlwaysFalse, this->conf};
ndn::util::signal::ScopedConnection connection = sync.onNewLsa->connect(
[&] (const ndn::Name& routerName, const uint64_t& sequenceNumber) {
BOOST_FAIL("An update for an LSA with non-new sequence number should not emit!");
});
std::string updateName = nlsr.getConfParameter().getLsaPrefix().toUri() +
CONFIG_SITE + "/%C1.Router/other-router/" +
std::to_string(Lsa::Type::NAME);
std::string updateName = this->updateNamePrefix + std::to_string(Lsa::Type::NAME);
receiveUpdate<SyncProtocol::value>(updateName, sequenceNumber, sync);
this->receiveUpdate(updateName, sequenceNumber);
}
/* Tests that SyncLogicHandler successfully concatenates configured
variables together to form the necessary prefixes to advertise
through ChronoSync.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(UpdatePrefix, SyncProtocol, Protocols)
BOOST_FIXTURE_TEST_CASE_TEMPLATE(UpdatePrefix, T, Protocols, SyncLogicFixture<T::value>)
{
setSyncProtocol<SyncProtocol::value>();
ndn::Name expectedPrefix = this->conf.getLsaPrefix();
expectedPrefix.append(this->conf.getSiteName());
expectedPrefix.append(this->conf.getRouterName());
SyncLogicHandler sync{face, testIsLsaNew, conf};
this->sync.buildUpdatePrefix();
ndn::Name expectedPrefix = nlsr.getConfParameter().getLsaPrefix();
expectedPrefix.append(CONFIG_SITE);
expectedPrefix.append(CONFIG_ROUTER_NAME);
sync.buildUpdatePrefix();
BOOST_CHECK_EQUAL(sync.m_nameLsaUserPrefix,
BOOST_CHECK_EQUAL(this->sync.m_nameLsaUserPrefix,
ndn::Name(expectedPrefix).append(std::to_string(Lsa::Type::NAME)));
BOOST_CHECK_EQUAL(sync.m_adjLsaUserPrefix,
BOOST_CHECK_EQUAL(this->sync.m_adjLsaUserPrefix,
ndn::Name(expectedPrefix).append(std::to_string(Lsa::Type::ADJACENCY)));
BOOST_CHECK_EQUAL(sync.m_coorLsaUserPrefix,
BOOST_CHECK_EQUAL(this->sync.m_coorLsaUserPrefix,
ndn::Name(expectedPrefix).append(std::to_string(Lsa::Type::COORDINATE)));
}
/* Tests that SyncLogicHandler's socket will be created when
Nlsr::initialize is called, preventing use of sync before the
Nlsr is initialized, preventing use of sync before the
socket is created.
NB: This test is as much an Nlsr class test as a
SyncLogicHandler class test, but it rides the line and ends up here.
*/
BOOST_AUTO_TEST_CASE_TEMPLATE(createSyncLogicOnInitialization, SyncProtocol, Protocols) // Bug #2649
BOOST_FIXTURE_TEST_CASE_TEMPLATE(createSyncLogicOnInitialization, T, Protocols,
SyncLogicFixture<T::value>) // Bug #2649
{
setSyncProtocol<SyncProtocol::value>();
nlsr.initialize();
Nlsr nlsr(this->face, this->m_keyChain, this->conf);
// Make sure an adjacency LSA has not been built yet
ndn::Name key = ndn::Name(nlsr.getConfParameter().getRouterPrefix()).append(std::to_string(Lsa::Type::ADJACENCY));
AdjLsa* lsa = nlsr.getLsdb().findAdjLsa(key);
ndn::Name key = ndn::Name(this->conf.getRouterPrefix()).append(std::to_string(Lsa::Type::ADJACENCY));
AdjLsa* lsa = nlsr.m_lsdb.findAdjLsa(key);
BOOST_REQUIRE(lsa == nullptr);
// Publish a routing update before an Adjacency LSA is built
BOOST_CHECK_NO_THROW(nlsr.getLsdb().getSyncLogicHandler()
BOOST_CHECK_NO_THROW(nlsr.m_lsdb.getSyncLogicHandler()
.publishRoutingUpdate(Lsa::Type::ADJACENCY, 0));
}
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -20,8 +20,8 @@
**/
#include "communication/sync-protocol-adapter.hpp"
#include "test-common.hpp"
#include "boost-test.hpp"
#include "../test-common.hpp"
#include "../boost-test.hpp"
#include <ndn-cxx/util/dummy-client-face.hpp>
+9 -9
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -46,14 +46,13 @@ class PublisherFixture : public BaseFixture
public:
PublisherFixture()
: face(m_ioService, m_keyChain, {true, true})
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, lsdb(nlsr.getLsdb())
, rt1(nlsr.getRoutingTable())
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, rt1(nlsr.m_routingTable)
{
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setRouterName("/This/Router");
routerId = addIdentity("/ndn/This/Router");
routerId = addIdentity(conf.getRouterPrefix());
nlsr.initialize();
face.processEvents(ndn::time::milliseconds(100));
@@ -178,7 +177,8 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
Lsdb& lsdb;
@@ -107,17 +107,16 @@ BOOST_AUTO_TEST_CASE(Localhost)
return block.type() == ndn::tlv::nlsr::RoutingTable; });
}
BOOST_AUTO_TEST_CASE(Routername)
{
ndn::Name regRouterPrefix(nlsr.getConfParameter().getRouterPrefix());
ndn::Name regRouterPrefix(conf.getRouterPrefix());
regRouterPrefix.append("nlsr");
// Should already be added to dispatcher
BOOST_CHECK_THROW(nlsr.getDispatcher().addTopPrefix(regRouterPrefix), std::out_of_range);
BOOST_CHECK_THROW(nlsr.m_dispatcher.addTopPrefix(regRouterPrefix), std::out_of_range);
checkPrefixRegistered(regRouterPrefix);
//Install adjacencies LSA
// Install adjacencies LSA
AdjLsa adjLsa;
adjLsa.setOrigRouter("/RouterA");
addAdjacency(adjLsa, "/RouterA/adjacency1", "udp://face-1", 10);
@@ -125,11 +124,11 @@ BOOST_AUTO_TEST_CASE(Routername)
std::vector<double> angles = {20.00, 30.00};
//Install coordinate LSA
// Install coordinate LSA
CoordinateLsa coordinateLsa = createCoordinateLsa("/RouterA", 10.0, angles);
lsdb.installCoordinateLsa(coordinateLsa);
//Install routing table
// Install routing table
RoutingTableEntry rte1("desrouter1");
const ndn::Name& DEST_ROUTER = rte1.getDestination();
@@ -137,23 +136,26 @@ BOOST_AUTO_TEST_CASE(Routername)
rt1.addNextHop(DEST_ROUTER, nh);
ndn::Name routerName(conf.getRouterPrefix());
routerName.append("nlsr");
// Request adjacency LSAs
face.receive(ndn::Interest("/ndn/This/Router/nlsr/lsdb/adjacencies").setCanBePrefix(true));
face.receive(ndn::Interest(ndn::Name(routerName).append("lsdb").append("adjacencies")).setCanBePrefix(true));
processDatasetInterest(face,
[] (const ndn::Block& block) { return block.type() == ndn::tlv::nlsr::AdjacencyLsa; });
// Request coordinate LSAs
face.receive(ndn::Interest("/ndn/This/Router/nlsr/lsdb/coordinates").setCanBePrefix(true));
face.receive(ndn::Interest(ndn::Name(routerName).append("lsdb").append("coordinates")).setCanBePrefix(true));
processDatasetInterest(face,
[] (const ndn::Block& block) { return block.type() == ndn::tlv::nlsr::CoordinateLsa; });
// Request Name LSAs
face.receive(ndn::Interest("/ndn/This/Router/nlsr/lsdb/names").setCanBePrefix(true));
face.receive(ndn::Interest(ndn::Name(routerName).append("lsdb").append("names")).setCanBePrefix(true));
processDatasetInterest(face,
[] (const ndn::Block& block) { return block.type() == ndn::tlv::nlsr::NameLsa; });
// Request Routing Table
face.receive(ndn::Interest("/ndn/This/Router/nlsr/routing-table").setCanBePrefix(true));
face.receive(ndn::Interest(ndn::Name(routerName).append("routing-table")));
processDatasetInterest(face,
[] (const ndn::Block& block) {
return block.type() == ndn::tlv::nlsr::RoutingTable; });
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -20,9 +20,11 @@
* \author Ashlesh Gawande <agawande@memphis.edu>
*
**/
#include <ndn-cxx/util/time.hpp>
#include "route/fib-entry.hpp"
#include "route/nexthop-list.hpp"
#include <ndn-cxx/util/time.hpp>
#include <boost/test/unit_test.hpp>
namespace nlsr {
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -20,8 +20,8 @@
**/
#include "route/fib.hpp"
#include "test-common.hpp"
#include "control-commands.hpp"
#include "../test-common.hpp"
#include "../control-commands.hpp"
#include "adjacency-list.hpp"
#include "conf-parameter.hpp"
@@ -37,6 +37,7 @@ class FibFixture : public UnitTestTimeFixture
public:
FibFixture()
: face(std::make_shared<ndn::util::DummyClientFace>(m_ioService, m_keyChain))
, conf(*face)
, interests(face->sentInterests)
{
Adjacent neighbor1(router1Name, ndn::FaceUri(router1FaceUri), 0, Adjacent::STATUS_ACTIVE, 0, router1FaceId);
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019 , The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -21,7 +21,7 @@
#include "route/name-prefix-table.hpp"
#include "nlsr.hpp"
#include "test-common.hpp"
#include "../test-common.hpp"
#include <ndn-cxx/util/dummy-client-face.hpp>
@@ -33,14 +33,16 @@ class NamePrefixTableFixture : public UnitTestTimeFixture
public:
NamePrefixTableFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, lsdb(nlsr.getLsdb())
, npt(nlsr.getNamePrefixTable())
, conf(face)
, nlsr(face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, npt(nlsr.m_namePrefixTable)
{
}
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
Nlsr nlsr;
Lsdb& lsdb;
@@ -51,28 +53,25 @@ BOOST_AUTO_TEST_SUITE(TestNamePrefixTable)
BOOST_FIXTURE_TEST_CASE(Bupt, NamePrefixTableFixture)
{
ConfParameter& conf = nlsr.getConfParameter();
conf.setNetwork("/ndn");
conf.setSiteName("/router");
conf.setRouterName("/a");
conf.buildRouterPrefix();
RoutingTable& routingTable = nlsr.getRoutingTable();
RoutingTable& routingTable = nlsr.m_routingTable;
routingTable.setRoutingCalcInterval(0);
NamePrefixTable& npt = nlsr.getNamePrefixTable();
Adjacent thisRouter(conf.getRouterPrefix(), ndn::FaceUri("udp4://10.0.0.1"), 0, Adjacent::STATUS_ACTIVE, 0, 0);
ndn::Name buptRouterName("/ndn/cn/edu/bupt/%C1.Router/bupthub");
Adjacent bupt(buptRouterName, ndn::FaceUri("udp4://10.0.0.2"), 0, Adjacent::STATUS_ACTIVE, 0, 0);
// This router's Adjacency LSA
nlsr.getAdjacencyList().insert(bupt);
conf.getAdjacencyList().insert(bupt);
AdjLsa thisRouterAdjLsa(thisRouter.getName(), 1,
ndn::time::system_clock::now() + ndn::time::seconds::max(),
2,
nlsr.getAdjacencyList());
conf.getAdjacencyList());
lsdb.installAdjLsa(thisRouterAdjLsa);
@@ -133,7 +132,6 @@ BOOST_FIXTURE_TEST_CASE(Bupt, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(AddEntryToPool, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
RoutingTablePoolEntry rtpe1("router1");
npt.addRtpeToPool(rtpe1);
@@ -144,7 +142,6 @@ BOOST_FIXTURE_TEST_CASE(AddEntryToPool, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(RemoveEntryFromPool, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
RoutingTablePoolEntry rtpe1("router1", 0);
std::shared_ptr<RoutingTablePoolEntry> rtpePtr = npt.addRtpeToPool(rtpe1);
@@ -158,7 +155,6 @@ BOOST_FIXTURE_TEST_CASE(RemoveEntryFromPool, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(AddRoutingEntryToNptEntry, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
RoutingTablePoolEntry rtpe1("/ndn/memphis/rtr1", 0);
std::shared_ptr<RoutingTablePoolEntry> rtpePtr = npt.addRtpeToPool(rtpe1);
NamePrefixTableEntry npte1("/ndn/memphis/rtr2");
@@ -182,7 +178,6 @@ BOOST_FIXTURE_TEST_CASE(AddRoutingEntryToNptEntry, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(RemoveRoutingEntryFromNptEntry, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
RoutingTablePoolEntry rtpe1("/ndn/memphis/rtr1", 0);
NamePrefixTableEntry npte1("/ndn/memphis/rtr2");
@@ -208,7 +203,6 @@ BOOST_FIXTURE_TEST_CASE(RemoveRoutingEntryFromNptEntry, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(AddNptEntryPtrToRoutingEntry, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
NamePrefixTableEntry npte1("/ndn/memphis/rtr2");
npt.m_table.push_back(make_shared<NamePrefixTableEntry>(npte1));
@@ -235,7 +229,6 @@ BOOST_FIXTURE_TEST_CASE(AddNptEntryPtrToRoutingEntry, NamePrefixTableFixture)
BOOST_FIXTURE_TEST_CASE(RemoveNptEntryPtrFromRoutingEntry, NamePrefixTableFixture)
{
NamePrefixTable& npt = nlsr.getNamePrefixTable();
NamePrefixTableEntry npte1("/ndn/memphis/rtr1");
NamePrefixTableEntry npte2("/ndn/memphis/rtr2");
RoutingTableEntry rte1("/ndn/memphis/destination1");
@@ -272,44 +265,43 @@ BOOST_FIXTURE_TEST_CASE(RemoveNptEntryPtrFromRoutingEntry, NamePrefixTableFixtur
BOOST_FIXTURE_TEST_CASE(RoutingTableUpdate, NamePrefixTableFixture)
{
NamePrefixTable& namePrefixTable = nlsr.getNamePrefixTable();
RoutingTable& routingTable = nlsr.getRoutingTable();
RoutingTable& routingTable = nlsr.m_routingTable;
const ndn::Name destination = ndn::Name{"/ndn/destination1"};
NextHop hop1{"upd4://10.0.0.1", 0};
NextHop hop2{"udp4://10.0.0.2", 1};
NextHop hop3{"udp4://10.0.0.3", 2};
const NamePrefixTableEntry entry1{"/ndn/router1"};
namePrefixTable.addEntry(entry1.getNamePrefix(), destination);
npt.addEntry(entry1.getNamePrefix(), destination);
routingTable.addNextHop(destination, hop1);
routingTable.addNextHop(destination, hop2);
namePrefixTable.updateWithNewRoute(routingTable.m_rTable);
npt.updateWithNewRoute(routingTable.m_rTable);
// At this point the NamePrefixTableEntry should have two NextHops.
auto nameIterator = std::find_if(namePrefixTable.begin(), namePrefixTable.end(),
auto nameIterator = std::find_if(npt.begin(), npt.end(),
[&] (const std::shared_ptr<NamePrefixTableEntry>& entry) {
return entry1.getNamePrefix() == entry->getNamePrefix();
});
BOOST_REQUIRE(nameIterator != namePrefixTable.end());
BOOST_REQUIRE(nameIterator != npt.end());
auto iterator = namePrefixTable.m_rtpool.find(destination);
BOOST_REQUIRE(iterator != namePrefixTable.m_rtpool.end());
auto iterator = npt.m_rtpool.find(destination);
BOOST_REQUIRE(iterator != npt.m_rtpool.end());
auto nextHops = (iterator->second)->getNexthopList();
BOOST_CHECK_EQUAL(nextHops.size(), 2);
// Add the other NextHop
routingTable.addNextHop(destination, hop3);
namePrefixTable.updateWithNewRoute(routingTable.m_rTable);
npt.updateWithNewRoute(routingTable.m_rTable);
// At this point the NamePrefixTableEntry should have three NextHops.
nameIterator = std::find_if(namePrefixTable.begin(), namePrefixTable.end(),
nameIterator = std::find_if(npt.begin(), npt.end(),
[&] (const std::shared_ptr<NamePrefixTableEntry>& entry) {
return entry1.getNamePrefix() == entry->getNamePrefix();
});
BOOST_REQUIRE(nameIterator != namePrefixTable.end());
iterator = namePrefixTable.m_rtpool.find(destination);
BOOST_REQUIRE(iterator != namePrefixTable.m_rtpool.end());
BOOST_REQUIRE(nameIterator != npt.end());
iterator = npt.m_rtpool.find(destination);
BOOST_REQUIRE(iterator != npt.m_rtpool.end());
nextHops = (iterator->second)->getNexthopList();
BOOST_CHECK_EQUAL(nextHops.size(), 3);
}
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -22,7 +22,8 @@
**/
#include "route/routing-table.hpp"
#include "test-common.hpp"
#include "nlsr.hpp"
#include "../test-common.hpp"
#include "route/routing-table-entry.hpp"
#include "route/nexthop.hpp"
#include <boost/test/unit_test.hpp>
@@ -34,16 +35,19 @@ BOOST_FIXTURE_TEST_SUITE(TestRoutingTable, BaseFixture)
BOOST_AUTO_TEST_CASE(RoutingTableAddNextHop)
{
RoutingTable rt1(m_scheduler);
ndn::util::DummyClientFace face;
ConfParameter conf(face);
ndn::KeyChain keyChain;
Nlsr nlsr(face, keyChain, conf);
RoutingTable rt1(m_scheduler, nlsr.m_fib, nlsr.m_lsdb,
nlsr.m_namePrefixTable, conf);
NextHop nh1;
const std::string DEST_ROUTER = "destRouter";
rt1.addNextHop(DEST_ROUTER, nh1);
rt1.addNextHop("destRouter", nh1);
BOOST_CHECK_EQUAL(rt1.findRoutingTableEntry(DEST_ROUTER)->getDestination(),
"destRouter");
BOOST_CHECK_EQUAL(rt1.findRoutingTableEntry(DEST_ROUTER)->getDestination(), DEST_ROUTER);
}
BOOST_AUTO_TEST_SUITE_END()
+9 -4
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -24,6 +24,8 @@
#include "adjacent.hpp"
#include "conf-parameter.hpp"
#include <ndn-cxx/util/dummy-client-face.hpp>
#include <boost/test/unit_test.hpp>
namespace nlsr {
@@ -85,7 +87,8 @@ BOOST_AUTO_TEST_CASE(AdjLsaIsBuildableWithOneNodeActive)
adjacencies.insert(adjacencyA);
adjacencies.insert(adjacencyB);
ConfParameter conf;
ndn::util::DummyClientFace face;
ConfParameter conf(face);
BOOST_CHECK(adjacencies.isAdjLsaBuildable(conf.getInterestRetryNumber()));
}
@@ -104,7 +107,8 @@ BOOST_AUTO_TEST_CASE(AdjLsaIsBuildableWithAllNodesTimedOut)
adjacencies.insert(adjacencyA);
adjacencies.insert(adjacencyB);
ConfParameter conf;
ndn::util::DummyClientFace face;
ConfParameter conf(face);
conf.setInterestRetryNumber(HELLO_RETRIES_DEFAULT);
BOOST_CHECK(adjacencies.isAdjLsaBuildable(conf.getInterestRetryNumber()));
@@ -125,7 +129,8 @@ BOOST_AUTO_TEST_CASE(AdjLsaIsNotBuildable)
adjacencies.insert(adjacencyA);
adjacencies.insert(adjacencyB);
ConfParameter conf;
ndn::util::DummyClientFace face;
ConfParameter conf(face);
conf.setInterestRetryNumber(HELLO_RETRIES_DEFAULT);
BOOST_CHECK(!adjacencies.isAdjLsaBuildable(conf.getInterestRetryNumber()));
+21 -1
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -24,6 +24,7 @@
#include "common.hpp"
#include "identity-management-fixture.hpp"
#include "conf-parameter.hpp"
#include <boost/asio.hpp>
#include <boost/test/unit_test.hpp>
@@ -166,6 +167,25 @@ public:
ndn::util::DummyClientFace m_face;
};
class DummyConfFileProcessor
{
typedef std::function<void(ConfParameter&)> AfterConfProcessing;
public:
DummyConfFileProcessor(ConfParameter& conf,
int32_t protocol = SYNC_PROTOCOL_PSYNC,
int32_t hyperbolicState = HYPERBOLIC_STATE_OFF)
{
conf.setNetwork("/ndn");
conf.setSiteName("/site");
conf.setRouterName("/%C1.Router/this-router");
conf.buildRouterPrefix();
conf.setSyncProtocol(protocol);
conf.setHyperbolicState(HYPERBOLIC_STATE_OFF);
}
};
} // namespace test
} // namespace nlsr
+13 -28
View File
@@ -21,7 +21,6 @@
#include "conf-file-processor.hpp"
#include "test-common.hpp"
#include "nlsr.hpp"
#include <fstream>
@@ -109,6 +108,8 @@ const std::string SECTION_ADVERTISING =
" prefix /ndn/edu/memphis/sports/basketball\n"
"}\n";
// NEED TO TEST SECURITY SECTION SUCH AS LOADING CERTIFICATE
const std::string CONFIG_LINK_STATE = SECTION_GENERAL + SECTION_NEIGHBORS +
SECTION_HYPERBOLIC_OFF + SECTION_FIB + SECTION_ADVERTISING;
@@ -124,8 +125,7 @@ class ConfFileProcessorFixture : public BaseFixture
public:
ConfFileProcessorFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, CONFIG_FILE("unit-test-nlsr.conf")
, conf(face, "unit-test-nlsr.conf")
{
}
@@ -142,7 +142,7 @@ public:
config << confString;
config.close();
ConfFileProcessor processor(nlsr, CONFIG_FILE);
ConfFileProcessor processor(conf);
return processor.processConfFile();
}
@@ -154,10 +154,7 @@ public:
public:
ndn::util::DummyClientFace face;
Nlsr nlsr;
private:
const std::string CONFIG_FILE;
ConfParameter conf;
};
BOOST_FIXTURE_TEST_SUITE(TestConfFileProcessor, ConfFileProcessorFixture)
@@ -165,7 +162,6 @@ BOOST_FIXTURE_TEST_SUITE(TestConfFileProcessor, ConfFileProcessorFixture)
BOOST_AUTO_TEST_CASE(LinkState)
{
processConfigurationString(CONFIG_LINK_STATE);
ConfParameter& conf = nlsr.getConfParameter();
conf.buildRouterPrefix();
// General
@@ -173,7 +169,7 @@ BOOST_AUTO_TEST_CASE(LinkState)
BOOST_CHECK_EQUAL(conf.getSiteName(), "/memphis.edu/");
BOOST_CHECK_EQUAL(conf.getRouterName(), "/cs/pollux/");
BOOST_CHECK_EQUAL(conf.getRouterPrefix(), "/ndn/memphis.edu/cs/pollux/");
BOOST_CHECK_EQUAL(conf.getChronosyncPrefix(), ndn::Name("/localhop/ndn/nlsr/sync").appendVersion(ConfParameter::SYNC_VERSION));
BOOST_CHECK_EQUAL(conf.getSyncPrefix(), ndn::Name("/localhop/ndn/nlsr/sync").appendVersion(ConfParameter::SYNC_VERSION));
BOOST_CHECK_EQUAL(conf.getLsaPrefix(), "/localhop/ndn/nlsr/LSA");
BOOST_CHECK_EQUAL(conf.getLsaRefreshTime(), 1800);
BOOST_CHECK_EQUAL(conf.getSyncProtocol(), SYNC_PROTOCOL_PSYNC);
@@ -190,16 +186,16 @@ BOOST_AUTO_TEST_CASE(LinkState)
BOOST_CHECK_EQUAL(conf.getAdjLsaBuildInterval(), 3);
BOOST_CHECK_EQUAL(conf.getFirstHelloInterval(), 6);
BOOST_CHECK(nlsr.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/mira"));
BOOST_CHECK(nlsr.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/castor"));
BOOST_CHECK(!nlsr.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/fail"));
BOOST_CHECK(conf.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/mira"));
BOOST_CHECK(conf.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/castor"));
BOOST_CHECK(!conf.getAdjacencyList().isNeighbor("/ndn/memphis.edu/cs/fail"));
Adjacent mira = nlsr.getAdjacencyList().getAdjacent("/ndn/memphis.edu/cs/mira");
Adjacent mira = conf.getAdjacencyList().getAdjacent("/ndn/memphis.edu/cs/mira");
BOOST_CHECK_EQUAL(mira.getName(), "/ndn/memphis.edu/cs/mira");
BOOST_CHECK_EQUAL(mira.getLinkCost(), 30);
BOOST_CHECK_EQUAL(mira.getFaceUri().toString(), "udp4://10.0.0.2:6363");
Adjacent castor = nlsr.getAdjacencyList().getAdjacent("/ndn/memphis.edu/cs/castor");
Adjacent castor = conf.getAdjacencyList().getAdjacent("/ndn/memphis.edu/cs/castor");
BOOST_CHECK_EQUAL(castor.getName(), "/ndn/memphis.edu/cs/castor");
BOOST_CHECK_EQUAL(castor.getLinkCost(), 20);
BOOST_CHECK_EQUAL(castor.getFaceUri().toString(), "udp4://10.0.0.1:6363");
@@ -212,7 +208,7 @@ BOOST_AUTO_TEST_CASE(LinkState)
BOOST_CHECK_EQUAL(conf.getRoutingCalcInterval(), 9);
// Advertising
BOOST_CHECK_EQUAL(nlsr.getNamePrefixList().size(), 2);
BOOST_CHECK_EQUAL(conf.getNamePrefixList().size(), 2);
}
BOOST_AUTO_TEST_CASE(MalformedUri)
@@ -240,7 +236,6 @@ BOOST_AUTO_TEST_CASE(Hyperbolic)
{
processConfigurationString(CONFIG_HYPERBOLIC);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getHyperbolicState(), 1);
BOOST_CHECK_EQUAL(conf.getCorR(), 123.456);
std::vector<double> angles;
@@ -252,7 +247,6 @@ BOOST_AUTO_TEST_CASE(Hyperbolic2)
{
processConfigurationString(CONFIG_HYPERBOLIC_ANGLES);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getHyperbolicState(), 1);
BOOST_CHECK_EQUAL(conf.getCorR(), 123.456);
std::vector<double> angles;
@@ -271,8 +265,6 @@ BOOST_AUTO_TEST_CASE(DefaultValuesGeneral)
BOOST_CHECK_EQUAL(processConfigurationString(config), true);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getLsaRefreshTime(), static_cast<uint32_t>(LSA_REFRESH_TIME_DEFAULT));
BOOST_CHECK_EQUAL(conf.getLsaInterestLifetime(),
static_cast<ndn::time::seconds>(LSA_INTEREST_LIFETIME_DEFAULT));
@@ -291,8 +283,6 @@ BOOST_AUTO_TEST_CASE(DefaultValuesNeighbors)
BOOST_CHECK_EQUAL(processConfigurationString(config), true);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getInterestRetryNumber(), static_cast<uint32_t>(HELLO_RETRIES_DEFAULT));
BOOST_CHECK_EQUAL(conf.getInterestResendTime(), static_cast<uint32_t>(HELLO_TIMEOUT_DEFAULT));
BOOST_CHECK_EQUAL(conf.getInfoInterestInterval(), static_cast<uint32_t>(HELLO_INTERVAL_DEFAULT));
@@ -311,8 +301,6 @@ BOOST_AUTO_TEST_CASE(DefaultValuesFib)
BOOST_CHECK_EQUAL(processConfigurationString(config), true);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getMaxFacesPerPrefix(),
static_cast<uint32_t>(MAX_FACES_PER_PREFIX_DEFAULT));
BOOST_CHECK_EQUAL(conf.getRoutingCalcInterval(),
@@ -327,8 +315,6 @@ BOOST_AUTO_TEST_CASE(DefaultValuesHyperbolic)
BOOST_CHECK_EQUAL(processConfigurationString(config), true);
ConfParameter& conf = nlsr.getConfParameter();
BOOST_CHECK_EQUAL(conf.getHyperbolicState(), static_cast<int32_t>(HYPERBOLIC_STATE_DEFAULT));
}
@@ -391,8 +377,7 @@ BOOST_AUTO_TEST_CASE(LoadCertToPublish)
BOOST_CHECK(processConfigurationString(SECTION_SECURITY));
// Certificate should now be in the CertificateStore
security::CertificateStore& certStore = nlsr.getCertificateStore();
BOOST_CHECK(certStore.find(identity.getDefaultKey().getName()) != nullptr);
BOOST_CHECK(conf.getCertStore().find(identity.getDefaultKey().getName()) != nullptr);
}
BOOST_AUTO_TEST_CASE(PrefixUpdateValidatorOptional) // Bug #2814
+6 -2
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California
*
* This file is part of NLSR (Named-data Link State Routing).
@@ -21,6 +21,9 @@
*
**/
#include "conf-parameter.hpp"
#include <ndn-cxx/util/dummy-client-face.hpp>
#include <boost/test/unit_test.hpp>
namespace nlsr {
@@ -33,7 +36,8 @@ BOOST_AUTO_TEST_SUITE(TestConfParameter)
BOOST_AUTO_TEST_CASE(ConfParameterSettersAndGetters)
{
ConfParameter cp1;
ndn::util::DummyClientFace face;
ConfParameter cp1(face);
const string NAME = "router1";
const string SITE = "memphis";
+6 -4
View File
@@ -46,10 +46,11 @@ class HyperbolicCalculatorFixture : public BaseFixture
public:
HyperbolicCalculatorFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, routingTable(nlsr.getRoutingTable())
, adjacencies(nlsr.getAdjacencyList())
, lsdb(nlsr.getLsdb())
, conf(face)
, nlsr(face, m_keyChain, conf)
, routingTable(nlsr.m_routingTable)
, adjacencies(conf.getAdjacencyList())
, lsdb(nlsr.m_lsdb)
{
}
@@ -148,6 +149,7 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
Nlsr nlsr;
Map map;
+19 -21
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -42,9 +42,11 @@ class LinkStateCalculatorFixture : public BaseFixture
public:
LinkStateCalculatorFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, routingTable(nlsr.getRoutingTable())
, lsdb(nlsr.getLsdb())
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, routingTable(nlsr.m_routingTable)
, lsdb(nlsr.m_lsdb)
{
setUpTopology();
}
@@ -52,12 +54,6 @@ public:
// Triangle topology with routers A, B, C connected
void setUpTopology()
{
ConfParameter& conf = nlsr.getConfParameter();
conf.setNetwork("/ndn");
conf.setSiteName("/router");
conf.setRouterName("/a");
conf.buildRouterPrefix();
Adjacent a(ROUTER_A_NAME, ndn::FaceUri(ROUTER_A_FACE), 0, Adjacent::STATUS_ACTIVE, 0, 0);
Adjacent b(ROUTER_B_NAME, ndn::FaceUri(ROUTER_B_FACE), 0, Adjacent::STATUS_ACTIVE, 0, 0);
Adjacent c(ROUTER_C_NAME, ndn::FaceUri(ROUTER_C_FACE), 0, Adjacent::STATUS_ACTIVE, 0, 0);
@@ -66,7 +62,7 @@ public:
b.setLinkCost(LINK_AB_COST);
c.setLinkCost(LINK_AC_COST);
AdjacencyList& adjacencyListA = nlsr.getAdjacencyList();
AdjacencyList& adjacencyListA = conf.getAdjacencyList();
adjacencyListA.insert(b);
adjacencyListA.insert(c);
@@ -100,6 +96,8 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
Map map;
@@ -119,9 +117,9 @@ public:
static const double LINK_BC_COST;
};
const ndn::Name LinkStateCalculatorFixture::ROUTER_A_NAME = "/ndn/router/a";
const ndn::Name LinkStateCalculatorFixture::ROUTER_B_NAME = "/ndn/router/b";
const ndn::Name LinkStateCalculatorFixture::ROUTER_C_NAME = "/ndn/router/c";
const ndn::Name LinkStateCalculatorFixture::ROUTER_A_NAME = "/ndn/site/%C1.Router/this-router";
const ndn::Name LinkStateCalculatorFixture::ROUTER_B_NAME = "/ndn/site/%C1.Router/b";
const ndn::Name LinkStateCalculatorFixture::ROUTER_C_NAME = "/ndn/site/%C1.Router/c";
const std::string LinkStateCalculatorFixture::ROUTER_A_FACE = "udp4://10.0.0.1";
const std::string LinkStateCalculatorFixture::ROUTER_B_FACE = "udp4://10.0.0.2";
@@ -136,7 +134,7 @@ BOOST_FIXTURE_TEST_SUITE(TestLinkStateRoutingCalculator, LinkStateCalculatorFixt
BOOST_AUTO_TEST_CASE(Basic)
{
LinkStateRoutingTableCalculator calculator(map.getMapSize());
calculator.calculatePath(map, routingTable, nlsr);
calculator.calculatePath(map, routingTable, conf, lsdb.getAdjLsdb());
RoutingTableEntry* entryB = routingTable.findRoutingTableEntry(ROUTER_B_NAME);
BOOST_REQUIRE(entryB != nullptr);
@@ -174,18 +172,18 @@ BOOST_AUTO_TEST_CASE(Asymmetric)
{
// Asymmetric link cost between B and C
ndn::Name key = ndn::Name(ROUTER_B_NAME).append(std::to_string(Lsa::Type::ADJACENCY));
AdjLsa* lsa = nlsr.getLsdb().findAdjLsa(key);
AdjLsa* lsa = nlsr.m_lsdb.findAdjLsa(key);
BOOST_REQUIRE(lsa != nullptr);
auto c = lsa->getAdl().findAdjacent(ROUTER_C_NAME);
BOOST_REQUIRE(c != nlsr.getAdjacencyList().end());
BOOST_REQUIRE(c != conf.getAdjacencyList().end());
double higherLinkCost = LINK_BC_COST + 1;
c->setLinkCost(higherLinkCost);
// Calculation should consider the link between B and C as having cost = higherLinkCost
LinkStateRoutingTableCalculator calculator(map.getMapSize());
calculator.calculatePath(map, routingTable, nlsr);
calculator.calculatePath(map, routingTable, conf, lsdb.getAdjLsdb());
RoutingTableEntry* entryB = routingTable.findRoutingTableEntry(ROUTER_B_NAME);
BOOST_REQUIRE(entryB != nullptr);
@@ -223,17 +221,17 @@ BOOST_AUTO_TEST_CASE(AsymmetricZeroCost)
{
// Asymmetric link cost between B and C
ndn::Name key = ndn::Name(ROUTER_B_NAME).append(std::to_string(Lsa::Type::ADJACENCY));
AdjLsa* lsa = nlsr.getLsdb().findAdjLsa(key);
AdjLsa* lsa = nlsr.m_lsdb.findAdjLsa(key);
BOOST_REQUIRE(lsa != nullptr);
auto c = lsa->getAdl().findAdjacent(ROUTER_C_NAME);
BOOST_REQUIRE(c != nlsr.getAdjacencyList().end());
BOOST_REQUIRE(c != conf.getAdjacencyList().end());
c->setLinkCost(0);
// Calculation should consider the link between B and C as down
LinkStateRoutingTableCalculator calculator(map.getMapSize());
calculator.calculatePath(map, routingTable, nlsr);
calculator.calculatePath(map, routingTable, conf, lsdb.getAdjLsdb());
// Router A should be able to get to B through B but not through C
RoutingTableEntry* entryB = routingTable.findRoutingTableEntry(ROUTER_B_NAME);
+30 -36
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -46,7 +46,9 @@ public:
, siteIdentityName("/ndn/edu/test-site")
, opIdentityName("/ndn/edu/test-site/%C1.Operator/op1")
, routerIdName("/ndn/edu/test-site/%C1.Router/router1")
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, confParam(face)
, confProcessor(confParam)
, nlsr(face, m_keyChain, confParam)
, ROOT_CERT_PATH(boost::filesystem::current_path() / std::string("root.cert"))
{
rootId = addIdentity(rootIdName);
@@ -75,24 +77,16 @@ public:
boost::property_tree::read_info(inputFile, pt);
//Loads section and file name
for (auto tn = pt.begin(); tn != pt.end(); ++tn) {
if (tn->first == "security") {
auto it = tn->second.begin();
nlsr.loadValidator(it->second, std::string("nlsr.conf"));
// Loads section and file name
for (const auto& tn : pt) {
if (tn.first == "security") {
auto it = tn.second.begin();
confParam.getValidator().load(it->second, std::string("nlsr.conf"));
break;
}
}
inputFile.close();
// Set the network so the LSA prefix is constructed
// Set all so that buildRouterPrefix is set
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setSiteName("/edu/test-site");
nlsr.getConfParameter().setRouterName("/%C1.Router/router1");
// Otherwise code coverage node fails with default 60 seconds lifetime
nlsr.getConfParameter().setSyncInterestLifetime(1000);
// Initialize NLSR to initialize the keyChain
nlsr.initialize();
@@ -107,26 +101,26 @@ public:
ndn::Name rootIdName, siteIdentityName, opIdentityName, routerIdName;
ndn::security::pib::Identity rootId, siteIdentity, opIdentity, routerId;
ConfParameter confParam;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
const boost::filesystem::path ROOT_CERT_PATH;
//std::function<void(const ndn::Interest& interest)> processInterest;
};
BOOST_FIXTURE_TEST_SUITE(TestLsaDataValidation, LsaRuleFixture)
BOOST_AUTO_TEST_CASE(ValidateCorrectLSA)
{
ndn::Name lsaDataName = nlsr.getConfParameter().getLsaPrefix();
lsaDataName.append(nlsr.getConfParameter().getSiteName());
lsaDataName.append(nlsr.getConfParameter().getRouterName());
ndn::Name lsaDataName = confParam.getLsaPrefix();
lsaDataName.append(confParam.getSiteName());
lsaDataName.append(confParam.getRouterName());
// Append LSA type
lsaDataName.append(std::to_string(Lsa::Type::NAME));
// This would be the sequence number of its own NameLsa
lsaDataName.appendNumber(nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
lsaDataName.appendNumber(nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
// Append version, segmentNo
lsaDataName.appendNumber(1).appendNumber(1);
@@ -135,28 +129,28 @@ BOOST_AUTO_TEST_CASE(ValidateCorrectLSA)
data.setFreshnessPeriod(ndn::time::seconds(10));
// Sign data with NLSR's key
nlsr.getKeyChain().sign(data, nlsr.getSigningInfo());
m_keyChain.sign(data, nlsr.m_signingInfo);
// Make NLSR validate data signed by its own key
nlsr.getValidator().validate(data,
[] (const Data&) { BOOST_CHECK(true); },
[] (const Data&, const ndn::security::v2::ValidationError&) {
BOOST_CHECK(false);
});
confParam.getValidator().validate(data,
[] (const Data&) { BOOST_CHECK(true); },
[] (const Data&, const ndn::security::v2::ValidationError&) {
BOOST_CHECK(false);
});
}
BOOST_AUTO_TEST_CASE(DoNotValidateIncorrectLSA)
{
// getSubName removes the /localhop compnonent from /localhop/ndn/NLSR/LSA
ndn::Name lsaDataName = nlsr.getConfParameter().getLsaPrefix().getSubName(1);
lsaDataName.append(nlsr.getConfParameter().getSiteName());
lsaDataName.append(nlsr.getConfParameter().getRouterName());
ndn::Name lsaDataName = confParam.getLsaPrefix().getSubName(1);
lsaDataName.append(confParam.getSiteName());
lsaDataName.append(confParam.getRouterName());
// Append LSA type
lsaDataName.append(std::to_string(Lsa::Type::NAME));
// This would be the sequence number of its own NameLsa
lsaDataName.appendNumber(nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
lsaDataName.appendNumber(nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
// Append version, segmentNo
lsaDataName.appendNumber(1).appendNumber(1);
@@ -165,11 +159,11 @@ BOOST_AUTO_TEST_CASE(DoNotValidateIncorrectLSA)
data.setFreshnessPeriod(ndn::time::seconds(10));
// Make NLSR validate data signed by its own key
nlsr.getValidator().validate(data,
[] (const Data&) { BOOST_CHECK(false); },
[] (const Data&, const ndn::security::v2::ValidationError&) {
BOOST_CHECK(true);
});
confParam.getValidator().validate(data,
[] (const Data&) { BOOST_CHECK(false); },
[] (const Data&, const ndn::security::v2::ValidationError&) {
BOOST_CHECK(true);
});
}
BOOST_AUTO_TEST_SUITE_END()
+6 -4
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, Regents of the University of California,
* Copyright (c) 2014-2019, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
@@ -39,9 +39,10 @@ class LsaSegmentStorageFixture : public UnitTestTimeFixture
public:
LsaSegmentStorageFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, lsdb(nlsr.getLsdb())
, lsaStorage(lsdb.getLsaStorage())
, conf(face)
, nlsr(face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, lsaStorage(lsdb.m_lsaStorage)
{
}
@@ -88,6 +89,7 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
Nlsr nlsr;
Lsdb& lsdb;
LsaSegmentStorage& lsaStorage;
+21 -22
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -35,28 +35,25 @@
namespace nlsr {
namespace test {
using std::shared_ptr;
using namespace ndn::time_literals;
class LsdbFixture : public UnitTestTimeFixture
{
public:
LsdbFixture()
: face(m_ioService, m_keyChain, {true, true})
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, lsdb(nlsr.getLsdb())
, conf(nlsr.getConfParameter())
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, REGISTER_COMMAND_PREFIX("/localhost/nfd/rib")
, REGISTER_VERB("register")
{
conf.setNetwork("/ndn");
conf.setSiteName("/site");
conf.setRouterName("/%C1.Router/this-router");
addIdentity("/ndn/site/%C1.Router/this-router");
nlsr.initialize();
advanceClocks(ndn::time::milliseconds(1), 10);
advanceClocks(10_ms);
face.sentInterests.clear();
}
@@ -93,9 +90,10 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
Lsdb& lsdb;
ConfParameter& conf;
ndn::Name REGISTER_COMMAND_PREFIX;
ndn::Name::Component REGISTER_VERB;
@@ -112,7 +110,7 @@ BOOST_AUTO_TEST_CASE(LsdbSync)
oldInterestName.appendNumber(oldSeqNo);
lsdb.expressInterest(oldInterestName, 0);
advanceClocks(ndn::time::milliseconds(1), 10);
advanceClocks(10_ms);
std::vector<ndn::Interest>& interests = face.sentInterests;
@@ -132,7 +130,7 @@ BOOST_AUTO_TEST_CASE(LsdbSync)
// Simulate an LSA interest timeout
lsdb.onFetchLsaError(ndn::util::SegmentFetcher::ErrorCode::INTEREST_TIMEOUT, "Timeout",
oldInterestName, 0, deadline, interestName, oldSeqNo);
advanceClocks(ndn::time::milliseconds(1), 10);
advanceClocks(10_ms);
BOOST_REQUIRE(interests.size() > 0);
@@ -150,7 +148,7 @@ BOOST_AUTO_TEST_CASE(LsdbSync)
newInterestName.appendNumber(newSeqNo);
lsdb.expressInterest(newInterestName, 0);
advanceClocks(ndn::time::milliseconds(1), 10);
advanceClocks(10_ms);
BOOST_REQUIRE(interests.size() > 0);
@@ -166,7 +164,7 @@ BOOST_AUTO_TEST_CASE(LsdbSync)
// Simulate an LSA interest timeout where the sequence number is outdated
lsdb.onFetchLsaError(ndn::util::SegmentFetcher::ErrorCode::INTEREST_TIMEOUT, "Timeout",
oldInterestName, 0, deadline, interestName, oldSeqNo);
advanceClocks(ndn::time::milliseconds(1), 10);
advanceClocks(10_ms);
// Interest should not be expressed for outdated sequence number
BOOST_CHECK_EQUAL(interests.size(), 0);
@@ -191,16 +189,17 @@ BOOST_AUTO_TEST_CASE(LsdbSegmentedData)
// Create another Lsdb and expressInterest
ndn::util::DummyClientFace face2(m_ioService, m_keyChain, {true, true});
face.linkTo(face2);
Nlsr nlsr2(m_ioService, m_scheduler, face2, m_keyChain);
ConfParameter conf2(face2);
Nlsr nlsr2(face2, m_keyChain, conf2);
std::string config = R"CONF(
trust-anchor
{
type any
}
)CONF";
nlsr2.getValidator().load(config, "config-file-from-string");
conf2.getValidator().load(config, "config-file-from-string");
Lsdb& lsdb2(nlsr2.getLsdb());
Lsdb& lsdb2(nlsr2.m_lsdb);
advanceClocks(ndn::time::milliseconds(1), 10);
@@ -286,12 +285,12 @@ BOOST_AUTO_TEST_CASE(LsdbRemoveAndExists)
npl1.insert(s1);
npl1.insert(s2);
//For NameLsa lsType is name.
//12 is seqNo, randomly generated.
//1800 is the default life time.
// For NameLsa lsType is name.
// 12 is seqNo, randomly generated.
// 1800 seconds is the default life time.
NameLsa nlsa1(ndn::Name("/router1/1"), 12, testTimePoint, npl1);
Lsdb lsdb1(nlsr, m_scheduler);
Lsdb& lsdb1(nlsr.m_lsdb);
lsdb1.installNameLsa(nlsa1);
lsdb1.writeNameLsdbLog();
+59 -75
View File
@@ -29,24 +29,21 @@
namespace nlsr {
namespace test {
using std::shared_ptr;
using namespace ndn::time_literals;
class NlsrFixture : public MockNfdMgmtFixture
{
public:
NlsrFixture()
: nlsr(m_ioService, m_scheduler, m_face, m_keyChain)
, lsdb(nlsr.getLsdb())
, neighbors(nlsr.getAdjacencyList())
: conf(m_face)
, confProcessor(conf)
, nlsr(m_face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, neighbors(conf.getAdjacencyList())
, nSuccessCallbacks(0)
, nFailureCallbacks(0)
{
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setSiteName("/site");
nlsr.getConfParameter().setRouterName("/%C1.Router/this-router");
nlsr.getConfParameter().buildRouterPrefix();
addIdentity(nlsr.getConfParameter().getRouterPrefix());
addIdentity(conf.getRouterPrefix());
}
void
@@ -61,6 +58,8 @@ public:
}
public:
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
Lsdb& lsdb;
AdjacencyList& neighbors;
@@ -85,7 +84,7 @@ BOOST_AUTO_TEST_CASE(HyperbolicOn_ZeroCostNeighbors)
Adjacent::STATUS_INACTIVE, 0, 0);
neighbors.insert(neighborC);
nlsr.getConfParameter().setHyperbolicState(HYPERBOLIC_STATE_ON);
conf.setHyperbolicState(HYPERBOLIC_STATE_ON);
nlsr.initialize();
@@ -121,18 +120,17 @@ BOOST_AUTO_TEST_CASE(HyperbolicOff_LinkStateCost)
BOOST_AUTO_TEST_CASE(SetEventIntervals)
{
// Simulate loading configuration file
ConfParameter& conf = nlsr.getConfParameter();
conf.setAdjLsaBuildInterval(3);
conf.setFirstHelloInterval(6);
conf.setRoutingCalcInterval(9);
nlsr.initialize();
Nlsr nlsr2(m_face, m_keyChain, conf);
const Lsdb& lsdb = nlsr.getLsdb();
const RoutingTable& rt = nlsr.getRoutingTable();
const Lsdb& lsdb = nlsr2.m_lsdb;
const RoutingTable& rt = nlsr2.m_routingTable;
BOOST_CHECK_EQUAL(lsdb.getAdjLsaBuildInterval(), ndn::time::seconds(3));
BOOST_CHECK_EQUAL(nlsr.getFirstHelloInterval(), 6);
BOOST_CHECK_EQUAL(conf.getFirstHelloInterval(), 6);
BOOST_CHECK_EQUAL(rt.getRoutingCalcInterval(), ndn::time::seconds(9));
}
@@ -145,27 +143,27 @@ BOOST_AUTO_TEST_CASE(FaceCreateEvent)
Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(faceUri), 10,
Adjacent::STATUS_INACTIVE, 0, 0);
BOOST_REQUIRE_EQUAL(nlsr.getAdjacencyList().insert(neighbor), 0);
BOOST_REQUIRE_EQUAL(conf.getAdjacencyList().insert(neighbor), 0);
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// Build, sign, and send the Face Event
ndn::nfd::FaceEventNotification event;
event.setKind(ndn::nfd::FACE_EVENT_CREATED)
.setRemoteUri(faceUri)
.setFaceId(faceId);
std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
auto data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
data->setContent(event.wireEncode());
nlsr.getKeyChain().sign(*data);
m_keyChain.sign(*data);
m_face.receive(*data);
// Move the clocks forward so that the Face processes the event.
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// Need to explicitly provide a FaceUri object, because the
// conversion will attempt to create Name objects.
auto iterator = nlsr.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
BOOST_REQUIRE(iterator != nlsr.getAdjacencyList().end());
auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
BOOST_CHECK_EQUAL(iterator->getFaceId(), faceId);
}
@@ -179,24 +177,24 @@ BOOST_AUTO_TEST_CASE(FaceCreateEventNoMatch)
Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(neighborUri), 10,
Adjacent::STATUS_INACTIVE, 0, 0);
nlsr.getAdjacencyList().insert(neighbor);
conf.getAdjacencyList().insert(neighbor);
// Build, sign, and send the Face Event
ndn::nfd::FaceEventNotification event;
event.setKind(ndn::nfd::FACE_EVENT_CREATED)
.setRemoteUri(eventUri)
.setFaceId(faceId);
std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
auto data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
data->setContent(event.wireEncode());
nlsr.getKeyChain().sign(*data);
m_keyChain.sign(*data);
m_face.receive(*data);
// Move the clocks forward so that the Face processes the event.
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// The Face URIs did not match, so this neighbor should be unconfigured.
auto iterator = nlsr.getAdjacencyList().findAdjacent(ndn::FaceUri(neighborUri));
BOOST_REQUIRE(iterator != nlsr.getAdjacencyList().end());
auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(neighborUri));
BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
BOOST_CHECK_EQUAL(iterator->getFaceId(), 0);
}
@@ -209,7 +207,7 @@ BOOST_AUTO_TEST_CASE(FaceCreateEventAlreadyConfigured)
Adjacent neighbor("/ndn/neighborA", ndn::FaceUri(faceUri), 10,
Adjacent::STATUS_ACTIVE, 0, neighborFaceId);
nlsr.getAdjacencyList().insert(neighbor);
conf.getAdjacencyList().insert(neighbor);
// Build, sign, and send the Face Event
ndn::nfd::FaceEventNotification event;
@@ -218,28 +216,22 @@ BOOST_AUTO_TEST_CASE(FaceCreateEventAlreadyConfigured)
.setFaceId(eventFaceId);
std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
data->setContent(event.wireEncode());
nlsr.getKeyChain().sign(*data);
m_keyChain.sign(*data);
m_face.receive(*data);
// Move the clocks forward so that the Face processes the event.
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// Since the neighbor was already configured, this (simply erroneous) event should have no effect.
auto iterator = nlsr.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
BOOST_REQUIRE(iterator != nlsr.getAdjacencyList().end());
auto iterator = conf.getAdjacencyList().findAdjacent(ndn::FaceUri(faceUri));
BOOST_REQUIRE(iterator != conf.getAdjacencyList().end());
BOOST_CHECK_EQUAL(iterator->getFaceId(), neighborFaceId);
}
BOOST_AUTO_TEST_CASE(FaceDestroyEvent)
{
// Simulate loading configuration file
ConfParameter& conf = nlsr.getConfParameter();
conf.setAdjLsaBuildInterval(0);
conf.setRoutingCalcInterval(0);
// Add active neighbors
AdjacencyList& neighbors = nlsr.getAdjacencyList();
AdjacencyList& neighbors = conf.getAdjacencyList();
uint64_t destroyFaceId = 128;
// Create a neighbor whose Face will be destroyed
@@ -287,19 +279,21 @@ BOOST_AUTO_TEST_CASE(FaceDestroyEvent)
lsdb.installAdjLsa(otherAdjLsa);
// Run the scheduler to build an adjacency LSA
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// Make sure an adjacency LSA was built
ndn::Name key = ndn::Name(nlsr.getConfParameter().getRouterPrefix())
ndn::Name key = ndn::Name(conf.getRouterPrefix())
.append(std::to_string(Lsa::Type::ADJACENCY));
AdjLsa* lsa = lsdb.findAdjLsa(key);
BOOST_REQUIRE(lsa != nullptr);
uint32_t lastAdjLsaSeqNo = lsa->getLsSeqNo();
nlsr.getLsdb().getSequencingManager().setAdjLsaSeq(lastAdjLsaSeqNo);
nlsr.m_lsdb.getSequencingManager().setAdjLsaSeq(lastAdjLsaSeqNo);
this->advanceClocks(1500_ms, 10);
// Make sure the routing table was calculated
RoutingTableEntry* rtEntry = nlsr.getRoutingTable().findRoutingTableEntry(failNeighbor.getName());
RoutingTableEntry* rtEntry = nlsr.m_routingTable.findRoutingTableEntry(failNeighbor.getName());
BOOST_REQUIRE(rtEntry != nullptr);
BOOST_REQUIRE_EQUAL(rtEntry->getNexthopList().size(), 1);
@@ -310,18 +304,18 @@ BOOST_AUTO_TEST_CASE(FaceDestroyEvent)
std::shared_ptr<ndn::Data> data = std::make_shared<ndn::Data>("/localhost/nfd/faces/events/%FE%00");
data->setContent(event.wireEncode());
nlsr.getKeyChain().sign(*data);
m_keyChain.sign(*data);
m_face.receive(*data);
// Run the scheduler to build an adjacency LSA
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
Adjacent updatedNeighbor = neighbors.getAdjacent(failNeighbor.getName());
BOOST_CHECK_EQUAL(updatedNeighbor.getFaceId(), 0);
BOOST_CHECK_EQUAL(updatedNeighbor.getInterestTimedOutNo(),
nlsr.getConfParameter().getInterestRetryNumber());
conf.getInterestRetryNumber());
BOOST_CHECK_EQUAL(updatedNeighbor.getStatus(), Adjacent::STATUS_INACTIVE);
lsa = lsdb.findAdjLsa(key);
@@ -329,8 +323,10 @@ BOOST_AUTO_TEST_CASE(FaceDestroyEvent)
BOOST_CHECK_EQUAL(lsa->getLsSeqNo(), lastAdjLsaSeqNo + 1);
this->advanceClocks(15_s, 10);
// Make sure the routing table was recalculated
rtEntry = nlsr.getRoutingTable().findRoutingTableEntry(failNeighbor.getName());
rtEntry = nlsr.m_routingTable.findRoutingTableEntry(failNeighbor.getName());
BOOST_CHECK(rtEntry == nullptr);
}
@@ -340,8 +336,7 @@ BOOST_AUTO_TEST_CASE(GetCertificate)
ndn::Name identityName("/TestNLSR/identity");
identityName.appendVersion();
ndn::security::pib::Identity identity = nlsr.getKeyChain().
createIdentity(identityName);
ndn::security::pib::Identity identity = m_keyChain.createIdentity(identityName);
ndn::security::v2::Certificate certificate =
identity.getDefaultKey().getDefaultCertificate();
@@ -358,19 +353,9 @@ BOOST_AUTO_TEST_CASE(GetCertificate)
nlsr.getCertificateStore().clear();
}
BOOST_AUTO_TEST_CASE(SetRouterCommandPrefix)
{
nlsr.initialize();
BOOST_CHECK_EQUAL(nlsr.getDatasetHandler().getRouterNameCommandPrefix(),
ndn::Name("/ndn/site/%C1.Router/this-router/lsdb"));
}
BOOST_AUTO_TEST_CASE(BuildAdjLsaAfterHelloResponse)
{
// Configure NLSR
ConfParameter& conf = nlsr.getConfParameter();
conf.setAdjLsaBuildInterval(1);
// Add neighbors
@@ -389,11 +374,11 @@ BOOST_AUTO_TEST_CASE(BuildAdjLsaAfterHelloResponse)
nlsr.initialize();
this->advanceClocks(ndn::time::milliseconds(1), 10);
this->advanceClocks(10_ms);
// Receive HELLO response from Router A
receiveHelloData(neighborAName, conf.getRouterPrefix());
this->advanceClocks(ndn::time::seconds(1), 10);
this->advanceClocks(1_s, 10);
ndn::Name lsaKey = ndn::Name(conf.getRouterPrefix()).append(std::to_string(Lsa::Type::ADJACENCY));
@@ -411,7 +396,7 @@ BOOST_AUTO_TEST_CASE(BuildAdjLsaAfterHelloResponse)
adjacency.setInterestTimedOutNo(HELLO_RETRIES_DEFAULT);
}
this->advanceClocks(ndn::time::seconds(1), 10);
this->advanceClocks(1_s, 10);
// Adjacency LSA should have been removed since this router's adjacencies are
// INACTIVE and have timed out
@@ -421,7 +406,7 @@ BOOST_AUTO_TEST_CASE(BuildAdjLsaAfterHelloResponse)
// Receive HELLO response from Router A and B
receiveHelloData(neighborAName, conf.getRouterPrefix());
receiveHelloData(neighborBName, conf.getRouterPrefix());
this->advanceClocks(ndn::time::seconds(1), 10);
this->advanceClocks(1_s, 10);
// Adjacency LSA should be built
lsa = lsdb.findAdjLsa(lsaKey);
@@ -441,7 +426,7 @@ BOOST_AUTO_TEST_CASE(FaceDatasetFetchSuccess)
},
[] (uint32_t code, const std::string& reason) {});
this->advanceClocks(ndn::time::milliseconds(100), 5);
this->advanceClocks(100_ms, 5);
ndn::nfd::FaceStatus payload1;
payload1.setFaceId(25401);
@@ -449,7 +434,7 @@ BOOST_AUTO_TEST_CASE(FaceDatasetFetchSuccess)
payload2.setFaceId(25402);
this->sendDataset("/localhost/nfd/faces/list", payload1, payload2);
this->advanceClocks(ndn::time::milliseconds(100), 5);
this->advanceClocks(100_ms, 5);
BOOST_CHECK(hasResult);
}
@@ -459,11 +444,11 @@ BOOST_AUTO_TEST_CASE(FaceDatasetFetchFailure)
[this](uint32_t code, const std::string& reason){
this->nFailureCallbacks++;
});
this->advanceClocks(ndn::time::milliseconds(100), 5);
this->advanceClocks(100_ms, 5);
ndn::Name payload;
this->sendDataset("/localhost/nfd/faces/list", payload);
this->advanceClocks(ndn::time::milliseconds(100), 5);
this->advanceClocks(100_ms, 5);
BOOST_CHECK_EQUAL(nFailureCallbacks, 1);
BOOST_CHECK_EQUAL(nSuccessCallbacks, 0);
@@ -489,7 +474,7 @@ BOOST_AUTO_TEST_CASE(FaceDatasetProcess)
nlsr.processFaceDataset(faceStatuses);
AdjacencyList adjList = nlsr.getAdjacencyList();
AdjacencyList adjList = conf.getAdjacencyList();
BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborA").getFaceId(), payload1.getFaceId());
BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborB").getFaceId(), payload2.getFaceId());
@@ -506,9 +491,9 @@ BOOST_AUTO_TEST_CASE(UnconfiguredNeighbor)
std::vector<ndn::nfd::FaceStatus> faceStatuses = {payload};
nlsr.processFaceDataset(faceStatuses);
this->advanceClocks(ndn::time::milliseconds(20), 5);
this->advanceClocks(20_ms, 5);
AdjacencyList adjList = nlsr.getAdjacencyList();
AdjacencyList adjList = conf.getAdjacencyList();
BOOST_CHECK_EQUAL(adjList.getAdjacent("/ndn/neighborA").getFaceId(), 0);
}
@@ -521,7 +506,6 @@ BOOST_AUTO_TEST_CASE(FaceDatasetPeriodicFetch)
ndn::time::milliseconds defaultTimeout = options.getTimeout();
int fetchInterval(1);
ConfParameter& conf = nlsr.getConfParameter();
conf.setFaceDatasetFetchInterval(fetchInterval);
conf.setFaceDatasetFetchTries(0);
@@ -532,7 +516,7 @@ BOOST_AUTO_TEST_CASE(FaceDatasetPeriodicFetch)
this->advanceClocks(defaultTimeout);
// Check that we have one interest for face list in the sent interests.
for (const ndn::Interest& interest : m_face.sentInterests) {
for (const auto& interest : m_face.sentInterests) {
if (datasetPrefix.isPrefixOf(interest.getName())) {
nNameMatches++;
}
@@ -546,7 +530,7 @@ BOOST_AUTO_TEST_CASE(FaceDatasetPeriodicFetch)
// Check that we now have two interests
nNameMatches = 0;
for (const ndn::Interest& interest : m_face.sentInterests) {
for (const auto& interest : m_face.sentInterests) {
if (datasetPrefix.isPrefixOf(interest.getName())) {
nNameMatches++;
}
+14 -26
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2017, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -19,8 +19,8 @@
* NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
**/
#include "test-common.hpp"
#include "sequencing-manager.hpp"
#include "test-common.hpp"
#include <boost/test/unit_test.hpp>
#include <boost/filesystem.hpp>
#include <string>
@@ -37,10 +37,8 @@ class SequencingManagerFixture : public BaseFixture
{
public:
SequencingManagerFixture()
: m_seqNumbers("")
, m_seqManager()
: m_seqManager("/tmp", HYPERBOLIC_STATE_OFF)
{
setFileDir();
}
~SequencingManagerFixture()
@@ -48,11 +46,6 @@ public:
boost::filesystem::remove(seqFile);
}
void
setFileDir() {
m_seqManager.setSeqFileDirectory("/tmp");
}
void
writeToFile(const std::string& testSeq) {
std::ofstream outputFile(seqFile, std::ofstream::trunc);
@@ -61,8 +54,8 @@ public:
}
void
initiateFromFile(const int& type) {
m_seqManager.initiateSeqNoFromFile(type);
initiateFromFile() {
m_seqManager.initiateSeqNoFromFile();
}
void
@@ -74,8 +67,7 @@ public:
BOOST_CHECK_EQUAL(m_seqManager.getCorLsaSeq(), cor);
}
private:
std::string m_seqNumbers;
public:
std::string seqFile = "/tmp/nlsrSeqNo.txt";
SequencingManager m_seqManager;
};
@@ -86,16 +78,14 @@ BOOST_AUTO_TEST_CASE(CombinedSeqNumber)
{
// LS
writeToFile("27121653322350672");
initiateFromFile(HYPERBOLIC_STATE_OFF);
m_seqManager.m_hyperbolicState = HYPERBOLIC_STATE_OFF;
initiateFromFile();
checkSeqNumbers(24667+10, 80+10, 0);
// HR
writeToFile("27121653322350672");
initiateFromFile(HYPERBOLIC_STATE_ON);
m_seqManager.m_hyperbolicState = HYPERBOLIC_STATE_ON;
initiateFromFile();
// AdjLsa is set to 0 since HR is on
checkSeqNumbers(24667+10, 0, 0+10);
}
@@ -104,16 +94,14 @@ BOOST_AUTO_TEST_CASE(SeparateSeqNumber)
{
// LS
writeToFile("NameLsaSeq 100\nAdjLsaSeq 100\nCorLsaSeq 0");
initiateFromFile(HYPERBOLIC_STATE_OFF);
m_seqManager.m_hyperbolicState = HYPERBOLIC_STATE_OFF;
initiateFromFile();
checkSeqNumbers(100+10, 100+10, 0);
// HR
writeToFile("NameLsa 100\nAdjLsa 0\nCorLsa 100");
initiateFromFile(HYPERBOLIC_STATE_ON);
m_seqManager.m_hyperbolicState = HYPERBOLIC_STATE_ON;
initiateFromFile();
// AdjLsa is set to 0 since HR is on
checkSeqNumbers(100+10, 0, 100+10);
}
+10 -10
View File
@@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2018, The University of Memphis,
* Copyright (c) 2014-2019, The University of Memphis,
* Regents of the University of California,
* Arizona Board of Regents.
*
@@ -35,11 +35,11 @@ class StatisticsFixture : public UnitTestTimeFixture
public:
StatisticsFixture()
: face(m_ioService, m_keyChain)
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, lsdb(nlsr.getLsdb())
, conf(face)
, nlsr(face, m_keyChain, conf)
, lsdb(nlsr.m_lsdb)
, hello(nlsr.m_helloProtocol)
, conf(nlsr.getConfParameter())
, collector(nlsr.getStatsCollector())
, collector(nlsr.m_statsCollector)
{
conf.setNetwork("/ndn");
conf.setSiteName("/site");
@@ -115,11 +115,11 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
Nlsr nlsr;
Lsdb& lsdb;
HelloProtocol& hello;
ConfParameter& conf;
StatsCollector& collector;
};
@@ -156,7 +156,7 @@ BOOST_AUTO_TEST_CASE(SendHelloInterest)
Adjacent other("/ndn/router/other", ndn::FaceUri("udp4://other"), 25, Adjacent::STATUS_INACTIVE, 0, 0);
// This router's Adjacency LSA
nlsr.getAdjacencyList().insert(other);
conf.getAdjacencyList().insert(other);
ndn::Name otherName(other.getName());
otherName.append("NLSR");
@@ -304,7 +304,7 @@ BOOST_AUTO_TEST_CASE(LsdbReceiveData)
// adjacency lsa
ndn::Name adjInterest("/localhop/ndn/nlsr/LSA/cs/%C1.Router/router1/ADJACENCY/");
adjInterest.appendNumber(seqNo);
AdjLsa aLsa(routerName, seqNo, MAX_TIME, 1, nlsr.getAdjacencyList());
AdjLsa aLsa(routerName, seqNo, MAX_TIME, 1, conf.getAdjacencyList());
lsdb.installAdjLsa(aLsa);
ndn::Block block = ndn::encoding::makeStringBlock(ndn::tlv::Content, aLsa.serialize());
@@ -327,7 +327,7 @@ BOOST_AUTO_TEST_CASE(LsdbReceiveData)
// name lsa
ndn::Name interestName("/localhop/ndn/nlsr/LSA/cs/%C1.Router/router1/NAME/");
interestName.appendNumber(seqNo);
NameLsa nLsa(routerName, seqNo, MAX_TIME, nlsr.getNamePrefixList());
NameLsa nLsa(routerName, seqNo, MAX_TIME, conf.getNamePrefixList());
lsdb.installNameLsa(nLsa);
block = ndn::encoding::makeStringBlock(ndn::tlv::Content, nLsa.serialize());
+8 -12
View File
@@ -24,7 +24,6 @@
#include "../test-common.hpp"
namespace nlsr {
namespace update {
namespace test {
class AdvertiseCrashFixture : public nlsr::test::UnitTestTimeFixture
@@ -32,14 +31,15 @@ class AdvertiseCrashFixture : public nlsr::test::UnitTestTimeFixture
public:
AdvertiseCrashFixture()
: face(m_ioService, m_keyChain, {true, true})
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, namePrefixList(nlsr.getNamePrefixList())
, updatePrefixUpdateProcessor(nlsr.getPrefixUpdateProcessor())
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, namePrefixList(conf.getNamePrefixList())
{
// Add an adjacency to nlsr
Adjacent adj("/ndn/edu/test-site-2/%C1.Router/test",
ndn::FaceUri("udp://1.0.0.2"), 10, Adjacent::STATUS_INACTIVE, 0, 0);
nlsr.getAdjacencyList().insert(adj);
conf.getAdjacencyList().insert(adj);
// Create a face dataset response with the face having the same uri as
// the adjacent
@@ -49,11 +49,7 @@ public:
std::vector<ndn::nfd::FaceStatus> faces{payload1};
// Set the network so the LSA prefix is constructed
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setRouterName(ndn::Name("/This/router"));
addIdentity(ndn::Name("/ndn/This/router"));
addIdentity(conf.getRouterPrefix());
// So that NLSR starts listening on prefixes
nlsr.initialize();
@@ -70,10 +66,11 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
NamePrefixList& namePrefixList;
PrefixUpdateProcessor& updatePrefixUpdateProcessor;
};
BOOST_FIXTURE_TEST_CASE(TestAdvertiseCrash, AdvertiseCrashFixture)
@@ -96,5 +93,4 @@ BOOST_FIXTURE_TEST_CASE(TestAdvertiseCrash, AdvertiseCrashFixture)
}
} // namespace test
} // namespace update
} // namespace nlsr
+22 -27
View File
@@ -28,7 +28,6 @@
#include "../control-commands.hpp"
namespace nlsr {
namespace update {
namespace test {
class NfdRibCommandProcessorFixture : public nlsr::test::UnitTestTimeFixture
@@ -36,15 +35,13 @@ class NfdRibCommandProcessorFixture : public nlsr::test::UnitTestTimeFixture
public:
NfdRibCommandProcessorFixture()
: face(m_ioService, m_keyChain, {true, true})
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, namePrefixes(nlsr.getNamePrefixList())
, processor(nlsr.getNfdRibCommandProcessor())
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, namePrefixes(conf.getNamePrefixList())
, processor(nlsr.m_nfdRibCommandProcessor)
{
// Set the network so the LSA prefix is constructed
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setRouterName(ndn::Name("/This/router"));
addIdentity(ndn::Name("/ndn/This/router"));
addIdentity(conf.getRouterPrefix());
// Initialize NLSR so a sync socket is created
nlsr.initialize();
@@ -52,7 +49,7 @@ public:
this->advanceClocks(ndn::time::milliseconds(10), 10);
face.sentInterests.clear();
nameLsaSeqNoBeforeInterest = nlsr.getLsdb().getSequencingManager().getNameLsaSeq();
nameLsaSeqNoBeforeInterest = nlsr.m_lsdb.getSequencingManager().getNameLsaSeq();
}
void
@@ -64,19 +61,15 @@ public:
this->advanceClocks(ndn::time::milliseconds(10), 10);
}
void
sendInterestForPublishedData()
void sendInterestForPublishedData()
{
// Need to send an interest now since ChronoSync
// no longer does face->put(*data) in publishData.
// Instead it does it in onInterest
ndn::Name lsaInterestName("/localhop/ndn/nlsr/LSA/This/router");
ndn::Name lsaInterestName = conf.getLsaPrefix();
lsaInterestName.append(conf.getSiteName());
lsaInterestName.append(conf.getRouterName());
lsaInterestName.append(std::to_string(Lsa::Type::NAME));
lsaInterestName.appendNumber(nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
lsaInterestName.appendNumber(nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
auto lsaInterest = make_shared<ndn::Interest>(lsaInterestName);
lsaInterest->setCanBePrefix(true);
face.receive(*lsaInterest);
face.receive(ndn::Interest(lsaInterestName).setCanBePrefix(true));
this->advanceClocks(ndn::time::milliseconds(10), 10);
}
@@ -85,7 +78,7 @@ public:
{
sendInterestForPublishedData();
const ndn::Name& lsaPrefix = nlsr.getConfParameter().getLsaPrefix();
const ndn::Name& lsaPrefix = conf.getLsaPrefix();
const auto& it = std::find_if(face.sentData.begin(), face.sentData.end(),
[&] (const ndn::Data& data) {
@@ -97,14 +90,17 @@ public:
public:
ndn::util::DummyClientFace face;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
NamePrefixList& namePrefixes;
NfdRibCommandProcessor& processor;
update::NfdRibCommandProcessor& processor;
uint64_t nameLsaSeqNoBeforeInterest;
};
typedef boost::mpl::vector<NfdRibRegisterCommand, NfdRibUnregisterCommand> Commands;
typedef boost::mpl::vector<update::NfdRibRegisterCommand,
update::NfdRibUnregisterCommand> Commands;
BOOST_FIXTURE_TEST_SUITE(TestNfdRibCommandProcessor, NfdRibCommandProcessorFixture)
@@ -148,7 +144,7 @@ BOOST_AUTO_TEST_CASE(onReceiveInterestRegisterCommand)
}
BOOST_CHECK_EQUAL((*itr), prefixName);
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
}
BOOST_AUTO_TEST_CASE(onReceiveInterestUnregisterCommand)
@@ -164,7 +160,7 @@ BOOST_AUTO_TEST_CASE(onReceiveInterestUnregisterCommand)
BOOST_CHECK_EQUAL(namePrefixes.getNames().size(), 0);
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
}
BOOST_AUTO_TEST_CASE(onReceiveInterestInvalidPrefix)
@@ -180,11 +176,10 @@ BOOST_AUTO_TEST_CASE(onReceiveInterestInvalidPrefix)
// Cannot use routingUpdatePublish test now since in
// initialize nlsr calls buildOwnNameLsa which publishes the routing update
BOOST_CHECK(nameLsaSeqNoBeforeInterest == nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
BOOST_CHECK(nameLsaSeqNoBeforeInterest == nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace test
} // namespace update
} // namespace nlsr
+37 -72
View File
@@ -31,11 +31,12 @@
#include <ndn-cxx/security/signing-helpers.hpp>
#include <boost/filesystem.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/info_parser.hpp>
using namespace ndn;
namespace nlsr {
namespace update {
namespace test {
class PrefixUpdateFixture : public nlsr::test::UnitTestTimeFixture
@@ -43,11 +44,12 @@ class PrefixUpdateFixture : public nlsr::test::UnitTestTimeFixture
public:
PrefixUpdateFixture()
: face(m_ioService, m_keyChain, {true, true})
, siteIdentityName(ndn::Name("/edu/test-site"))
, opIdentityName(ndn::Name("/edu/test-site").append(ndn::Name("%C1.Operator")))
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, namePrefixList(nlsr.getNamePrefixList())
, updatePrefixUpdateProcessor(nlsr.getPrefixUpdateProcessor())
, siteIdentityName(ndn::Name("site"))
, opIdentityName(ndn::Name("site").append(ndn::Name("%C1.Operator")))
, conf(face)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, namePrefixList(conf.getNamePrefixList())
, SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
{
// Site cert
@@ -57,65 +59,28 @@ public:
// Operator cert
opIdentity = addSubCertificate(opIdentityName, siteIdentity);
const std::string CONFIG = R"CONF(
rule
{
id "NLSR ControlCommand Rule"
for interest
filter
{
type name
regex ^(<localhost><nlsr>)<prefix-update>[<advertise><withdraw>]<><><>$
}
checker
{
type customized
sig-type rsa-sha256
key-locator
{
type name
regex ^<>*<KEY><>$
}
}
}
rule
{
id "NLSR Hierarchy Rule"
for data
filter
{
type name
regex ^[^<KEY>]*<KEY><><><>$
}
checker
{
type hierarchical
sig-type rsa-sha256
}
}
trust-anchor
{
type file
file-name "site.cert"
}
)CONF";
std::ifstream inputFile;
inputFile.open(std::string("nlsr.conf"));
const boost::filesystem::path CONFIG_PATH =
(boost::filesystem::current_path() / std::string("unit-test.conf"));
BOOST_REQUIRE(inputFile.is_open());
updatePrefixUpdateProcessor.getValidator().load(CONFIG, CONFIG_PATH.native());
boost::property_tree::ptree pt;
boost::property_tree::read_info(inputFile, pt);
for (const auto& tn : pt) {
if (tn.first == "security") {
for (const auto& it : tn.second) {
if (it.first == "prefix-update-validator") {
conf.getPrefixUpdateValidator().load(it.second, std::string("nlsr.conf"));
}
}
}
}
inputFile.close();
nlsr.loadCertToPublish(opIdentity.getDefaultKey().getDefaultCertificate());
// Set the network so the LSA prefix is constructed
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setSiteName("/edu/test-site");
nlsr.getConfParameter().setRouterName("/%C1.Router/this-router");
nlsr.getConfParameter().buildRouterPrefix();
// Otherwise code coverage node fails with default 60 seconds lifetime
nlsr.getConfParameter().setSyncInterestLifetime(1000);
addIdentity(ndn::Name("/ndn/edu/test-site/%C1.Router/this-router"));
addIdentity(conf.getRouterPrefix());
// Initialize NLSR so a sync socket is created
nlsr.initialize();
@@ -130,12 +95,12 @@ public:
// Need to send an interest now since ChronoSync
// no longer does face->put(*data) in publishData.
// Instead it does it in onInterest
ndn::Name lsaInterestName = nlsr.getConfParameter().getLsaPrefix();
lsaInterestName.append(nlsr.getConfParameter().getSiteName());
lsaInterestName.append(nlsr.getConfParameter().getRouterName());
ndn::Name lsaInterestName = conf.getLsaPrefix();
lsaInterestName.append(conf.getSiteName());
lsaInterestName.append(conf.getRouterName());
lsaInterestName.append(std::to_string(Lsa::Type::NAME));
lsaInterestName.appendNumber(nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
lsaInterestName.appendNumber(nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
auto lsaInterest = std::make_shared<Interest>(lsaInterestName);
lsaInterest->setCanBePrefix(true);
@@ -148,7 +113,7 @@ public:
{
sendInterestForPublishedData();
const ndn::Name& lsaPrefix = nlsr.getConfParameter().getLsaPrefix();
const ndn::Name& lsaPrefix = conf.getLsaPrefix();
const auto& it = std::find_if(face.sentData.begin(), face.sentData.end(),
[lsaPrefix] (const ndn::Data& data) {
@@ -168,9 +133,10 @@ public:
ndn::Name opIdentityName;
ndn::security::pib::Identity opIdentity;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
NamePrefixList& namePrefixList;
PrefixUpdateProcessor& updatePrefixUpdateProcessor;
const boost::filesystem::path SITE_CERT_PATH;
};
@@ -179,7 +145,7 @@ BOOST_FIXTURE_TEST_SUITE(TestPrefixUpdateProcessor, PrefixUpdateFixture)
BOOST_AUTO_TEST_CASE(Basic)
{
uint64_t nameLsaSeqNoBeforeInterest = nlsr.getLsdb().getSequencingManager().getNameLsaSeq();
uint64_t nameLsaSeqNoBeforeInterest = nlsr.m_lsdb.getSequencingManager().getNameLsaSeq();
ndn::nfd::ControlParameters parameters;
parameters.setName("/prefix/to/advertise/");
@@ -205,16 +171,16 @@ BOOST_AUTO_TEST_CASE(Basic)
this->advanceClocks(ndn::time::milliseconds(10));
NamePrefixList& namePrefixList = nlsr.getNamePrefixList();
NamePrefixList& namePrefixList = conf.getNamePrefixList();
BOOST_REQUIRE_EQUAL(namePrefixList.size(), 1);
BOOST_CHECK_EQUAL(namePrefixList.getNames().front(), parameters.getName());
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
face.sentData.clear();
nameLsaSeqNoBeforeInterest = nlsr.getLsdb().getSequencingManager().getNameLsaSeq();
nameLsaSeqNoBeforeInterest = nlsr.m_lsdb.getSequencingManager().getNameLsaSeq();
//Withdraw
ndn::Name withdrawCommand("/localhost/nlsr/prefix-update/withdraw");
@@ -230,11 +196,10 @@ BOOST_AUTO_TEST_CASE(Basic)
BOOST_CHECK_EQUAL(namePrefixList.size(), 0);
BOOST_CHECK(wasRoutingUpdatePublished());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.getLsdb().getSequencingManager().getNameLsaSeq());
BOOST_CHECK(nameLsaSeqNoBeforeInterest < nlsr.m_lsdb.getSequencingManager().getNameLsaSeq());
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace test
} // namespace update
} // namespace nlsr
+17 -21
View File
@@ -33,7 +33,6 @@
#include <boost/filesystem.hpp>
namespace nlsr {
namespace update {
namespace test {
namespace pt = boost::property_tree;
@@ -46,18 +45,19 @@ public:
: face(m_ioService, m_keyChain, {true, true})
, siteIdentityName(ndn::Name("/edu/test-site"))
, opIdentityName(ndn::Name("/edu/test-site").append(ndn::Name("%C1.Operator")))
, nlsr(m_ioService, m_scheduler, face, m_keyChain)
, SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
, testConfFile("/tmp/nlsr.conf.test")
, conf(face, testConfFile)
, confProcessor(conf)
, nlsr(face, m_keyChain, conf)
, SITE_CERT_PATH(boost::filesystem::current_path() / std::string("site.cert"))
, counter(0)
{
std::ifstream source("/usr/local/etc/ndn/nlsr.conf.sample", std::ios::binary);
std::ofstream destination("/tmp/nlsr.conf.test", std::ios::binary);
std::ofstream destination(testConfFile, std::ios::binary);
destination << source.rdbuf();
source.close();
destination.close();
nlsr.setConfFileName(testConfFile);
siteIdentity = addIdentity(siteIdentityName);
saveCertificate(siteIdentity, SITE_CERT_PATH.string());
@@ -73,16 +73,15 @@ public:
// Loads section and file name
for (const auto& section : pt) {
if (section.first == "security") {
auto it = section.second.begin();
it++;
if (it != pt.end() && it->first == "prefix-update-validator") {
nlsr.getPrefixUpdateProcessor().loadValidator(it->second, std::string(testConfFile));
for (const auto& it : section.second) {
if (it.first == "prefix-update-validator") {
conf.getPrefixUpdateValidator().load(it.second, std::string("nlsr.conf"));
}
}
break;
}
}
inputFile.close();
nlsr.loadCertToPublish(opIdentity.getDefaultKey().getDefaultCertificate());
// Site cert
siteIdentity = addIdentity(siteIdentityName);
saveCertificate(siteIdentity, SITE_CERT_PATH.string());
@@ -92,11 +91,7 @@ public:
nlsr.loadCertToPublish(opIdentity.getDefaultKey().getDefaultCertificate());
// Set the network so the LSA prefix is constructed
nlsr.getConfParameter().setNetwork("/ndn");
nlsr.getConfParameter().setSiteName("/edu/test-site");
nlsr.getConfParameter().setRouterName("/%C1.Router/this-router");
nlsr.getConfParameter().buildRouterPrefix();
addIdentity(nlsr.getConfParameter().getRouterPrefix());
addIdentity(conf.getRouterPrefix());
// Initialize NLSR so a sync socket is created
nlsr.initialize();
@@ -140,7 +135,7 @@ public:
parameters.setName(prefixName);
if (P_FLAG)
{
parameters.setFlags(PREFIX_FLAG);
parameters.setFlags(update::PREFIX_FLAG);
}
ndn::Name advertiseCommand("/localhost/nlsr/prefix-update/advertise");
ndn::Name withdrawCommand("/localhost/nlsr/prefix-update/withdraw");
@@ -164,10 +159,12 @@ public:
ndn::Name opIdentityName;
ndn::security::pib::Identity opIdentity;
std::string testConfFile;
ConfParameter conf;
DummyConfFileProcessor confProcessor;
Nlsr nlsr;
const boost::filesystem::path SITE_CERT_PATH;
ndn::Name sessionTime;
std::string testConfFile;
int counter;
};
@@ -211,7 +208,7 @@ BOOST_AUTO_TEST_CASE(PrefixStillSavedAfterJustWithdrawn)
BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), true);
// trying to advertise same name prefix
face.receive(advertiseWithdraw("/prefix/to/save", "advertise", true));
/*face.receive(advertiseWithdraw("/prefix/to/save", "advertise", true));
this->advanceClocks(ndn::time::milliseconds(10));
BOOST_REQUIRE(counter == 1);
BOOST_CHECK_EQUAL(getResponseCode(), 406);
@@ -229,11 +226,10 @@ BOOST_AUTO_TEST_CASE(PrefixStillSavedAfterJustWithdrawn)
this->advanceClocks(ndn::time::milliseconds(10));
// after withdrawn delete prefix should be deleted from the file
BOOST_CHECK_EQUAL(getResponseCode(), 205);
BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), false);
BOOST_CHECK_EQUAL(checkPrefix("/prefix/to/save"), false);*/
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace test
} // namespace update
} // namespace nlsr