1
#include "source/common/upstream/default_local_address_selector.h"
2

            
3
#include <string>
4

            
5
namespace Envoy {
6
namespace Upstream {
7

            
8
DefaultUpstreamLocalAddressSelector::DefaultUpstreamLocalAddressSelector(
9
    std::vector<::Envoy::Upstream::UpstreamLocalAddress>&& upstream_local_addresses)
10
18179
    : upstream_local_addresses_(std::move(upstream_local_addresses)) {
11
  // If bind config is not provided, we insert at least one
12
  // ``UpstreamLocalAddress`` with null address.
13
18179
  ASSERT(!upstream_local_addresses_.empty());
14
18179
}
15

            
16
UpstreamLocalAddress DefaultUpstreamLocalAddressSelector::getUpstreamLocalAddressImpl(
17
    const Network::Address::InstanceConstSharedPtr& endpoint_address,
18
31199
    OptRef<const Network::TransportSocketOptions>) const {
19
31207
  for (auto& local_address : upstream_local_addresses_) {
20
31207
    if (local_address.address_ == nullptr) {
21
31165
      continue;
22
31165
    }
23

            
24
    // Invalid addresses should have been rejected while parsing the bind
25
    // config.
26
42
    ASSERT(local_address.address_->ip() != nullptr);
27
42
    if (endpoint_address->ip() != nullptr &&
28
42
        local_address.address_->ip()->version() == endpoint_address->ip()->version()) {
29
22
      return local_address;
30
22
    }
31
42
  }
32

            
33
31177
  return upstream_local_addresses_[0];
34
31199
}
35

            
36
} // namespace Upstream
37
} // namespace Envoy