aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/filters/client_channel/server_address.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/ext/filters/client_channel/server_address.cc')
-rw-r--r--src/core/ext/filters/client_channel/server_address.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/core/ext/filters/client_channel/server_address.cc b/src/core/ext/filters/client_channel/server_address.cc
new file mode 100644
index 0000000000..ec33cbbd95
--- /dev/null
+++ b/src/core/ext/filters/client_channel/server_address.cc
@@ -0,0 +1,103 @@
+/*
+ *
+ * Copyright 2018 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 <grpc/support/port_platform.h>
+
+#include "src/core/ext/filters/client_channel/server_address.h"
+
+#include <string.h>
+
+namespace grpc_core {
+
+//
+// ServerAddress
+//
+
+ServerAddress::ServerAddress(const grpc_resolved_address& address,
+ grpc_channel_args* args)
+ : address_(address), args_(args) {}
+
+ServerAddress::ServerAddress(const void* address, size_t address_len,
+ grpc_channel_args* args)
+ : args_(args) {
+ memcpy(address_.addr, address, address_len);
+ address_.len = static_cast<socklen_t>(address_len);
+}
+
+int ServerAddress::Cmp(const ServerAddress& other) const {
+ if (address_.len > other.address_.len) return 1;
+ if (address_.len < other.address_.len) return -1;
+ int retval = memcmp(address_.addr, other.address_.addr, address_.len);
+ if (retval != 0) return retval;
+ return grpc_channel_args_compare(args_, other.args_);
+}
+
+bool ServerAddress::IsBalancer() const {
+ return grpc_channel_arg_get_bool(
+ grpc_channel_args_find(args_, GRPC_ARG_ADDRESS_IS_BALANCER), false);
+}
+
+//
+// ServerAddressList
+//
+
+namespace {
+
+void* ServerAddressListCopy(void* addresses) {
+ ServerAddressList* a = static_cast<ServerAddressList*>(addresses);
+ return New<ServerAddressList>(*a);
+}
+
+void ServerAddressListDestroy(void* addresses) {
+ ServerAddressList* a = static_cast<ServerAddressList*>(addresses);
+ Delete(a);
+}
+
+int ServerAddressListCompare(void* addresses1, void* addresses2) {
+ ServerAddressList* a1 = static_cast<ServerAddressList*>(addresses1);
+ ServerAddressList* a2 = static_cast<ServerAddressList*>(addresses2);
+ if (a1->size() > a2->size()) return 1;
+ if (a1->size() < a2->size()) return -1;
+ for (size_t i = 0; i < a1->size(); ++i) {
+ int retval = (*a1)[i].Cmp((*a2)[i]);
+ if (retval != 0) return retval;
+ }
+ return 0;
+}
+
+const grpc_arg_pointer_vtable server_addresses_arg_vtable = {
+ ServerAddressListCopy, ServerAddressListDestroy, ServerAddressListCompare};
+
+} // namespace
+
+grpc_arg CreateServerAddressListChannelArg(const ServerAddressList* addresses) {
+ return grpc_channel_arg_pointer_create(
+ const_cast<char*>(GRPC_ARG_SERVER_ADDRESS_LIST),
+ const_cast<ServerAddressList*>(addresses), &server_addresses_arg_vtable);
+}
+
+ServerAddressList* FindServerAddressListChannelArg(
+ const grpc_channel_args* channel_args) {
+ const grpc_arg* lb_addresses_arg =
+ grpc_channel_args_find(channel_args, GRPC_ARG_SERVER_ADDRESS_LIST);
+ if (lb_addresses_arg == nullptr || lb_addresses_arg->type != GRPC_ARG_POINTER)
+ return nullptr;
+ return static_cast<ServerAddressList*>(lb_addresses_arg->value.pointer.p);
+}
+
+} // namespace grpc_core