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

Reply via email to