// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.overnet.protocol;

using fuchsia.net;

/// Diagnostic data on a single peer connection.
table PeerConnectionDiagnosticInfo {
    /// Source address.
    1: NodeId source;
    /// Destination address.
    2: NodeId destination;
    /// Whether this connection is a client.
    3: bool is_client;
    /// True if the connection established and ready to send traffic.
    4: bool is_established;
    /// Number of packets received.
    5: uint64 received_packets;
    /// Number of packets sent.
    6: uint64 sent_packets;
    /// Number of packets lost.
    7: uint64 lost_packets;
    /// Round trip time for the connection in microseconds.
    8: uint64 round_trip_time_microseconds;
    /// Current congestion window in bytes.
    9: uint64 congestion_window_bytes;
    /// Number of overnet messages sent.
    10: uint64 messages_sent;
    /// Number of bytes sent due to overnet messages.
    11: uint64 bytes_sent;
    /// Number of connect to service requests.
    12: uint64 connect_to_service_sends;
    /// Number of bytes sent due to connect to service requests.
    13: uint64 connect_to_service_send_bytes;
    /// Number of node description updates.
    14: uint64 update_node_description_sends;
    /// Number of bytes sent due to node description updates.
    15: uint64 update_node_description_send_bytes;
    /// Number of link status updates.
    16: uint64 update_link_status_sends;
    /// Number of bytes sent due to link status updates.
    17: uint64 update_link_status_send_bytes;
    /// Number of link status update acknowledgements sent.
    18: uint64 update_link_status_ack_sends;
    /// Number of bytes sent due to link status update acknowledgements.
    19: uint64 update_link_status_ack_send_bytes;
};

/// Diagnostic data on a single link.
table LinkDiagnosticInfo {
    /// Source address.
    1: NodeId source;
    /// Destination address.
    2: NodeId destination;
    /// Source identifier for this link.
    3: uint64 source_local_id;
    /// Number of packets received.
    4: uint64 received_packets;
    /// Number of packets sent.
    5: uint64 sent_packets;
    /// Number of bytes received.
    6: uint64 received_bytes;
    /// Number of bytes sent.
    7: uint64 sent_bytes;
    /// Round trip time for the connection in microseconds.
    8: uint64 round_trip_time_microseconds;
    /// Number of ping requests sent.
    9: uint64 pings_sent;
    /// Number of packets forwarded.
    10: uint64 packets_forwarded;
    /// Type of link & configuration data.
    11: LinkConfig config;
};

/// A description of the configuration of a given link.
union LinkConfig {
    /// A link configured via fuchsia.overnet.MeshController/AttachSocket - these are links
    /// that are implemented externally to Overnet.
    7: Empty socket;
    1: reserved;
    /// A link using overnetstack's UDP protocol.
    /// The content of this config is the address of the peer.
    2: fuchsia.net.Ipv6SocketAddress udp;
    /// A link using Overnet's serial protocol acting as a server.
    /// The text is the canonicalized unparsed serial descriptor for this serial port.
    3: string:256 serial_server;
    /// A link using Overnet's serial protocol acting as a client.
    /// The text is the canonicalized unparsed serial descriptor for this serial port.
    4: string:256 serial_client;
    /// Ascendd server link. The text is the path to the ascendd socket.
    5: AscenddLinkConfig ascendd_server;
    /// A host binary connecting to ascendd. Text is the path to the ascendd socket.
    6: AscenddLinkConfig ascendd_client;
};

/// An ascendd link configuration.
table AscenddLinkConfig {
    /// Path to the ascendd socket.
    1: string:1024 path;
    /// Connection label for this link.
    2: string:32 connection_label;
};

/// The operating system running a node.
enum OperatingSystem {
    /// Fuchsia
    FUCHSIA = 0;
    /// Linux
    LINUX = 1;
    /// MacOS
    MAC = 2;
};

/// The implementation of a node that's running.
enum Implementation {
    /// Some unit test... shouldn't be seen in the wild.
    UNIT_TEST = 0;
    /// The overnetstack daemon on Fuchsia.
    OVERNET_STACK = 1;
    /// The non-Fuchsia routing daemon Ascendd.
    ASCENDD = 2;
    /// The `hoist` Rust crate embedding Overnet.
    HOIST_RUST_CRATE = 3;
};

/// Diagnostic data on a single node.
table NodeDescription {
    /// A string saying something about what operating system this node is running on
    /// Currently used: 'fuchsia', 'linux', 'mac'
    1: OperatingSystem operating_system;
    /// A string saying something about the runtime environment of a node
    2: Implementation implementation;
    /// The name of the binary containing Overnet
    3: string:32 binary;
    /// The hostname of the device running Overnet
    4: string:32 hostname;
};

/// Composition of results from Diagnostic/Probe.
table ProbeResult {
    /// Node description, obtained by probing ProbeSelector.NODE_DESCRIPTION
    1: NodeDescription node_description;
    /// Peer connections list, obtained by probing ProbeSelector.PEER_CONNECTIONS
    2: vector<PeerConnectionDiagnosticInfo>:MAX peer_connections;
    /// Link list, obtained by probing ProbeSelector.LINKS
    3: vector<LinkDiagnosticInfo>:MAX links;
    /// Count of how many links are still negotiating, obtained by probing ProbeSelector.CONNECTING_LINK_COUNT
    4: uint64 connecting_link_count;
};

/// Selector bits for what to probe during Diagnostic/Probe.
bits ProbeSelector : uint64 {
    /// Request ProbeResult.node_description is present in the result
    NODE_DESCRIPTION = 0x01;
    /// Request ProbeResult.peer_connections is present in the result
    PEER_CONNECTIONS = 0x02;
    /// Request ProbeResult.links is present in the result
    LINKS = 0x04;
    /// Request ProbeResult.connecting_link_count is present in the result
    CONNECTING_LINK_COUNT = 0x08;
};

/// Diagnostic information exported by Overnet peers.
/// This interface is additionally exported to the Overnet mesh.
[Discoverable]
protocol Diagnostic {
    /// Probe some basic statistics from this node
    Probe(ProbeSelector selector) -> (ProbeResult result);
};
