From b4bd3d635982df5bdbc93287e0cc7f1fa53c6e6e Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Wed, 3 Sep 2014 07:35:30 +0200 Subject: [PATCH 1/4] ipv6: added address,prefix,nduseropt event tracers Moved debug dumps from event processing code to explicit trace functions usable as event callback handlers. --- include/wicked/netinfo.h | 3 ++ src/ifevent.c | 85 ++++++++++++++++++++++++++++------------ 2 files changed, 63 insertions(+), 25 deletions(-) diff --git a/include/wicked/netinfo.h b/include/wicked/netinfo.h index 6a505495d..701ece9e6 100644 --- a/include/wicked/netinfo.h +++ b/include/wicked/netinfo.h @@ -119,6 +119,9 @@ extern int ni_server_enable_interface_addr_events(void (*handler)(ni_netdev_t * extern int ni_server_enable_interface_prefix_events(void (*handler)(ni_netdev_t *, ni_event_t, const ni_ipv6_ra_pinfo_t *)); extern int ni_server_enable_interface_nduseropt_events(void (*handler)(ni_netdev_t *, ni_event_t)); extern int ni_server_enable_interface_uevents(void); +extern void ni_server_trace_interface_addr_events(ni_netdev_t *, ni_event_t, const ni_address_t *); +extern void ni_server_trace_interface_prefix_events(ni_netdev_t *, ni_event_t, const ni_ipv6_ra_pinfo_t *); +extern void ni_server_trace_interface_nduseropt_events(ni_netdev_t *, ni_event_t); extern void ni_server_deactivate_interface_events(void); extern void ni_server_deactivate_interface_uevents(void); extern ni_bool_t ni_server_listens_uevents(void); diff --git a/src/ifevent.c b/src/ifevent.c index 11b2bac80..21de2f1f3 100644 --- a/src/ifevent.c +++ b/src/ifevent.c @@ -370,16 +370,6 @@ __ni_rtevent_newprefix(ni_netconfig_t *nc, const struct sockaddr_nl *nladdr, str free(pi); return -1; } -#if 0 - ni_debug_verbose(NI_LOG_DEBUG3, NI_TRACE_EVENTS, - "%s: RA<%s>, Prefix<%s/%u %s,%s>[%u, %u]", dev->name, - (ipv6->radv.managed_addr ? "managed-address" : - (ipv6->radv.other_config ? "other-config" : "unmanaged")), - ni_sockaddr_print(&pi->prefix), pi->length, - (pi->on_link ? "onlink" : "not-onlink"), - (pi->autoconf ? "autoconf" : "no-autoconf"), - pi->lifetime.preferred_lft, pi->lifetime.valid_lft); -#endif if ((old = ni_ipv6_ra_pinfo_list_remove(&ipv6->radv.pinfo, pi)) != NULL) { if (pi->lifetime.valid_lft > 0) { @@ -486,26 +476,12 @@ __ni_rtevent_process_rdnss_info(ni_netdev_t *dev, const struct nd_opt_hdr *opt, ni_ipv6_ra_rdnss_reset(ipv6->radv.rdnss); ipv6->radv.rdnss->lifetime = ntohl(rdnss->nd_opt_rdnss_lifetime); - if (ipv6->radv.rdnss->lifetime == 0xffffffff) - ni_debug_events("%s: rdnss lifetime: infinite", dev->name); - else - ni_debug_events("%s: rdnss lifetime: %u", dev->name, - ipv6->radv.rdnss->lifetime); - len -= sizeof(*rdnss); addr = &rdnss->nd_opt_rdnss_addr[0]; for ( ; len >= sizeof(*addr); len -= sizeof(*addr), ++addr) { if (IN6_IS_ADDR_LOOPBACK(addr) || IN6_IS_ADDR_UNSPECIFIED(addr)) continue; - ni_ipv6_ra_rdnss_add_server(ipv6->radv.rdnss, addr); - - if (ni_log_facility(NI_TRACE_EVENTS)) { - const ni_sockaddr_array_t *addrs = &ipv6->radv.rdnss->addrs; - - ni_debug_events("%s: rdnss address: %s", dev->name, - ni_sockaddr_print(&addrs->data[addrs->count-1])); - } } __ni_netdev_nduseropt_event(dev, NI_EVENT_RDNSS_UPDATE); return 0; @@ -544,7 +520,8 @@ __ni_rtevent_process_nd_radv_opts(ni_netdev_t *dev, const struct nd_opt_hdr *opt default: /* kernels up to at least 3.4 do not provide other */ - ni_debug_events("%s: unhandled nd user option %d", + ni_debug_verbose(NI_LOG_DEBUG1, NI_TRACE_IPV6|NI_TRACE_EVENTS, + "%s: unhandled nd user option %d", dev->name, opt->nd_opt_type); break; } @@ -747,6 +724,14 @@ ni_server_listen_interface_events(void (*ifevent_handler)(ni_netdev_t *, ni_even return 0; } +void +ni_server_trace_interface_addr_events(ni_netdev_t *dev, ni_event_t event, const ni_address_t *ap) +{ + ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, + "%s: %s event: %s", dev->name, ni_event_type_to_name(event), + ni_sockaddr_prefix_print(&ap->local_addr, ap->prefixlen)); +} + int ni_server_enable_interface_addr_events(void (*ifaddr_handler)(ni_netdev_t *, ni_event_t, const ni_address_t *)) { @@ -769,6 +754,20 @@ ni_server_enable_interface_addr_events(void (*ifaddr_handler)(ni_netdev_t *, ni_ return 0; } +void +ni_server_trace_interface_prefix_events(ni_netdev_t *dev, ni_event_t event, const ni_ipv6_ra_pinfo_t *pi) +{ + ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, + "%s: %s IPv6 RA<%s> Prefix<%s/%u %s,%s>[%u, %u]", dev->name, + (event == NI_EVENT_PREFIX_UPDATE ? "update" : "delete"), + (dev->ipv6 && dev->ipv6->radv.managed_addr ? "managed" : + (dev->ipv6 && dev->ipv6->radv.other_config ? "config" : "unmanaged")), + ni_sockaddr_print(&pi->prefix), pi->length, + (pi->on_link ? "onlink" : "not-onlink"), + (pi->autoconf ? "autoconf" : "no-autoconf"), + pi->lifetime.preferred_lft, pi->lifetime.valid_lft); +} + int ni_server_enable_interface_prefix_events(void (*ifprefix_handler)(ni_netdev_t *, ni_event_t, const ni_ipv6_ra_pinfo_t *)) { @@ -784,6 +783,42 @@ ni_server_enable_interface_prefix_events(void (*ifprefix_handler)(ni_netdev_t *, return 0; } +void +ni_server_trace_interface_nduseropt_events(ni_netdev_t *dev, ni_event_t event) +{ + ni_ipv6_devinfo_t *ipv6 = dev->ipv6; + + if (!ni_debug_guard(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS)) + return; + + switch (event) { + case NI_EVENT_RDNSS_UPDATE: + if (ipv6 && ipv6->radv.rdnss && ipv6->radv.rdnss->addrs.count) { + char lifetime[32] = "infinite"; + const char *rainfo; + unsigned int i; + + rainfo = ipv6->radv.managed_addr ? "managed" : + ipv6->radv.other_config ? "config" : "unmanaged"; + if (ipv6->radv.rdnss->lifetime != 0xffffffff) { + snprintf(lifetime, sizeof(lifetime), "%u", + ipv6->radv.rdnss->lifetime); + } + for (i = 0; i < ipv6->radv.rdnss->addrs.count; ++i) { + ni_trace("%s: update IPv6 RA<%s> RDNSS<%s>[%s]", + dev->name, rainfo, + ni_sockaddr_print(&ipv6->radv.rdnss->addrs.data[i]), + lifetime); + } + } + break; + default: + ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_IPV6|NI_TRACE_EVENTS, + "%s: IPv6 RA %s event: ", dev->name, ni_event_type_to_name(event)); + break; + } +} + int ni_server_enable_interface_nduseropt_events(void (*ifnduseropt_handler)(ni_netdev_t *, ni_event_t)) { From 0fcf8e32a0d77effeeea5a88ff28bafce30677a5 Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Wed, 3 Sep 2014 07:39:13 +0200 Subject: [PATCH 2/4] wickedd: enabled address,prefix,nduseropt events --- server/main.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/server/main.c b/server/main.c index cf6a58bd2..5f5fb6a89 100644 --- a/server/main.c +++ b/server/main.c @@ -85,6 +85,9 @@ static void run_interface_server(void); static void discover_state(ni_dbus_server_t *); static void recover_state(const char *filename); static void handle_interface_event(ni_netdev_t *, ni_event_t); +static void handle_interface_addr_events(ni_netdev_t *, ni_event_t, const ni_address_t *); +static void handle_interface_prefix_events(ni_netdev_t *, ni_event_t, const ni_ipv6_ra_pinfo_t *); +static void handle_interface_nduseropt_events(ni_netdev_t *, ni_event_t); static void handle_rfkill_event(ni_rfkill_type_t, ni_bool_t, void *); static void handle_other_event(ni_event_t); #ifdef MODEM @@ -240,6 +243,12 @@ run_interface_server(void) /* open global RTNL socket to listen for kernel events */ if (ni_server_listen_interface_events(handle_interface_event) < 0) ni_fatal("unable to initialize netlink listener"); + if (ni_server_enable_interface_addr_events(handle_interface_addr_events) < 0) + ni_fatal("unable to initialize netlink address listener"); + if (ni_server_enable_interface_prefix_events(handle_interface_prefix_events) < 0) + ni_fatal("unable to initialize netlink prefix listener"); + if (ni_server_enable_interface_nduseropt_events(handle_interface_nduseropt_events) < 0) + ni_fatal("unable to initialize netlink nduseropt listener"); if (ni_udev_net_subsystem_available()) { if (ni_server_enable_interface_uevents() < 0) @@ -421,6 +430,24 @@ handle_interface_event(ni_netdev_t *dev, ni_event_t event) } } +static void +handle_interface_addr_events(ni_netdev_t *dev, ni_event_t event, const ni_address_t *ap) +{ + ni_server_trace_interface_addr_events(dev, event, ap); +} + +static void +handle_interface_prefix_events(ni_netdev_t *dev, ni_event_t event, const ni_ipv6_ra_pinfo_t *pi) +{ + ni_server_trace_interface_prefix_events(dev, event, pi); +} + +static void +handle_interface_nduseropt_events(ni_netdev_t *dev, ni_event_t event) +{ + ni_server_trace_interface_nduseropt_events(dev, event); +} + static void handle_other_event(ni_event_t event) { From 5d35d8616262c083b8e9b501732d08d450321b4f Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Wed, 3 Sep 2014 07:40:33 +0200 Subject: [PATCH 3/4] dhcp6: try to start on device-change event in auto mode --- dhcp6/device.c | 24 ++++++++---------------- dhcp6/main.c | 1 + 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/dhcp6/device.c b/dhcp6/device.c index 74649034c..1540b6977 100644 --- a/dhcp6/device.c +++ b/dhcp6/device.c @@ -1125,6 +1125,13 @@ ni_dhcp6_device_event(ni_dhcp6_device_t *dev, ni_netdev_t *ifp, ni_event_t event } break; + case NI_EVENT_DEVICE_CHANGE: + if (dev->config && dev->config->mode == NI_DHCP6_MODE_AUTO) { + ni_dhcp6_device_update_mode(dev, ifp); + ni_dhcp6_device_start(dev); + } + break; + default: ni_debug_dhcp("%s: received other event", dev->ifname); break; @@ -1170,22 +1177,7 @@ void ni_dhcp6_prefix_event(ni_dhcp6_device_t *dev, ni_netdev_t *ifp, ni_event_t event, const ni_ipv6_ra_pinfo_t *pi) { - ni_ipv6_devinfo_t *ipv6; - - ipv6 = ni_netdev_get_ipv6(ifp); - if (ipv6 == NULL) - return; - - ni_debug_verbose(NI_LOG_DEBUG2, NI_TRACE_EVENTS, - "%s: %s RA<%s> Prefix<%s/%u %s,%s> [%d,%d]", dev->ifname, - (event == NI_EVENT_PREFIX_UPDATE ? "update" : "delete"), - (ipv6->radv.managed_addr ? "managed-address" : - (ipv6->radv.other_config ? "managed-config" : "unmanaged")), - ni_sockaddr_print(&pi->prefix), pi->length, - (pi->on_link ? "onlink" : "not-onlink"), - (pi->autoconf ? "autoconf" : "no-autoconf"), - pi->lifetime.preferred_lft, pi->lifetime.valid_lft); - + ni_server_trace_interface_prefix_events(ifp, event, pi); switch (event) { case NI_EVENT_PREFIX_UPDATE: if (dev->config && dev->config->mode == NI_DHCP6_MODE_AUTO) { diff --git a/dhcp6/main.c b/dhcp6/main.c index dd11e9b45..0c04763c2 100644 --- a/dhcp6/main.c +++ b/dhcp6/main.c @@ -547,6 +547,7 @@ dhcp6_interface_event(ni_netdev_t *ifp, ni_event_t event) dhcp6_device_destroy(dhcp6_dbus_server, ifp); break; + case NI_EVENT_DEVICE_CHANGE: case NI_EVENT_DEVICE_DOWN: case NI_EVENT_DEVICE_UP: case NI_EVENT_NETWORK_DOWN: From 22f04e9027cc6ff6275aa5d1b9a007e36067b6dc Mon Sep 17 00:00:00 2001 From: Marius Tomaschewski Date: Wed, 3 Sep 2014 10:09:59 +0200 Subject: [PATCH 4/4] address: expose flags via dbus and show in ifstatus --- client/ifstatus.c | 13 +++++----- include/wicked/address.h | 3 ++- schema/interface.xml | 4 +++ src/address.c | 56 ++++++++++++++++++++++++++++++++++++++++ src/dbus-objects/misc.c | 9 +++++++ src/ifevent.c | 10 +++++-- 6 files changed, 85 insertions(+), 10 deletions(-) diff --git a/client/ifstatus.c b/client/ifstatus.c index 3ad35e5b3..00af7c4cb 100644 --- a/client/ifstatus.c +++ b/client/ifstatus.c @@ -329,18 +329,17 @@ ni_ifstatus_show_addrs(const ni_netdev_t *dev, ni_bool_t verbose) ni_address_t *ap; for (ap = dev->addrs; ap; ap = ap->next) { - if (ni_address_is_duplicate(ap)) - continue; - if (ni_address_is_deprecated(ap)) + if (!ni_sockaddr_is_specified(&ap->local_addr)) continue; if (ni_address_is_linklocal(ap) && !verbose) continue; - if (!ni_sockaddr_is_specified(&ap->local_addr)) - continue; - if_printf("", "addr:", "%s %s/%u", + ni_address_format_flags(&buf, ap->family, ap->flags, "|"); + if_printf("", "addr:", "%s %s/%u%s%s", ni_addrfamily_type_to_name(ap->family), - ni_sockaddr_print(&ap->local_addr), ap->prefixlen); + ni_sockaddr_print(&ap->local_addr), ap->prefixlen, + buf.string ? " " : "", buf.string ? buf.string : ""); + ni_stringbuf_destroy(&buf); if (verbose) { if (ap->family == AF_INET) { diff --git a/include/wicked/address.h b/include/wicked/address.h index 7a6880c8b..b9e2ec9ff 100644 --- a/include/wicked/address.h +++ b/include/wicked/address.h @@ -93,11 +93,12 @@ extern unsigned int ni_af_address_prefixlen(int af); extern ni_address_t * ni_address_new(int af, unsigned int prefix_len, const ni_sockaddr_t *local_addr, ni_address_t **list); +extern void ni_address_free(ni_address_t *); +extern const char * ni_address_format_flags(ni_stringbuf_t *, unsigned int, unsigned int, const char *); extern void ni_address_list_append(ni_address_t **, ni_address_t *); extern void ni_address_list_destroy(ni_address_t **); extern void ni_address_list_dedup(ni_address_t **); extern ni_address_t * ni_address_list_find(ni_address_t *, const ni_sockaddr_t *); extern unsigned int ni_address_list_count(ni_address_t *list); -extern void ni_address_free(ni_address_t *); #endif /* __WICKED_ADDRESS_H__ */ diff --git a/schema/interface.xml b/schema/interface.xml index ccd5b94d0..4e29b9800 100644 --- a/schema/interface.xml +++ b/schema/interface.xml @@ -9,6 +9,10 @@ + + + +