// 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.
    1: SocketLinkOptions socket;
    /// 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;
};

/// 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;
};

/// 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);
};
