diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h index 480c2d00..45fbad9f 100644 --- a/lib/libwebsockets.h +++ b/lib/libwebsockets.h @@ -354,6 +354,8 @@ enum lws_context_options { LWS_SERVER_OPTION_EXPLICIT_VHOSTS = (1 << 13), LWS_SERVER_OPTION_UNIX_SOCK = (1 << 14), LWS_SERVER_OPTION_STS = (1 << 15), + LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY = (1 << 16), + LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE = (1 << 17), /****** add new things just above ---^ ******/ }; diff --git a/lib/server.c b/lib/server.c index d3de15a8..ce885de2 100644 --- a/lib/server.c +++ b/lib/server.c @@ -91,6 +91,20 @@ lws_context_init_server(struct lws_context_creation_info *info, compatible_close(sockfd); return 1; } + +#if defined(LWS_USE_IPV6) && defined(IPV6_V6ONLY) + if (LWS_IPV6_ENABLED(vhost)) { + if (vhost->options & LWS_SERVER_OPTION_IPV6_V6ONLY_MODIFY) { + int value = (vhost->options & LWS_SERVER_OPTION_IPV6_V6ONLY_VALUE) ? 1 : 0; + if (setsockopt(sockfd, SOL_IPV6, IPV6_V6ONLY, + (const void*)&value, sizeof(value)) < 0) { + compatible_close(sockfd); + return 1; + } + } + } +#endif + #if defined(__linux__) && defined(SO_REUSEPORT) && LWS_MAX_SMP > 1 if (vhost->context->count_threads > 1) if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT,