@@ -78,7 +78,8 @@ NamePrefixTable::updateFromLsdb(std::shared_ptr<Lsa> lsa, LsdbUpdate updateType,
7878 for (const auto &prefix : nlsa->getNpl ().getPrefixInfo ()) {
7979 if (prefix.getName () != m_ownRouterName) {
8080 m_nexthopCost[DestNameKey (lsa->getOriginRouter (), prefix.getName ())] = prefix.getCost ();
81- addEntry (prefix.getName (), lsa->getOriginRouter ());
81+ // Don't use capture flag on advertised prefixes...
82+ addEntry (prefix.getName (), lsa->getOriginRouter (), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
8283 }
8384 }
8485 }
@@ -91,7 +92,8 @@ NamePrefixTable::updateFromLsdb(std::shared_ptr<Lsa> lsa, LsdbUpdate updateType,
9192 for (const auto &prefix : namesToAdd) {
9293 if (prefix.getName () != m_ownRouterName) {
9394 m_nexthopCost[DestNameKey (lsa->getOriginRouter (), prefix.getName ())] = prefix.getCost ();
94- addEntry (prefix.getName (), lsa->getOriginRouter ());
95+ // Don't use capture flag on advertised prefixes...
96+ addEntry (prefix.getName (), lsa->getOriginRouter (), ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
9597 }
9698 }
9799
@@ -129,7 +131,7 @@ NamePrefixTable::adjustNexthopCosts(const NexthopList& nhlist, const ndn::Name&
129131}
130132
131133void
132- NamePrefixTable::addEntry (const ndn::Name& name, const ndn::Name& destRouter)
134+ NamePrefixTable::addEntry (const ndn::Name& name, const ndn::Name& destRouter, uint64_t routeFlags )
133135{
134136 // Check if the advertised name prefix is in the table already.
135137 auto nameItr = std::find_if (m_table.begin (), m_table.end (),
@@ -169,15 +171,16 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
169171 if (nameItr == m_table.end ()) {
170172 NLSR_LOG_DEBUG (" Adding origin: " << rtpePtr->getDestination ()
171173 << " to a new name prefix: " << name);
172- npte = std::make_shared<NamePrefixTableEntry>(name);
174+
175+ npte = std::make_shared<NamePrefixTableEntry>(name, ndn::nfd::ROUTE_FLAG_CHILD_INHERIT);
173176 npte->addRoutingTableEntry (rtpePtr);
174177 npte->generateNhlfromRteList ();
175178 m_table.push_back (npte);
176179
177180 // If this entry has next hops, we need to inform the FIB
178181 if (npte->getNexthopList ().size () > 0 ) {
179182 NLSR_LOG_TRACE (" Updating FIB with next hops for " << npte->getNamePrefix ());
180- m_fib.update (name, adjustNexthopCosts (npte->getNexthopList (), name, destRouter));
183+ m_fib.update (name, adjustNexthopCosts (npte->getNexthopList (), name, destRouter), npte-> getFlags () );
181184 }
182185 // The routing table may recalculate and add a routing table entry
183186 // with no next hops to replace an existing routing table entry. In
@@ -193,13 +196,16 @@ NamePrefixTable::addEntry(const ndn::Name& name, const ndn::Name& destRouter)
193196 else {
194197 npte = *nameItr;
195198 NLSR_LOG_TRACE (" Adding origin: " << rtpePtr->getDestination () <<
196- " to existing prefix: " << **nameItr);
197- (*nameItr)->addRoutingTableEntry (rtpePtr);
198- (*nameItr)->generateNhlfromRteList ();
199-
200- if ((*nameItr)->getNexthopList ().size () > 0 ) {
201- NLSR_LOG_TRACE (" Updating FIB with next hops for " << (**nameItr));
202- m_fib.update (name, adjustNexthopCosts ((*nameItr)->getNexthopList (), name, destRouter));
199+ " to existing prefix: " << *npte);
200+ // We should not downgrade the capture flag to child-inherit unless there are no nexthops
201+ if (npte->getFlags () != routeFlags && npte->getNexthopList ().size () == 0 ) {
202+ npte->setFlags (routeFlags);
203+ }
204+ npte->addRoutingTableEntry (rtpePtr);
205+ npte->generateNhlfromRteList ();
206+ if (npte->getNexthopList ().size () > 0 ) {
207+ NLSR_LOG_TRACE (" Updating FIB with next hops for " << *npte);
208+ m_fib.update (name, adjustNexthopCosts (npte->getNexthopList (), name, destRouter), npte->getFlags ());
203209 }
204210 else {
205211 NLSR_LOG_TRACE (npte->getNamePrefix () << " has no next hops; removing from FIB" );
@@ -233,12 +239,13 @@ NamePrefixTable::removeEntry(const ndn::Name& name, const ndn::Name& destRouter)
233239 auto nameItr = std::find_if (m_table.begin (), m_table.end (),
234240 [&] (const auto & entry) { return entry->getNamePrefix () == name; });
235241 if (nameItr != m_table.end ()) {
242+ std::shared_ptr<NamePrefixTableEntry> npte = *nameItr;
236243 NLSR_LOG_TRACE (" Removing origin: " << rtpePtr->getDestination ()
237244 << " from prefix: " << **nameItr);
238245
239246 // Rather than iterating through the whole list periodically, just
240247 // delete them here if they have no references.
241- if ((*nameItr) ->removeRoutingTableEntry (rtpePtr) == 0 ) {
248+ if (npte ->removeRoutingTableEntry (rtpePtr) == 0 ) {
242249 deleteRtpeFromPool (rtpePtr);
243250 }
244251
@@ -257,17 +264,17 @@ NamePrefixTable::removeEntry(const ndn::Name& name, const ndn::Name& destRouter)
257264 // Prefix Table. Once a new Name LSA advertises this prefix, a
258265 // new entry for the prefix will be created.
259266 //
260- if ((*nameItr) ->getRteListSize () == 0 ) {
261- NLSR_LOG_TRACE (**nameItr << " has no routing table entries;"
267+ if (npte ->getRteListSize () == 0 ) {
268+ NLSR_LOG_TRACE (*npte << " has no routing table entries;"
262269 << " removing from table and FIB" );
263270 m_table.erase (nameItr);
264271 m_fib.remove (name);
265272 }
266273 else {
267- NLSR_LOG_TRACE (**nameItr << " has other routing table entries;"
274+ NLSR_LOG_TRACE (*npte << " has other routing table entries;"
268275 << " updating FIB with next hops" );
269276 (*nameItr)->generateNhlfromRteList ();
270- m_fib.update (name, adjustNexthopCosts ((*nameItr) ->getNexthopList (), name, destRouter));
277+ m_fib.update (name, adjustNexthopCosts (npte ->getNexthopList (), name, destRouter), npte-> getFlags ( ));
271278 }
272279 }
273280 else {
@@ -295,15 +302,15 @@ NamePrefixTable::updateWithNewRoute(const std::list<RoutingTableEntry>& entries)
295302 poolEntry->setNexthopList (sourceEntry->getNexthopList ());
296303 for (const auto & nameEntry : poolEntry->namePrefixTableEntries ) {
297304 auto nameEntryFullPtr = nameEntry.second .lock ();
298- addEntry (nameEntryFullPtr->getNamePrefix (), poolEntry->getDestination ());
305+ addEntry (nameEntryFullPtr->getNamePrefix (), poolEntry->getDestination (), nameEntryFullPtr-> getFlags () );
299306 }
300307 }
301308 else if (sourceEntry == entries.end ()) {
302309 NLSR_LOG_DEBUG (" Routing entry: " << poolEntry->getDestination () << " now has no next-hops." );
303310 poolEntry->getNexthopList ().clear ();
304311 for (const auto & nameEntry : poolEntry->namePrefixTableEntries ) {
305312 auto nameEntryFullPtr = nameEntry.second .lock ();
306- addEntry (nameEntryFullPtr->getNamePrefix (), poolEntry->getDestination ());
313+ addEntry (nameEntryFullPtr->getNamePrefix (), poolEntry->getDestination (), nameEntryFullPtr-> getFlags () );
307314 }
308315 }
309316 else {
0 commit comments