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

// Features that may be present on a network interface.
// TODO(tkilbourn): consider a bitfield for this.
enum InterfaceFeature : uint8 {
    // The interface is a wireless network interface.
    wlan = 1;

    // The interface is synthetic, i.e., not backed by hardware.
    synthetic = 2;

    // The interface is a loopback device provided by the stack.
    loopback = 3;
};

// Status constants
// The interface is enabled.
const uint32 interfaceStatusEnabled = 0x01;
// The interface has a physical link.
const uint32 interfaceStatusLinkUp = 0x02;

struct InterfaceAddress {
    // The IP address of the interface.
    fuchsia.net.IpAddress ipAddress;

    // The length of the network portion of the interface IP address.
    uint8 prefixLen;

    // For point-to-point interfaces, the address of the remote peer.
    fuchsia.net.IpAddress? peerAddress;
};

struct InterfaceInfo {
    // An opaque identifier for the interface, assigned by the stack.
    // This identifier will never be 0, and will not be reused even if the device is removed and
    // subsequently re-added. It is not stable across netstack instances.
    uint64 id;

    // The topological path to the device, representing a stable identifier for the interface
    // hardware.
    string path;

    // The MAC address of the interface, if available.
    fuchsia.net.MacAddress? mac;

    // The maximum transmission unit for the interface in bytes.
    uint32 mtu;

    // The features present on the interface.
    // TODO(tkilbourn): consider a bitfield for this.
    vector<InterfaceFeature> features;

    // The status of the interface. This is a bitfield containing the "Status constants" in this
    // file.
    uint32 status;

    // The list of addresses currently assigned to the interface.
    vector<InterfaceAddress> addresses;
};

// A ForwardingDestination represents either the device that should transmit a packet or the address
// of the next hop in the route.
union ForwardingDestination {
    // The opaque identifier of the device to which packets should be forwarded.
    uint64 deviceId;

    // The IP address of the next hop, used to look up the next forwarding entry.
    fuchsia.net.IpAddress nextHop;
};

// An entry in the forwarding table for the network stack.
struct ForwardingEntry {
    // The subnet is the key for the entry in the table.
    fuchsia.net.Subnet subnet;

    // The destination that will receive the forwarded packet.
    ForwardingDestination destination;
};

enum InterfaceChangeEvent {
    // The device was added to the system.
    added = 1;

    // The device was removed from the system.
    removed = 2;

    // The device was enabled.
    enabled = 3;

    // The device was disabled.
    disabled = 4;

    // The device has a link to the medium on which it is attached.
    linkUp = 5;

    // The device does not have a link to the medium on which it is attached.
    linkDown = 6;
};

struct InterfaceStatusChange {
    // The opaque identifier of the device that had its status change.
    uint64 id;

    // The event representing the status change.
    InterfaceChangeEvent event;
};

union InterfaceAddressChangeEvent {
    InterfaceAddress added;
    InterfaceAddress removed;
};

struct InterfaceAddressChange {
    // The opaque identifier of the device that had its address change.
    uint64 id;

    // The event representing the address change.
    InterfaceAddressChangeEvent event;
};

enum ErrorType {
    internal = 1;
    notSupported = 2;
    invalidArgs = 10;
    badState = 20;
    timedOut = 21;
    notFound = 25;
    alreadyExists = 26;
    io = 40;
};

struct Error {
    ErrorType type;
};

[Discoverable]
interface Stack {
    // List all the interfaces available in the network stack.
    0x100: ListInterfaces() -> (vector<InterfaceInfo> ifs);

    // Retrieve info about a specific interface.
    0x101: GetInterfaceInfo(uint64 id) -> (InterfaceInfo? info, Error? err);

    // Enable the interface. Packets may be processed by the stack after this call is processed.
    0x102: EnableInterface(uint64 id) -> (Error? err);

    // Disable the interface. The stack will no longer process packets after this call.
    0x103: DisableInterface(uint64 id) -> (Error? err);

    // Add an address to the interface. If the interface already has an address of a given type that
    // does not allow duplicates, this method will return an error.
    0x104: AddInterfaceAddress(uint64 id, InterfaceAddress addr) -> (Error? err);

    // Remove the address from the interface. If the address is not assigned to the interface, an
    // error is returned.
    0x105: DelInterfaceAddress(uint64 id, fuchsia.net.IpAddress addr) -> (Error? err);

    // List all the entries in the forwarding table for the network stack.
    0x200: GetForwardingTable() -> (vector<ForwardingEntry> table);

    // Add a new entry to the forwarding table. If the table already contains an entry with the same
    // subnet, an error is returned. The entry may be deleted using DelForwardingEntry first.
    0x201: AddForwardingEntry(ForwardingEntry entry) -> (Error? err);

    // Removes the forwarding entry with the given subnet. This will not affect any overlapping
    // subnets (superset or subset) so the subnet must exactly match an entry in the forwarding
    // table. If no entry for the subnet exists, an error is returned.
    0x202: DelForwardingEntry(fuchsia.net.Subnet subnet) -> (Error? err);

    // 0x300: reserved for packet filtering

    // Events
    // A status change event is triggered whenever an interface's status changes.
    0x1000: -> OnInterfaceStatusChange(InterfaceStatusChange info);

    // An address change event is triggered whenever an interface's addresses change.
    0x1001: -> OnInterfaceAddressChange(InterfaceAddressChange info);
};
