No longer set capture flag on advertised prefixes

Previously, all registered routes from NLSR would have
the capture flag set. This is desirable for some application
prefixes but does not necessarily make sense for advertised
prefixes as a whole.

Refs: #5360
Change-Id: If7e0f8e7d03aada18db9db4408f8d4167970e659
diff --git a/src/route/name-prefix-table.cpp b/src/route/name-prefix-table.cpp
index ea4fc16..ba521ba 100644
--- a/src/route/name-prefix-table.cpp
+++ b/src/route/name-prefix-table.cpp
@@ -78,7 +78,8 @@
       for (const auto &prefix : nlsa->getNpl().getPrefixInfo()) {
         if (prefix.getName() != m_ownRouterName) {
           m_nexthopCost[DestNameKey(lsa->getOriginRouter(), prefix.getName())] = prefix.getCost();
-          addEntry(prefix.getName(), lsa->getOriginRouter());
+          // Don't use capture flag on advertised prefixes...
+          addEntry(prefix.getName(), lsa->getOriginRouter(), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
         }
       }
     }
@@ -91,7 +92,8 @@
     for (const auto &prefix : namesToAdd) {
       if (prefix.getName() != m_ownRouterName) {
         m_nexthopCost[DestNameKey(lsa->getOriginRouter(), prefix.getName())] = prefix.getCost();
-        addEntry(prefix.getName(), lsa->getOriginRouter());
+        // Don't use capture flag on advertised prefixes...
+        addEntry(prefix.getName(), lsa->getOriginRouter(), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
       }
     }
 
@@ -129,7 +131,7 @@
 }
 
 void
-NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
+NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter, uint64_t routeFlags)
 {
   // Check if the advertised name prefix is in the table already.
   auto nameItr = std::find_if(m_table.begin(), m_table.end(),
@@ -169,7 +171,8 @@
   if (nameItr == m_table.end()) {
     NLSR_LOG_DEBUG("Adding origin: " << rtpePtr->getDestination()
                    << " to a new name prefix: " << name);
-    npte = std::make_shared<NamePrefixTableEntry>(name);
+
+    npte = std::make_shared<NamePrefixTableEntry>(name, ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
     npte->addRoutingTableEntry(rtpePtr);
     npte->generateNhlfromRteList();
     m_table.push_back(npte);
@@ -177,7 +180,7 @@
     // 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_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter));
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
     // The routing table may recalculate and add a routing table entry
     // with no next hops to replace an existing routing table entry. In
@@ -193,13 +196,16 @@
   else {
     npte = *nameItr;
     NLSR_LOG_TRACE("Adding origin: " << rtpePtr->getDestination() <<
-                   " to existing prefix: " << **nameItr);
-    (*nameItr)->addRoutingTableEntry(rtpePtr);
-    (*nameItr)->generateNhlfromRteList();
-
-    if ((*nameItr)->getNexthopList().size() > 0) {
-      NLSR_LOG_TRACE("Updating FIB with next hops for " << (**nameItr));
-      m_fib.update(name, adjustNexthopCosts((*nameItr)->getNexthopList(), name, destRouter));
+                   " to existing prefix: " << *npte);
+    // We should not downgrade the capture flag to child-inherit unless there are no nexthops
+    if (npte->getFlags() != routeFlags && npte->getNexthopList().size() == 0) {
+      npte->setFlags(routeFlags);
+    }
+    npte->addRoutingTableEntry(rtpePtr);
+    npte->generateNhlfromRteList();
+    if (npte->getNexthopList().size() > 0) {
+      NLSR_LOG_TRACE("Updating FIB with next hops for " << *npte);
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
     else {
       NLSR_LOG_TRACE(npte->getNamePrefix() << " has no next hops; removing from FIB");
@@ -233,12 +239,13 @@
   auto nameItr = std::find_if(m_table.begin(), m_table.end(),
                               [&] (const auto& entry) { return entry->getNamePrefix() == name; });
   if (nameItr != m_table.end()) {
+    std::shared_ptr<NamePrefixTableEntry> npte = *nameItr;
     NLSR_LOG_TRACE("Removing origin: " << rtpePtr->getDestination()
                    << " from prefix: " << **nameItr);
 
     // Rather than iterating through the whole list periodically, just
     // delete them here if they have no references.
-    if ((*nameItr)->removeRoutingTableEntry(rtpePtr) == 0) {
+    if (npte->removeRoutingTableEntry(rtpePtr) == 0) {
       deleteRtpeFromPool(rtpePtr);
     }
 
@@ -257,17 +264,17 @@
     //   Prefix Table. Once a new Name LSA advertises this prefix, a
     //   new entry for the prefix will be created.
     //
-    if ((*nameItr)->getRteListSize() == 0) {
-      NLSR_LOG_TRACE(**nameItr << " has no routing table entries;"
+    if (npte->getRteListSize() == 0) {
+      NLSR_LOG_TRACE(*npte << " has no routing table entries;"
                      << " removing from table and FIB");
       m_table.erase(nameItr);
       m_fib.remove(name);
     }
     else {
-      NLSR_LOG_TRACE(**nameItr << " has other routing table entries;"
+      NLSR_LOG_TRACE(*npte << " has other routing table entries;"
                      << " updating FIB with next hops");
       (*nameItr)->generateNhlfromRteList();
-      m_fib.update(name, adjustNexthopCosts((*nameItr)->getNexthopList(), name, destRouter));
+      m_fib.update(name, adjustNexthopCosts(npte->getNexthopList(), name, destRouter), npte->getFlags());
     }
   }
   else {
@@ -295,7 +302,7 @@
       poolEntry->setNexthopList(sourceEntry->getNexthopList());
       for (const auto& nameEntry : poolEntry->namePrefixTableEntries) {
         auto nameEntryFullPtr = nameEntry.second.lock();
-        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination());
+        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination(), nameEntryFullPtr->getFlags());
       }
     }
     else if (sourceEntry == entries.end()) {
@@ -303,7 +310,7 @@
       poolEntry->getNexthopList().clear();
       for (const auto& nameEntry : poolEntry->namePrefixTableEntries) {
         auto nameEntryFullPtr = nameEntry.second.lock();
-        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination());
+        addEntry(nameEntryFullPtr->getNamePrefix(), poolEntry->getDestination(), nameEntryFullPtr->getFlags());
       }
     }
     else {