From a9524509e8737f93f7ab78509367efca406539b0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 7 Jul 2016 18:38:50 +0200 Subject: rdisc: preserve most-managed dhcp-level from multiple router advertisements --- src/rdisc/nm-fake-rdisc.c | 8 ++++++-- 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 868dacb46d..12c2e30d94 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; -- cgit v1.2.1