From 95d6387123171d812552cd6213034c823a7e8631 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Fri, 17 Apr 2020 19:44:59 -0700 Subject: [PATCH 1/2] Add address comparators for 6PLANE networks and fix an errno issue --- src/api/sockets.c | 2 ++ src/core/ipv6/nd6.c | 15 +++++++++++++-- src/include/lwip/errno.h | 2 +- src/include/lwip/ip6_addr.h | 15 +++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index 2d231739..a0c24829 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -38,6 +38,7 @@ */ #include "lwip/opt.h" +#include "ZeroTierConstants.h" #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ @@ -281,6 +282,7 @@ static struct lwip_select_cb *select_cb_list; #define sock_set_errno(sk, e) do { \ const int sockerr = (e); \ set_errno(sockerr); \ + zts_errno = sockerr; \ } while (0) /* Forward declaration of some functions */ diff --git a/src/core/ipv6/nd6.c b/src/core/ipv6/nd6.c index 039b7963..475ab3ee 100644 --- a/src/core/ipv6/nd6.c +++ b/src/core/ipv6/nd6.c @@ -1644,9 +1644,20 @@ nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif) * addresses (from autoconfiguration) have no implied subnet assignment, and * are thus effectively /128 assignments. See RFC 5942 for more on this. */ for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { - if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + /*if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && netif_ip6_addr_isstatic(netif, i) && - ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) { + ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) {*/ + int prefix_match = 0; + if (ip6_addr_is_zt_6plane(ip6addr)) { + prefix_match = ip6_addr_6plane_cmp(ip6addr, netif_ip6_addr(netif, i)); + } + if (ip6_addr_is_zt_rfc4193(ip6addr)) { + prefix_match = ip6_addr_rfc4193_cmp(ip6addr, netif_ip6_addr(netif, i)); + } + if (!prefix_match) { + prefix_match = ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i)); + } + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && prefix_match) { return 1; } } diff --git a/src/include/lwip/errno.h b/src/include/lwip/errno.h index 9f59afc8..80771165 100644 --- a/src/include/lwip/errno.h +++ b/src/include/lwip/errno.h @@ -190,7 +190,7 @@ extern "C" { #else /* LWIP_ERRNO_STDINCLUDE */ /* Define LWIP_ERRNO_INCLUDE to an equivalent of to include the error defines here */ #ifdef LWIP_ERRNO_INCLUDE -#include LWIP_ERRNO_INCLUDE +#include #endif /* LWIP_ERRNO_INCLUDE */ #endif /* LWIP_ERRNO_STDINCLUDE */ diff --git a/src/include/lwip/ip6_addr.h b/src/include/lwip/ip6_addr.h index 29c2a34d..448ffef8 100644 --- a/src/include/lwip/ip6_addr.h +++ b/src/include/lwip/ip6_addr.h @@ -160,6 +160,21 @@ typedef struct ip6_addr ip6_addr_t; #define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \ ip6_addr_cmp_zone((addr1), (addr2))) +/* Determine if an address *could* be a ZeroTier 6PLANE/Ad-hoc address */ +#define ip6_addr_is_zt_6plane(addr1) (((addr1)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xfc000000UL)) + +/* Compare first 40 bits of address (ff + first 32 bits of nwid XOR'd with second 32 bits of nwid) */ +#define ip6_addr_6plane_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] & PP_HTONL(0xff000000UL)) == ((addr2)->addr[1] & PP_HTONL(0xff000000UL))) + +/* Determine if an address *could* be an RFC4193 address */ +#define ip6_addr_is_zt_rfc4193(addr1) (((addr1)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xfd000000UL)) + +/* Compare first 72 bits of address (fd + 64 bits of nwid) */ +#define ip6_addr_rfc4193_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] == (addr2)->addr[1]) && \ + ((addr1)->addr[2] & PP_HTONL(0xff000000UL)) == ((addr2)->addr[2] & PP_HTONL(0xff000000UL))) + /* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */ #define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \ ((addr1)->addr[3] == (addr2)->addr[3])) From 32708c0a8b140efb545cc35101ee5fdeca6d6489 Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Fri, 1 May 2020 17:03:46 -0700 Subject: [PATCH 2/2] Add zts_errno to sockets.c --- src/api/sockets.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/sockets.c b/src/api/sockets.c index a0c24829..a6d682cb 100644 --- a/src/api/sockets.c +++ b/src/api/sockets.c @@ -38,7 +38,8 @@ */ #include "lwip/opt.h" -#include "ZeroTierConstants.h" + +extern int zts_errno; #if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */