// 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.net.stack;

using fuchsia.net;
using fuchsia.net.interfaces.admin;

/// A path to a device node.
alias DevicePath = string:255;

/// A value indicating that a [`ForwardingEntry`]'s metric is unspecified.
const UNSPECIFIED_METRIC uint32 = 0;

/// An entry in the forwarding table for the network stack.
///
/// Valid if at least one of [`device_id`] and [`next_hop`] is specified.
type ForwardingEntry = struct {
    /// The destination subnet this route can be used to send to.
    subnet fuchsia.net.Subnet;

    /// The opaque identifier of the device to which packets should be forwarded. The zero value is
    /// interpreted as unspecified. If unspecified, [`next_hop`] must be set, and will be used by
    /// the server to select an appropriate device.
    device_id fuchsia.net.InterfaceId;

    /// The IP address of the next hop. Used for link-layer address resolution, if present.
    next_hop fuchsia.net.IpAddress:optional;

    /// This entry's metric.
    ///
    /// [`UNSPECIFIED_METRIC`] is interpreted as unspecified.
    metric uint32;
};

type Error = strict enum {
    INTERNAL = 1;
    NOT_SUPPORTED = 2;
    INVALID_ARGS = 3;
    BAD_STATE = 4;
    TIME_OUT = 5;
    NOT_FOUND = 6;
    ALREADY_EXISTS = 7;
    IO = 8;
};

@discoverable
closed protocol Stack {
    /// Add a new entry to the forwarding table.
    ///
    /// If the table already contains an entry with the same subnet and
    /// destination, an already exists error is returned.
    strict AddForwardingEntry(struct {
        entry ForwardingEntry;
    }) -> () error Error;

    /// Removes the forwarding entry. The entry must exactly match an entry in
    /// the forwarding table, with the exception of the metric value, which is
    /// ignored.
    strict DelForwardingEntry(struct {
        entry ForwardingEntry;
    }) -> () error Error;

    /// Sets the IP forwarding state for an interface.
    // TODO(https://fxbug.dev/42176374): Remove this.
    @deprecated("Use fuchsia.net.interfaces.admin/Control.SetConfiguration")
    strict SetInterfaceIpForwardingDeprecated(struct {
        id fuchsia.net.InterfaceId;
        ip_version fuchsia.net.IpVersion;
        enabled bool;
    }) -> () error Error;

    /// Enables or disables the DHCP client on an interface.
    /// TODO(https://fxbug.dev/42162065): Remove this once the DHCP client is moved
    /// out of the netstack.
    strict SetDhcpClientEnabled(resource struct {
        id fuchsia.net.InterfaceId;
        enable bool;
    }) -> () error Error;

    /// Creates a bridge over the provided `interfaces`.
    ///
    /// If the bridge can't be created, `bridge` is closed with a `BAD_PORT`
    /// termination reason.
    ///
    /// NOTE: We're shoehorning bridging into the `admin/Control` API and
    /// reassigning meaning to `BAD_PORT` because we don't want to leak
    /// bridging-specific errors there. The POR is that bridging is going to get
    /// its own API at some point.
    ///
    /// Bridge lifetime is controlled through the `bridge` handle.
    // TODO(https://fxbug.dev/42167696): Redesign and re-home this.
    strict BridgeInterfaces(resource struct {
        interfaces vector<fuchsia.net.InterfaceId>:MAX;
        bridge server_end:fuchsia.net.interfaces.admin.Control;
    });
};

@discoverable
closed protocol Log {
    /// Dynamically set packet logging.
    // TODO(https://fxbug.dev/42118625): replace with optional packet captures in Inspect
    // output.
    strict SetLogPackets(struct {
        enabled bool;
    }) -> ();
};
