// LINT: LEGACY_NAMES
syntax = "proto2";

package clearcut.connectivity;

option java_package = "com.android.server.connectivity.metrics";
option java_outer_classname = "IpConnectivityLogClass";

// NetworkId represents the id given by the system to a physical network on the
// Android device. It is used to relates events to each other for devices with
// multiple networks (WiFi, 4G, ...).
// Deprecated since version 3, replaced by top-level network_id field in
// IpConnectivityEvent.
message NetworkId {
  // Every network gets assigned a network_id on creation based on order of
  // creation. Thus network_id N is assigned to the network created directly
  // after network N-1. Thus there is no PII involved here. Zero means no
  // network. The value 0 is never assigned to a network.
  optional int32 network_id = 1;
};

// LinkLayer describes a physical link layer technology used by a network.
// It is not intended to map one to one to the TRANSPORT_* constants defined in
// android.net.NetworkCapabilities. Instead it is intended to be used as
// a dimension field for metrics events and aggregated metrics.
// Next tag: 10
enum LinkLayer {
  // An unknown link layer technology.
  UNKNOWN   = 0;

  BLUETOOTH = 1;
  CELLULAR  = 2;
  ETHERNET  = 3;
  WIFI      = 4;
  WIFI_P2P  = 7;
  WIFI_NAN  = 8; // Also known as WiFi Aware
  LOWPAN    = 9;

  // Indicates that the link layer dimension is not relevant for the metrics or
  // event considered.
  NONE      = 5;

  // Indicates that the metrics or event considered may involve several links.
  MULTIPLE  = 6;
};

// A pair of (key, value) integers for describing histogram-like statistics.
message Pair {
  optional int32 key = 1;
  optional int32 value = 2;
};

// An event recorded when the system default network disconnects or the system
// switches to a new default network. An event is also recorded to cover gaps
// without a default network.
// Next tag: 12
message DefaultNetworkEvent {

  // Reason why this network stopped being the default.
  enum LostReason {
    UNKNOWN       = 0;
    OUTSCORED     = 1;
    INVALIDATION  = 2;
    DISCONNECT    = 3;
  };

  // Whether the network supports IPv4, IPv6, or both.
  enum IPSupport {
    NONE = 0;
    IPV4 = 1;
    IPV6 = 2;
    DUAL = 3;
  };

  // Duration in milliseconds when this network was the default.
  // Since P.
  optional int64 default_network_duration_ms = 5;

  // Duration in milliseconds when this default network Internet access was
  // validated. This field is equal to 0 for DefaultNetworkEvents representing
  // lack of a default network.
  // Since P.
  optional int64 validation_duration_ms = 11;

  // Network score of this network when it became the default network.
  // Or 0 if this event represents a period without a default network.
  // Since P.
  optional int64 initial_score = 7;

  // Network score of this network when it stopped being the default network.
  // Or 0 if this event represents a period without a default network.
  // Since P.
  optional int64 final_score = 8;

  // Best available information about IP support of this default network.
  // Or NONE if this event represents a period without a default network.
  // Since P.
  optional IPSupport ip_support = 9;

  // LinkLayer of the previous default network. Ignores any previous period
  // without a default network.
  // Since P
  optional LinkLayer previous_default_network_link_layer = 10;

  // Deprecated fields

  // A value of 0 means this is a loss of the system default network.
  // Deprecated since version 3. Replaced by top level network_id.
  optional NetworkId network_id = 1 [deprecated = true];

  // A value of 0 means there was no previous default network.
  // Deprecated since version 3. Replaced by previous_default_network_id.
  optional NetworkId previous_network_id = 2 [deprecated = true];

  // Best available information about IP support of the previous network when
  // disconnecting or switching to a new default network.
  // Deprecated since version 3. Replaced by ip_support field.
  optional IPSupport previous_network_ip_support = 3 [deprecated = true];

  // The transport types of the new default network, represented by
  // TRANSPORT_* constants as defined in NetworkCapabilities.
  // Deprecated since version 3. Replaced by top-level transports field.
  repeated int32 transport_types = 4 [deprecated = true];

  // Duration in milliseconds without a default network. This field is non-zero
  // only for DefaultNetworkEvents representing lack of a default network.
  // Since P.
  optional int64 no_default_network_duration_ms = 6 [deprecated = true];
};

