summaryrefslogtreecommitdiff
path: root/src/platform/windows
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-02-25 17:13:38 -0800
committerGarrett D'Amore <garrett@damore.org>2024-02-25 18:39:56 -0800
commit53a9740d1dcbad6be4b4c1a10a5f3fcbb97a5be9 (patch)
tree00c49f3cd56f5797ec0d3f31dab689c6573fc6e6 /src/platform/windows
parent8e62028a0db24364ea218007811e58ea11d0b64f (diff)
downloadnng-53a9740d1dcbad6be4b4c1a10a5f3fcbb97a5be9.tar.gz
nng-53a9740d1dcbad6be4b4c1a10a5f3fcbb97a5be9.tar.bz2
nng-53a9740d1dcbad6be4b4c1a10a5f3fcbb97a5be9.zip
fixes #1496 Provide NNG_ENABLE_IPV6 option (disabled by default)
This also checks if the build system has the definitions for AF_INET6, which might help in some embedded IPv4 only settings. The resolver test is enhanced to include a check for IPv6 enabled in the kernel. IPv6 support is enabled by default, of course.
Diffstat (limited to 'src/platform/windows')
-rw-r--r--src/platform/windows/win_resolv.c43
-rw-r--r--src/platform/windows/win_sockaddr.c14
-rw-r--r--src/platform/windows/win_tcpdial.c26
3 files changed, 62 insertions, 21 deletions
diff --git a/src/platform/windows/win_resolv.c b/src/platform/windows/win_resolv.c
index 92c7461f..4f353e08 100644
--- a/src/platform/windows/win_resolv.c
+++ b/src/platform/windows/win_resolv.c
@@ -148,17 +148,23 @@ resolv_task(resolv_item *item)
rv = NNG_EADDRINVAL;
for (probe = results; probe != NULL; probe = probe->ai_next) {
- if ((probe->ai_addr->sa_family == AF_INET) ||
- (probe->ai_addr->sa_family == AF_INET6)) {
+ if (probe->ai_addr->sa_family == AF_INET) {
break;
}
+#if NNG_ENABLE_IPV6
+ if (probe->ai_addr->sa_family == AF_INET6) {
+ break;
+ }
+#endif
}
nni_mtx_lock(&resolv_mtx);
if ((probe != NULL) && (item->aio != NULL)) {
- struct sockaddr_in *sin;
+ struct sockaddr_in *sin;
+#ifdef NNG_ENABLE_IPV6
struct sockaddr_in6 *sin6;
- nni_sockaddr *sa;
+#endif
+ nni_sockaddr *sa;
sa = item->sa;
@@ -170,6 +176,7 @@ resolv_task(resolv_item *item)
sa->s_in.sa_port = sin->sin_port;
sa->s_in.sa_addr = sin->sin_addr.s_addr;
break;
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
rv = 0;
sin6 = (void *) probe->ai_addr;
@@ -178,6 +185,7 @@ resolv_task(resolv_item *item)
sa->s_in6.sa_scope = sin6->sin6_scope_id;
memcpy(sa->s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16);
break;
+#endif
}
}
nni_mtx_unlock(&resolv_mtx);
@@ -205,12 +213,18 @@ nni_resolv_ip(const char *host, const char *serv, int family, bool passive,
case NNG_AF_INET:
fam = AF_INET;
break;
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
fam = AF_INET6;
break;
case NNG_AF_UNSPEC:
fam = AF_UNSPEC;
break;
+#else
+ case NNG_AF_UNSPEC:
+ fam = AF_INET;
+ break;
+#endif
default:
nni_aio_finish_error(aio, NNG_ENOTSUP);
return;
@@ -306,12 +320,15 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
struct addrinfo hints;
struct addrinfo *results;
int rv;
- bool v6 = false;
- bool wrapped = false;
char *port;
char *host;
char *buf;
size_t buf_len;
+#ifdef NNG_ENABLE_IPV6
+ bool v6 = false;
+ bool wrapped = false;
+ char *s;
+#endif
if (addr == NULL) {
addr = "";
@@ -323,12 +340,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
}
memcpy(buf, addr, buf_len);
host = buf;
+
+#ifdef NNG_ENABLE_IPV6
if (*host == '[') {
v6 = true;
wrapped = true;
host++;
} else {
- char *s;
for (s = host; *s != '\0'; s++) {
if (*s == '.') {
break;
@@ -358,6 +376,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
rv = NNG_EADDRINVAL;
goto done;
}
+#else // NNG_ENABLE_IPV6
+ for (port = host; *port != '\0'; port++) {
+ if (*port == ':') {
+ break;
+ }
+ }
+#endif
if ((!want_port) && (*port != '\0')) {
rv = NNG_EADDRINVAL;
@@ -373,9 +398,13 @@ parse_ip(const char *addr, nng_sockaddr *sa, bool want_port)
memset(&hints, 0, sizeof(hints));
hints.ai_flags =
AI_ADDRCONFIG | AI_NUMERICSERV | AI_NUMERICHOST | AI_PASSIVE;
+#ifdef NNG_ENABLE_IPV6
if (v6) {
hints.ai_family = AF_INET6;
}
+#else
+ hints.ai_family = AF_INET;
+#endif
rv = getaddrinfo(host, port, &hints, &results);
if ((rv != 0) || (results == NULL)) {
diff --git a/src/platform/windows/win_sockaddr.c b/src/platform/windows/win_sockaddr.c
index 818f670b..585096e9 100644
--- a/src/platform/windows/win_sockaddr.c
+++ b/src/platform/windows/win_sockaddr.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -15,8 +15,10 @@
int
nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
{
- SOCKADDR_IN * sin;
+ SOCKADDR_IN *sin;
+#ifdef NNG_ENABLE_IPV6
SOCKADDR_IN6 *sin6;
+#endif
if ((ss == NULL) || (sa == NULL)) {
return (-1);
@@ -30,6 +32,7 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
sin->sin_addr.s_addr = sa->s_in.sa_addr;
return (sizeof(*sin));
+#ifdef NNG_ENABLE_IPV6
case NNG_AF_INET6:
sin6 = (void *) ss;
memset(sin6, 0, sizeof(*sin6));
@@ -38,6 +41,7 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
sin6->sin6_scope_id = sa->s_in6.sa_scope;
memcpy(sin6->sin6_addr.s6_addr, sa->s_in6.sa_addr, 16);
return (sizeof(*sin6));
+#endif
}
return (-1);
}
@@ -45,8 +49,10 @@ nni_win_nn2sockaddr(SOCKADDR_STORAGE *ss, const nni_sockaddr *sa)
int
nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
{
- SOCKADDR_IN * sin;
+ SOCKADDR_IN *sin;
+#ifdef NNG_ENABLE_IPV6
SOCKADDR_IN6 *sin6;
+#endif
if ((ss == NULL) || (sa == NULL)) {
return (-1);
@@ -59,6 +65,7 @@ nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
sa->s_in.sa_addr = sin->sin_addr.s_addr;
return (0);
+#ifdef NNG_ENABLE_IPV6
case PF_INET6:
sin6 = (void *) ss;
sa->s_in6.sa_family = NNG_AF_INET6;
@@ -66,6 +73,7 @@ nni_win_sockaddr2nn(nni_sockaddr *sa, const SOCKADDR_STORAGE *ss)
sa->s_in6.sa_scope = sin6->sin6_scope_id;
memcpy(sa->s_in6.sa_addr, sin6->sin6_addr.s6_addr, 16);
return (0);
+#endif
}
return (-1);
}
diff --git a/src/platform/windows/win_tcpdial.c b/src/platform/windows/win_tcpdial.c
index 9463c241..b4a6d745 100644
--- a/src/platform/windows/win_tcpdial.c
+++ b/src/platform/windows/win_tcpdial.c
@@ -1,5 +1,5 @@
//
-// Copyright 2020 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2018 Devolutions <info@devolutions.net>
//
@@ -113,7 +113,7 @@ static void
tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
{
nni_tcp_dialer *d = arg;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
nni_mtx_lock(&d->mtx);
if ((c = nni_aio_get_prov_data(aio)) != NULL) {
@@ -128,9 +128,9 @@ tcp_dial_cancel(nni_aio *aio, void *arg, int rv)
static void
tcp_dial_cb(nni_win_io *io, int rv, size_t cnt)
{
- nni_tcp_conn * c = io->ptr;
+ nni_tcp_conn *c = io->ptr;
nni_tcp_dialer *d = c->dialer;
- nni_aio * aio = c->conn_aio;
+ nni_aio *aio = c->conn_aio;
BOOL ka;
BOOL nd;
@@ -183,7 +183,7 @@ nni_tcp_dial(nni_tcp_dialer *d, const nni_sockaddr *sa, nni_aio *aio)
SOCKET s;
SOCKADDR_STORAGE ss;
int len;
- nni_tcp_conn * c;
+ nni_tcp_conn *c;
int rv;
if (nni_aio_begin(aio) != 0) {
@@ -335,13 +335,15 @@ tcp_dialer_get_locaddr(void *arg, void *buf, size_t *szp, nni_type t)
static int
tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
{
- nni_tcp_dialer * d = arg;
- nng_sockaddr sa;
- SOCKADDR_STORAGE ss;
- struct sockaddr_in * sin;
+ nni_tcp_dialer *d = arg;
+ nng_sockaddr sa;
+ SOCKADDR_STORAGE ss;
+ struct sockaddr_in *sin;
+ size_t sslen;
+ int rv;
+#ifdef NNG_ENABLE_IPV6
struct sockaddr_in6 *sin6;
- size_t sslen;
- int rv;
+#endif
if ((rv = nni_copyin_sockaddr(&sa, buf, sz, t)) != 0) {
return (rv);
@@ -358,12 +360,14 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t)
return (NNG_EADDRINVAL);
}
break;
+#ifdef NNG_ENABLE_IPV6
case AF_INET6:
sin6 = (void *) &ss;
if (sin6->sin6_port != 0) {
return (NNG_EADDRINVAL);
}
break;
+#endif
default:
return (NNG_EADDRINVAL);
}