diff options
author | Ara Ayvazyan <Aivazyan@microsoft.com> | 2018-04-26 16:23:06 -0700 |
---|---|---|
committer | Ara Ayvazyan <Aivazyan@microsoft.com> | 2018-04-26 16:23:06 -0700 |
commit | f5f5ee31a25e37d6a19939f837f0089431f9951c (patch) | |
tree | 374e1d449dde10276db79759d6f5a07b3ee04c60 /src/core/lib/iomgr/tcp_windows.cc | |
parent | 3450b16c5980e6b17984c4a7346dc4f1c0a97809 (diff) |
Enable SIO_LOOPBACK_FAST_PATH on Windows
Diffstat (limited to 'src/core/lib/iomgr/tcp_windows.cc')
-rw-r--r-- | src/core/lib/iomgr/tcp_windows.cc | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/core/lib/iomgr/tcp_windows.cc b/src/core/lib/iomgr/tcp_windows.cc index 04e6f11eee..5d316d477b 100644 --- a/src/core/lib/iomgr/tcp_windows.cc +++ b/src/core/lib/iomgr/tcp_windows.cc @@ -74,12 +74,28 @@ static grpc_error* set_dualstack(SOCKET sock) { : GRPC_WSA_ERROR(WSAGetLastError(), "setsockopt(IPV6_V6ONLY)"); } +static grpc_error* enable_loopback_fast_path(SOCKET sock) { + int status; + uint32_t param = 1; + DWORD ret; + status = WSAIoctl(sock, /*SIO_LOOPBACK_FAST_PATH==*/_WSAIOW(IOC_VENDOR, 16), + ¶m, sizeof(param), NULL, 0, &ret, 0, 0); + if (status == SOCKET_ERROR) { + status = WSAGetLastError(); + } + return status == 0 || status == WSAEOPNOTSUPP + ? GRPC_ERROR_NONE + : GRPC_WSA_ERROR(status, "WSAIoctl(SIO_LOOPBACK_FAST_PATH)"); +} + grpc_error* grpc_tcp_prepare_socket(SOCKET sock) { grpc_error* err; err = set_non_block(sock); if (err != GRPC_ERROR_NONE) return err; err = set_dualstack(sock); if (err != GRPC_ERROR_NONE) return err; + err = enable_loopback_fast_path(sock); + if (err != GRPC_ERROR_NONE) return err; return GRPC_ERROR_NONE; } |