// Logs IpReachabilityMonitor probe events and NUD_FAILED events.
// This message is associated to android.net.metrics.IpReachabilityEvent.
// Next tag: 3.
message IpReachabilityEvent {
  // The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
  // Deprecated since version 2, to be replaced by link_layer field.
  optional string if_name = 1 [deprecated = true];

  // The event type code of the probe, represented by constants defined in
  // android.net.metrics.IpReachabilityEvent.
  // NUD_FAILED_ORGANIC and PROVISIONING_LOST_ORGANIC recorded since version 1.
  optional int32 event_type = 2;
};

// Logs NetworkMonitor and ConnectivityService events related to the state of
// a network: connection, evaluation, validation, lingering, and disconnection.
// This message is associated to android.net.metrics.NetworkEvent.
// Next tag: 4.
message NetworkEvent {
  // The id of the network on which this event happened.
  // Deprecated since version 3.
  optional NetworkId network_id = 1 [deprecated = true];

  // The type of network event, represented by NETWORK_* constants defined in
  // android.net.metrics.NetworkEvent.
  optional int32 event_type = 2;

  // Only valid after finishing evaluating a network for Internet connectivity.
  // The time it took for this evaluation to complete.
  optional int32 latency_ms = 3;
}

// Logs individual captive portal probing events that are performed when
// evaluating or reevaluating networks for Internet connectivity.
// This message is associated to android.net.metrics.ValidationProbeEvent.
// Next tag: 5.
message ValidationProbeEvent {
  // The id of the network for which the probe was sent.
  // Deprecated since version 3.
  optional NetworkId network_id = 1 [deprecated = true];

  // The time it took for that probe to complete or time out.
  optional int32 latency_ms = 2;

  // The type of portal probe, represented by PROBE_* constants defined in
  // android.net.metrics.ValidationProbeEvent.
  optional int32 probe_type = 3;

  // The http code result of the probe test.
  optional int32 probe_result = 4;
}

// Logs DNS lookup latencies.
// This message is associated to android.net.metrics.DnsEvent.
// Next tag: 11
message DNSLookupBatch {

  // The time it took for successful DNS lookups to complete.
  // The number of repeated values can be less than getaddrinfo_query_count
  // + gethostbyname_query_count in case of event rate-limiting.
  repeated int32 latencies_ms = 4;

  // The total number of getaddrinfo queries.
  // Since version 4.
  optional int64 getaddrinfo_query_count = 5;

  // The total number of gethostbyname queries.
  // Since version 4.
  optional int64 gethostbyname_query_count = 6;

  // The total number of getaddrinfo errors.
  // Since version 4.
  optional int64 getaddrinfo_error_count = 7;

  // The total number of gethostbyname errors.
  // Since version 4.
  optional int64 gethostbyname_error_count = 8;

  // Counts of all errors returned by getaddrinfo.
  // The Pair key field is the getaddrinfo error value.
  // The value field is the count for that return value.
  // Since version 4
  repeated Pair getaddrinfo_errors = 9;

  // Counts of all errors returned by gethostbyname.
  // The Pair key field is the gethostbyname errno value.
  // the Pair value field is the count for that errno code.
  // Since version 4
  repeated Pair gethostbyname_errors = 10;


  // Deprecated fields

  // The id of the network on which the DNS lookups took place.
  // Deprecated since version 3.
  optional NetworkId network_id = 1 [deprecated = true];

  // The types of the DNS lookups, as defined in android.net.metrics.DnsEvent.
  // Deprecated since version 3.
  repeated int32 event_types = 2 [deprecated = true];

  // The return values of the DNS resolver for each DNS lookups.
  // Deprecated since version 3.
  repeated int32 return_codes = 3 [deprecated = true];
};

// Represents a collections of DNS lookup latencies and counters for a
// particular combination of DNS query type and return code.
// Since version 2.
// Next tag: 7.
message DNSLatencies {
  // The type of the DNS lookups, as defined in android.net.metrics.DnsEvent.
  // Acts as a key for a set of DNS query results.
  // Possible values are: 0 for getaddrinfo, 1 for gethostbyname.
  optional int32 type = 1;

  // The return value of the DNS resolver for the DNS lookups.
  // Acts as a key for a set of DNS query results.
  // Possible values are: 0 for success, or errno code for failures.
  optional int32 return_code = 2;

  // The number of query operations recorded.
  optional int32 query_count = 3;

  // The number of query operations returning A IPv4 records.
  optional int32 a_count = 4;

  // The number of query operations returning AAAA IPv6 records.
  optional int32 aaaa_count = 5;

  // The time it took for each DNS lookup to complete. The number of repeated
  // values can be less than query_count in case of event rate-limiting.
  repeated int32 latencies_ms = 6;
};

