// 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.policy;

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

struct InterfaceInfo {
    /// Interface name.
    string name;

    /// All info of an interface except the interface name.
    fuchsia.net.stack.InterfaceProperties properties;
};

/// Event for interface name update.
struct InterfaceNameUpdate {
    /// The new name.
    string name;
};

table Events {
    /// InterfaceStatus event is triggered whenever an interface's status is changed.
    1: fuchsia.net.stack.InterfaceStatus status;

    /// InterfaceAddressDiff event is triggered whenever the interface's addresses are changed.
    2: fuchsia.net.stack.InterfaceAddressDiff addressDiff;

    /// InterfaceNameUpdate event is triggered whenever an interface's name is changed.
    3: InterfaceNameUpdate name;
};

union EthernetControllerRequest {
    request<StandardInterfaceController> standard;
    request<BridgeInterfaceController> bridge;
};

[FragileBase]
interface BaseInterfaceController {
    /// Retrieve info about an interface.
    GetInterfaceInfo() -> (InterfaceInfo info);

    /// Set the administrative enablement for an interfance.
    /// If enabled, the interface starts processing packets.
    /// If disabled, the interface stops processing packets.
    SetInterfaceStatus(fuchsia.net.stack.EnablementStatus status) -> (zx.status status);

    /// Set DHCP client enablement for a specific interface.
    /// If enabled, the interface acquires a dynamic IP address through DHCP server.
    /// If disabled, the interface uses the assigned static IP address.
    SetDHCPClientStatus(fuchsia.net.stack.EnablementStatus status) -> (zx.status status);

    /// Add/Remove IP address for an interface.
    /// Remove only if IP address is an exact match.
    UpdateAddress(fuchsia.net.stack.InterfaceAddressDiff addressDiff) -> (zx.status status);

    /// Set a name for an interface.
    SetName(string name) -> (zx.status status);

    -> OnChange(Events events);
};

/// Controller of physical and virtual interfaces.
interface StandardInterfaceController : BaseInterfaceController {
};

/// Controller of  bridging interfaces.
interface BridgeInterfaceController : BaseInterfaceController {
};

[Discoverable]
// Observer receives events from all interfaces and queries interface info.
// It is used by clients like mdns which only care about interface change events
// and the first-class clients like sysUI and net_ctl.
interface Observer {
    /// Retrieve info of all the interfaces.
    ListInterfaces() -> (vector<InterfaceInfo>? infos, zx.status status);

    /// Retrieve info of a specific interface.
    GetInterfaceInfo(string name) -> (InterfaceInfo? info, zx.status status);

    -> OnChange(string interface, Events events);
};

[Discoverable]
interface BasePolicy {
    /// Add virtual interfaces.
    // Physical interfaces are added by watching the events in /dev/class/ethernet directory.
    // The networking interface added through this API are tied to the lifetime of the fidl channel.
    // If the client crashes/exits, the channel is closed,
    // and then the interface created by this method over the channel will be destructed.
    AddInterface(fuchsia.hardware.ethernet.Device device, request<StandardInterfaceController> interfaceCtl) -> (zx.status status);

    /// Create bridging interface.
    CreateBridge(vector<string> interfaces, request<BridgeInterfaceController> interfaceCtl) -> (zx.status status);
};

[Discoverable]
// PrivilegedPolicy provides any interface's controller.
// It is used by clients such as SysUI and net_ctl.
// Infrastructure team is working on capability control mechanism and details can be found:
// https://docs.google.com/document/d/1pOPFRfdh6AnWt2d37F1k7YH0AhJ1AnrGEdUU3zyzCkQ/edit#
// That said, the component infrastrastructure will block unqualified client from accessing the PrivilegedPolicy interface.
interface PrivilegedPolicy {
    GetInterfaceController(string interface, EthernetControllerRequest controller)-> (zx.status status);
};
