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
[email protected]
https://lists.connman.net/mailman/listinfo/connman