From 2ce39fe26c76eddd71a62e48bc7212e41c3af7fb Mon Sep 17 00:00:00 2001 From: Leonardo Maccari Rufino Date: Tue, 30 May 2017 18:31:06 -0300 Subject: [PATCH] Subject: Support to IPv6 on Windows --- CMakeLists.txt | 9 ++------- lib/client-handshake.c | 2 ++ lib/libwebsockets.c | 14 +++++++++++--- lib/server.c | 15 ++++++++++++--- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bbce17d..2cac774 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -326,19 +326,14 @@ if (LWS_WITH_SQLITE3) endif() -# FIXME: This must be runtime-only option. # The base dir where the test-apps look for the SSL certs. set(LWS_OPENSSL_CLIENT_CERTS ../share CACHE PATH "Server SSL certificate directory") if (WIN32) set(LWS_OPENSSL_CLIENT_CERTS . CACHE PATH "Client SSL certificate directory") - if (LWS_IPV6) - set(LWS_IPV6 OFF) - message(WARNING "IPv6 does not currently work on Windows!") - endif() - if (LWS_UNIX_SOCK) + if (LWS_UNIX_SOCK) set(LWS_UNIX_SOCK OFF) - message(WARNING "Windows does not support UNIX domain sockets") + message(WARNING "Windows does not support UNIX domain sockets") endif() else() set(LWS_OPENSSL_CLIENT_CERTS /etc/pki/tls/certs/ CACHE PATH "Client SSL certificate directory") diff --git a/lib/client-handshake.c b/lib/client-handshake.c index a9f8665..e335cc7 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -121,6 +121,8 @@ lws_client_connect_2(struct lws *wsi) memcpy(&server_addr6.sin6_addr, &((struct sockaddr_in6 *)result->ai_addr)->sin6_addr, sizeof(struct in6_addr)); + server_addr6.sin6_scope_id = ((struct sockaddr_in6 *)result->ai_addr)->sin6_scope_id; + server_addr6.sin6_flowinfo = ((struct sockaddr_in6 *)result->ai_addr)->sin6_flowinfo; break; default: lwsl_err("Unknown address family\n"); diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 288c3df..1f9182a 100755 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -1878,10 +1878,10 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, #endif struct sockaddr_in serv_addr4; #ifndef LWS_PLAT_OPTEE - socklen_t len = sizeof(struct sockaddr); + socklen_t len = sizeof(struct sockaddr_storage); #endif int n; - struct sockaddr_in sin; + struct sockaddr_storage sin; struct sockaddr *v; #ifdef LWS_USE_UNIX_SOCK @@ -1913,6 +1913,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, return -1; } +#ifndef WIN32 if (iface) { struct ifaddrs *addrs, *addr; char ip[NI_MAXHOST]; @@ -1944,6 +1945,7 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, } freeifaddrs(addrs); } +#endif serv_addr6.sin6_family = AF_INET6; serv_addr6.sin6_port = htons(port); @@ -1986,7 +1988,13 @@ lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port, lwsl_warn("getsockname: %s\n", strerror(LWS_ERRNO)); else #endif - port = ntohs(sin.sin_port); +#if defined(LWS_USE_IPV6) + port = (sin.ss_family == AF_INET6) ? + ntohs(((struct sockaddr_in6 *) &sin)->sin6_port) : + ntohs(((struct sockaddr_in *) &sin)->sin_port); +#else + port = ntohs(((struct sockaddr_in *) &sin)->sin_port); +#endif #endif return port; diff --git a/lib/server.c b/lib/server.c index ee61c60..a84f661 100644 --- a/lib/server.c +++ b/lib/server.c @@ -2009,7 +2009,7 @@ lws_server_socket_service(struct lws_context *context, struct lws *wsi, lws_sock_file_fd_type fd; int opts = LWS_ADOPT_SOCKET | LWS_ADOPT_ALLOW_SSL; #if LWS_POSIX - struct sockaddr_in cli_addr; + struct sockaddr_storage cli_addr; socklen_t clilen; #endif int n, len; @@ -2295,8 +2295,17 @@ try_pollout: lws_plat_set_socket_options(wsi->vhost, accept_fd); - lwsl_debug("accepted new conn port %u on fd=%d\n", - ntohs(cli_addr.sin_port), accept_fd); +#if defined(LWS_USE_IPV6) + lwsl_debug("accepted new conn port %u on fd=%d\n", + ((cli_addr.ss_family == AF_INET6) ? + ntohs(((struct sockaddr_in6 *) &cli_addr)->sin6_port) : + ntohs(((struct sockaddr_in *) &cli_addr)->sin_port)), + accept_fd); +#else + lwsl_debug("accepted new conn port %u on fd=%d\n", + ntohs(((struct sockaddr_in *) &cli_addr)->sin_port), + accept_fd); +#endif #else /* not very beautiful... */ -- 2.7.4