// Represents latency and errno statistics of the connect() system call.
// Since version 2.
// Next tag: 7
message ConnectStatistics {
  // The number of connect() operations recorded.
  optional int32 connect_count = 1;

  // The number of connect() operations done in blocking mode.
  // Since version 3.
  optional int32 connect_blocking_count = 5;

  // The number of connect() operations with IPv6 socket address.
  optional int32 ipv6_addr_count = 2;

  // The time it took for successful blocking connect() operations to complete
  // The number of repeated values can be less than connect_blocking_count in
  // case of event rate-limiting.
  repeated int32 latencies_ms = 3;

  // The time it took for successful connect() operation to complete in
  // non-blocking mode. The number of repeated values can be less than
  // connect_count - connect_blocking_count in case of event rate-limiting.
  repeated int32 non_blocking_latencies_ms = 6;

  // Counts of all error values returned by failed connect() operations.
  // The Pair key field is the errno code. The Pair value field is the count
  // for that errno code.
  repeated Pair errnos_counters = 4;
};

// Represents a DHCP event on a single interface, which can be a DHCPClient
// state transition or a response packet parsing error.
// This message is associated to android.net.metrics.DhcpClientEvent and
// android.net.metrics.DhcpErrorEvent.
// Next tag: 5
message DHCPEvent {
  // The interface name (wlan, rmnet, lo, ...) on which the event happened.
  // Deprecated since version 2, to be replaced by link_layer field.
  optional string if_name = 1 [deprecated = true];

  oneof value {
    // The name of a state in the DhcpClient state machine, represented by
    // the inner classes of android.net.dhcp.DhcpClient.
    string state_transition = 2;

    // The error code of a DHCP error, represented by constants defined in
    // android.net.metrics.DhcpErrorEvent.
    int32 error_code = 3;
  }

  // Lifetime duration in milliseconds of a DhcpClient state, or transition
  // time in milliseconds between specific pairs of DhcpClient's states.
  // Only populated since version 1, when state_transition is populated.
  optional int32 duration_ms = 4;
}

// Represents the generation of an Android Packet Filter program.
// Since version 1.
// Next tag: 8
message ApfProgramEvent {
  // Maximum lifetime of the program in seconds.
  optional int64 lifetime = 1;

  // Effective lifetime of the program in seconds from the time the
  // program was installed to the time it was replaced or removed.
  optional int64 effective_lifetime = 7;

  // Number of RAs filtered by the APF program.
  optional int32 filtered_ras = 2;

  // Total number of RAs to filter currently tracked by ApfFilter. Can be more
  // than filtered_ras if all available program size was exhausted.
  optional int32 current_ras = 3;

  // Length of the APF program in bytes.
  optional int32 program_length = 4;

  // True if the APF program is dropping multicast and broadcast traffic.
  optional bool drop_multicast = 5;

  // True if the interface on which APF runs has an IPv4 address.
  optional bool has_ipv4_addr = 6;
}

// Represents Router Advertisement listening statistics for an interface with
// Android Packet Filter enabled.
// Since version 1.
// Next tag: 15
message ApfStatistics {
  // The time interval in milliseconds these stastistics cover.
  optional int64 duration_ms = 1;

  // The total number of received RAs.
  optional int32 received_ras = 2;

  // The total number of received RAs that matched a known RA.
  optional int32 matching_ras = 3;

  // The total number of received RAs ignored due to the MAX_RAS limit.
  optional int32 dropped_ras = 5;

  // The total number of received RAs with an effective lifetime of 0 seconds.
  // Effective lifetime for APF is the minimum of all lifetimes in a RA.
  optional int32 zero_lifetime_ras = 6;

  // The total number of received RAs that could not be parsed.
  optional int32 parse_errors = 7;

  // The total number of APF program updates triggered by an RA reception.
  optional int32 program_updates = 8;

  // The maximum APF program size in byte advertised by hardware.
  optional int32 max_program_size = 9;

  // The total number of successful APF program updates triggered by any state
  // change in ApfFilter. Since version 3.
  optional int32 program_updates_all = 10;

  // The total number of APF program updates triggered when disabling the
  // multicast filter. Since version 3.
  // Since version 4.
  optional int32 program_updates_allowing_multicast = 11;

  // The total number of packets processed by the APF interpreter.
  // Since version 4.
  optional int32 total_packet_processed = 12;

  // The total number of packets dropped by the APF interpreter.
  // Since version 4.
  optional int32 total_packet_dropped = 13;

  // List of hardware counters collected by the APF interpreter.
  // The Pair key is the counter id, defined in android.net.metrics.ApfStats.
  // The Pair value is the counter value.
  // Since version 4.
  repeated Pair hardware_counters = 14;
}

