// Copyright 2018 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.netemul.network;

using fuchsia.hardware.ethernet;
using fuchsia.hardware.network;
using fuchsia.net;
using zx;

/// Provides emulated latency configuration.
struct LatencyConfig {
    /// Average latency, in ms.
    uint64 average;
    /// Latency standard deviation, in ms.
    uint64 std_dev;
};

// Note: Loss config is a union to be able to provide other models of packet loss.
/// Provides emulated packet loss configuration.
union LossConfig {
    /// Rate of packet loss expressed as independent drop probability [0-100].
    1: uint8 random_rate;
};

/// Provides emulated packet reordering configuration.
struct ReorderConfig {
    /// Size of buffer, in packets, to store and forward with randomized order.
    uint32 store_buff;
    /// Tick/deadline in ms to empty buffer, regardless of full state.
    /// 0 will cause buffer to flush only when full (dangerous).
    uint64 tick;
};

/// Used to configure a network with emulated adversity conditions.
table NetworkConfig {
    /// Latency configuration.
    1: LatencyConfig latency;
    /// Packet loss configuration.
    2: LossConfig packet_loss;
    /// Packet reordering configuration.
    3: ReorderConfig reorder;
};

/// Manages virtual networks.
protocol NetworkManager {
    /// Lists emulated networks by name.
    ListNetworks() -> (vector<string:MAX>:MAX nets);
    /// Creates a new network with given name and config.
    CreateNetwork(string:MAX name, NetworkConfig config) -> (zx.status status, Network? net);
    /// Gets a handle to a network.
    GetNetwork(string:MAX name) -> (Network? net);
};

/// Backing of an emulated endpoint.
enum EndpointBacking {
    /// Endpoint backed by ethertap device.
    ETHERTAP = 1;
    /// Endpoint backed by a network-tun device.
    /// The created `fuchsia.hardware.network.Device` always acts as a virtual ethernet device.
    NETWORK_DEVICE = 2;
};

/// Configuration used to create an endpoint.
struct EndpointConfig {
    /// Fake ethernet mtu.
    uint16 mtu;
    /// Fake ethernet mac address, if not provided will be set to randomized local mac,
    /// using endpoint name as seed.
    fuchsia.net.MacAddress? mac;
    /// Backing type of emulated endpoint.
    EndpointBacking backing;
};

/// Manages virtual endpoints.
protocol EndpointManager {
    /// Lists endpoints by name.
    ListEndpoints() -> (vector<string:MAX>:MAX endp);
    /// Creates endpoint with given name and config.
    CreateEndpoint(string:MAX name, EndpointConfig config) -> (zx.status status, Endpoint? endpoint);
    /// Gets a handle to an endpoint.
    GetEndpoint(string:MAX name) -> (Endpoint? endpoint);
};

/// Fake endpoint can be added to a network to snoop or inject packets.
protocol FakeEndpoint {
    /// Writes a frame to the network.
    Write(vector<uint8>:MAX data) -> ();
    /// Reads a single frame from the network.
    ///
    /// Blocks until new data is available to be read. FakeEndpoint will keep a limited amount of
    /// frames to be read, dropping the oldest ones if the data is not fetched fast enough. The
    /// number of dropped frames since the last call to `Read` is returned in `dropped_frames`.
    ///
    /// Issuing a second `Read` request when the first one is still pending will cause the channel
    /// to be closed with `ZX_ERR_BAD_STATE`.
    Read() -> (vector<uint8>:MAX data, uint64 dropped_frames);
};

/// Virtual network.
protocol Network {
    /// Gets network configuration.
    GetConfig() -> (NetworkConfig config);
    /// Gets network name.
    GetName() -> (string:MAX name);
    /// Updates network configuration.
    SetConfig(NetworkConfig config) -> (zx.status status);
    /// Attaches endpoint with given name to network.
    AttachEndpoint(string:MAX name) -> (zx.status status);
    /// Removes endpoint with given name from network.
    RemoveEndpoint(string:MAX name) -> (zx.status status);
    /// Injects a fake endpoint.
    CreateFakeEndpoint(request<FakeEndpoint> ep);
};

/// Simple interface to serve devices over fidl.
protocol DeviceProxy {
    /// Fulfills the device request.
    /// The fulfilled requests's protocol is defined by the `Endpoint`'s `EndpointBacking`.
    ServeDevice(zx.handle:CHANNEL req);
};

/// A connection to an endpoint's underlying protocol.
resource union DeviceConnection {
    /// Set if the endpoint's backing is `ETHERTAP`.
    1: fuchsia.hardware.ethernet.Device ethernet;
    /// Set if the endpoint's backing is `NETWORK_DEVICE`.
    // NOTE(brunodalbo) the DeviceInstance protocol is a transient protocol that is exposed by devfs.
    // As documented in its definition, users should avoid passing this forward, but connect to its
    // internal protocols instead.
    2: fuchsia.hardware.network.DeviceInstance network_device;
};

/// Virtual ethernet endpoint.
protocol Endpoint {
    // Gets endpoint configuration.
    GetConfig() -> (EndpointConfig config);
    /// Gets endpoint name.
    GetName() -> (string:MAX name);
    /// Sends link up or down signal
    SetLinkUp(bool up) -> ();
    /// Opens a channel with the underlying device protocol.
    /// The resulting `DeviceConnection` variant is defined by this `Endpoint`'s `EndpointBacking`.
    GetDevice() -> (DeviceConnection device);
    /// Gets a proxy to open requests with zircon ethernet device.
    GetProxy(request<DeviceProxy> proxy);
};

/// Convenience struct for creating entire network setups.
struct NetworkSetup {
    /// Network name, must be unique in network context.
    string:MAX name;
    /// NetworkConfig to use when creating network.
    NetworkConfig config;
    /// Collection of endpoints to create and attach to network.
    vector<EndpointSetup>:MAX endpoints;
};

/// Convenience struct for creating endpoints along with network setup.
struct EndpointSetup {
    /// Endpoint name, must be unique in network context.
    string:MAX name;
    /// Optional endpoint config, if not provided defaults will be used.
    /// Default values are: mtu = 1500, backing = ETHERTAP, mac = randomized.
    EndpointConfig? config;
    /// Start endpoint with link status up.
    bool link_up;
};

/// Handle returned when using NetworkContext.Setup for quick network configuration.
/// Networks and endpoints created by Setup are tied to the lifecycle of the SetupHandle's channel.
protocol SetupHandle {
};

/// Main entry point to manage virtual networks and endpoints.
[Discoverable]
protocol NetworkContext {
    GetNetworkManager(request<NetworkManager> net_manager);
    GetEndpointManager(request<EndpointManager> endp_manager);
    /// Creates a collection of networks described by `networks`.
    /// `status` is `ZX_OK` for success
    /// `setup_handle` is a resource that references and maintains the lifecycle of
    ///                the created networks and endpoints.
    Setup(vector<NetworkSetup>:MAX networks) -> (zx.status status, SetupHandle? setup_handle);
};
