/* * * 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. * */ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SERVER_ADDRESS_H #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SERVER_ADDRESS_H #include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/uri/uri_parser.h" // Channel arg key for ServerAddressList. #define GRPC_ARG_SERVER_ADDRESS_LIST "grpc.server_address_list" // Channel arg key for a bool indicating whether an address is a grpclb // load balancer (as opposed to a backend). #define GRPC_ARG_ADDRESS_IS_BALANCER "grpc.address_is_balancer" // Channel arg key for a string indicating an address's balancer name. #define GRPC_ARG_ADDRESS_BALANCER_NAME "grpc.address_balancer_name" namespace grpc_core { // // ServerAddress // // A server address is a grpc_resolved_address with an associated set of // channel args. Any args present here will be merged into the channel // args when a subchannel is created for this address. class ServerAddress { public: // Takes ownership of args. ServerAddress(const grpc_resolved_address& address, grpc_channel_args* args); ServerAddress(const void* address, size_t address_len, grpc_channel_args* args); ~ServerAddress() { grpc_channel_args_destroy(args_); } // Copyable. ServerAddress(const ServerAddress& other) : address_(other.address_), args_(grpc_channel_args_copy(other.args_)) {} ServerAddress& operator=(const ServerAddress& other) { address_ = other.address_; grpc_channel_args_destroy(args_); args_ = grpc_channel_args_copy(other.args_); return *this; } // Movable. ServerAddress(ServerAddress&& other) : address_(other.address_), args_(other.args_) { other.args_ = nullptr; } ServerAddress& operator=(ServerAddress&& other) { address_ = other.address_; args_ = other.args_; other.args_ = nullptr; return *this; } bool operator==(const ServerAddress& other) const { return Cmp(other) == 0; } int Cmp(const ServerAddress& other) const; const grpc_resolved_address& address() const { return address_; } const grpc_channel_args* args() const { return args_; } bool IsBalancer() const; private: grpc_resolved_address address_; grpc_channel_args* args_; }; // // ServerAddressList // typedef InlinedVector ServerAddressList; // Returns a channel arg containing \a addresses. grpc_arg CreateServerAddressListChannelArg(const ServerAddressList* addresses); // Returns the ServerListAddress instance in channel_args or NULL. ServerAddressList* FindServerAddressListChannelArg( const grpc_channel_args* channel_args); } // namespace grpc_core #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SERVER_ADDRESS_H */