syntax = "proto3";

package envoy.api.v2.core;

option java_outer_classname = "AddressProto";
option java_multiple_files = true;
option java_package = "io.envoyproxy.envoy.api.v2.core";

import "envoy/api/v2/core/base.proto";

import "google/protobuf/wrappers.proto";

import "validate/validate.proto";
import "gogoproto/gogo.proto";

option (gogoproto.equal_all) = true;

// [#protodoc-title: Network addresses]

message Pipe {
  // Unix Domain Socket path. On Linux, paths starting with '@' will use the
  // abstract namespace. The starting '@' is replaced by a null byte by Envoy.
  // Paths starting with '@' will result in an error in environments other than
  // Linux.
  string path = 1 [(validate.rules).string.min_bytes = 1];
}

message SocketAddress {
  enum Protocol {
    option (gogoproto.goproto_enum_prefix) = false;
    TCP = 0;
    // [#not-implemented-hide:]
    UDP = 1;
  }
  Protocol protocol = 1 [(validate.rules).enum.defined_only = true];
  // The address for this socket. :ref:`Listeners <config_listeners>` will bind
  // to the address. An empty address is not allowed. Specify ``0.0.0.0`` or ``::``
  // to bind to any address. [#comment:TODO(zuercher) reinstate when implemented:
  // It is possible to distinguish a Listener address via the prefix/suffix matching
  // in :ref:`FilterChainMatch <envoy_api_msg_listener.FilterChainMatch>`.] When used
  // within an upstream :ref:`BindConfig <envoy_api_msg_core.BindConfig>`, the address
  // controls the source address of outbound connections. For :ref:`clusters
  // <envoy_api_msg_Cluster>`, the cluster type determines whether the
  // address must be an IP (*STATIC* or *EDS* clusters) or a hostname resolved by DNS
  // (*STRICT_DNS* or *LOGICAL_DNS* clusters). Address resolution can be customized
  // via :ref:`resolver_name <envoy_api_field_core.SocketAddress.resolver_name>`.
  string address = 2 [(validate.rules).string.min_bytes = 1];
  oneof port_specifier {
    option (validate.required) = true;
    uint32 port_value = 3 [(validate.rules).uint32.lte = 65535];
    // This is only valid if :ref:`resolver_name
    // <envoy_api_field_core.SocketAddress.resolver_name>` is specified below and the
    // named resolver is capable of named port resolution.
    string named_port = 4;
  }
  // The name of the resolver. This must have been registered with Envoy. If this is
  // empty, a context dependent default applies. If address is a hostname this
  // should be set for resolution other than DNS. If the address is a concrete
  // IP address, no resolution will occur.
  string resolver_name = 5;

  // When binding to an IPv6 address above, this enables `IPv4 compatibility
  // <https://tools.ietf.org/html/rfc3493#page-11>`_. Binding to ``::`` will
  // allow both IPv4 and IPv6 connections, with peer IPv4 addresses mapped into
  // IPv6 space as ``::FFFF:<IPv4-address>``.
  bool ipv4_compat = 6;
}

message TcpKeepalive {
  // Maximum number of keepalive probes to send without response before deciding
  // the connection is dead. Default is to use the OS level configuration (unless
  // overridden, Linux defaults to 9.)
  google.protobuf.UInt32Value keepalive_probes = 1;
  // The number of seconds a connection needs to be idle before keep-alive probes
  // start being sent. Default is to use the OS level configuration (unless
  // overridden, Linux defaults to 7200s (ie 2 hours.)
  google.protobuf.UInt32Value keepalive_time = 2;
  // The number of seconds between keep-alive probes. Default is to use the OS
  // level configuration (unless overridden, Linux defaults to 75s.)
  google.protobuf.UInt32Value keepalive_interval = 3;
}

message BindConfig {
  // The address to bind to when creating a socket.
  SocketAddress source_address = 1
      [(validate.rules).message.required = true, (gogoproto.nullable) = false];

  // Whether to set the *IP_FREEBIND* option when creating the socket. When this
  // flag is set to true, allows the :ref:`source_address
  // <envoy_api_field_UpstreamBindConfig.source_address>` to be an IP address
  // that is not configured on the system running Envoy. When this flag is set
  // to false, the option *IP_FREEBIND* is disabled on the socket. When this
  // flag is not set (default), the socket is not modified, i.e. the option is
  // neither enabled nor disabled.
  google.protobuf.BoolValue freebind = 2;

  // Additional socket options that may not be present in Envoy source code or
  // precompiled binaries.
  repeated SocketOption socket_options = 3;
}

// Addresses specify either a logical or physical address and port, which are
// used to tell Envoy where to bind/listen, connect to upstream and find
// management servers.
message Address {
  oneof address {
    option (validate.required) = true;

    SocketAddress socket_address = 1;
    Pipe pipe = 2;
  }
}

// CidrRange specifies an IP Address and a prefix length to construct
// the subnet mask for a `CIDR <https://tools.ietf.org/html/rfc4632>`_ range.
message CidrRange {
  // IPv4 or IPv6 address, e.g. ``192.0.0.0`` or ``2001:db8::``.
  string address_prefix = 1 [(validate.rules).string.min_bytes = 1];
  // Length of prefix, e.g. 0, 32.
  google.protobuf.UInt32Value prefix_len = 2 [(validate.rules).uint32.lte = 128];
}
