xds_listener.h
Go to the documentation of this file.
1 //
2 // Copyright 2018 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef GRPC_CORE_EXT_XDS_XDS_LISTENER_H
18 #define GRPC_CORE_EXT_XDS_XDS_LISTENER_H
19 
21 
22 #include <stdint.h>
23 #include <string.h>
24 
25 #include <algorithm>
26 #include <array>
27 #include <cstdint>
28 #include <map>
29 #include <memory>
30 #include <string>
31 #include <vector>
32 
33 #include "absl/status/statusor.h"
34 #include "absl/strings/string_view.h"
35 #include "absl/types/optional.h"
38 #include "upb/def.h"
39 
47 
48 namespace grpc_core {
49 
50 // TODO(roth): When we can use absl::variant<>, consider using that
51 // here, to enforce the fact that only one of the two fields can be set.
56 
57  bool operator==(const DownstreamTlsContext& other) const {
58  return common_tls_context == other.common_tls_context &&
60  }
61 
62  std::string ToString() const;
63  bool Empty() const;
64  };
65 
66  enum class ListenerType {
67  kTcpListener = 0,
69  } type;
70 
72  // The name to use in the RDS request.
74  // Storing the Http Connection Manager Common Http Protocol Option
75  // max_stream_duration
77  // The RouteConfiguration to use for this listener.
78  // Present only if it is inlined in the LDS response.
80 
81  struct HttpFilter {
84 
85  bool operator==(const HttpFilter& other) const {
86  return name == other.name && config == other.config;
87  }
88 
89  std::string ToString() const;
90  };
91  std::vector<HttpFilter> http_filters;
92 
93  bool operator==(const HttpConnectionManager& other) const {
94  return route_config_name == other.route_config_name &&
96  rds_update == other.rds_update &&
97  http_filters == other.http_filters;
98  }
99 
100  std::string ToString() const;
101  };
102 
103  // Populated for type=kHttpApiListener.
105 
106  // Populated for type=kTcpListener.
107  // host:port listening_address set when type is kTcpListener
109 
112  // This is in principle the filter list.
113  // We currently require exactly one filter, which is the HCM.
115 
116  bool operator==(const FilterChainData& other) const {
119  }
120 
121  std::string ToString() const;
122  };
123 
124  // A multi-level map used to determine which filter chain to use for a given
125  // incoming connection. Determining the right filter chain for a given
126  // connection checks the following properties, in order:
127  // - destination port (never matched, so not present in map)
128  // - destination IP address
129  // - server name (never matched, so not present in map)
130  // - transport protocol (allows only "raw_buffer" or unset, prefers the
131  // former, so only one of those two types is present in map)
132  // - application protocol (never matched, so not present in map)
133  // - connection source type (any, local or external)
134  // - source IP address
135  // - source port
136  // https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/listener/v3/listener_components.proto#config-listener-v3-filterchainmatch
137  // for more details
138  struct FilterChainMap {
140  std::shared_ptr<FilterChainData> data;
141  bool operator==(const FilterChainDataSharedPtr& other) const {
142  return *data == *other.data;
143  }
144  };
145  struct CidrRange {
148 
149  bool operator==(const CidrRange& other) const {
150  return memcmp(&address, &other.address, sizeof(address)) == 0 &&
151  prefix_len == other.prefix_len;
152  }
153 
154  std::string ToString() const;
155  };
156  using SourcePortsMap = std::map<uint16_t, FilterChainDataSharedPtr>;
157  struct SourceIp {
160 
161  bool operator==(const SourceIp& other) const {
162  return prefix_range == other.prefix_range &&
163  ports_map == other.ports_map;
164  }
165  };
166  using SourceIpVector = std::vector<SourceIp>;
168  using ConnectionSourceTypesArray = std::array<SourceIpVector, 3>;
169  struct DestinationIp {
171  // We always fail match on server name, so those filter chains are not
172  // included here.
174 
175  bool operator==(const DestinationIp& other) const {
176  return prefix_range == other.prefix_range &&
178  }
179  };
180  // We always fail match on destination ports map
181  using DestinationIpVector = std::vector<DestinationIp>;
183 
184  bool operator==(const FilterChainMap& other) const {
186  }
187 
188  std::string ToString() const;
190 
192 
193  bool operator==(const XdsListenerResource& other) const {
195  address == other.address &&
198  }
199 
200  std::string ToString() const;
201 };
202 
204  : public XdsResourceTypeImpl<XdsListenerResourceType, XdsListenerResource> {
205  public:
206  absl::string_view type_url() const override {
207  return "envoy.config.listener.v3.Listener";
208  }
209  absl::string_view v2_type_url() const override {
210  return "envoy.api.v2.Listener";
211  }
212 
214  absl::string_view serialized_resource,
215  bool is_v2) const override;
216 
217  bool AllResourcesRequiredInSotW() const override { return true; }
218 
219  void InitUpbSymtab(upb_DefPool* symtab) const override {
222  symtab);
224  }
225 };
226 
227 } // namespace grpc_core
228 
229 #endif // GRPC_CORE_EXT_XDS_XDS_LISTENER_H
grpc_core::XdsListenerResourceType::type_url
absl::string_view type_url() const override
Definition: xds_listener.h:206
grpc_core::XdsListenerResource::FilterChainMap::ConnectionSourceType::kExternal
@ kExternal
grpc_core::XdsListenerResource::FilterChainData::ToString
std::string ToString() const
Definition: xds_listener.cc:119
grpc_core::XdsListenerResource::FilterChainMap::FilterChainDataSharedPtr::operator==
bool operator==(const FilterChainDataSharedPtr &other) const
Definition: xds_listener.h:141
grpc_core::XdsListenerResource::FilterChainMap::ConnectionSourceTypesArray
std::array< SourceIpVector, 3 > ConnectionSourceTypesArray
Definition: xds_listener.h:168
grpc_core::XdsListenerResource::ToString
std::string ToString() const
Definition: xds_listener.cc:249
grpc_core::XdsListenerResource::FilterChainData::operator==
bool operator==(const FilterChainData &other) const
Definition: xds_listener.h:116
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_getmsgdef
const UPB_INLINE upb_MessageDef * envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_getmsgdef(upb_DefPool *s)
Definition: http_connection_manager.upbdefs.h:24
grpc_core::XdsEncodingContext
Definition: upb_utils.h:39
grpc_core::XdsListenerResource::FilterChainMap::DestinationIp::prefix_range
absl::optional< CidrRange > prefix_range
Definition: xds_listener.h:170
grpc_core
Definition: call_metric_recorder.h:31
string.h
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_core::XdsListenerResource::FilterChainData::downstream_tls_context
DownstreamTlsContext downstream_tls_context
Definition: xds_listener.h:111
grpc_core::XdsListenerResource::FilterChainMap::DestinationIp
Definition: xds_listener.h:169
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_core::XdsListenerResource::FilterChainMap::ConnectionSourceType::kSameIpOrLoopback
@ kSameIpOrLoopback
xds_http_filters.h
xds_route_config.h
grpc_resolved_address
Definition: resolved_address.h:34
grpc_core::XdsListenerResource::ListenerType
ListenerType
Definition: xds_listener.h:66
xds_resource_type_impl.h
grpc_core::XdsListenerResourceType::AllResourcesRequiredInSotW
bool AllResourcesRequiredInSotW() const override
Definition: xds_listener.h:217
grpc_core::XdsListenerResource::HttpConnectionManager::route_config_name
std::string route_config_name
Definition: xds_listener.h:73
resolved_address.h
grpc_core::XdsListenerResource::filter_chain_map
struct grpc_core::XdsListenerResource::FilterChainMap filter_chain_map
grpc_core::XdsListenerResource::type
enum grpc_core::XdsListenerResource::ListenerType type
grpc_core::XdsListenerResource::HttpConnectionManager::HttpFilter::operator==
bool operator==(const HttpFilter &other) const
Definition: xds_listener.h:85
grpc_core::XdsListenerResource::DownstreamTlsContext::ToString
std::string ToString() const
Definition: xds_listener.cc:70
grpc_core::XdsListenerResource::DownstreamTlsContext::Empty
bool Empty() const
Definition: xds_listener.cc:76
http_connection_manager.upbdefs.h
grpc_core::XdsListenerResource::FilterChainMap::SourceIp
Definition: xds_listener.h:157
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
grpc_core::XdsListenerResource::operator==
bool operator==(const XdsListenerResource &other) const
Definition: xds_listener.h:193
grpc_core::XdsListenerResource::FilterChainMap::CidrRange::prefix_len
uint32_t prefix_len
Definition: xds_listener.h:147
grpc_core::XdsListenerResource::FilterChainMap
Definition: xds_listener.h:138
grpc_core::XdsListenerResource::FilterChainMap::ToString
std::string ToString() const
Definition: xds_listener.cc:212
grpc_core::XdsResourceTypeImpl
Definition: xds_resource_type_impl.h:34
envoy_config_listener_v3_Listener_getmsgdef
const UPB_INLINE upb_MessageDef * envoy_config_listener_v3_Listener_getmsgdef(upb_DefPool *s)
Definition: listener.upbdefs.h:29
grpc_core::XdsListenerResource::FilterChainMap::ConnectionSourceType::kAny
@ kAny
grpc_core::XdsListenerResource::FilterChainMap::SourceIpVector
std::vector< SourceIp > SourceIpVector
Definition: xds_listener.h:166
xds_common_types.h
grpc_core::XdsListenerResource::ListenerType::kHttpApiListener
@ kHttpApiListener
grpc_core::XdsListenerResource::FilterChainData::http_connection_manager
HttpConnectionManager http_connection_manager
Definition: xds_listener.h:114
grpc_core::XdsListenerResource::FilterChainMap::DestinationIpVector
std::vector< DestinationIp > DestinationIpVector
Definition: xds_listener.h:181
grpc_core::XdsHttpFilterImpl::FilterConfig
Definition: xds_http_filters.h:43
grpc_core::XdsListenerResource::HttpConnectionManager::rds_update
absl::optional< XdsRouteConfigResource > rds_update
Definition: xds_listener.h:79
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
grpc_core::XdsListenerResourceType::Decode
absl::StatusOr< DecodeResult > Decode(const XdsEncodingContext &context, absl::string_view serialized_resource, bool is_v2) const override
Definition: xds_listener.cc:1031
grpc_core::XdsListenerResource::FilterChainMap::DestinationIp::operator==
bool operator==(const DestinationIp &other) const
Definition: xds_listener.h:175
grpc_core::XdsListenerResource::http_connection_manager
HttpConnectionManager http_connection_manager
Definition: xds_listener.h:104
grpc_core::XdsListenerResourceType
Definition: xds_listener.h:203
time.h
grpc_core::XdsListenerResource::HttpConnectionManager::HttpFilter::name
std::string name
Definition: xds_listener.h:82
grpc_core::XdsListenerResource::HttpConnectionManager
Definition: xds_listener.h:71
grpc_core::XdsListenerResource::HttpConnectionManager::operator==
bool operator==(const HttpConnectionManager &other) const
Definition: xds_listener.h:93
grpc_core::XdsListenerResource::HttpConnectionManager::HttpFilter::ToString
std::string ToString() const
Definition: xds_listener.cc:110
grpc_core::XdsListenerResource::FilterChainMap::ConnectionSourceType
ConnectionSourceType
Definition: xds_listener.h:167
stdint.h
grpc_core::XdsListenerResource::default_filter_chain
absl::optional< FilterChainData > default_filter_chain
Definition: xds_listener.h:191
grpc_core::XdsListenerResource::FilterChainMap::SourcePortsMap
std::map< uint16_t, FilterChainDataSharedPtr > SourcePortsMap
Definition: xds_listener.h:156
grpc_core::XdsListenerResource::FilterChainMap::DestinationIp::source_types_array
ConnectionSourceTypesArray source_types_array
Definition: xds_listener.h:173
grpc_core::XdsListenerResource::FilterChainMap::operator==
bool operator==(const FilterChainMap &other) const
Definition: xds_listener.h:184
grpc_core::XdsListenerResource::address
std::string address
Definition: xds_listener.h:108
symtab
upb_symtab * symtab
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:774
grpc_core::XdsListenerResource::FilterChainMap::SourceIp::ports_map
SourcePortsMap ports_map
Definition: xds_listener.h:159
grpc_core::XdsListenerResourceType::v2_type_url
absl::string_view v2_type_url() const override
Definition: xds_listener.h:209
grpc_core::CommonTlsContext
Definition: xds_common_types.h:45
grpc_core::XdsListenerResource::FilterChainMap::CidrRange::ToString
std::string ToString() const
Definition: xds_listener.cc:129
def.h
grpc_core::XdsListenerResource::ListenerType::kTcpListener
@ kTcpListener
grpc_core::XdsListenerResource::FilterChainMap::SourceIp::prefix_range
absl::optional< CidrRange > prefix_range
Definition: xds_listener.h:158
listener.upbdefs.h
grpc_core::XdsListenerResource::HttpConnectionManager::HttpFilter::config
XdsHttpFilterImpl::FilterConfig config
Definition: xds_listener.h:83
grpc_core::XdsListenerResource::HttpConnectionManager::HttpFilter
Definition: xds_listener.h:81
grpc_core::XdsListenerResource::DownstreamTlsContext::operator==
bool operator==(const DownstreamTlsContext &other) const
Definition: xds_listener.h:57
grpc_core::XdsListenerResource::FilterChainMap::CidrRange::address
grpc_resolved_address address
Definition: xds_listener.h:146
grpc_core::XdsListenerResource::FilterChainMap::destination_ip_vector
DestinationIpVector destination_ip_vector
Definition: xds_listener.h:182
config_s
Definition: bloaty/third_party/zlib/deflate.c:120
grpc_core::XdsListenerResource::HttpConnectionManager::http_filters
std::vector< HttpFilter > http_filters
Definition: xds_listener.h:91
grpc_core::XdsListenerResource
Definition: xds_listener.h:52
grpc_core::XdsListenerResource::FilterChainMap::FilterChainDataSharedPtr
Definition: xds_listener.h:139
grpc_core::XdsListenerResource::FilterChainMap::FilterChainDataSharedPtr::data
std::shared_ptr< FilterChainData > data
Definition: xds_listener.h:140
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
absl::StatusOr
Definition: abseil-cpp/absl/status/statusor.h:187
grpc_core::XdsListenerResource::DownstreamTlsContext
Definition: xds_listener.h:53
upb_utils.h
grpc_core::XdsListenerResource::FilterChainMap::CidrRange::operator==
bool operator==(const CidrRange &other) const
Definition: xds_listener.h:149
grpc_core::Duration
Definition: src/core/lib/gprpp/time.h:122
grpc_core::XdsListenerResource::HttpConnectionManager::ToString
std::string ToString() const
Definition: xds_listener.cc:84
grpc_core::XdsListenerResourceType::InitUpbSymtab
void InitUpbSymtab(upb_DefPool *symtab) const override
Definition: xds_listener.h:219
grpc_core::XdsListenerResource::DownstreamTlsContext::require_client_certificate
bool require_client_certificate
Definition: xds_listener.h:55
upb_DefPool
Definition: upb/upb/def.c:217
grpc_core::XdsListenerResource::FilterChainData
Definition: xds_listener.h:110
grpc_core::XdsHttpFilterRegistry::PopulateSymtab
static void PopulateSymtab(upb_DefPool *symtab)
Definition: xds_http_filters.cc:105
grpc_core::XdsListenerResource::FilterChainMap::SourceIp::operator==
bool operator==(const SourceIp &other) const
Definition: xds_listener.h:161
grpc_core::XdsListenerResource::DownstreamTlsContext::common_tls_context
CommonTlsContext common_tls_context
Definition: xds_listener.h:54
grpc_core::XdsListenerResource::HttpConnectionManager::http_max_stream_duration
Duration http_max_stream_duration
Definition: xds_listener.h:76
port_platform.h
grpc_core::XdsListenerResource::FilterChainMap::CidrRange
Definition: xds_listener.h:145


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:59