diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 182ae24..72f0754 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -61,6 +61,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ${_GRPC_GRPCPP} PRIVATE ${_PROTOBUF_LIBPROTOBUF} -lrt + -static ) set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE -s) diff --git a/src/cmake/gRPCFetchCMake.cmake b/src/cmake/gRPCFetchCMake.cmake index 470f2d4..62885ea 100644 --- a/src/cmake/gRPCFetchCMake.cmake +++ b/src/cmake/gRPCFetchCMake.cmake @@ -8,31 +8,12 @@ include(FetchContent) -macro(apply_git_patch REPO_PATH PATCH_PATH) - execute_process(COMMAND git apply --check ${PATCH_PATH} - WORKING_DIRECTORY ${REPO_PATH} - RESULT_VARIABLE SUCCESS - ERROR_QUIET) - - if(${SUCCESS} EQUAL 0) - message("Applying git patch ${PATCH_PATH} in ${REPO_PATH} repository") - execute_process(COMMAND git am -3 ${PATCH_PATH} - WORKING_DIRECTORY ${REPO_PATH} - RESULT_VARIABLE SUCCESS) - - if(${SUCCESS} EQUAL 1) - # We don't stop here because it can happen in case of parallel builds - message(WARNING "\nError: failed to apply the patch patch: ${PATCH_PATH}\n") - endif() - else() - message("Already applied: ${PATCH_PATH}") - endif() -endmacro() +set(protobuf_INSTALL OFF) FetchContent_Declare( grpc GIT_REPOSITORY https://github.com/grpc/grpc - GIT_TAG v1.52.1 + GIT_TAG v1.57.0 GIT_SHALLOW 1 ) set(FETCHCONTENT_QUIET OFF) @@ -41,12 +22,6 @@ FetchContent_GetProperties(grpc) if (NOT grpc_POPULATED) FetchContent_Populate(grpc) - #Apply VSOCK patches - file(GLOB patches_files "${CMAKE_SOURCE_DIR}/src/external/patches/grpc/*.patch") - foreach(file ${patches_files}) - apply_git_patch(${grpc_SOURCE_DIR} ${file}) - endforeach() - add_subdirectory(${grpc_SOURCE_DIR} ${grpc_BINARY_DIR} EXCLUDE_FROM_ALL) endif() diff --git a/src/external/patches/grpc/0001-support-vsock_v1.52.1.patch b/src/external/patches/grpc/0001-support-vsock_v1.52.1.patch deleted file mode 100644 index d10e159..0000000 --- a/src/external/patches/grpc/0001-support-vsock_v1.52.1.patch +++ /dev/null @@ -1,719 +0,0 @@ -From 4f549ba7c67e0ff858005ae28ec3af43b4350352 Mon Sep 17 00:00:00 2001 -From: "Qi, Yadong" -Date: Wed, 14 Jul 2021 02:20:36 +0000 -Subject: [PATCH] support vsock - -Support Virtio-VSOCK - -Signed-off-by: Qi, Yadong ---- - BUILD | 2 + - CMakeLists.txt | 2 + - Makefile | 2 + - config.m4 | 1 + - gRPC-Core.podspec | 2 + - grpc.gemspec | 2 + - package.xml | 2 + - .../ext/filters/client_channel/http_proxy.cc | 5 + - .../resolver/sockaddr/README.md | 2 +- - .../resolver/sockaddr/sockaddr_resolver.cc | 24 +++++ - .../transport/chttp2/server/chttp2_server.cc | 4 + - src/core/lib/address_utils/parse_address.cc | 99 +++++++++++++++++++ - src/core/lib/address_utils/parse_address.h | 8 ++ - src/core/lib/address_utils/sockaddr_utils.cc | 41 ++++++++ - src/core/lib/iomgr/port.h | 2 + - src/core/lib/iomgr/sockaddr_posix.h | 1 + - src/core/lib/iomgr/sockaddr_windows.h | 1 + - src/core/lib/iomgr/tcp_client_posix.cc | 3 +- - .../iomgr/tcp_server_utils_posix_common.cc | 5 +- - src/core/lib/iomgr/vsock.cc | 73 ++++++++++++++ - src/core/lib/iomgr/vsock.h | 40 ++++++++ - src/python/grpcio/grpc_core_dependencies.py | 1 + - 22 files changed, 318 insertions(+), 4 deletions(-) - create mode 100644 src/core/lib/iomgr/vsock.cc - create mode 100644 src/core/lib/iomgr/vsock.h - -diff --git a/BUILD b/BUILD -index c000a1f6a..6e4c3661b 100644 ---- a/BUILD -+++ b/BUILD -@@ -1236,6 +1236,7 @@ grpc_cc_library( - "//src/core:lib/iomgr/tcp_windows.cc", - "//src/core:lib/iomgr/unix_sockets_posix.cc", - "//src/core:lib/iomgr/unix_sockets_posix_noop.cc", -+ "//src/core:lib/iomgr/vsock.cc", - "//src/core:lib/iomgr/wakeup_fd_eventfd.cc", - "//src/core:lib/iomgr/wakeup_fd_nospecial.cc", - "//src/core:lib/iomgr/wakeup_fd_pipe.cc", -@@ -1329,6 +1330,7 @@ grpc_cc_library( - "//src/core:lib/iomgr/tcp_server_utils_posix.h", - "//src/core:lib/iomgr/tcp_windows.h", - "//src/core:lib/iomgr/unix_sockets_posix.h", -+ "//src/core:lib/iomgr/vsock.h", - "//src/core:lib/iomgr/wakeup_fd_pipe.h", - "//src/core:lib/iomgr/wakeup_fd_posix.h", - "//src/core:lib/resource_quota/api.h", -diff --git a/CMakeLists.txt b/CMakeLists.txt -index b0299050c..f8869ecd3 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -2260,6 +2260,7 @@ add_library(grpc - src/core/lib/iomgr/timer_manager.cc - src/core/lib/iomgr/unix_sockets_posix.cc - src/core/lib/iomgr/unix_sockets_posix_noop.cc -+ src/core/lib/iomgr/vsock.cc - src/core/lib/iomgr/wakeup_fd_eventfd.cc - src/core/lib/iomgr/wakeup_fd_nospecial.cc - src/core/lib/iomgr/wakeup_fd_pipe.cc -@@ -2929,6 +2930,7 @@ add_library(grpc_unsecure - src/core/lib/iomgr/timer_manager.cc - src/core/lib/iomgr/unix_sockets_posix.cc - src/core/lib/iomgr/unix_sockets_posix_noop.cc -+ src/core/lib/iomgr/vsock.cc - src/core/lib/iomgr/wakeup_fd_eventfd.cc - src/core/lib/iomgr/wakeup_fd_nospecial.cc - src/core/lib/iomgr/wakeup_fd_pipe.cc -diff --git a/Makefile b/Makefile -index 9b94bf4e0..fc327ec51 100644 ---- a/Makefile -+++ b/Makefile -@@ -1528,6 +1528,7 @@ LIBGRPC_SRC = \ - src/core/lib/iomgr/timer_manager.cc \ - src/core/lib/iomgr/unix_sockets_posix.cc \ - src/core/lib/iomgr/unix_sockets_posix_noop.cc \ -+ src/core/lib/iomgr/vsock.cc \ - src/core/lib/iomgr/wakeup_fd_eventfd.cc \ - src/core/lib/iomgr/wakeup_fd_nospecial.cc \ - src/core/lib/iomgr/wakeup_fd_pipe.cc \ -@@ -2056,6 +2057,7 @@ LIBGRPC_UNSECURE_SRC = \ - src/core/lib/iomgr/timer_manager.cc \ - src/core/lib/iomgr/unix_sockets_posix.cc \ - src/core/lib/iomgr/unix_sockets_posix_noop.cc \ -+ src/core/lib/iomgr/vsock.cc \ - src/core/lib/iomgr/wakeup_fd_eventfd.cc \ - src/core/lib/iomgr/wakeup_fd_nospecial.cc \ - src/core/lib/iomgr/wakeup_fd_pipe.cc \ -diff --git a/config.m4 b/config.m4 -index 2bf738be1..111827d09 100644 ---- a/config.m4 -+++ b/config.m4 -@@ -653,6 +653,7 @@ if test "$PHP_GRPC" != "no"; then - src/core/lib/iomgr/timer_manager.cc \ - src/core/lib/iomgr/unix_sockets_posix.cc \ - src/core/lib/iomgr/unix_sockets_posix_noop.cc \ -+ src/core/lib/iomgr/vsock.cc \ - src/core/lib/iomgr/wakeup_fd_eventfd.cc \ - src/core/lib/iomgr/wakeup_fd_nospecial.cc \ - src/core/lib/iomgr/wakeup_fd_pipe.cc \ -diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec -index cd56e4bb7..1e7c6576d 100644 ---- a/gRPC-Core.podspec -+++ b/gRPC-Core.podspec -@@ -1418,6 +1418,7 @@ Pod::Spec.new do |s| - 'src/core/lib/iomgr/unix_sockets_posix.cc', - 'src/core/lib/iomgr/unix_sockets_posix.h', - 'src/core/lib/iomgr/unix_sockets_posix_noop.cc', -+ 'src/core/lib/iomgr/vsock.cc', - 'src/core/lib/iomgr/wakeup_fd_eventfd.cc', - 'src/core/lib/iomgr/wakeup_fd_nospecial.cc', - 'src/core/lib/iomgr/wakeup_fd_pipe.cc', -@@ -2456,6 +2457,7 @@ Pod::Spec.new do |s| - 'src/core/lib/iomgr/timer_heap.h', - 'src/core/lib/iomgr/timer_manager.h', - 'src/core/lib/iomgr/unix_sockets_posix.h', -+ 'src/core/lib/iomgr/vsock.h', - 'src/core/lib/iomgr/wakeup_fd_pipe.h', - 'src/core/lib/iomgr/wakeup_fd_posix.h', - 'src/core/lib/json/json.h', -diff --git a/grpc.gemspec b/grpc.gemspec -index d91c2828b..ddf731d45 100644 ---- a/grpc.gemspec -+++ b/grpc.gemspec -@@ -1329,6 +1329,8 @@ Gem::Specification.new do |s| - s.files += %w( src/core/lib/iomgr/unix_sockets_posix.cc ) - s.files += %w( src/core/lib/iomgr/unix_sockets_posix.h ) - s.files += %w( src/core/lib/iomgr/unix_sockets_posix_noop.cc ) -+ s.files += %w( src/core/lib/iomgr/vsock.cc ) -+ s.files += %w( src/core/lib/iomgr/vsock.h ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_eventfd.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_nospecial.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.cc ) -diff --git a/package.xml b/package.xml -index ddef258ae..bf56a4ecb 100644 ---- a/package.xml -+++ b/package.xml -@@ -1311,6 +1311,8 @@ - - - -+ -+ - - - -diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc -index 113e5e6ab..aed4fe7aa 100644 ---- a/src/core/ext/filters/client_channel/http_proxy.cc -+++ b/src/core/ext/filters/client_channel/http_proxy.cc -@@ -149,6 +149,11 @@ absl::optional HttpProxyMapper::MapName( - std::string(server_uri).c_str()); - return absl::nullopt; - } -+ if (uri->scheme() == "vsock") { -+ gpr_log(GPR_INFO, "not using proxy for VSock '%s'", -+ std::string(server_uri).c_str()); -+ return absl::nullopt; -+ } - // Prefer using 'no_grpc_proxy'. Fallback on 'no_proxy' if it is not set. - auto no_proxy_str = GetEnv("no_grpc_proxy"); - if (!no_proxy_str.has_value()) { -diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/README.md b/src/core/ext/filters/client_channel/resolver/sockaddr/README.md -index e307ba88f..210ffdf3a 100644 ---- a/src/core/ext/filters/client_channel/resolver/sockaddr/README.md -+++ b/src/core/ext/filters/client_channel/resolver/sockaddr/README.md -@@ -1 +1 @@ --Support for resolving ipv4:, ipv6:, unix: schemes -+Support for resolving ipv4:, ipv6:, unix:, vsock: schemes -diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc -index 7dc785930..7d14cafbe 100644 ---- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc -+++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc -@@ -172,6 +172,26 @@ class UnixAbstractResolverFactory : public ResolverFactory { - }; - #endif // GRPC_HAVE_UNIX_SOCKET - -+#ifdef GRPC_HAVE_VSOCK -+class VSockResolverFactory : public ResolverFactory { -+ public: -+ bool IsValidUri(const URI& uri) const override { -+ return ParseUri(uri, grpc_parse_vsock, nullptr); -+ } -+ -+ OrphanablePtr CreateResolver(ResolverArgs args) const override { -+ return CreateSockaddrResolver(std::move(args), grpc_parse_vsock); -+ } -+ -+ std::string GetDefaultAuthority(const URI& /*uri*/) const override { -+ return "localhost"; -+ } -+ -+ absl::string_view scheme() const override { return "vsock"; } -+}; -+ -+#endif // GRPC_HAVE_VSOCK -+ - } // namespace - - void RegisterSockaddrResolver(CoreConfiguration::Builder* builder) { -@@ -185,6 +205,10 @@ void RegisterSockaddrResolver(CoreConfiguration::Builder* builder) { - builder->resolver_registry()->RegisterResolverFactory( - std::make_unique()); - #endif -+#ifdef GRPC_HAVE_VSOCK -+ builder->resolver_registry()->RegisterResolverFactory( -+ absl::make_unique()); -+#endif - } - - } // namespace grpc_core -diff --git a/src/core/ext/transport/chttp2/server/chttp2_server.cc b/src/core/ext/transport/chttp2/server/chttp2_server.cc -index 714c4150e..4d2ce8368 100644 ---- a/src/core/ext/transport/chttp2/server/chttp2_server.cc -+++ b/src/core/ext/transport/chttp2/server/chttp2_server.cc -@@ -70,6 +70,7 @@ - #include "src/core/lib/iomgr/tcp_server.h" - #include "src/core/lib/iomgr/timer.h" - #include "src/core/lib/iomgr/unix_sockets_posix.h" -+#include "src/core/lib/iomgr/vsock.h" - #include "src/core/lib/resource_quota/memory_quota.h" - #include "src/core/lib/resource_quota/resource_quota.h" - #include "src/core/lib/security/credentials/credentials.h" -@@ -95,6 +96,7 @@ namespace { - - const char kUnixUriPrefix[] = "unix:"; - const char kUnixAbstractUriPrefix[] = "unix-abstract:"; -+const char kVSockUriPrefix[] = "vsock:"; - - class Chttp2ServerListener : public Server::ListenerInterface { - public: -@@ -925,6 +927,8 @@ grpc_error_handle Chttp2ServerAddPort(Server* server, const char* addr, - kUnixAbstractUriPrefix)) { - resolved_or = - grpc_resolve_unix_abstract_domain_address(parsed_addr_unprefixed); -+ } else if (absl::ConsumePrefix(&parsed_addr_unprefixed, kVSockUriPrefix)) { -+ resolved_or = grpc_resolve_vsock_address(parsed_addr_unprefixed); - } else { - resolved_or = - GetDNSResolver()->LookupHostnameBlocking(parsed_addr, "https"); -diff --git a/src/core/lib/address_utils/parse_address.cc b/src/core/lib/address_utils/parse_address.cc -index c72987c5d..1f8404192 100644 ---- a/src/core/lib/address_utils/parse_address.cc -+++ b/src/core/lib/address_utils/parse_address.cc -@@ -27,6 +27,10 @@ - #include - #endif - #include -+#ifdef GRPC_HAVE_VSOCK -+#include -+#include -+#endif - - #include "absl/status/status.h" - #include "absl/strings/str_cat.h" -@@ -144,6 +148,98 @@ grpc_error_handle UnixAbstractSockaddrPopulate( - } // namespace grpc_core - #endif // GRPC_HAVE_UNIX_SOCKET - -+#ifdef GRPC_HAVE_VSOCK -+ -+bool grpc_parse_vsock(const grpc_core::URI& uri, -+ grpc_resolved_address* resolved_addr) { -+ if (uri.scheme() != "vsock") { -+ gpr_log(GPR_ERROR, "Expected 'vsock' scheme, got '%s'", -+ uri.scheme().c_str()); -+ return false; -+ } -+ grpc_error_handle error = -+ grpc_core::VSockaddrPopulate(uri.path(), resolved_addr); -+ if (!error.ok()) { -+ gpr_log(GPR_ERROR, "%s", grpc_core::StatusToString(error).c_str()); -+ return false; -+ } -+ return true; -+} -+ -+namespace grpc_core { -+ -+grpc_error_handle VSockaddrPopulate(absl::string_view cidport, -+ grpc_resolved_address* resolved_addr) { -+ memset(resolved_addr, 0, sizeof(*resolved_addr)); -+ struct sockaddr_vm* vm = -+ reinterpret_cast(resolved_addr->addr); -+ -+ vm->svm_family = AF_VSOCK; -+ -+ //Split cid and port -+ std::string cid; -+ std::string port; -+ size_t colon = cidport.find(':'); -+ if (colon != absl::string_view::npos && -+ cidport.find(':', colon + 1) == absl::string_view::npos) { -+ cid = std::string(cidport.substr(0, colon)); -+ port = std::string(cidport.substr(colon + 1, cidport.size() - colon - 1)); -+ } else { -+ return GRPC_ERROR_CREATE( -+ absl::StrCat("Failed split vsock cid/port: %s ", -+ std::string(cidport).c_str()).c_str()); -+ } -+ -+ // Parse cid -+ if (cid.empty()) { -+ return GRPC_ERROR_CREATE( -+ absl::StrCat("no vsock cid given for vsock scheme").c_str()); -+ } -+ unsigned int cid_num; -+ if (sscanf(cid.c_str(), "%u", &cid_num) != 1) { -+ return GRPC_ERROR_CREATE( -+ absl::StrCat("invalid vsock cid: '%s'", -+ std::string(cid).c_str()).c_str()); -+ } -+ vm->svm_cid = cid_num; -+ -+ // Parse port -+ if (port.empty()) { -+ return GRPC_ERROR_CREATE( -+ absl::StrCat("no vsock port given for vsock scheme").c_str()); -+ } -+ unsigned int port_num; -+ if (sscanf(port.c_str(), "%u", &port_num) != 1) { -+ return GRPC_ERROR_CREATE( -+ absl::StrCat("invalid vsock port: '%s'", -+ std::string(cid).c_str()).c_str()); -+ } -+ vm->svm_port = port_num; -+ -+ resolved_addr->len = static_cast(sizeof(*vm)); -+ return absl::OkStatus(); -+} -+ -+} // namespace grpc_core -+ -+#else /* GRPC_HAVE_VSOCK */ -+ -+bool grpc_parse_vsock(const grpc_core::URI& /* uri */, -+ grpc_resolved_address* /* resolved_addr */) { -+ abort(); -+} -+ -+namespace grpc_core { -+ -+grpc_error_handle VSockaddrPopulate( -+ absl::string_view /* path */, grpc_resolved_address* /* resolved_addr */) { -+ abort(); -+} -+ -+} // namespace grpc_core -+#endif /* GRPC_HAVE_VSOCK */ -+ -+ - bool grpc_parse_ipv4_hostport(absl::string_view hostport, - grpc_resolved_address* addr, bool log_errors) { - bool success = false; -@@ -299,6 +395,9 @@ bool grpc_parse_uri(const grpc_core::URI& uri, - if (uri.scheme() == "unix-abstract") { - return grpc_parse_unix_abstract(uri, resolved_addr); - } -+ if (uri.scheme() == "vsock") { -+ return grpc_parse_vsock(uri, resolved_addr); -+ } - if (uri.scheme() == "ipv4") { - return grpc_parse_ipv4(uri, resolved_addr); - } -diff --git a/src/core/lib/address_utils/parse_address.h b/src/core/lib/address_utils/parse_address.h -index 6005f5f26..ef55448b4 100644 ---- a/src/core/lib/address_utils/parse_address.h -+++ b/src/core/lib/address_utils/parse_address.h -@@ -40,6 +40,11 @@ bool grpc_parse_unix(const grpc_core::URI& uri, - bool grpc_parse_unix_abstract(const grpc_core::URI& uri, - grpc_resolved_address* resolved_addr); - -+/// Populate \a resolved_addr from \a uri, whose path is expected to contain a -+/// virtio vsock path. Returns true upon success. -+bool grpc_parse_vsock(const grpc_core::URI& uri, -+ grpc_resolved_address* resolved_addr); -+ - /// Populate \a resolved_addr from \a uri, whose path is expected to contain an - /// IPv4 host:port pair. Returns true upon success. - bool grpc_parse_ipv4(const grpc_core::URI& uri, -@@ -81,6 +86,9 @@ grpc_error_handle UnixSockaddrPopulate(absl::string_view path, - grpc_error_handle UnixAbstractSockaddrPopulate( - absl::string_view path, grpc_resolved_address* resolved_addr); - -+/** Populate \a resolved_addr to be a virtio-vsock at |path| */ -+grpc_error_handle VSockaddrPopulate(absl::string_view path, -+ grpc_resolved_address* resolved_addr); - } // namespace grpc_core - - #endif // GRPC_CORE_LIB_ADDRESS_UTILS_PARSE_ADDRESS_H -diff --git a/src/core/lib/address_utils/sockaddr_utils.cc b/src/core/lib/address_utils/sockaddr_utils.cc -index e45183a89..15b7b2693 100644 ---- a/src/core/lib/address_utils/sockaddr_utils.cc -+++ b/src/core/lib/address_utils/sockaddr_utils.cc -@@ -44,6 +44,11 @@ - #include - #endif - -+#ifdef GRPC_HAVE_VSOCK -+#include -+#include -+#endif -+ - #ifdef GRPC_HAVE_UNIX_SOCKET - static absl::StatusOr grpc_sockaddr_to_uri_unix_if_possible( - const grpc_resolved_address* resolved_addr) { -@@ -76,6 +81,24 @@ static absl::StatusOr grpc_sockaddr_to_uri_unix_if_possible( - } - #endif - -+#ifdef GRPC_HAVE_VSOCK -+static std::string grpc_sockaddr_to_uri_vsock_if_possible( -+ const grpc_resolved_address* resolved_addr) { -+ const grpc_sockaddr* addr = -+ reinterpret_cast(resolved_addr->addr); -+ if (addr->sa_family != AF_VSOCK) { -+ return ""; -+ } -+ const auto* vsock_addr = reinterpret_cast(addr); -+ return absl::StrCat("vsock:", vsock_addr->svm_cid, ":", vsock_addr->svm_port); -+} -+#else -+static std::string grpc_sockaddr_to_uri_vsock_if_possible( -+ const grpc_resolved_address* /* addr */) { -+ return ""; -+} -+#endif -+ - static const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0xff, 0xff}; - -@@ -223,6 +246,14 @@ absl::StatusOr grpc_sockaddr_to_string( - } - #endif - -+#ifdef GRPC_HAVE_VSOCK -+ if (addr->sa_family == GRPC_AF_VSOCK) { -+ const sockaddr_vm* addr_vm = reinterpret_cast(addr); -+ out = std::string(absl::StrCat(addr_vm->svm_cid, ":", addr_vm->svm_port)); -+ return out; -+ } -+#endif -+ - const void* ip = nullptr; - int port = 0; - uint32_t sin6_scope_id = 0; -@@ -271,6 +302,10 @@ absl::StatusOr grpc_sockaddr_to_uri( - if (scheme == nullptr || strcmp("unix", scheme) == 0) { - return grpc_sockaddr_to_uri_unix_if_possible(resolved_addr); - } -+ if (scheme == nullptr || strcmp("vsock", scheme) == 0) { -+ return grpc_sockaddr_to_uri_vsock_if_possible(resolved_addr); -+ } -+ - auto path = grpc_sockaddr_to_string(resolved_addr, false /* normalize */); - if (!path.ok()) return path; - absl::StatusOr uri = -@@ -291,6 +326,8 @@ const char* grpc_sockaddr_get_uri_scheme( - return "ipv6"; - case GRPC_AF_UNIX: - return "unix"; -+ case GRPC_AF_VSOCK: -+ return "vsock"; - } - return nullptr; - } -@@ -314,6 +351,10 @@ int grpc_sockaddr_get_port(const grpc_resolved_address* resolved_addr) { - #ifdef GRPC_HAVE_UNIX_SOCKET - case AF_UNIX: - return 1; -+#endif -+#ifdef GRPC_HAVE_VSOCK -+ case AF_VSOCK: -+ return 1; - #endif - default: - gpr_log(GPR_ERROR, "Unknown socket family %d in grpc_sockaddr_get_port", -diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h -index 743bc1ef5..27f5941e8 100644 ---- a/src/core/lib/iomgr/port.h -+++ b/src/core/lib/iomgr/port.h -@@ -37,6 +37,7 @@ - #define GRPC_HAVE_IP_PKTINFO 1 - #define GRPC_HAVE_MSG_NOSIGNAL 1 - #define GRPC_HAVE_UNIX_SOCKET 1 -+#define GRPC_HAVE_VSOCK 1 - #define GRPC_LINUX_EVENTFD 1 - #define GRPC_POSIX_SOCKET 1 - #define GRPC_POSIX_SOCKETUTILS 1 -@@ -48,6 +49,7 @@ - #define GRPC_HAVE_IP_PKTINFO 1 - #define GRPC_HAVE_MSG_NOSIGNAL 1 - #define GRPC_HAVE_UNIX_SOCKET 1 -+#define GRPC_HAVE_VSOCK 1 - // Linux has TCP_INQ support since 4.18, but it is safe to set - // the socket option on older kernels. - #define GRPC_HAVE_TCP_INQ 1 -diff --git a/src/core/lib/iomgr/sockaddr_posix.h b/src/core/lib/iomgr/sockaddr_posix.h -index 075c79322..7dd8fb345 100644 ---- a/src/core/lib/iomgr/sockaddr_posix.h -+++ b/src/core/lib/iomgr/sockaddr_posix.h -@@ -47,6 +47,7 @@ typedef struct in6_addr grpc_in6_addr; - - #define GRPC_AF_UNSPEC AF_UNSPEC - #define GRPC_AF_UNIX AF_UNIX -+#define GRPC_AF_VSOCK AF_VSOCK - #define GRPC_AF_INET AF_INET - #define GRPC_AF_INET6 AF_INET6 - -diff --git a/src/core/lib/iomgr/sockaddr_windows.h b/src/core/lib/iomgr/sockaddr_windows.h -index c367ec12e..d55518f22 100644 ---- a/src/core/lib/iomgr/sockaddr_windows.h -+++ b/src/core/lib/iomgr/sockaddr_windows.h -@@ -47,6 +47,7 @@ typedef struct in6_addr grpc_in6_addr; - - #define GRPC_AF_UNSPEC AF_UNSPEC - #define GRPC_AF_UNIX AF_UNIX -+#define GRPC_AF_VSOCK AF_VSOCK - #define GRPC_AF_INET AF_INET - #define GRPC_AF_INET6 AF_INET6 - -diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc -index 96ccdf298..ca199723c 100644 ---- a/src/core/lib/iomgr/tcp_client_posix.cc -+++ b/src/core/lib/iomgr/tcp_client_posix.cc -@@ -47,6 +47,7 @@ - #include "src/core/lib/iomgr/tcp_posix.h" - #include "src/core/lib/iomgr/timer.h" - #include "src/core/lib/iomgr/unix_sockets_posix.h" -+#include "src/core/lib/iomgr/vsock.h" - #include "src/core/lib/slice/slice_internal.h" - - extern grpc_core::TraceFlag grpc_tcp_trace; -@@ -103,7 +104,7 @@ static grpc_error_handle prepare_socket( - if (!err.ok()) goto error; - err = grpc_set_socket_cloexec(fd, 1); - if (!err.ok()) goto error; -- if (!grpc_is_unix_socket(addr)) { -+ if (!grpc_is_unix_socket(addr) && !grpc_is_vsock(addr)) { - err = grpc_set_socket_low_latency(fd, 1); - if (!err.ok()) goto error; - err = grpc_set_socket_reuse_addr(fd, 1); -diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc -index 574fd02d0..80e6eca36 100644 ---- a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc -+++ b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc -@@ -42,6 +42,7 @@ - #include "src/core/lib/iomgr/sockaddr.h" - #include "src/core/lib/iomgr/tcp_server_utils_posix.h" - #include "src/core/lib/iomgr/unix_sockets_posix.h" -+#include "src/core/lib/iomgr/vsock.h" - - #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 - -@@ -190,7 +191,7 @@ grpc_error_handle grpc_tcp_server_prepare_socket( - - GPR_ASSERT(fd >= 0); - -- if (so_reuseport && !grpc_is_unix_socket(addr)) { -+ if (so_reuseport && !grpc_is_unix_socket(addr) && !grpc_is_vsock(addr)) { - err = grpc_set_socket_reuse_port(fd, 1); - if (!err.ok()) goto error; - } -@@ -206,7 +207,7 @@ grpc_error_handle grpc_tcp_server_prepare_socket( - if (!err.ok()) goto error; - err = grpc_set_socket_cloexec(fd, 1); - if (!err.ok()) goto error; -- if (!grpc_is_unix_socket(addr)) { -+ if (!grpc_is_unix_socket(addr) && !grpc_is_vsock(addr)) { - err = grpc_set_socket_low_latency(fd, 1); - if (!err.ok()) goto error; - err = grpc_set_socket_reuse_addr(fd, 1); -diff --git a/src/core/lib/iomgr/vsock.cc b/src/core/lib/iomgr/vsock.cc -new file mode 100644 -index 000000000..c72356f81 ---- /dev/null -+++ b/src/core/lib/iomgr/vsock.cc -@@ -0,0 +1,73 @@ -+/* -+ * -+ * Copyright 2021 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_HAVE_VSOCK -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "absl/strings/str_cat.h" -+ -+#include -+#include -+ -+#include "src/core/lib/address_utils/parse_address.h" -+#include "src/core/lib/gpr/useful.h" -+#include "src/core/lib/iomgr/sockaddr.h" -+#include "src/core/lib/iomgr/vsock.h" -+#include "src/core/lib/transport/error_utils.h" -+ -+void grpc_create_socketpair_if_vsock(int sv[2]) { -+ GPR_ASSERT(socketpair(AF_VSOCK, SOCK_STREAM, 0, sv) == 0); -+} -+ -+absl::StatusOr> -+grpc_resolve_vsock_address(absl::string_view name) { -+ grpc_resolved_address addr; -+ grpc_error_handle error = grpc_core::VSockaddrPopulate(name, &addr); -+ if (error.ok()) { -+ return std::vector({addr}); -+ } -+ auto result = grpc_error_to_absl_status(error); -+ return result; -+} -+ -+int grpc_is_vsock(const grpc_resolved_address* resolved_addr) { -+ const grpc_sockaddr* addr = -+ reinterpret_cast(resolved_addr->addr); -+ return addr->sa_family == AF_VSOCK; -+} -+ -+std::string grpc_sockaddr_to_uri_vsock_if_possible( -+ const grpc_resolved_address* resolved_addr) { -+ const grpc_sockaddr* addr = -+ reinterpret_cast(resolved_addr->addr); -+ if (addr->sa_family != AF_VSOCK) { -+ return ""; -+ } -+ const auto* vsock_addr = reinterpret_cast(addr); -+ return absl::StrCat("vsock:", vsock_addr->svm_cid, ":", vsock_addr->svm_port); -+} -+ -+#endif -diff --git a/src/core/lib/iomgr/vsock.h b/src/core/lib/iomgr/vsock.h -new file mode 100644 -index 000000000..e89d4b909 ---- /dev/null -+++ b/src/core/lib/iomgr/vsock.h -@@ -0,0 +1,40 @@ -+/* -+ * -+ * Copyright 2021 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. -+ * -+ */ -+ -+#ifndef GRPC_CORE_LIB_IOMGR_VSOCK_H -+#define GRPC_CORE_LIB_IOMGR_VSOCK_H -+ -+#include -+ -+#include -+ -+#include "absl/strings/string_view.h" -+ -+#include -+ -+#include "src/core/lib/iomgr/port.h" -+#include "src/core/lib/iomgr/resolve_address.h" -+ -+void grpc_create_socketpair_if_vsock(int sv[2]); -+ -+absl::StatusOr> -+grpc_resolve_vsock_address(absl::string_view name); -+ -+int grpc_is_vsock(const grpc_resolved_address* resolved_addr); -+ -+#endif /* GRPC_CORE_LIB_IOMGR_VSOCK_H */ -diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py -index 6e05ae817..88ba93ed5 100644 ---- a/src/python/grpcio/grpc_core_dependencies.py -+++ b/src/python/grpcio/grpc_core_dependencies.py -@@ -628,6 +628,7 @@ CORE_SOURCE_FILES = [ - 'src/core/lib/iomgr/timer_manager.cc', - 'src/core/lib/iomgr/unix_sockets_posix.cc', - 'src/core/lib/iomgr/unix_sockets_posix_noop.cc', -+ 'src/core/lib/iomgr/vsock.cc', - 'src/core/lib/iomgr/wakeup_fd_eventfd.cc', - 'src/core/lib/iomgr/wakeup_fd_nospecial.cc', - 'src/core/lib/iomgr/wakeup_fd_pipe.cc', --- -2.25.1 - diff --git a/src/external/patches/grpc/0002-example-helloworld-allow-input-arg-for-greet_server.patch b/src/external/patches/grpc/0002-example-helloworld-allow-input-arg-for-greet_server.patch deleted file mode 100644 index 5e1c96d..0000000 --- a/src/external/patches/grpc/0002-example-helloworld-allow-input-arg-for-greet_server.patch +++ /dev/null @@ -1,59 +0,0 @@ -From d23ab41e36953946c9ba6add3a5f5daf67b520bc Mon Sep 17 00:00:00 2001 -From: "Qi, Yadong" -Date: Mon, 19 Jul 2021 08:01:08 +0000 -Subject: [PATCH 2/2] example: helloworld: allow input arg for greet_server - -allow input args for greet_server. - -Signed-off-by: Qi, Yadong ---- - examples/cpp/helloworld/greeter_server.cc | 26 ++++++++++++++++++++--- - 1 file changed, 23 insertions(+), 3 deletions(-) - -diff --git a/examples/cpp/helloworld/greeter_server.cc b/examples/cpp/helloworld/greeter_server.cc -index 560b8b4282..d2c4f3f42f 100644 ---- a/examples/cpp/helloworld/greeter_server.cc -+++ b/examples/cpp/helloworld/greeter_server.cc -@@ -48,8 +48,7 @@ class GreeterServiceImpl final : public Greeter::Service { - } - }; - --void RunServer() { -- std::string server_address("0.0.0.0:50051"); -+void RunServer(std::string server_address) { - GreeterServiceImpl service; - - grpc::EnableDefaultHealthCheckService(true); -@@ -70,7 +69,28 @@ void RunServer() { - } - - int main(int argc, char** argv) { -- RunServer(); -+ std::string server_str; -+ std::string arg_str("--server"); -+ if (argc > 1) { -+ std::string arg_val = argv[1]; -+ size_t start_pos = arg_val.find(arg_str); -+ if (start_pos != std::string::npos) { -+ start_pos += arg_str.size(); -+ if (arg_val[start_pos] == '=') { -+ server_str = arg_val.substr(start_pos + 1); -+ } else { -+ std::cout << "The only correct argument syntax is --server=" -+ << std::endl; -+ return 0; -+ } -+ } else { -+ std::cout << "The only acceptable argument is --server=" << std::endl; -+ return 0; -+ } -+ } else { -+ server_str = "0.0.0.0:50051"; -+ } -+ RunServer(server_str); - - return 0; - } --- -2.25.1 - diff --git a/src/host/app_launcher/CMakeLists.txt b/src/host/app_launcher/CMakeLists.txt index 6bc3895..9039da9 100644 --- a/src/host/app_launcher/CMakeLists.txt +++ b/src/host/app_launcher/CMakeLists.txt @@ -33,6 +33,7 @@ target_link_libraries(${APPLAUNCHER_PROJ} PRIVATE ${_GRPC_GRPCPP} PRIVATE ${_PROTOBUF_LIBPROTOBUF} -lrt + -static ) set_target_properties(${APPLAUNCHER_PROJ} PROPERTIES LINK_FLAGS_RELEASE -s)