Use these functions in the code to simplify the logic. --- This is a possibly generically useful change.
Note that the code in __connman_inet_get_running_interfaces() was a bit confusing -- the code for the IPv6 case checked for a link-local address, not a loopback address as the comment said. Is that intentional or accidental? It's not obvious. src/connman.h | 2 ++ src/inet.c | 58 ++++++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/connman.h b/src/connman.h index 7b3265f..6214431 100644 --- a/src/connman.h +++ b/src/connman.h @@ -151,6 +151,7 @@ void __connman_task_cleanup(void); #include <connman/inet.h> +bool __connman_inet_is_addr_loopback(const struct sockaddr *addr); char **__connman_inet_get_running_interfaces(void); int __connman_inet_modify_address(int cmd, int flags, int index, int family, const char *address, @@ -166,6 +167,7 @@ int __connman_inet_get_interface_ll_address(int index, int family, void *address typedef void (*__connman_inet_rs_cb_t) (struct nd_router_advert *reply, unsigned int length, void *user_data); +bool __connman_inet_ipv6_is_addr_linklocal(const struct sockaddr *addr); int __connman_inet_ipv6_send_rs(int index, int timeout, __connman_inet_rs_cb_t callback, void *user_data); int __connman_inet_ipv6_send_ra(int index, struct in6_addr *src_addr, diff --git a/src/inet.c b/src/inet.c index e06d9c8..38d7230 100644 --- a/src/inet.c +++ b/src/inet.c @@ -2582,6 +2582,44 @@ bool connman_inet_check_hostname(const char *ptr, size_t len) return true; } +bool __connman_inet_ipv6_is_addr_linklocal(const struct sockaddr *addr) +{ + const struct in6_addr *addr6; + + switch (addr->sa_family) { + case AF_INET6: + addr6 = &((const struct sockaddr_in6 *)addr)->sin6_addr; + if (IN6_IS_ADDR_LINKLOCAL(addr6)) + return true; + break; + default: + break; + } + return false; +} + +bool __connman_inet_is_addr_loopback(const struct sockaddr *addr) +{ + const struct in6_addr *addr6; + in_addr_t addr4; + + switch (addr->sa_family) { + case AF_INET: + addr4 = ntohl(((const struct sockaddr_in *)addr)->sin_addr.s_addr); + if (((addr4 & 0xff000000) >> 24) == 127) + return true; + break; + case AF_INET6: + addr6 = &((const struct sockaddr_in6 *)addr)->sin6_addr; + if (IN6_IS_ADDR_LOOPBACK(addr6)) + return true; + break; + default: + break; + } + return false; +} + char **__connman_inet_get_running_interfaces(void) { char **result; @@ -2622,27 +2660,15 @@ char **__connman_inet_get_running_interfaces(void) for (i = 0; i < numif; i++) { struct ifreq *r = &ifr[i]; - struct in6_addr *addr6; - in_addr_t addr4; /* * Note that we do not return loopback interfaces here as they * are not needed for our purposes. */ - switch (r->ifr_addr.sa_family) { - case AF_INET: - addr4 = ntohl(((struct sockaddr_in *) - &r->ifr_addr)->sin_addr.s_addr); - if (((addr4 & 0xff000000) >> 24) == 127) - continue; - break; - case AF_INET6: - addr6 = &((struct sockaddr_in6 *) - &r->ifr_addr)->sin6_addr; - if (IN6_IS_ADDR_LINKLOCAL(addr6)) - continue; - break; - } + if (__connman_inet_is_addr_loopback(&r->ifr_addr)) + continue; + if (__connman_inet_ipv6_is_addr_linklocal(&r->ifr_addr)) + continue; result[count++] = g_strdup(r->ifr_name); } -- 2.1.4 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman