// Copyright 2020 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.dhcpv6;

using fuchsia.net.name;
using fuchsia.net;

/// Default port a DHCPv6 client should listen to according to [RFC 8415,
/// Section 7.2](https://tools.ietf.org/html/rfc8415#section-7.2).
const uint16 DEFAULT_CLIENT_PORT = 546;

/// Supported DHCPv6 option codes that can be included in the client's
/// [Option Request Option](https://tools.ietf.org/html/rfc8415#section-21.7).
///
/// See the full list of option codes
/// [here](https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml#dhcpv6-parameters-2).
enum RequestableOptionCode {
    DNS_SERVERS = 23;
};

/// A DHCPv6 operational model where the client only sends information
/// requests and handles corresponding replies, as defined in
/// [RFC 8415, Section 6.1](https://tools.ietf.org/html/rfc8415#section-6.1).
table Stateless {
    /// A list of option codes to include in
    /// [Option Request Option](https://tools.ietf.org/html/rfc8415#section-21.7).
    1: vector<RequestableOptionCode>:1 options_to_request;
};

/// Operational models for a client.
///
/// The client will run all the provided models in parallel.
///
/// See the full list of operational models in
/// [RFC 8415, Section 6](https://tools.ietf.org/html/rfc8415#section-6).
table OperationalModels {
    1: Stateless stateless;
};

/// Parameters for calling [`fuchsia.net.dhcpv6/ClientProvider.NewClient`].
table NewClientParams {
    /// The ID of the interface the client will run on.
    ///
    /// Required.
    1: uint64 interface_id;

    /// The socket address to use when communicating with servers.
    ///
    /// DHCPv6 servers listen for link-local multicasts, so not using a
    /// link-local address here may cause interoperability issues.
    ///
    /// Client creation will fail with `INVALID_ARGS` if:
    ///
    /// * a multicast address is provided;
    /// * or a link-local address is provided, and its zone index doesn't match
    ///   `interface_id` (Fuchsia has a 1:1 mapping from zone index to interface
    ///   ID).
    ///
    /// Client creation will fail if it fails to bind a socket to this address.
    ///
    /// Required.
    2: fuchsia.net.Ipv6SocketAddress address;

    /// The [`fuchsia.net.dhcpv6/OperationalModels`] the client will start in.
    ///
    /// Client creation will fail if `models` is empty or unsupported.
    ///
    /// Required.
    3: OperationalModels models;
};

/// Provides a method to create new clients.
[Discoverable]
protocol ClientProvider {
    /// Provides a DHCPv6 client.
    ///
    /// + request `params` the parameters to create the client with.
    /// + request `request` the channel handle that can be used to control the
    ///     newly created client. Will be closed if a client cannot be created,
    ///     with an epitaph explaining the reason.
    NewClient(NewClientParams params, request<Client> request);
};

/// Provides methods to watch for discovered network configurations.
protocol Client {
    compose fuchsia.net.name.DnsServerWatcher;
};
