From 976fff17975b410026290d038e33bc12e6b6a5fb Mon Sep 17 00:00:00 2001 From: yang-g Date: Wed, 4 Mar 2020 14:12:15 -0800 Subject: [PATCH] Create a macro to allow custom dualstack socket --- BUILD | 1 + BUILD.gn | 1 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 2 + config.m4 | 1 + config.w32 | 1 + gRPC-Core.podspec | 1 + grpc.gemspec | 1 + grpc.gyp | 2 + package.xml | 1 + src/core/lib/iomgr/dualstack_socket_posix.cc | 47 +++++++++++++++++++ .../lib/iomgr/socket_utils_common_posix.cc | 19 +------- src/core/lib/iomgr/socket_utils_posix.h | 3 ++ src/python/grpcio/grpc_core_dependencies.py | 1 + tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 17 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 src/core/lib/iomgr/dualstack_socket_posix.cc diff --git a/BUILD b/BUILD index 75c1fd61543..8fe2d6d2e15 100644 --- a/BUILD +++ b/BUILD @@ -714,6 +714,7 @@ grpc_cc_library( "src/core/lib/iomgr/call_combiner.cc", "src/core/lib/iomgr/cfstream_handle.cc", "src/core/lib/iomgr/combiner.cc", + "src/core/lib/iomgr/dualstack_socket_posix.cc", "src/core/lib/iomgr/endpoint.cc", "src/core/lib/iomgr/endpoint_cfstream.cc", "src/core/lib/iomgr/endpoint_pair_posix.cc", diff --git a/BUILD.gn b/BUILD.gn index 1110b9a0b34..ee40a4db057 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -582,6 +582,7 @@ config("grpc_config") { "src/core/lib/iomgr/closure.h", "src/core/lib/iomgr/combiner.cc", "src/core/lib/iomgr/combiner.h", + "src/core/lib/iomgr/dualstack_socket_posix.cc", "src/core/lib/iomgr/dynamic_annotations.h", "src/core/lib/iomgr/endpoint.cc", "src/core/lib/iomgr/endpoint.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index c87f080e2d5..cac83849d08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1495,6 +1495,7 @@ add_library(grpc src/core/lib/iomgr/call_combiner.cc src/core/lib/iomgr/cfstream_handle.cc src/core/lib/iomgr/combiner.cc + src/core/lib/iomgr/dualstack_socket_posix.cc src/core/lib/iomgr/endpoint.cc src/core/lib/iomgr/endpoint_cfstream.cc src/core/lib/iomgr/endpoint_pair_posix.cc @@ -2141,6 +2142,7 @@ add_library(grpc_unsecure src/core/lib/iomgr/call_combiner.cc src/core/lib/iomgr/cfstream_handle.cc src/core/lib/iomgr/combiner.cc + src/core/lib/iomgr/dualstack_socket_posix.cc src/core/lib/iomgr/endpoint.cc src/core/lib/iomgr/endpoint_cfstream.cc src/core/lib/iomgr/endpoint_pair_posix.cc diff --git a/Makefile b/Makefile index f6f750d709b..243053da687 100644 --- a/Makefile +++ b/Makefile @@ -3840,6 +3840,7 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/call_combiner.cc \ src/core/lib/iomgr/cfstream_handle.cc \ src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ src/core/lib/iomgr/endpoint.cc \ src/core/lib/iomgr/endpoint_cfstream.cc \ src/core/lib/iomgr/endpoint_pair_posix.cc \ @@ -4461,6 +4462,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/call_combiner.cc \ src/core/lib/iomgr/cfstream_handle.cc \ src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ src/core/lib/iomgr/endpoint.cc \ src/core/lib/iomgr/endpoint_cfstream.cc \ src/core/lib/iomgr/endpoint_pair_posix.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 1ecb3f54f7e..db915e77dcc 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -923,6 +923,7 @@ libs: - src/core/lib/iomgr/call_combiner.cc - src/core/lib/iomgr/cfstream_handle.cc - src/core/lib/iomgr/combiner.cc + - src/core/lib/iomgr/dualstack_socket_posix.cc - src/core/lib/iomgr/endpoint.cc - src/core/lib/iomgr/endpoint_cfstream.cc - src/core/lib/iomgr/endpoint_pair_posix.cc @@ -1745,6 +1746,7 @@ libs: - src/core/lib/iomgr/call_combiner.cc - src/core/lib/iomgr/cfstream_handle.cc - src/core/lib/iomgr/combiner.cc + - src/core/lib/iomgr/dualstack_socket_posix.cc - src/core/lib/iomgr/endpoint.cc - src/core/lib/iomgr/endpoint_cfstream.cc - src/core/lib/iomgr/endpoint_pair_posix.cc diff --git a/config.m4 b/config.m4 index dc8592b9d1f..7a38e36cd71 100644 --- a/config.m4 +++ b/config.m4 @@ -273,6 +273,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/call_combiner.cc \ src/core/lib/iomgr/cfstream_handle.cc \ src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ src/core/lib/iomgr/endpoint.cc \ src/core/lib/iomgr/endpoint_cfstream.cc \ src/core/lib/iomgr/endpoint_pair_posix.cc \ diff --git a/config.w32 b/config.w32 index 518ebb87e67..089504a1841 100644 --- a/config.w32 +++ b/config.w32 @@ -242,6 +242,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\iomgr\\call_combiner.cc " + "src\\core\\lib\\iomgr\\cfstream_handle.cc " + "src\\core\\lib\\iomgr\\combiner.cc " + + "src\\core\\lib\\iomgr\\dualstack_socket_posix.cc " + "src\\core\\lib\\iomgr\\endpoint.cc " + "src\\core\\lib\\iomgr\\endpoint_cfstream.cc " + "src\\core\\lib\\iomgr\\endpoint_pair_posix.cc " + diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index c6f26956635..f842a3ae677 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -632,6 +632,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/closure.h', 'src/core/lib/iomgr/combiner.cc', 'src/core/lib/iomgr/combiner.h', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', 'src/core/lib/iomgr/dynamic_annotations.h', 'src/core/lib/iomgr/endpoint.cc', 'src/core/lib/iomgr/endpoint.h', diff --git a/grpc.gemspec b/grpc.gemspec index 243c8352652..cf0b389f50a 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -554,6 +554,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/closure.h ) s.files += %w( src/core/lib/iomgr/combiner.cc ) s.files += %w( src/core/lib/iomgr/combiner.h ) + s.files += %w( src/core/lib/iomgr/dualstack_socket_posix.cc ) s.files += %w( src/core/lib/iomgr/dynamic_annotations.h ) s.files += %w( src/core/lib/iomgr/endpoint.cc ) s.files += %w( src/core/lib/iomgr/endpoint.h ) diff --git a/grpc.gyp b/grpc.gyp index 94e42076da1..c32c0dca814 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -626,6 +626,7 @@ 'src/core/lib/iomgr/call_combiner.cc', 'src/core/lib/iomgr/cfstream_handle.cc', 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', 'src/core/lib/iomgr/endpoint.cc', 'src/core/lib/iomgr/endpoint_cfstream.cc', 'src/core/lib/iomgr/endpoint_pair_posix.cc', @@ -1108,6 +1109,7 @@ 'src/core/lib/iomgr/call_combiner.cc', 'src/core/lib/iomgr/cfstream_handle.cc', 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', 'src/core/lib/iomgr/endpoint.cc', 'src/core/lib/iomgr/endpoint_cfstream.cc', 'src/core/lib/iomgr/endpoint_pair_posix.cc', diff --git a/package.xml b/package.xml index 951ad89d023..d9d5d1516d8 100644 --- a/package.xml +++ b/package.xml @@ -534,6 +534,7 @@ + diff --git a/src/core/lib/iomgr/dualstack_socket_posix.cc b/src/core/lib/iomgr/dualstack_socket_posix.cc new file mode 100644 index 00000000000..dc0eafebf98 --- /dev/null +++ b/src/core/lib/iomgr/dualstack_socket_posix.cc @@ -0,0 +1,47 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON + +#include +#include "src/core/lib/iomgr/socket_utils_posix.h" + +#ifndef GRPC_SET_SOCKET_DUALSTACK_CUSTOM + +/* This should be 0 in production, but it may be enabled for testing or + debugging purposes, to simulate an environment where IPv6 sockets can't + also speak IPv4. */ +int grpc_forbid_dualstack_sockets_for_testing = 0; + +int grpc_set_socket_dualstack(int fd) { + if (!grpc_forbid_dualstack_sockets_for_testing) { + const int off = 0; + return 0 == setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)); + } else { + /* Force an IPv6-only socket, for testing purposes. */ + const int on = 1; + setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); + return 0; + } +} +#endif // GRPC_SET_SOCKET_DUALSTACK_CUSTOM +#endif // GRPC_POSIX_SOCKET_UTILS_COMMON diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc index 3974ae7dec2..a5048d890d3 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.cc +++ b/src/core/lib/iomgr/socket_utils_common_posix.cc @@ -396,23 +396,6 @@ int grpc_ipv6_loopback_available(void) { return g_ipv6_loopback_available; } -/* This should be 0 in production, but it may be enabled for testing or - debugging purposes, to simulate an environment where IPv6 sockets can't - also speak IPv4. */ -int grpc_forbid_dualstack_sockets_for_testing = 0; - -static int set_socket_dualstack(int fd) { - if (!grpc_forbid_dualstack_sockets_for_testing) { - const int off = 0; - return 0 == setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off)); - } else { - /* Force an IPv6-only socket, for testing purposes. */ - const int on = 1; - setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)); - return 0; - } -} - static grpc_error* error_for_fd(int fd, const grpc_resolved_address* addr) { if (fd >= 0) return GRPC_ERROR_NONE; char* addr_str; @@ -452,7 +435,7 @@ grpc_error* grpc_create_dualstack_socket_using_factory( errno = EAFNOSUPPORT; } /* Check if we've got a valid dualstack socket. */ - if (*newfd >= 0 && set_socket_dualstack(*newfd)) { + if (*newfd >= 0 && grpc_set_socket_dualstack(*newfd)) { *dsmode = GRPC_DSMODE_DUALSTACK; return GRPC_ERROR_NONE; } diff --git a/src/core/lib/iomgr/socket_utils_posix.h b/src/core/lib/iomgr/socket_utils_posix.h index 734d340a953..b4dc909d1e0 100644 --- a/src/core/lib/iomgr/socket_utils_posix.h +++ b/src/core/lib/iomgr/socket_utils_posix.h @@ -126,6 +126,9 @@ typedef enum grpc_dualstack_mode { /* Only tests should use this flag. */ extern int grpc_forbid_dualstack_sockets_for_testing; +/* Tries to set the socket to dualstack. Returns 1 on success. */ +int grpc_set_socket_dualstack(int fd); + /* Creates a new socket for connecting to (or listening on) an address. If addr is AF_INET6, this creates an IPv6 socket first. If that fails, diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 06477148ca9..dd26915d14b 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -251,6 +251,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/iomgr/call_combiner.cc', 'src/core/lib/iomgr/cfstream_handle.cc', 'src/core/lib/iomgr/combiner.cc', + 'src/core/lib/iomgr/dualstack_socket_posix.cc', 'src/core/lib/iomgr/endpoint.cc', 'src/core/lib/iomgr/endpoint_cfstream.cc', 'src/core/lib/iomgr/endpoint_pair_posix.cc', diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 2cdd451df64..5c5d1c9fac5 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1517,6 +1517,7 @@ src/core/lib/iomgr/cfstream_handle.h \ src/core/lib/iomgr/closure.h \ src/core/lib/iomgr/combiner.cc \ src/core/lib/iomgr/combiner.h \ +src/core/lib/iomgr/dualstack_socket_posix.cc \ src/core/lib/iomgr/dynamic_annotations.h \ src/core/lib/iomgr/endpoint.cc \ src/core/lib/iomgr/endpoint.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 5a643358339..20087420e4e 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1329,6 +1329,7 @@ src/core/lib/iomgr/cfstream_handle.h \ src/core/lib/iomgr/closure.h \ src/core/lib/iomgr/combiner.cc \ src/core/lib/iomgr/combiner.h \ +src/core/lib/iomgr/dualstack_socket_posix.cc \ src/core/lib/iomgr/dynamic_annotations.h \ src/core/lib/iomgr/endpoint.cc \ src/core/lib/iomgr/endpoint.h \