diff options
Diffstat (limited to 'src/ip6-manager/nm-ip6-manager.c')
| -rw-r--r-- | src/ip6-manager/nm-ip6-manager.c | 63 |
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: |