summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-04-21 08:37:03 +0200
committerThomas Haller <thaller@redhat.com>2020-06-15 07:59:50 +0200
commit8b7f0c460667f7a846a7930c07f2eb3608858e15 (patch)
treed0fefc1dcb653533d03bac418b69996268e7c249
parentecf32c2c8f8c97d64f0794e0c64c80ef05293ffc (diff)
downloadNetworkManager-8b7f0c460667f7a846a7930c07f2eb3608858e15.tar.gz
Revert "IPv6 SLAAC: Honor small PIO Valid Lifetimes"
This reverts commit 2da092b5922b823b51ec5ff5ad6e8d6d41c82a69. (cherry picked from commit a88be01da2c06203defd1b63b7f74f117daea401)
-rw-r--r--src/ndisc/nm-ndisc.c39
-rw-r--r--src/ndisc/tests/test-ndisc-fake.c5
2 files changed, 26 insertions, 18 deletions
diff --git a/src/ndisc/nm-ndisc.c b/src/ndisc/nm-ndisc.c
index bb3a92b05d..5e556084e8 100644
--- a/src/ndisc/nm-ndisc.c
+++ b/src/ndisc/nm-ndisc.c
@@ -442,15 +442,8 @@ nm_ndisc_add_address (NMNDisc *ndisc,
}
if (existing) {
- /* A Valid Lifetime of 0 eliminates the corresponding address(es). This deviates
- * from RFC4862 Section 5.5.3, item e), as recommended in IETF draft draft-gont-6man-slaac-renum.
- */
- if (new->lifetime == 0) {
- g_array_remove_index (rdata->addresses, i);
- return TRUE;
- }
-
if (from_ra) {
+ const gint32 NM_NDISC_PREFIX_LFT_MIN = 7200; /* seconds, RFC4862 5.5.3.e */
gint64 old_expiry_lifetime, old_expiry_preferred;
old_expiry_lifetime = get_expiry (existing);
@@ -459,16 +452,25 @@ nm_ndisc_add_address (NMNDisc *ndisc,
if (new->lifetime == NM_NDISC_INFINITY)
existing->lifetime = NM_NDISC_INFINITY;
else {
- gint64 new_lifetime;
+ gint64 new_lifetime, remaining_lifetime;
- /* Honor small valid lifetimes, as discussed in
- * draft-gont-6man-slaac-renum, to allow for more timelier
- * reaction to renumbering events. This deviates from
- * RFC4862 Section 5.5.3, item e).
- */
+ /* see RFC4862 5.5.3.e */
+ if (existing->lifetime == NM_NDISC_INFINITY)
+ remaining_lifetime = G_MAXINT64;
+ else
+ remaining_lifetime = ((gint64) existing->timestamp) + ((gint64) existing->lifetime) - ((gint64) now_s);
new_lifetime = ((gint64) new->timestamp) + ((gint64) new->lifetime) - ((gint64) now_s);
- existing->timestamp = now_s;
- existing->lifetime = CLAMP (new_lifetime, (gint64) 0, (gint64) (G_MAXUINT32 - 1));
+
+ if ( new_lifetime > (gint64) NM_NDISC_PREFIX_LFT_MIN
+ || new_lifetime > remaining_lifetime) {
+ existing->timestamp = now_s;
+ existing->lifetime = CLAMP (new_lifetime, (gint64) 0, (gint64) (G_MAXUINT32 - 1));
+ } else if (remaining_lifetime <= (gint64) NM_NDISC_PREFIX_LFT_MIN) {
+ /* keep the current lifetime. */
+ } else {
+ existing->timestamp = now_s;
+ existing->lifetime = NM_NDISC_PREFIX_LFT_MIN;
+ }
}
if (new->preferred == NM_NDISC_INFINITY) {
@@ -485,6 +487,11 @@ nm_ndisc_add_address (NMNDisc *ndisc,
|| old_expiry_preferred != get_expiry_preferred (existing);
}
+ if (new->lifetime == 0) {
+ g_array_remove_index (rdata->addresses, i);
+ return TRUE;
+ }
+
if ( get_expiry (existing) == get_expiry (new)
&& get_expiry_preferred (existing) == get_expiry_preferred (new))
return FALSE;
diff --git a/src/ndisc/tests/test-ndisc-fake.c b/src/ndisc/tests/test-ndisc-fake.c
index 7a5eea012d..91fe9802d7 100644
--- a/src/ndisc/tests/test-ndisc-fake.c
+++ b/src/ndisc/tests/test-ndisc-fake.c
@@ -217,8 +217,9 @@ test_everything_changed (NMNDisc *ndisc, const NMNDiscData *rdata, guint changed
g_assert_cmpint (rdata->gateways_n, ==, 1);
match_gateway (rdata, 0, "fe80::2", data->timestamp1, 10, NM_ICMPV6_ROUTER_PREF_MEDIUM);
- g_assert_cmpint (rdata->addresses_n, ==, 1);
- match_address (rdata, 0, "2001:db8:a:b::1", data->timestamp1, 10, 10);
+ g_assert_cmpint (rdata->addresses_n, ==, 2);
+ match_address (rdata, 0, "2001:db8:a:a::1", data->timestamp1, 10, 0);
+ match_address (rdata, 1, "2001:db8:a:b::1", data->timestamp1, 10, 10);
g_assert_cmpint (rdata->routes_n, ==, 1);
match_route (rdata, 0, "2001:db8:a:b::", 64, "fe80::2", data->timestamp1, 10, 10);
g_assert_cmpint (rdata->dns_servers_n, ==, 1);