Hans Leidekker : ws2_32: Enable IP_DONTFRAGMENT by default for SOCK_STREAM sockets.
Alexandre Julliard
julliard at winehq.org
Thu Sep 13 03:49:13 CDT 2018
Module: wine
Branch: stable
Commit: d47d5ec7ffcb19238826a375a24c5990dd098bde
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d47d5ec7ffcb19238826a375a24c5990dd098bde
Author: Hans Leidekker <hans at codeweavers.com>
Date: Thu May 10 11:30:10 2018 +0200
ws2_32: Enable IP_DONTFRAGMENT by default for SOCK_STREAM sockets.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 6d6b4bffb3f619ae298669b888775350223e281f)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/ws2_32/socket.c | 9 ++++++--
dlls/ws2_32/tests/sock.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 1105282..43a623e 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -7513,9 +7513,14 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
if (ipxptype > 0)
set_ipx_packettype(ret, ipxptype);
- /* ensure IP_DONTFRAGMENT is disabled, in Linux the global default can be enabled */
if (unixaf == AF_INET || unixaf == AF_INET6)
- set_dont_fragment(ret, unixaf == AF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, FALSE);
+ {
+ /* ensure IP_DONTFRAGMENT is disabled for SOCK_DGRAM and SOCK_RAW, enabled for SOCK_STREAM */
+ if (unixtype == SOCK_DGRAM || unixtype == SOCK_RAW) /* in Linux the global default can be enabled */
+ set_dont_fragment(ret, unixaf == AF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, FALSE);
+ else if (unixtype == SOCK_STREAM)
+ set_dont_fragment(ret, unixaf == AF_INET6 ? IPPROTO_IPV6 : IPPROTO_IP, TRUE);
+ }
#ifdef IPV6_V6ONLY
if (unixaf == AF_INET6)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 754c58b..b59c830 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -1907,6 +1907,59 @@ todo_wine
ok(value == 1, "Expected 1, got %d\n", value);
closesocket(s);
+
+ s = socket(family, SOCK_STREAM, 0);
+ if (s == INVALID_SOCKET && i)
+ {
+ skip("IPv6 is not supported\n");
+ break;
+ }
+ ok(s != INVALID_SOCKET, "socket failed with error %d\n", GetLastError());
+
+ size = sizeof(value);
+ value = 0xdead;
+ err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+ ok(value == 1 || broken(value == 0) /* < vista */, "Expected 1, got %d\n", value);
+
+ size = sizeof(value);
+ value = 0;
+ err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+
+ value = 0xdead;
+ err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+ ok(value == 0, "Expected 0, got %d\n", value);
+
+ closesocket(s);
+
+ s = socket(family, SOCK_RAW, 0);
+ if (s == INVALID_SOCKET)
+ {
+ if (WSAGetLastError() == WSAEACCES) skip("SOCK_RAW is not available\n");
+ else if (i) skip("IPv6 is not supported\n");
+ break;
+ }
+ ok(s != INVALID_SOCKET, "socket failed with error %d\n", GetLastError());
+
+ size = sizeof(value);
+ value = 0xdead;
+ err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+ ok(value == 0, "Expected 0, got %d\n", value);
+
+ size = sizeof(value);
+ value = 1;
+ err = setsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+
+ value = 0xdead;
+ err = getsockopt(s, level, IP_DONTFRAGMENT, (char *) &value, &size);
+ ok(!err, "Expected 0, got %d with error %d\n", err, GetLastError());
+ ok(value == 1, "Expected 1, got %d\n", value);
+
+ closesocket(s);
}
}
More information about the wine-cvs
mailing list