diff --git a/rib/readvertise/client-to-nlsr-readvertise-policy.cpp b/rib/readvertise/client-to-nlsr-readvertise-policy.cpp new file mode 100644 index 00000000..aba5fdb3 --- /dev/null +++ b/rib/readvertise/client-to-nlsr-readvertise-policy.cpp @@ -0,0 +1,49 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/** + * Copyright (c) 2014-2017, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. + * + * This file is part of NFD (Named Data Networking Forwarding Daemon). + * See AUTHORS.md for complete list of NFD authors and contributors. + * + * NFD is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * NFD, e.g., in COPYING.md file. If not, see . + */ + +#include "client-to-nlsr-readvertise-policy.hpp" + +namespace nfd { +namespace rib { + +ndn::optional +ClientToNlsrReadvertisePolicy::handleNewRoute(const RibRouteRef& ribRoute) const +{ + if (ribRoute.route->origin == ndn::nfd::ROUTE_ORIGIN_CLIENT) { + return ReadvertiseAction{ribRoute.entry->getName(), ndn::security::SigningInfo()}; + } + else { + return ndn::nullopt; + } +} + +time::milliseconds +ClientToNlsrReadvertisePolicy::getRefreshInterval() const +{ + return time::seconds(3600); +} + +} // namespace rib +} // namespace nfd diff --git a/rib/readvertise/client-to-nlsr-readvertise-policy.hpp b/rib/readvertise/client-to-nlsr-readvertise-policy.hpp new file mode 100644 index 00000000..af1481af --- /dev/null +++ b/rib/readvertise/client-to-nlsr-readvertise-policy.hpp @@ -0,0 +1,54 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/** + * Copyright (c) 2014-2017, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. + * + * This file is part of NFD (Named Data Networking Forwarding Daemon). + * See AUTHORS.md for complete list of NFD authors and contributors. + * + * NFD is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * NFD, e.g., in COPYING.md file. If not, see . + */ + +#ifndef NFD_RIB_READVERTISE_CLIENT_TO_NLSR_READVERTISE_POLICY_HPP +#define NFD_RIB_READVERTISE_CLIENT_TO_NLSR_READVERTISE_POLICY_HPP + +#include "readvertise-policy.hpp" + +namespace nfd { +namespace rib { + +/** \brief a policy to readvertise routes registered by end hosts into NLSR + */ +class ClientToNlsrReadvertisePolicy : public ReadvertisePolicy +{ +public: + /** \brief advertise if the route's origin is client + * + * If the route origin is "client" (typically from auto prefix propagation), readvertise it + * using the default signing identity. + */ + ndn::optional + handleNewRoute(const RibRouteRef& ribRoute) const override; + + time::milliseconds + getRefreshInterval() const override; +}; + +} // namespace rib +} // namespace nfd + +#endif // NFD_RIB_READVERTISE_CLIENT_TO_NLSR_READVERTISE_POLICY_HPP diff --git a/rib/readvertise/readvertise-policy.hpp b/rib/readvertise/readvertise-policy.hpp new file mode 100644 index 00000000..ebcc6c07 --- /dev/null +++ b/rib/readvertise/readvertise-policy.hpp @@ -0,0 +1,62 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/** + * Copyright (c) 2014-2017, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. + * + * This file is part of NFD (Named Data Networking Forwarding Daemon). + * See AUTHORS.md for complete list of NFD authors and contributors. + * + * NFD is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * NFD, e.g., in COPYING.md file. If not, see . + */ + +#ifndef NFD_RIB_READVERTISE_READVERTISE_POLICY_HPP +#define NFD_RIB_READVERTISE_READVERTISE_POLICY_HPP + +#include "../rib.hpp" +#include + +namespace nfd { +namespace rib { + +/** \brief a decision made by readvertise policy + */ +struct ReadvertiseAction +{ + Name prefix; ///< the prefix that should be readvertised + ndn::security::SigningInfo signer; ///< credentials for command signing +}; + +/** \brief a policy to decide whether to readvertise a route, and what prefix to readvertise + */ +class ReadvertisePolicy : noncopyable +{ +public: + /** \brief decide whether to readvertise a route, and what prefix to readvertise + */ + virtual ndn::optional + handleNewRoute(const RibRouteRef& ribRoute) const = 0; + + /** \return how often readvertisements made by this policy should be refreshed. + */ + virtual time::milliseconds + getRefreshInterval() const = 0; +}; + +} // namespace rib +} // namespace nfd + +#endif // NFD_RIB_READVERTISE_READVERTISE_POLICY_HPP diff --git a/rib/readvertise/readvertised-route.hpp b/rib/readvertise/readvertised-route.hpp index 1a896b1d..0692ccd6 100644 --- a/rib/readvertise/readvertised-route.hpp +++ b/rib/readvertise/readvertised-route.hpp @@ -48,19 +48,13 @@ public: mutable scheduler::ScopedEventId retryEvt; ///< retry or refresh event }; -/** \brief a less than comparison functor for ReadvertisedRoute prefix - */ -class ReadvertisedRoutePrefixCompare +inline bool +operator<(const ReadvertisedRoute& lhs, const ReadvertisedRoute& rhs) { -public: - bool - operator()(const ReadvertisedRoute& lhs, const ReadvertisedRoute& rhs) - { - return lhs.prefix < rhs.prefix; - } -}; + return lhs.prefix < rhs.prefix; +} -using ReadvertisedRouteContainer = std::set; +using ReadvertisedRouteContainer = std::set; } // namespace rib } // namespace nfd diff --git a/tests/rib/readvertise/client-to-nlsr-readvertise-policy.t.cpp b/tests/rib/readvertise/client-to-nlsr-readvertise-policy.t.cpp new file mode 100644 index 00000000..6535a87f --- /dev/null +++ b/tests/rib/readvertise/client-to-nlsr-readvertise-policy.t.cpp @@ -0,0 +1,76 @@ +/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ +/** + * Copyright (c) 2014-2017, Regents of the University of California, + * Arizona Board of Regents, + * Colorado State University, + * University Pierre & Marie Curie, Sorbonne University, + * Washington University in St. Louis, + * Beijing Institute of Technology, + * The University of Memphis. + * + * This file is part of NFD (Named Data Networking Forwarding Daemon). + * See AUTHORS.md for complete list of NFD authors and contributors. + * + * NFD is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * NFD, e.g., in COPYING.md file. If not, see . + */ + +#include "rib/readvertise/client-to-nlsr-readvertise-policy.hpp" + +#include "tests/test-common.hpp" + +namespace nfd { +namespace rib { +namespace tests { + +using namespace nfd::tests; + +BOOST_AUTO_TEST_SUITE(Readvertise) +BOOST_FIXTURE_TEST_SUITE(TestClientToNlsrReadvertisePolicy, BaseFixture) + +BOOST_AUTO_TEST_CASE(ReadvertiseClientRoute) +{ + auto entry = make_shared(); + entry->setName("/test/A"); + Route route; + route.origin = ndn::nfd::ROUTE_ORIGIN_CLIENT; + auto routeIt = entry->insertRoute(route).first; + RibRouteRef rrr{entry, routeIt}; + + ClientToNlsrReadvertisePolicy policy; + ndn::optional action = policy.handleNewRoute(rrr); + + BOOST_REQUIRE(action); + BOOST_CHECK_EQUAL(action->prefix, "/test/A"); + BOOST_REQUIRE_EQUAL(action->signer, ndn::security::SigningInfo()); +} + +BOOST_AUTO_TEST_CASE(DontReadvertiseRoute) +{ + auto entry = make_shared(); + entry->setName("/test/A"); + Route route; + route.origin = ndn::nfd::ROUTE_ORIGIN_NLSR; + auto routeIt = entry->insertRoute(route).first; + RibRouteRef rrr{entry, routeIt}; + + ClientToNlsrReadvertisePolicy policy; + ndn::optional action = policy.handleNewRoute(rrr); + + BOOST_CHECK(!action); +} + +BOOST_AUTO_TEST_SUITE_END() // TestClientToNlsrReadvertisePolicy +BOOST_AUTO_TEST_SUITE_END() // Readvertise + +} // namespace tests +} // namespace rib +} // namespace nfd