aboutsummaryrefslogtreecommitdiff
path: root/src/core/ext/filters
diff options
context:
space:
mode:
authorHao Chen <chenhaosjtuacm@google.com>2020-01-10 13:52:35 -0800
committerHao Chen <chenhaosjtuacm@google.com>2020-01-10 13:52:35 -0800
commita0d43cf1a94bc5443ee8ee2499490f6af4da6272 (patch)
tree110b029d64273a9ffb3cb9af91481516cd49183b /src/core/ext/filters
parent987bce6ff47fcdb93db330fccb1e3f4471fbd0ec (diff)
downloadgrpc-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.cc32
-rw-r--r--src/core/ext/filters/client_channel/parse_address.h5
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);