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

using fuchsia.net;
using zx;

/// The pool of addresses managed by a DHCP server and from which leases are supplied.
table AddressPool {
    /// The network ID of the address pool's subnet.
    1: fuchsia.net.Ipv4Address network_id;
    /// The broadcast address of the address pool's subnet.
    2: fuchsia.net.Ipv4Address broadcast;
    /// The subnet mask of the address pool's network.
    3: fuchsia.net.Ipv4Address mask;
    /// The starting address, inclusive, of the range of addresses which the DHCP server
    /// will lease to clients. This address must be in the subnet defined by the network_id
    /// and mask members of the AddressPool.
    4: fuchsia.net.Ipv4Address pool_range_start;
    /// The ending address, inclusive, of the range of addresses which the server will
    /// to clients. This address must be in the subnet defined by the network_id and mask
    /// members of the AddressPool.
    5: fuchsia.net.Ipv4Address pool_range_stop;
};

/// The duration of leases offered by the server.
table LeaseLength {
    /// The default lease length to be issued to clients. This field must have a value.
    1: Duration default;
    /// The maximum lease length value which the server will issue to clients who
    /// have requested a specific lease length. If omitted, the max lease length is
    /// equivalent to the default lease length.
    2: Duration max;
};

/// A static IP address assignment for a host or device on the network managed by Server.
table StaticAssignment {
    /// The MAC address of the host or device which will have the static IP address assignment.
    1: fuchsia.net.MacAddress host;
    /// The IP address which the host or device will always be assigned by dhcpd.
    2: fuchsia.net.Ipv4Address assigned_addr;
};

/// The configurable server parameters.
flexible union Parameter {
    /// The IP addresses to which the server is bound. The vector bound has been
    /// arbitrarily selected as a generous upper limit.
    1: vector<fuchsia.net.Ipv4Address>:256 ip_addrs;
    /// The server's pool of managed addresses. Changing the address pool will not cancel existing
    /// leases because the DHCP protocol does not provide a mechanism for doing so. Administrators
    /// should take care when changing the address pool for a server with active leases.
    2: AddressPool address_pool;
    /// The duration of leases issued by dhcpd.
    3: LeaseLength lease;
    /// The client MAC addresses which the server will issue leases to. By default,
    /// the server will not have a permitted MAC list, in which case it will attempt to
    /// issue a lease to every client which requests one. If permitted_macs has a non-zero length
    /// then the server will only respond to lease requests from clients with a MAC in the list. The
    /// vector bound has been arbitrarily selected as a generous upper limit.
    4: vector<fuchsia.net.MacAddress>:256 permitted_macs;
    /// Addresses statically assigned to specific hosts or devices. Typically, a network
    /// administrator will statically assign addresses to always-on network
    /// devices which should always have the same IP address, such as network printers. The vector
    /// bound has been arbitrarily selected as a generous upper limit.
    5: vector<StaticAssignment>:256 statically_assigned_addrs;
    /// Enables server behavior where the server ARPs an IP address prior to issuing
    /// it in a lease. If the server receives a response, the server will mark the
    /// address as in-use and try again with a different address.
    6: bool arp_probe;
    /// The names of the interface to which the server will listen. If this
    /// vector is empty, the server will listen on all interfaces and will
    /// process incoming DHCP messages regardless of the interface on which
    /// they arrive. If this vector is not empty, then the server will only
    /// listen for incoming DHCP messages on the named interfaces contained by
    /// this vector. The string and vectors bounds have been arbitrarily
    /// selected as generous upper limits.
    7: vector<string:256>:256 bound_device_names;
};

/// The name of the Parameter to be retrieved by Server.GetParameter().
enum ParameterName {
    IP_ADDRS = 0;
    ADDRESS_POOL = 1;
    LEASE_LENGTH = 2;
    PERMITTED_MACS = 3;
    STATICALLY_ASSIGNED_ADDRS = 4;
    ARP_PROBE = 5;
    BOUND_DEVICE_NAMES = 6;
};

/// Provides methods for DHCP Server configuration.
[Discoverable]
protocol Server {
    /// Returns the requested Option if it is supported.
    ///
    /// + request `code` the code of an Option whose value has been requested.
    /// - response `value` the value of the requested Option.
    /// * error a zx.status indicating why the value could not be retrieved.
    GetOption(OptionCode code) -> (Option value) error zx.status;

    /// Returns the requested Parameter if it is supported.
    ///
    /// + request `name` the name of a Parameter whose value has been requested.
    /// - response `value` the value of the requested Parameter.
    /// * error a zx.status indicating why the value could not be retrieved.
    GetParameter(ParameterName name) -> (Parameter value) error zx.status;

    /// Sets the Option to the argument. On success, a SetOption will take
    /// effect immediately.
    ///
    /// + request `value` an Option whose value will be set to the value of this
    /// argument.
    /// * error a zx.status indicating the cause of failure.
    SetOption(Option value) -> () error zx.status;

    /// Sets the Parameter to the argument. On success, the new parameter value
    /// can be queried by GetParameter or ListParameter immediately. However,
    /// the server may require a restart in order for the new Parameter value to
    /// take effect. To ensure expected operation, administrators should restart
    /// the server after mutating its parameters with SetParameter or
    /// ResetParameters.
    ///
    /// + request `value` a Parameter whose value will be set to the value of
    /// this argument.
    /// * error a zx.status indicating the cause of failure.
    SetParameter(Parameter value) -> () error zx.status;

    /// Lists all DHCP options for which the Server has a value. Any option
    /// which does not have a value will be omitted from the returned list.
    /// ListOptions provides administrators a means to print a server's
    /// configuration as opposed to querying the value of a single Option.
    ///
    /// - response `options` a vector containing all of the options for which
    /// the Server has a value. Bounded to 256 as options are identified by a 1
    /// octet code and 256 is the maximum number of such codes.
    /// * error a zx.status indicating the cause of failure.
    ListOptions() -> (vector<Option>:256 options) error zx.status;

    /// Lists all DHCP server parameters. ListParameters provides administrators
    /// a means to print a server's configuration as opposed to querying the
    /// value of a single Parameter.
    ///
    /// - response `parameter` a vector containing the values of all of the
    /// Server's parameters. Bounded to 256 to provide a generous upper limit
    /// on the number of server parameters while being of the same size as
    /// ListOptions.
    /// * error a zx.status indicating the cause of failure.
    ListParameters() -> (vector<Parameter>:256 parameters) error zx.status;

    /// Resets all DHCP options to have no value. On success, ResetOptions will
    /// take effect immediately.
    ///
    /// * error a zx.status indicating the cause of failure.
    ResetOptions() -> () error zx.status;

    /// Resets all DHCP server parameters to their default value. On success,
    /// the reset parameter values can be queried immediately with GetParameter
    /// or ListParameters. However, the server must be restarted before all new
    /// parameter values take effect. To ensure expected operation,
    /// administrators should restart the server after mutating its parameters
    /// with SetParameter or ResetParameters.
    ///
    /// * error a zx.status indicating the cause of failure.
    ResetParameters() -> () error zx.status;

    /// Clears all leases maintained by the Server. On success, ClearLeases will
    /// take effect immediately. Server administrators should take care when
    /// calling this method as the DHCP protocol does not provide a mechanism by
    /// which a Server can notify a client that its lease has been cleared.
    ///
    /// * error a zx.status indicating the cause of failure.
    ClearLeases() -> () error zx.status;
};
