|
| 1 | +#include <chrono> |
| 2 | + |
1 | 3 | #include "envoy/network/listen_socket.h" |
| 4 | +#include "envoy/stream_info/stream_info.h" |
2 | 5 |
|
3 | 6 | #include "source/common/network/address_impl.h" |
4 | 7 | #include "source/common/network/utility.h" |
@@ -133,6 +136,34 @@ bool envoy_dynamic_module_callback_listener_filter_get_remote_address( |
133 | 136 | return true; |
134 | 137 | } |
135 | 138 |
|
| 139 | +bool envoy_dynamic_module_callback_listener_filter_get_direct_remote_address( |
| 140 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
| 141 | + envoy_dynamic_module_type_envoy_buffer* address_out, uint32_t* port_out) { |
| 142 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 143 | + auto* callbacks = filter->callbacks(); |
| 144 | + |
| 145 | + if (callbacks == nullptr) { |
| 146 | + address_out->ptr = nullptr; |
| 147 | + address_out->length = 0; |
| 148 | + *port_out = 0; |
| 149 | + return false; |
| 150 | + } |
| 151 | + |
| 152 | + const auto& address = callbacks->socket().connectionInfoProvider().directRemoteAddress(); |
| 153 | + if (address == nullptr || address->ip() == nullptr) { |
| 154 | + address_out->ptr = nullptr; |
| 155 | + address_out->length = 0; |
| 156 | + *port_out = 0; |
| 157 | + return false; |
| 158 | + } |
| 159 | + |
| 160 | + const std::string& addr_str = address->ip()->addressAsString(); |
| 161 | + address_out->ptr = const_cast<char*>(addr_str.c_str()); |
| 162 | + address_out->length = addr_str.size(); |
| 163 | + *port_out = address->ip()->port(); |
| 164 | + return true; |
| 165 | +} |
| 166 | + |
136 | 167 | bool envoy_dynamic_module_callback_listener_filter_get_local_address( |
137 | 168 | envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
138 | 169 | envoy_dynamic_module_type_envoy_buffer* address_out, uint32_t* port_out) { |
@@ -161,6 +192,114 @@ bool envoy_dynamic_module_callback_listener_filter_get_local_address( |
161 | 192 | return true; |
162 | 193 | } |
163 | 194 |
|
| 195 | +bool envoy_dynamic_module_callback_listener_filter_get_direct_local_address( |
| 196 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
| 197 | + envoy_dynamic_module_type_envoy_buffer* address_out, uint32_t* port_out) { |
| 198 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 199 | + auto* callbacks = filter->callbacks(); |
| 200 | + |
| 201 | + if (callbacks == nullptr) { |
| 202 | + address_out->ptr = nullptr; |
| 203 | + address_out->length = 0; |
| 204 | + *port_out = 0; |
| 205 | + return false; |
| 206 | + } |
| 207 | + |
| 208 | + const auto& address = callbacks->socket().connectionInfoProvider().directLocalAddress(); |
| 209 | + if (address == nullptr || address->ip() == nullptr) { |
| 210 | + address_out->ptr = nullptr; |
| 211 | + address_out->length = 0; |
| 212 | + *port_out = 0; |
| 213 | + return false; |
| 214 | + } |
| 215 | + |
| 216 | + const std::string& addr_str = address->ip()->addressAsString(); |
| 217 | + address_out->ptr = const_cast<char*>(addr_str.c_str()); |
| 218 | + address_out->length = addr_str.size(); |
| 219 | + *port_out = address->ip()->port(); |
| 220 | + return true; |
| 221 | +} |
| 222 | + |
| 223 | +bool envoy_dynamic_module_callback_listener_filter_get_original_dst( |
| 224 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
| 225 | + envoy_dynamic_module_type_envoy_buffer* address_out, uint32_t* port_out) { |
| 226 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 227 | + auto* callbacks = filter->callbacks(); |
| 228 | + |
| 229 | + if (callbacks == nullptr) { |
| 230 | + address_out->ptr = nullptr; |
| 231 | + address_out->length = 0; |
| 232 | + *port_out = 0; |
| 233 | + return false; |
| 234 | + } |
| 235 | + |
| 236 | + if (callbacks->socket().addressType() != Network::Address::Type::Ip) { |
| 237 | + address_out->ptr = nullptr; |
| 238 | + address_out->length = 0; |
| 239 | + *port_out = 0; |
| 240 | + return false; |
| 241 | + } |
| 242 | + |
| 243 | + // Avoid calling getOriginalDst on an invalid handle. |
| 244 | + if (callbacks->socket().ioHandle().fdDoNotUse() < 0) { |
| 245 | + address_out->ptr = nullptr; |
| 246 | + address_out->length = 0; |
| 247 | + *port_out = 0; |
| 248 | + return false; |
| 249 | + } |
| 250 | + |
| 251 | + const auto original_dst = Network::Utility::getOriginalDst(callbacks->socket()); |
| 252 | + if (original_dst == nullptr || original_dst->ip() == nullptr) { |
| 253 | + address_out->ptr = nullptr; |
| 254 | + address_out->length = 0; |
| 255 | + *port_out = 0; |
| 256 | + return false; |
| 257 | + } |
| 258 | + |
| 259 | + // Cache the address in the filter to ensure lifetime extends beyond this function. |
| 260 | + filter->cachedOriginalDst() = original_dst; |
| 261 | + |
| 262 | + const std::string& addr_str = original_dst->ip()->addressAsString(); |
| 263 | + address_out->ptr = const_cast<char*>(addr_str.c_str()); |
| 264 | + address_out->length = addr_str.size(); |
| 265 | + *port_out = original_dst->ip()->port(); |
| 266 | + return true; |
| 267 | +} |
| 268 | + |
| 269 | +envoy_dynamic_module_type_address_type |
| 270 | +envoy_dynamic_module_callback_listener_filter_get_address_type( |
| 271 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr) { |
| 272 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 273 | + auto* callbacks = filter->callbacks(); |
| 274 | + |
| 275 | + if (callbacks == nullptr) { |
| 276 | + return envoy_dynamic_module_type_address_type_Unknown; |
| 277 | + } |
| 278 | + |
| 279 | + switch (callbacks->socket().addressType()) { |
| 280 | + case Network::Address::Type::Ip: |
| 281 | + return envoy_dynamic_module_type_address_type_Ip; |
| 282 | + case Network::Address::Type::Pipe: |
| 283 | + return envoy_dynamic_module_type_address_type_Pipe; |
| 284 | + case Network::Address::Type::EnvoyInternal: |
| 285 | + return envoy_dynamic_module_type_address_type_EnvoyInternal; |
| 286 | + } |
| 287 | + |
| 288 | + return envoy_dynamic_module_type_address_type_Unknown; |
| 289 | +} |
| 290 | + |
| 291 | +bool envoy_dynamic_module_callback_listener_filter_is_local_address_restored( |
| 292 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr) { |
| 293 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 294 | + auto* callbacks = filter->callbacks(); |
| 295 | + |
| 296 | + if (callbacks == nullptr) { |
| 297 | + return false; |
| 298 | + } |
| 299 | + |
| 300 | + return callbacks->socket().connectionInfoProvider().localAddressRestored(); |
| 301 | +} |
| 302 | + |
164 | 303 | bool envoy_dynamic_module_callback_listener_filter_set_remote_address( |
165 | 304 | envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
166 | 305 | envoy_dynamic_module_type_module_buffer address, uint32_t port, bool is_ipv6) { |
@@ -228,6 +367,15 @@ void envoy_dynamic_module_callback_listener_filter_continue_filter_chain( |
228 | 367 | } |
229 | 368 | } |
230 | 369 |
|
| 370 | +void envoy_dynamic_module_callback_listener_filter_use_original_dst( |
| 371 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, bool use_original_dst) { |
| 372 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 373 | + auto* callbacks = filter->callbacks(); |
| 374 | + if (callbacks != nullptr) { |
| 375 | + callbacks->useOriginalDst(use_original_dst); |
| 376 | + } |
| 377 | +} |
| 378 | + |
231 | 379 | void envoy_dynamic_module_callback_listener_filter_close_socket( |
232 | 380 | envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr) { |
233 | 381 | auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
@@ -308,6 +456,32 @@ bool envoy_dynamic_module_callback_listener_filter_get_filter_state( |
308 | 456 | return true; |
309 | 457 | } |
310 | 458 |
|
| 459 | +void envoy_dynamic_module_callback_listener_filter_set_downstream_transport_failure_reason( |
| 460 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr, |
| 461 | + envoy_dynamic_module_type_module_buffer reason) { |
| 462 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 463 | + auto* callbacks = filter->callbacks(); |
| 464 | + if (callbacks == nullptr || reason.ptr == nullptr || reason.length == 0) { |
| 465 | + return; |
| 466 | + } |
| 467 | + |
| 468 | + callbacks->streamInfo().setDownstreamTransportFailureReason( |
| 469 | + absl::string_view(reason.ptr, reason.length)); |
| 470 | +} |
| 471 | + |
| 472 | +uint64_t envoy_dynamic_module_callback_listener_filter_get_connection_start_time_ms( |
| 473 | + envoy_dynamic_module_type_listener_filter_envoy_ptr filter_envoy_ptr) { |
| 474 | + auto* filter = static_cast<DynamicModuleListenerFilter*>(filter_envoy_ptr); |
| 475 | + auto* callbacks = filter->callbacks(); |
| 476 | + if (callbacks == nullptr) { |
| 477 | + return 0; |
| 478 | + } |
| 479 | + |
| 480 | + const auto start_time = callbacks->streamInfo().startTime(); |
| 481 | + const auto duration = start_time.time_since_epoch(); |
| 482 | + return std::chrono::duration_cast<std::chrono::milliseconds>(duration).count(); |
| 483 | +} |
| 484 | + |
311 | 485 | } // extern "C" |
312 | 486 |
|
313 | 487 | } // namespace ListenerFilters |
|
0 commit comments