diff options
author | Thomas Haller <thaller@redhat.com> | 2016-07-07 18:38:50 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2016-07-07 18:39:05 +0200 |
commit | 57798f67d1b64295492d4ca19ab99f08f8e28082 (patch) | |
tree | fd865c2412f577680977ae65f3ae52a09275dbba | |
parent | d46205566820866a09a7405e661f4954ac5f7a31 (diff) | |
download | NetworkManager-th/rdisc-cleanup-bgo768521.tar.gz |
rdisc: preserve most-managed dhcp-level from multiple router advertisementsth/rdisc-cleanup-bgo768521
-rw-r--r-- | src/rdisc/nm-fake-rdisc.c | 8 | ||||
-rw-r--r-- | src/rdisc/nm-lndp-rdisc.c | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/src/rdisc/nm-fake-rdisc.c b/src/rdisc/nm-fake-rdisc.c index 043986277f..46f2b08cf1 100644 --- a/src/rdisc/nm-fake-rdisc.c +++ b/src/rdisc/nm-fake-rdisc.c @@ -238,11 +238,15 @@ receive_ra (gpointer user_data) NMRDiscConfigMap changed = 0; guint32 now = nm_utils_get_monotonic_timestamp_s (); guint i; + NMRDiscDHCPLevel dhcp_level; priv->receive_ra_id = 0; - if (rdata->public.dhcp_level != ra->dhcp_level) { - rdata->public.dhcp_level = ra->dhcp_level; + /* preserve the "most managed" level on updates. */ + dhcp_level = MAX (rdata->public.dhcp_level, ra->dhcp_level); + + if (rdata->public.dhcp_level != dhcp_level) { + rdata->public.dhcp_level = dhcp_level; changed |= NM_RDISC_CONFIG_DHCP_LEVEL; } diff --git a/src/rdisc/nm-lndp-rdisc.c b/src/rdisc/nm-lndp-rdisc.c index ff35f473f5..147995725e 100644 --- a/src/rdisc/nm-lndp-rdisc.c +++ b/src/rdisc/nm-lndp-rdisc.c @@ -152,6 +152,12 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data) else dhcp_level = NM_RDISC_DHCP_LEVEL_NONE; + /* when receiving multiple RA (possibly from different routers), + * let's keep the "most managed" level. */ + G_STATIC_ASSERT_EXPR (NM_RDISC_DHCP_LEVEL_MANAGED > NM_RDISC_DHCP_LEVEL_OTHERCONF); + G_STATIC_ASSERT_EXPR (NM_RDISC_DHCP_LEVEL_OTHERCONF > NM_RDISC_DHCP_LEVEL_NONE); + dhcp_level = MAX (dhcp_level, rdata->public.dhcp_level); + if (dhcp_level != rdata->public.dhcp_level) { rdata->public.dhcp_level = dhcp_level; changed |= NM_RDISC_CONFIG_DHCP_LEVEL; |