about summary refs log tree commit diff
path: root/src/rdisc/nm-fake-rdisc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rdisc/nm-fake-rdisc.c')
-rw-r--r--src/rdisc/nm-fake-rdisc.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/src/rdisc/nm-fake-rdisc.c b/src/rdisc/nm-fake-rdisc.c
index 6a1585b3..46f2b08c 100644
--- a/src/rdisc/nm-fake-rdisc.c
+++ b/src/rdisc/nm-fake-rdisc.c
@@ -233,15 +233,20 @@ receive_ra (gpointer user_data)
 	NMFakeRDisc *self = user_data;
 	NMFakeRDiscPrivate *priv = NM_FAKE_RDISC_GET_PRIVATE (self);
 	NMRDisc *rdisc = NM_RDISC (self);
+	NMRDiscDataInternal *rdata = rdisc->rdata;
 	FakeRa *ra = priv->ras->data;
 	NMRDiscConfigMap changed = 0;
 	guint32 now = nm_utils_get_monotonic_timestamp_s ();
 	guint i;
+	NMRDiscDHCPLevel dhcp_level;
 
 	priv->receive_ra_id = 0;
 
-	if (rdisc->dhcp_level != ra->dhcp_level) {
-		rdisc->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;
 	}
 
@@ -263,6 +268,8 @@ receive_ra (gpointer user_data)
 			.preference = item->preference,
 		};
 
+		g_assert (route.plen > 0 && route.plen <= 128);
+
 		if (nm_rdisc_add_route (rdisc, &route))
 			changed |= NM_RDISC_CONFIG_ROUTES;
 
@@ -294,13 +301,13 @@ receive_ra (gpointer user_data)
 			changed |= NM_RDISC_CONFIG_DNS_DOMAINS;
 	}
 
-	if (rdisc->mtu != ra->mtu) {
-		rdisc->mtu = ra->mtu;
+	if (rdata->public.mtu != ra->mtu) {
+		rdata->public.mtu = ra->mtu;
 		changed |= NM_RDISC_CONFIG_MTU;
 	}
 
-	if (rdisc->hop_limit != ra->hop_limit) {
-		rdisc->hop_limit = ra->hop_limit;
+	if (rdata->public.hop_limit != ra->hop_limit) {
+		rdata->public.hop_limit = ra->hop_limit;
 		changed |= NM_RDISC_CONFIG_HOP_LIMIT;
 	}
 
@@ -344,15 +351,10 @@ nm_fake_rdisc_emit_new_ras (NMFakeRDisc *self)
 NMRDisc *
 nm_fake_rdisc_new (int ifindex, const char *ifname)
 {
-	NMRDisc *rdisc = g_object_new (NM_TYPE_FAKE_RDISC, NULL);
-
-	rdisc->ifindex = ifindex;
-	rdisc->ifname = g_strdup (ifname);
-	rdisc->max_addresses = NM_RDISC_MAX_ADDRESSES_DEFAULT;
-	rdisc->rtr_solicitations = NM_RDISC_RTR_SOLICITATIONS_DEFAULT;
-	rdisc->rtr_solicitation_interval = NM_RDISC_RTR_SOLICITATION_INTERVAL_DEFAULT;
-
-	return rdisc;
+	return g_object_new (NM_TYPE_FAKE_RDISC,
+	                     NM_RDISC_IFINDEX, ifindex,
+	                     NM_RDISC_IFNAME, ifname,
+	                     NULL);
 }
 
 static void
@@ -385,10 +387,10 @@ nm_fake_rdisc_class_init (NMFakeRDiscClass *klass)
 	rdisc_class->start = start;
 	rdisc_class->send_rs = send_rs;
 
-	signals[RS_SENT] = g_signal_new (
-			NM_FAKE_RDISC_RS_SENT,
-			G_OBJECT_CLASS_TYPE (klass),
-			G_SIGNAL_RUN_FIRST,
-			0,  NULL, NULL, NULL,
-			G_TYPE_NONE, 0);
+	signals[RS_SENT] =
+	    g_signal_new (NM_FAKE_RDISC_RS_SENT,
+	                  G_OBJECT_CLASS_TYPE (klass),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0,  NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 }