// Represents the reception of a Router Advertisement packet for an interface
// with Android Packet Filter enabled.
// Since version 1.
// Next tag: 7.
message RaEvent {
  // All lifetime values are expressed in seconds. The default value for an
  // option lifetime that was not present in the RA option list is -1.
  // The lifetime of an option (e.g., the Prefix Information Option) is the
  // minimum lifetime of all such options in the packet.

  // The value of the router lifetime in the RA packet.
  optional int64 router_lifetime = 1;

  // Prefix valid lifetime from the prefix information option.
  optional int64 prefix_valid_lifetime = 2;

  // Prefix preferred lifetime from the prefix information option.
  optional int64 prefix_preferred_lifetime = 3;

  // Route info lifetime.
  optional int64 route_info_lifetime = 4;

  // Recursive DNS server lifetime.
  optional int64 rdnss_lifetime = 5;

  // DNS search list lifetime.
  optional int64 dnssl_lifetime = 6;
}

// Represents an IP provisioning event in IpManager and how long the
// provisioning action took.
// This message is associated to android.net.metrics.IpManagerEvent.
// Next tag: 4.
message IpProvisioningEvent {
  // The interface name (wlan, rmnet, lo, ...) on which the probe was sent.
  // Deprecated since version 2, to be replaced by link_layer field.
  optional string if_name = 1 [deprecated = true];

  // The code of the IP provisioning event, represented by constants defined in
  // android.net.metrics.IpManagerEvent.
  optional int32 event_type = 2;

  // The duration of the provisioning action that resulted in this event.
  optional int32 latency_ms = 3;
}

// Represents statistics from a single android Network.
// Since version 4. Replace NetworkEvent.
// Next tag: 9.
message NetworkStats {

  // Duration of this Network lifecycle in milliseconds.
  optional int64 duration_ms = 1;

  // Information about IP support of this network.
  optional DefaultNetworkEvent.IPSupport ip_support = 2;

  // True if the network was validated at least once.
  optional bool ever_validated = 3;

  // True if a captive portal was found at least once on this network.
  optional bool portal_found = 4;

  // Total number of times no connectivity was reported for this network.
  optional int32 no_connectivity_reports = 5;

  // Total number of validation attempts.
  optional int32 validation_attempts = 6;

  // Results from all validation attempts.
  // The Pair key is the result:
  //    0 -> unvalidated
  //    1 -> validated
  //    2 -> captive portal
  // The Pair value is the duration of the validation attempts in milliseconds.
  repeated Pair validation_events = 7;

  // Time series of validation states in time order.
  // The Pair key is the state:
  //    0 -> unvalidated
  //    1 -> validated
  //    2 -> captive portal,
  // The Pair value is the duration of that state in milliseconds.
  repeated Pair validation_states = 8;
}

