Don't build Adjacency LSA when destroyed face belongs to INACTIVE node
refs: #2733
Change-Id: I2a53bce876486980b380e9d8226b410bc754b034
diff --git a/src/nlsr.cpp b/src/nlsr.cpp
index 5d40002..2d58b19 100644
--- a/src/nlsr.cpp
+++ b/src/nlsr.cpp
@@ -296,13 +296,28 @@
_LOG_DEBUG("Face to " << adjacent->getName() << " with face id: " << faceId << " destroyed");
adjacent->setFaceId(0);
- adjacent->setStatus(Adjacent::STATUS_INACTIVE);
- // A new adjacency LSA cannot be built until the neighbor is marked INACTIVE and
- // has met the HELLO retry threshold
- adjacent->setInterestTimedOutNo(m_confParam.getInterestRetryNumber());
+ // Only trigger an Adjacency LSA build if this node is changing from ACTIVE to INACTIVE
+ // since this rebuild will effectively cancel the previous Adjacency LSA refresh event
+ // and schedule a new one further in the future.
+ //
+ // Continuously scheduling the refresh in the future will block the router from refreshing
+ // its Adjacency LSA. Since other routers' Name prefixes' expiration times are updated
+ // when this router refreshes its Adjacency LSA, the other routers' prefixes will expire
+ // and be removed from the RIB.
+ //
+ // This check is required to fix Bug #2733 for now. This check would be unnecessary
+ // to fix Bug #2733 when Issue #2732 is completed, but the check also helps with
+ // optimization so it can remain even when Issue #2732 is implemented.
+ if (adjacent->getStatus() == Adjacent::STATUS_ACTIVE) {
+ adjacent->setStatus(Adjacent::STATUS_INACTIVE);
- m_nlsrLsdb.scheduleAdjLsaBuild();
+ // A new adjacency LSA cannot be built until the neighbor is marked INACTIVE and
+ // has met the HELLO retry threshold
+ adjacent->setInterestTimedOutNo(m_confParam.getInterestRetryNumber());
+
+ m_nlsrLsdb.scheduleAdjLsaBuild();
+ }
}
}
}