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;