|
@@ -1916,8 +1916,32 @@ ok:
|
|
update_lft = 1;
|
|
update_lft = 1;
|
|
else if (stored_lft <= MIN_VALID_LIFETIME) {
|
|
else if (stored_lft <= MIN_VALID_LIFETIME) {
|
|
/* valid_lft <= stored_lft is always true */
|
|
/* valid_lft <= stored_lft is always true */
|
|
- /* XXX: IPsec */
|
|
|
|
- update_lft = 0;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * 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
|
|
|
|
+ * minumum.
|
|
|
|
+ */
|
|
|
|
+ if (prefered_lft != ifp->prefered_lft) {
|
|
|
|
+ valid_lft = stored_lft;
|
|
|
|
+ update_lft = 1;
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
valid_lft = MIN_VALID_LIFETIME;
|
|
valid_lft = MIN_VALID_LIFETIME;
|
|
if (valid_lft < prefered_lft)
|
|
if (valid_lft < prefered_lft)
|
|
@@ -3085,7 +3109,7 @@ restart:
|
|
spin_unlock(&ifp->lock);
|
|
spin_unlock(&ifp->lock);
|
|
continue;
|
|
continue;
|
|
} else if (age >= ifp->prefered_lft) {
|
|
} else if (age >= ifp->prefered_lft) {
|
|
- /* jiffies - ifp->tsamp > age >= ifp->prefered_lft */
|
|
|
|
|
|
+ /* jiffies - ifp->tstamp > age >= ifp->prefered_lft */
|
|
int deprecate = 0;
|
|
int deprecate = 0;
|
|
|
|
|
|
if (!(ifp->flags&IFA_F_DEPRECATED)) {
|
|
if (!(ifp->flags&IFA_F_DEPRECATED)) {
|