diff options
author | Hao Chen <chenhaosjtuacm@google.com> | 2020-01-10 13:52:35 -0800 |
---|---|---|
committer | Hao Chen <chenhaosjtuacm@google.com> | 2020-01-10 13:52:35 -0800 |
commit | a0d43cf1a94bc5443ee8ee2499490f6af4da6272 (patch) | |
tree | 110b029d64273a9ffb3cb9af91481516cd49183b /src/core/ext/filters | |
parent | 987bce6ff47fcdb93db330fccb1e3f4471fbd0ec (diff) | |
download | grpc-grpc-a0d43cf1a94bc5443ee8ee2499490f6af4da6272.tar.gz |
Vsock support for GRPC
This is originally from Chrome OS team. Modified to make it
builds on non-Linux platforms
Test: done on Cufflefish VM with ag/9869094
Bug: b/145631107
Change-Id: I41a5f8af68488cc6c9b9629d9c99b54bc085764a
Diffstat (limited to 'src/core/ext/filters')
-rw-r--r-- | src/core/ext/filters/client_channel/parse_address.cc | 32 | ||||
-rw-r--r-- | src/core/ext/filters/client_channel/parse_address.h | 5 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/core/ext/filters/client_channel/parse_address.cc b/src/core/ext/filters/client_channel/parse_address.cc index 707beb8876..c737f53d01 100644 --- a/src/core/ext/filters/client_channel/parse_address.cc +++ b/src/core/ext/filters/client_channel/parse_address.cc @@ -26,6 +26,10 @@ #include <string.h> #ifdef GRPC_HAVE_UNIX_SOCKET #include <sys/un.h> +#ifdef GRPC_HAVE_LINUX_VSOCK +#include <sys/socket.h> +#include <linux/vm_sockets.h> +#endif /* GRPC_HAVE_LINUX_VSOCK */ #endif #include <grpc/support/alloc.h> @@ -63,6 +67,32 @@ bool grpc_parse_unix(const grpc_uri* uri, #endif /* GRPC_HAVE_UNIX_SOCKET */ +#if defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) + +bool grpc_parse_vsock(const grpc_uri* uri, + grpc_resolved_address* resolved_addr) { + memset(resolved_addr, 0, sizeof(*resolved_addr)); + struct sockaddr_vm *vm = + reinterpret_cast<struct sockaddr_vm *>(resolved_addr->addr); + + if (sscanf(uri->path, "%u:%u", &vm->svm_cid, &vm->svm_port) != 2) { + return false; + } + vm->svm_family = AF_VSOCK; + + resolved_addr->len = static_cast<socklen_t>(sizeof(*vm)); + return true; +} + +#else /* defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) */ + +bool grpc_parse_vsock(const grpc_uri* uri, + grpc_resolved_address* resolved_addr) { + abort(); +} + +#endif /* defined(GRPC_HAVE_UNIX_SOCKET) && defined(GRPC_HAVE_LINUX_VSOCK) */ + bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr, bool log_errors) { bool success = false; @@ -200,6 +230,8 @@ bool grpc_parse_uri(const grpc_uri* uri, grpc_resolved_address* resolved_addr) { return grpc_parse_ipv4(uri, resolved_addr); } else if (strcmp("ipv6", uri->scheme) == 0) { return grpc_parse_ipv6(uri, resolved_addr); + } else if (strcmp("vsock", uri->scheme) == 0) { + return grpc_parse_vsock(uri, resolved_addr); } gpr_log(GPR_ERROR, "Can't parse scheme '%s'", uri->scheme); return false; diff --git a/src/core/ext/filters/client_channel/parse_address.h b/src/core/ext/filters/client_channel/parse_address.h index c2af0e6c49..2e7356f0ce 100644 --- a/src/core/ext/filters/client_channel/parse_address.h +++ b/src/core/ext/filters/client_channel/parse_address.h @@ -30,6 +30,11 @@ * unix socket path. Returns true upon success. */ bool grpc_parse_unix(const grpc_uri* uri, grpc_resolved_address* resolved_addr); +/** Populate \a resolved_addr from \a uri, whose path is expected to contain a + * vsock specification. Returns true upon success. */ +bool grpc_parse_vsock(const grpc_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_uri* uri, grpc_resolved_address* resolved_addr); |