|
@@ -2220,43 +2220,21 @@ ok:
|
|
|
else
|
|
|
stored_lft = 0;
|
|
|
if (!update_lft && !create && stored_lft) {
|
|
|
- if (valid_lft > MIN_VALID_LIFETIME ||
|
|
|
- valid_lft > stored_lft)
|
|
|
- update_lft = 1;
|
|
|
- else if (stored_lft <= MIN_VALID_LIFETIME) {
|
|
|
- /* valid_lft <= stored_lft is always true */
|
|
|
- /*
|
|
|
- * RFC 4862 Section 5.5.3e:
|
|
|
- * "Note that the preferred lifetime of
|
|
|
- * the corresponding address is always
|
|
|
- * reset to the Preferred Lifetime in
|
|
|
- * the received Prefix Information
|
|
|
- * option, regardless of whether the
|
|
|
- * valid lifetime is also reset or
|
|
|
- * ignored."
|
|
|
- *
|
|
|
- * So if the preferred lifetime in
|
|
|
- * this advertisement is different
|
|
|
- * than what we have stored, but the
|
|
|
- * valid lifetime is invalid, just
|
|
|
- * reset prefered_lft.
|
|
|
- *
|
|
|
- * We must set the valid lifetime
|
|
|
- * to the stored lifetime since we'll
|
|
|
- * be updating the timestamp below,
|
|
|
- * else we'll set it back to the
|
|
|
- * minimum.
|
|
|
- */
|
|
|
- if (prefered_lft != ifp->prefered_lft) {
|
|
|
- valid_lft = stored_lft;
|
|
|
- update_lft = 1;
|
|
|
- }
|
|
|
- } else {
|
|
|
- valid_lft = MIN_VALID_LIFETIME;
|
|
|
- if (valid_lft < prefered_lft)
|
|
|
- prefered_lft = valid_lft;
|
|
|
- update_lft = 1;
|
|
|
- }
|
|
|
+ const u32 minimum_lft = min(
|
|
|
+ stored_lft, (u32)MIN_VALID_LIFETIME);
|
|
|
+ valid_lft = max(valid_lft, minimum_lft);
|
|
|
+
|
|
|
+ /* RFC4862 Section 5.5.3e:
|
|
|
+ * "Note that the preferred lifetime of the
|
|
|
+ * corresponding address is always reset to
|
|
|
+ * the Preferred Lifetime in the received
|
|
|
+ * Prefix Information option, regardless of
|
|
|
+ * whether the valid lifetime is also reset or
|
|
|
+ * ignored."
|
|
|
+ *
|
|
|
+ * So we should always update prefered_lft here.
|
|
|
+ */
|
|
|
+ update_lft = 1;
|
|
|
}
|
|
|
|
|
|
if (update_lft) {
|