|
|
@ -74,12 +74,28 @@ static grpc_error* set_dualstack(SOCKET sock) { |
|
|
|
: GRPC_WSA_ERROR(WSAGetLastError(), "setsockopt(IPV6_V6ONLY)"); |
|
|
|
: 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* grpc_tcp_prepare_socket(SOCKET sock) { |
|
|
|
grpc_error* err; |
|
|
|
grpc_error* err; |
|
|
|
err = set_non_block(sock); |
|
|
|
err = set_non_block(sock); |
|
|
|
if (err != GRPC_ERROR_NONE) return err; |
|
|
|
if (err != GRPC_ERROR_NONE) return err; |
|
|
|
err = set_dualstack(sock); |
|
|
|
err = set_dualstack(sock); |
|
|
|
if (err != GRPC_ERROR_NONE) return err; |
|
|
|
if (err != GRPC_ERROR_NONE) return err; |
|
|
|
|
|
|
|
err = enable_loopback_fast_path(sock); |
|
|
|
|
|
|
|
if (err != GRPC_ERROR_NONE) return err; |
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|