Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/socket.c | 5 +++++ dlls/ws2_32/socket.c | 4 ++-- include/wine/afd.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index f33fc014f3b..f0dc00a9651 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1802,6 +1802,11 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc return do_setsockopt( handle, io, IPPROTO_IP, IP_UNICAST_IF, in_buffer, in_size ); #endif
+#ifdef IPV6_ADD_MEMBERSHIP + case IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP: + return do_setsockopt( handle, io, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, in_buffer, in_size ); +#endif + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index d5de709e991..f02d668ece4 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -3717,9 +3717,9 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, case WS_IPPROTO_IPV6: switch(optname) { -#ifdef IPV6_ADD_MEMBERSHIP case WS_IPV6_ADD_MEMBERSHIP: -#endif + return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP, optval, optlen ); + #ifdef IPV6_DROP_MEMBERSHIP case WS_IPV6_DROP_MEMBERSHIP: #endif diff --git a/include/wine/afd.h b/include/wine/afd.h index c150e2ce474..dda07695f75 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -207,6 +207,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_SET_IP_UNBLOCK_SOURCE WINE_AFD_IOC(262) #define IOCTL_AFD_WINE_GET_IP_UNICAST_IF WINE_AFD_IOC(263) #define IOCTL_AFD_WINE_SET_IP_UNICAST_IF WINE_AFD_IOC(264) +#define IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP WINE_AFD_IOC(265)
struct afd_create_params {
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/socket.c | 33 ++++++++++++++++++++++ dlls/ws2_32/socket.c | 59 ++-------------------------------------- include/wine/afd.h | 1 + 3 files changed, 37 insertions(+), 56 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index f0dc00a9651..fbfd873b3b9 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1807,6 +1807,39 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc return do_setsockopt( handle, io, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, in_buffer, in_size ); #endif
+ case IOCTL_AFD_WINE_GET_IPV6_DONTFRAG: + { + socklen_t len = out_size; + int ret; + + if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ))) + return status; + +#ifdef IPV6_DONTFRAG + ret = getsockopt( fd, IPPROTO_IPV6, IPV6_DONTFRAG, out_buffer, &len ); +#elif defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DONT) + { + int value; + + len = sizeof(value); + ret = getsockopt( fd, IPPROTO_IPV6, IPV6_MTU_DISCOVER, &value, &len ); + if (!ret) *(DWORD *)out_buffer = (value != IPV6_PMTUDISC_DONT); + } +#else + { + static int once; + + if (!once++) + FIXME( "IPV6_DONTFRAGMENT is not supported on this platform\n" ); + ret = 0; /* fake success */ + } +#endif + if (needs_close) close( fd ); + if (ret) return sock_errno_to_status( errno ); + io->Information = len; + return STATUS_SUCCESS; + } + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index f02d668ece4..837e8021248 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -742,60 +742,6 @@ static BOOL set_dont_fragment(SOCKET s, int level, BOOL value) return value; }
-static BOOL get_dont_fragment(SOCKET s, int level, BOOL *out) -{ - int fd, optname, value, not_expected; - socklen_t optlen = sizeof(value); - - if (level == IPPROTO_IP) - { -#ifdef IP_DONTFRAG - optname = IP_DONTFRAG; - not_expected = 0; -#elif defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT) - optname = IP_MTU_DISCOVER; - not_expected = IP_PMTUDISC_DONT; -#else - static int once; - if (!once++) - FIXME("IP_DONTFRAGMENT for IPv4 not supported in this platform\n"); - return TRUE; /* fake success */ -#endif - } - else - { -#ifdef IPV6_DONTFRAG - optname = IPV6_DONTFRAG; - not_expected = 0; -#elif defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DONT) - optname = IPV6_MTU_DISCOVER; - not_expected = IPV6_PMTUDISC_DONT; -#else - static int once; - if (!once++) - FIXME("IP_DONTFRAGMENT for IPv6 not supported in this platform\n"); - return TRUE; /* fake success */ -#endif - } - - fd = get_sock_fd(s, 0, NULL); - if (fd == -1) return FALSE; - - if (!getsockopt(fd, level, optname, &value, &optlen)) - { - *out = value != not_expected; - value = TRUE; - } - else - { - WSASetLastError(wsaErrno()); - value = FALSE; - } - - release_sock_fd(s, fd); - return value; -} - struct per_thread_data *get_per_thread_data(void) { struct per_thread_data * ptb = NtCurrentTeb()->WinSockData; @@ -2511,6 +2457,9 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, case WS_IPPROTO_IPV6: switch(optname) { + case WS_IPV6_DONTFRAG: + return server_getsockopt( s, IOCTL_AFD_WINE_GET_IPV6_DONTFRAG, optval, optlen ); + case WS_IPV6_MULTICAST_IF: case WS_IPV6_MULTICAST_HOPS: case WS_IPV6_MULTICAST_LOOP: @@ -2529,8 +2478,6 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, } release_sock_fd( s, fd ); return ret; - case WS_IPV6_DONTFRAG: - return get_dont_fragment(s, IPPROTO_IPV6, (BOOL *)optval) ? 0 : SOCKET_ERROR;
default: FIXME( "unrecognized IPv6 option %u\n", optname ); diff --git a/include/wine/afd.h b/include/wine/afd.h index dda07695f75..bb8fd68f059 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -208,6 +208,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_GET_IP_UNICAST_IF WINE_AFD_IOC(263) #define IOCTL_AFD_WINE_SET_IP_UNICAST_IF WINE_AFD_IOC(264) #define IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP WINE_AFD_IOC(265) +#define IOCTL_AFD_WINE_GET_IPV6_DONTFRAG WINE_AFD_IOC(266)
struct afd_create_params {
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/socket.c | 19 ++++++++++++++ dlls/ws2_32/socket.c | 53 +++------------------------------------- include/wine/afd.h | 1 + 3 files changed, 23 insertions(+), 50 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index fbfd873b3b9..6a9fcc168a6 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1840,6 +1840,25 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc return STATUS_SUCCESS; }
+ case IOCTL_AFD_WINE_SET_IPV6_DONTFRAG: +#ifdef IPV6_DONTFRAG + return do_setsockopt( handle, io, IPPROTO_IPV6, IPV6_DONTFRAG, in_buffer, in_size ); +#elif defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) && defined(IPV6_PMTUDISC_DONT) + { + int value = *(DWORD *)in_buffer ? IPV6_PMTUDISC_DO : IPV6_PMTUDISC_DONT; + + return do_setsockopt( handle, io, IPPROTO_IP, IPV6_MTU_DISCOVER, &value, sizeof(value) ); + } +#else + { + static int once; + + if (!once++) + FIXME( "IPV6_DONTFRAGMENT is not supported on this platform\n" ); + return STATUS_SUCCESS; /* fake success */ + } +#endif + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 837e8021248..b436079d709 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -694,54 +694,6 @@ static inline void release_sock_fd( SOCKET s, int fd ) close( fd ); }
-static BOOL set_dont_fragment(SOCKET s, int level, BOOL value) -{ - int fd, optname; - - if (level == IPPROTO_IP) - { -#ifdef IP_DONTFRAG - optname = IP_DONTFRAG; -#elif defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DO) && defined(IP_PMTUDISC_DONT) - optname = IP_MTU_DISCOVER; - value = value ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT; -#else - static int once; - if (!once++) - FIXME("IP_DONTFRAGMENT for IPv4 not supported in this platform\n"); - return TRUE; /* fake success */ -#endif - } - else - { -#ifdef IPV6_DONTFRAG - optname = IPV6_DONTFRAG; -#elif defined(IPV6_MTU_DISCOVER) && defined(IPV6_PMTUDISC_DO) && defined(IPV6_PMTUDISC_DONT) - optname = IPV6_MTU_DISCOVER; - value = value ? IPV6_PMTUDISC_DO : IPV6_PMTUDISC_DONT; -#else - static int once; - if (!once++) - FIXME("IP_DONTFRAGMENT for IPv6 not supported in this platform\n"); - return TRUE; /* fake success */ -#endif - } - - fd = get_sock_fd(s, 0, NULL); - if (fd == -1) return FALSE; - - if (!setsockopt(fd, level, optname, &value, sizeof(value))) - value = TRUE; - else - { - WSASetLastError(wsaErrno()); - value = FALSE; - } - - release_sock_fd(s, fd); - return value; -} - struct per_thread_data *get_per_thread_data(void) { struct per_thread_data * ptb = NtCurrentTeb()->WinSockData; @@ -3667,6 +3619,9 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, case WS_IPV6_ADD_MEMBERSHIP: return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP, optval, optlen );
+ case WS_IPV6_DONTFRAG: + return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPV6_DONTFRAG, optval, optlen ); + #ifdef IPV6_DROP_MEMBERSHIP case WS_IPV6_DROP_MEMBERSHIP: #endif @@ -3679,8 +3634,6 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, #endif convert_sockopt(&level, &optname); break; - case WS_IPV6_DONTFRAG: - return set_dont_fragment(s, IPPROTO_IPV6, *(BOOL *)optval) ? 0 : SOCKET_ERROR; case WS_IPV6_PROTECTION_LEVEL: FIXME("IPV6_PROTECTION_LEVEL is ignored!\n"); return 0; diff --git a/include/wine/afd.h b/include/wine/afd.h index bb8fd68f059..e1933184da0 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -209,6 +209,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_SET_IP_UNICAST_IF WINE_AFD_IOC(264) #define IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP WINE_AFD_IOC(265) #define IOCTL_AFD_WINE_GET_IPV6_DONTFRAG WINE_AFD_IOC(266) +#define IOCTL_AFD_WINE_SET_IPV6_DONTFRAG WINE_AFD_IOC(267)
struct afd_create_params {
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/socket.c | 5 +++++ dlls/ws2_32/socket.c | 4 ++-- include/wine/afd.h | 1 + 3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 6a9fcc168a6..2beb4f1778f 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1859,6 +1859,11 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc } #endif
+#ifdef IPV6_DROP_MEMBERSHIP + case IOCTL_AFD_WINE_SET_IPV6_DROP_MEMBERSHIP: + return do_setsockopt( handle, io, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, in_buffer, in_size ); +#endif + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index b436079d709..cd8bd63b88c 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -3622,9 +3622,9 @@ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, case WS_IPV6_DONTFRAG: return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPV6_DONTFRAG, optval, optlen );
-#ifdef IPV6_DROP_MEMBERSHIP case WS_IPV6_DROP_MEMBERSHIP: -#endif + return server_setsockopt( s, IOCTL_AFD_WINE_SET_IPV6_DROP_MEMBERSHIP, optval, optlen ); + case WS_IPV6_MULTICAST_IF: case WS_IPV6_MULTICAST_HOPS: case WS_IPV6_MULTICAST_LOOP: diff --git a/include/wine/afd.h b/include/wine/afd.h index e1933184da0..ad12c55af12 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -210,6 +210,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_SET_IPV6_ADD_MEMBERSHIP WINE_AFD_IOC(265) #define IOCTL_AFD_WINE_GET_IPV6_DONTFRAG WINE_AFD_IOC(266) #define IOCTL_AFD_WINE_SET_IPV6_DONTFRAG WINE_AFD_IOC(267) +#define IOCTL_AFD_WINE_SET_IPV6_DROP_MEMBERSHIP WINE_AFD_IOC(268)
struct afd_create_params {
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/unix/socket.c | 3 +++ dlls/ws2_32/socket.c | 4 +++- include/wine/afd.h | 1 + 3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 2beb4f1778f..85763d032ed 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1864,6 +1864,9 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc return do_setsockopt( handle, io, IPPROTO_IPV6, IPV6_DROP_MEMBERSHIP, in_buffer, in_size ); #endif
+ case IOCTL_AFD_WINE_GET_IPV6_MULTICAST_HOPS: + return do_getsockopt( handle, io, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, out_buffer, out_size ); + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index cd8bd63b88c..9c2d58827ba 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2412,8 +2412,10 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, case WS_IPV6_DONTFRAG: return server_getsockopt( s, IOCTL_AFD_WINE_GET_IPV6_DONTFRAG, optval, optlen );
- case WS_IPV6_MULTICAST_IF: case WS_IPV6_MULTICAST_HOPS: + return server_getsockopt( s, IOCTL_AFD_WINE_GET_IPV6_MULTICAST_HOPS, optval, optlen ); + + case WS_IPV6_MULTICAST_IF: case WS_IPV6_MULTICAST_LOOP: case WS_IPV6_UNICAST_HOPS: case WS_IPV6_V6ONLY: diff --git a/include/wine/afd.h b/include/wine/afd.h index ad12c55af12..0f04cc824a8 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -211,6 +211,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_GET_IPV6_DONTFRAG WINE_AFD_IOC(266) #define IOCTL_AFD_WINE_SET_IPV6_DONTFRAG WINE_AFD_IOC(267) #define IOCTL_AFD_WINE_SET_IPV6_DROP_MEMBERSHIP WINE_AFD_IOC(268) +#define IOCTL_AFD_WINE_GET_IPV6_MULTICAST_HOPS WINE_AFD_IOC(269)
struct afd_create_params {
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=94641
Your paranoid android.
=== debiant2 (64 bit WoW report) ===
ws2_32: sock.c:4958: Test failed: expected timeout