summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-07-07 18:38:50 +0200
committerThomas Haller <thaller@redhat.com>2016-07-07 18:39:05 +0200
commit57798f67d1b64295492d4ca19ab99f08f8e28082 (patch)
treefd865c2412f577680977ae65f3ae52a09275dbba
parentd46205566820866a09a7405e661f4954ac5f7a31 (diff)
downloadNetworkManager-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.c8
-rw-r--r--src/rdisc/nm-lndp-rdisc.c6
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;