Subject: Support to IPv6 on Windows
authorLeonardo Maccari Rufino <eulmr1@gmail.com>
Tue, 30 May 2017 21:31:06 +0000 (18:31 -0300)
committerAndy Green <andy@warmcat.com>
Wed, 31 May 2017 22:55:50 +0000 (06:55 +0800)
CMakeLists.txt
lib/client-handshake.c
lib/libwebsockets.c
lib/server.c

index bbce17d..2cac774 100644 (file)
@@ -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")
index a9f8665..e335cc7 100644 (file)
@@ -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");
index 288c3df..1f9182a 100755 (executable)
@@ -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;
index ee61c60..a84f661 100644 (file)
@@ -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... */