rdisc: preserve most-managed dhcp-level from multiple router advertisements

This commit is contained in:
Thomas Haller
2016-07-07 18:38:50 +02:00
parent 0e07bbf968
commit a9524509e8
2 changed files with 12 additions and 2 deletions

View File

@@ -238,11 +238,15 @@ receive_ra (gpointer user_data)
NMRDiscConfigMap changed = 0; NMRDiscConfigMap changed = 0;
guint32 now = nm_utils_get_monotonic_timestamp_s (); guint32 now = nm_utils_get_monotonic_timestamp_s ();
guint i; guint i;
NMRDiscDHCPLevel dhcp_level;
priv->receive_ra_id = 0; priv->receive_ra_id = 0;
if (rdata->public.dhcp_level != ra->dhcp_level) { /* preserve the "most managed" level on updates. */
rdata->public.dhcp_level = ra->dhcp_level; 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; changed |= NM_RDISC_CONFIG_DHCP_LEVEL;
} }

View File

@@ -152,6 +152,12 @@ receive_ra (struct ndp *ndp, struct ndp_msg *msg, gpointer user_data)
else else
dhcp_level = NM_RDISC_DHCP_LEVEL_NONE; 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) { if (dhcp_level != rdata->public.dhcp_level) {
rdata->public.dhcp_level = dhcp_level; rdata->public.dhcp_level = dhcp_level;
changed |= NM_RDISC_CONFIG_DHCP_LEVEL; changed |= NM_RDISC_CONFIG_DHCP_LEVEL;