rib: do the longest-prefix match in self-learning route renew helper
Change-Id: I7f6f349fda6925dc3847716fed123d745f11b02a
refs: #4683
diff --git a/rib/rib-manager.cpp b/rib/rib-manager.cpp
index 8762e39..35bc87f 100644
--- a/rib/rib-manager.cpp
+++ b/rib/rib-manager.cpp
@@ -362,7 +362,7 @@
BOOST_ASSERT(pa.getData());
if (!m_isLocalhopEnabled) {
- NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << ' ' << faceId <<
+ NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << " " << faceId <<
": localhop_security unconfigured");
cb(SlAnnounceResult::VALIDATION_FAILURE);
return;
@@ -375,12 +375,12 @@
beginAddRoute(pa.getAnnouncedName(), route, nullopt,
[=] (RibUpdateResult ribRes) {
auto res = getSlAnnounceResultFromRibUpdateResult(ribRes);
- NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << ' ' << faceId << ": " << res);
+ NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << " " << faceId << ": " << res);
cb(res);
});
},
[=] (const Data&, ndn::security::v2::ValidationError err) {
- NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << ' ' << faceId <<
+ NFD_LOG_INFO("slAnnounce " << pa.getAnnouncedName() << " " << faceId <<
" validation error: " << err);
cb(SlAnnounceResult::VALIDATION_FAILURE);
}
@@ -394,18 +394,20 @@
Route routeQuery;
routeQuery.faceId = faceId;
routeQuery.origin = ndn::nfd::ROUTE_ORIGIN_PREFIXANN;
- Route* oldRoute = m_rib.find(name, routeQuery);
+ Route* oldRoute = m_rib.findLongestPrefix(name, routeQuery);
+
if (oldRoute == nullptr || !oldRoute->announcement) {
- NFD_LOG_DEBUG("slRenew " << name << ' ' << faceId << ": not found");
+ NFD_LOG_DEBUG("slRenew " << name << " " << faceId << ": not found");
return cb(SlAnnounceResult::NOT_FOUND);
}
+ Name routeName = oldRoute->announcement->getAnnouncedName();
Route route = *oldRoute;
route.expires = std::min(route.annExpires, time::steady_clock::now() + maxLifetime);
- beginAddRoute(name, route, nullopt,
+ beginAddRoute(routeName, route, nullopt,
[=] (RibUpdateResult ribRes) {
auto res = getSlAnnounceResultFromRibUpdateResult(ribRes);
- NFD_LOG_INFO("slRenew " << name << ' ' << faceId << ": " << res);
+ NFD_LOG_INFO("slRenew " << name << " " << faceId << ": " << res << " " << routeName);
cb(res);
});
}
diff --git a/rib/rib.cpp b/rib/rib.cpp
index d209f63..bbd72f1 100644
--- a/rib/rib.cpp
+++ b/rib/rib.cpp
@@ -80,6 +80,20 @@
return nullptr;
}
+Route*
+Rib::findLongestPrefix(const Name& prefix, const Route& route) const
+{
+ Route* existingRoute = find(prefix, route);
+ if (existingRoute == nullptr) {
+ auto parent = findParent(prefix);
+ if (parent) {
+ existingRoute = find(parent->getName(), route);
+ }
+ }
+
+ return existingRoute;
+}
+
void
Rib::insert(const Name& prefix, const Route& route)
{
diff --git a/rib/rib.hpp b/rib/rib.hpp
index 5beea2d..a9278de 100644
--- a/rib/rib.hpp
+++ b/rib/rib.hpp
@@ -77,6 +77,9 @@
Route*
find(const Name& prefix, const Route& route) const;
+ Route*
+ findLongestPrefix(const Name& prefix, const Route& route) const;
+
const_iterator
begin() const;