// Represents statistics from NFLOG wakeup events due to ingress packets.
// Since oc-mr1.
// Next tag: 13.
message WakeupStats {
  // The time duration in seconds covered by these stats, for deriving
  // exact wakeup rates.
  optional int64 duration_sec = 1;

  // The total number of ingress packets waking up the device.
  optional int64 total_wakeups = 2;

  // The total number of wakeup packets routed to a socket belonging to
  // the root uid (uid 0).
  optional int64 root_wakeups = 3;

  // The total number of wakeup packets routed to a socket belonging to
  // the system server (uid 1000).
  optional int64 system_wakeups = 4;

  // The total number of wakeup packets routed to a socket belonging to
  // an application (uid > 9999).
  optional int64 application_wakeups = 5;

  // The total number of wakeup packets routed to a socket belonging to another
  // uid than the root uid, system uid, or an application uid (any uid in
  // between [1001, 9999]. See android.os.Process for possible uids.
  optional int64 non_application_wakeups = 6;

  // The total number of wakeup packets with no associated socket or uid.
  optional int64 no_uid_wakeups = 7;

  // Counts of all different ethertype values from wakeup packets received.
  repeated Pair ethertype_counts = 8;

  // Counts of all different IP next header values from wakeup packets received.
  repeated Pair ip_next_header_counts = 9;

  // The total number of wakeup packets whose destination hardware address was
  // a unicast address.
  optional int64 l2_unicast_count = 10;

  // The total number of wakeup packets whose destination hardware address was
  // a multicast address.
  optional int64 l2_multicast_count = 11;

  // The total number of wakeup packets whose destination hardware address was
  // a broadcast address.
  optional int64 l2_broadcast_count = 12;
}

// Represents one of the IP connectivity event defined in this file.
// Next tag: 20
message IpConnectivityEvent {
  // Time in ms when the event was recorded.
  optional int64 time_ms = 1;

  // Physical link layer of the network on which the event happened.
  // Acts as a dimension key.
  // Since version 2.
  optional LinkLayer link_layer = 15;

  // Represents the id given by the system to a physical network on the device.
  // Every network gets assigned a unique id on creation from a monotonic
  // counter. The value 0 is never assigned to a network and means no network.
  // It is used to correlate different types of events to each other for devices
  // with multiple networks (WiFi, 4G, ...).
  // Since version 3.
  optional int32 network_id = 16;

  // The interface name (wlan, rmnet, lo, ...) on which the event happened.
  // Present if the link_layer field was not inferred from the if_name on
  // the device, so that post-processing of the serialized proto can backfill
  // link_layer. Since version 3.
  optional string if_name = 17;

  // The transport types of the network on which the event happened, expressed
  // as a bit field of TRANSPORT_* constants as defined in NetworkCapabilities.
  // Present if the link_layer field was not inferred from the transport types,
  // so that post-processing of the serialized proto can backfill link_layer
  // Since version 3.
  optional int64 transports = 18;

  oneof event {

    // An event about the system default network.
    DefaultNetworkEvent default_network_event = 2;

    // An IP reachability probe event.
    IpReachabilityEvent ip_reachability_event = 3;

    // A network lifecycle event.
    NetworkEvent network_event = 4 [deprecated = true];

    // A batch of DNS lookups.
    // Deprecated in the nyc-mr2 release since version 2,and replaced by
    // dns_latencies.
    DNSLookupBatch dns_lookup_batch = 5 [deprecated = true];

    // DNS lookup latency statistics.
    DNSLatencies dns_latencies = 13;

    // Connect latency and errno statistics.
    ConnectStatistics connect_statistics = 14;

    // A DHCP client event or DHCP receive error.
    DHCPEvent dhcp_event = 6;

    // An IP provisioning event.
    IpProvisioningEvent ip_provisioning_event = 7;

    // A network validation probe event.
    ValidationProbeEvent validation_probe_event = 8;

    // An Android Packet Filter program event.
    ApfProgramEvent apf_program_event = 9;

    // An Android Packet Filter statistics event.
    ApfStatistics apf_statistics = 10;

    // An RA packet reception event.
    RaEvent ra_event = 11;

    // Network statistics.
    NetworkStats network_stats = 19;

    // Ingress packet wakeup statistics.
    WakeupStats wakeup_stats = 20;
  };
};

// The information about IP connectivity events.
// Next tag: 4.
message IpConnectivityLog {
  // An array of IP connectivity events.
  repeated IpConnectivityEvent events = 1;

  // The number of events that had to be dropped due to a full buffer.
  optional int32 dropped_events = 2;

  // The version number of the metrics events being collected.
  //  nyc:     not populated, implicitly 0.
  //  nyc-dr1: not populated, implicitly 1 (sailfish and marlin only).
  //  nyc-mr1: not populated, implicitly 1.
  //  nyc-mr2: 2.
  //  oc:      3.
  //  oc-dr1:  4. (sailfish, marlin, walleye, taimen)
  optional int32 version = 3;
};
