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

using fuchsia.net;
using zx;

/// The configurable server parameters.
type Parameter = flexible union {
    /// The IP addresses to which the server is bound. The vector bound has been
    /// arbitrarily selected as a generous upper limit.
    1: ip_addrs vector<fuchsia.net.Ipv4Address>:256;
    /// The pool of addresses managed by a DHCP server and from which leases are
    /// supplied.
    ///
    /// The pool is valid iff all of the following are true:
    ///   1) All fields are present.
    ///   2) The stop address is larger than the start address.
    ///   3) The prefix length is large enough to fit the full range of
    ///      addresses.
    ///
    /// For example, a pool of 4 addresses with a 24 bit subnet mask could be
    /// specified as:
    ///   {
    ///     prefix_length: 24,
    ///     range_start: 192.168.1.2,
    ///     range_stop: 192.168.1.5,
    ///   }
    ///
    /// 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: address_pool table {
        /// The prefix length (in bits) of the address pool's subnet mask.
        1: prefix_length uint8;
        /// The starting address, inclusive, of the range of addresses which the
        /// DHCP server will lease to clients.
        2: range_start fuchsia.net.Ipv4Address;
        /// The ending address, inclusive, of the range of addresses which the
        /// server will lease to clients.
        3: range_stop fuchsia.net.Ipv4Address;
    };
    /// The duration of leases offered by the server.
    3: lease @generated_name("LeaseLength") table {
        /// The default lease length to be issued to clients. This field must
        /// have a value.
        1: default Duration;
        /// 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: max Duration;
    };
    /// 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  MAC in the list. The vector bound
    /// has been arbitrarily selected as a generous upper limit.
    4: permitted_macs vector<fuchsia.net.MacAddress>:256;
    /// 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: statically_assigned_addrs vector<@generated_name("StaticAssignment") table {
        /// The MAC address of the host or device which will have the static IP
        /// address assignment.
        1: host fuchsia.net.MacAddress;
        /// The IP address which the host or device will always be assigned the
        /// server.
        2: assigned_addr fuchsia.net.Ipv4Address;
    }>:256;
    /// 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: arp_probe bool;
    /// 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: bound_device_names vector<string:256>:256;
};

/// The name of the Parameter to be retrieved by Server.GetParameter().
type ParameterName = strict enum {
    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 {
    /// Starts serving DHCP leases.
    ///
    /// Starts the DHCP server with the current set of parameters.
    ///
    /// On error the server remains in the stopped state. If the server is
    /// already serving, `StartServing` is a no-op.
    ///
    /// *error a zx.status indicating why the server could not be started.
    StartServing() -> (struct {}) error zx.status;

    /// Stops serving DHCP leases.
    ///
    /// Stopping causes all the listening ports to be closed.
    ///
    /// Configuring parameters on the DHCP server is only allowed when the
    /// server is stopped.
    ///
    /// If the server is not currently serving, `StopServing` is a no-op.
    StopServing() -> ();

    /// Returns whether or not the server is serving DHCP leases.
    IsServing() -> (struct {
        enabled bool;
    });

    /// 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(struct {
        code OptionCode;
    }) -> (struct {
        value Option;
    }) 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(struct {
        name ParameterName;
    }) -> (struct {
        value Parameter;
    }) 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(struct {
        value Option;
    }) -> (struct {}) 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.
    ///
    /// Setting parameters is only allowed if the server is stopped.
    /// `ZX_ERR_BAD_STATE` is returned otherwise.
    ///
    /// + 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(struct {
        value Parameter;
    }) -> (struct {}) 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() -> (struct {
        options vector<Option>:256;
    }) 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() -> (struct {
        parameters vector<Parameter>:256;
    }) 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() -> (struct {}) 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.
    ///
    /// Setting parameters is only allowed if the server is stopped.
    /// `ZX_ERR_BAD_STATE` is returned otherwise.
    ///
    /// * error a zx.status indicating the cause of failure.
    ResetParameters() -> (struct {}) 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() -> (struct {}) error zx.status;
};
