about summary refs log tree commit diff
path: root/src/ip6-manager/nm-ip6-manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ip6-manager/nm-ip6-manager.c')
-rw-r--r--src/ip6-manager/nm-ip6-manager.c63
1 files changed, 52 insertions, 11 deletions
diff --git a/src/ip6-manager/nm-ip6-manager.c b/src/ip6-manager/nm-ip6-manager.c
index 503dab51..99f85ede 100644
--- a/src/ip6-manager/nm-ip6-manager.c
+++ b/src/ip6-manager/nm-ip6-manager.c
@@ -91,7 +91,7 @@ typedef struct {
 
 	char *disable_ip6_path;
 	gboolean disable_ip6_save_valid;
-	guint32 disable_ip6_save;
+	gint32 disable_ip6_save;
 
 	guint finish_addrconf_id;
 	guint config_changed_id;
@@ -112,6 +112,14 @@ typedef struct {
 } NMIP6Device;
 
 static void
+clear_config_changed (NMIP6Device *device)
+{
+	if (device->config_changed_id)
+		g_source_remove (device->config_changed_id);
+	device->config_changed_id = 0;
+}
+
+static void
 nm_ip6_device_destroy (NMIP6Device *device)
 {
 	g_return_if_fail (device != NULL);
@@ -124,8 +132,9 @@ nm_ip6_device_destroy (NMIP6Device *device)
 
 	if (device->finish_addrconf_id)
 		g_source_remove (device->finish_addrconf_id);
-	if (device->config_changed_id)
-		g_source_remove (device->config_changed_id);
+
+	clear_config_changed (device);
+
 	g_free (device->iface);
 	if (device->rdnss_servers)
 		g_array_free (device->rdnss_servers, TRUE);
@@ -176,9 +185,10 @@ nm_ip6_device_new (NMIP6Manager *manager, int ifindex)
 	device->disable_ip6_path = g_strdup_printf ("/proc/sys/net/ipv6/conf/%s/disable_ipv6",
 	                                            device->iface);
 	g_assert (device->disable_ip6_path);
-	device->disable_ip6_save_valid = nm_utils_get_proc_sys_net_value (device->disable_ip6_path,
-	                                                                  device->iface,
-	                                                                  &device->disable_ip6_save);
+	device->disable_ip6_save_valid = nm_utils_get_proc_sys_net_value_with_bounds (device->disable_ip6_path,
+	                                                                              device->iface,
+	                                                                              &device->disable_ip6_save,
+	                                                                              0, 1);
 
 	return device;
 
@@ -267,6 +277,7 @@ rdnss_expired (gpointer user_data)
 	nm_log_dbg (LOGD_IP6, "(%s): IPv6 RDNSS information expired", device->iface);
 
 	set_rdnss_timeout (device);
+	clear_config_changed (device);
 	emit_config_changed (&info);
 	return FALSE;
 }
@@ -321,11 +332,12 @@ static gboolean
 dnssl_expired (gpointer user_data)
 {
 	NMIP6Device *device = user_data;
-	CallbackInfo info = { device, IP6_DHCP_OPT_NONE };
+	CallbackInfo info = { device, IP6_DHCP_OPT_NONE, FALSE };
 
 	nm_log_dbg (LOGD_IP6, "(%s): IPv6 DNSSL information expired", device->iface);
 
 	set_dnssl_timeout (device);
+	clear_config_changed (device);
 	emit_config_changed (&info);
 	return FALSE;
 }
@@ -434,8 +446,9 @@ nm_ip6_device_sync_from_netlink (NMIP6Device *device, gboolean config_changed)
 		addr = nl_addr_get_binary_addr (nladdr);
 
 		if (inet_ntop (AF_INET6, addr, buf, INET6_ADDRSTRLEN) > 0) {
-			nm_log_dbg (LOGD_IP6, "(%s): netlink address: %s",
-			            device->iface, buf);
+			nm_log_dbg (LOGD_IP6, "(%s): netlink address: %s/%d",
+			            device->iface, buf,
+			            rtnl_addr_get_prefixlen (rtnladdr));
 		}
 
 		if (IN6_IS_ADDR_LINKLOCAL (addr)) {
@@ -972,6 +985,28 @@ static struct nla_policy link_prot_policy[IFLA_INET6_MAX + 1] = {
 	[IFLA_INET6_FLAGS]	= { .type = NLA_U32 },
 };
 
+static char *
+ra_flags_to_string (guint32 ra_flags)
+{
+	GString *s = g_string_sized_new (20);
+
+	g_string_append (s, " (");
+	if (ra_flags & IF_RS_SENT)
+		g_string_append_c (s, 'S');
+
+	if (ra_flags & IF_RA_RCVD)
+		g_string_append_c (s, 'R');
+
+	if (ra_flags & IF_RA_OTHERCONF)
+		g_string_append_c (s, 'O');
+
+	if (ra_flags & IF_RA_MANAGED)
+		g_string_append_c (s, 'M');
+
+	g_string_append_c (s, ')');
+	return g_string_free (s, FALSE);
+}
+
 static NMIP6Device *
 process_newlink (NMIP6Manager *manager, struct nl_msg *msg)
 {
@@ -981,6 +1016,7 @@ process_newlink (NMIP6Manager *manager, struct nl_msg *msg)
 	struct nlattr *tb[IFLA_MAX + 1];
 	struct nlattr *pi[IFLA_INET6_MAX + 1];
 	int err;
+	char *flags_str = NULL;
 
 	/* FIXME: we have to do this manually for now since libnl doesn't yet
 	 * support the IFLA_PROTINFO attribute of NEWLINK messages.  When it does,
@@ -1024,7 +1060,12 @@ process_newlink (NMIP6Manager *manager, struct nl_msg *msg)
 	}
 
 	device->ra_flags = nla_get_u32 (pi[IFLA_INET6_FLAGS]);
-	nm_log_dbg (LOGD_IP6, "(%s): got IPv6 flags 0x%X", device->iface, device->ra_flags);
+
+	if (nm_logging_level_enabled (LOGL_DEBUG))
+		flags_str = ra_flags_to_string (device->ra_flags);
+	nm_log_dbg (LOGD_IP6, "(%s): got IPv6 flags 0x%X%s",
+	            device->iface, device->ra_flags, flags_str ? flags_str : "");
+	g_free (flags_str);
 
 	return device;
 }
@@ -1038,7 +1079,7 @@ netlink_notification (NMNetlinkMonitor *monitor, struct nl_msg *msg, gpointer us
 	gboolean config_changed = FALSE;
 
 	hdr = nlmsg_hdr (msg);
-	nm_log_dbg (LOGD_HW, "netlink notificate type %d", hdr->nlmsg_type);
+	nm_log_dbg (LOGD_HW, "netlink event type %d", hdr->nlmsg_type);
 	switch (hdr->nlmsg_type) {
 	case RTM_NEWADDR:
 	case RTM_DELADDR: