blob: 247d2d47162eaad84a1488b590f6345fcaaf3736 [file] [log] [blame]
// Copyright 2023 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 fuchsia.net.interfaces.admin;
/// The maximum possible number of DNS servers that can be included in an
/// acquired DHCP configuration.
///
/// According to [RFC 2132 section
/// 3.8](https://www.rfc-editor.org/rfc/rfc2132#section-3.8), the length of the
/// DNS server list in bytes is represented in the protocol by an 8-bit unsigned
/// integer:
/// "[variable-length options have] a length octet following the tag octet. The
/// value of the length octet does not include the two octets specifying the tag
/// and length."
/// 2^8 = 256, which divided by 4 bytes gives us 64 as an upper bound on the
/// maximum possible number of DNS servers that can be included in an acquired
/// DHCP configuration.
const MAX_DNS_SERVERS uint8 = 64;
/// The maximum possible number of routers that can be included in an acquired
/// DHCP configuration.
///
/// According to [RFC 2132 section
/// 3.5](https://www.rfc-editor.org/rfc/rfc2132#section-3.5), the length of the
/// routers list in bytes is represented in the protocol by an 8-bit unsigned
/// integer:
/// "[variable-length options have] a length octet following the tag octet. The
/// value of the length octet does not include the two octets specifying the
/// tag and length."
/// 2^8 = 256, which divided by 4 bytes gives us 64 as an upper bound on the
/// maximum possible number of routers that can be included in an acquired
/// DHCP configuration.
const MAX_ROUTERS uint8 = 64;
/// Describes the configuration information the DHCP client requests from DHCP
/// servers.
type ConfigurationToRequest = table {
/// Request a list of IP addresses for routers on the client's subnet,
/// in order of preference.
/// See [RFC 2132 section 3.5](https://www.rfc-editor.org/rfc/rfc2132#section-3.5).
///
/// If not set, interpreted as false.
1: routers bool;
/// Request a list of available DNS servers.
/// See [RFC 2132 section 3.8](https://www.rfc-editor.org/rfc/rfc2132#section-3.8).
///
/// If not set, interpreted as false.
2: dns_servers bool;
};
/// Provides a method to create new DHCP clients.
@discoverable
closed protocol ClientProvider {
/// Provides a DHCPv4 client.
///
/// + request `params` the parameters to create the client with.
/// + request `request` grants control over the client.
strict NewClient(resource struct {
/// The ID of the interface the client runs on.
interface_id fuchsia.net.InterfaceId;
/// The parameters with which to create the DHCP client.
/// If `configuration_to_request` is unset and `request_ip_address` is
/// false, `request` is closed with terminal event `INVALID_PARAMS`.
params @generated_name("NewClientParams") table {
/// Parameters for describing the configuration information the DHCP
/// client requests from DHCP servers.
///
/// If not set, interpreted as empty (no configuration information
/// is requested).
1: configuration_to_request ConfigurationToRequest;
/// Whether the client negotiates an IP address.
///
/// If false or not set, the client asks only for local
/// configuration parameters.
/// See [RFC 2131 section 3.4](https://www.rfc-editor.org/rfc/rfc2131#section-3.4).
2: request_ip_address bool;
};
request server_end:Client;
});
/// No-op method that allows checking for presence.
///
/// It's not currently possible for a client with an optionally-provided
/// protocol to check whether there's someone on the other end without
/// making a FIDL call (https://fxbug.dev/42177573). This method provides a
/// workaround by giving a client a method that it can call to check for
/// liveness.
///
/// TODO(https://fxbug.dev/42076541): Remove this once the DHCP out-of-stack
/// client is always being used.
@deprecated("For DHCP client migration only, see https://fxbug.dev/42076541 for details")
strict CheckPresence() -> ();
};
/// Provides methods to watch for discovered network configurations and control
/// the DHCP client discovering them.
///
/// This protocol encodes the DHCP client's lifetime in both directions;
/// the DHCP client remains alive iff both ends of the protocol are open. That
/// is:
///
/// - Closing the client end causes the DHCP client to be destroyed.
/// - Observing a closure of the server end indicates the DHCP client no longer
/// exists.
closed protocol Client {
/// Returns acquired DHCP configuration.
///
/// Yields a value whenever the client acquires new configuration. Notably,
/// does not yield a value upon DHCP lease expiry; instead, expiry of the IP
/// address is communicated via the `AddressStateProvider` (refer to
/// documentation of `fuchsia.net.interfaces.admin/AddressStateProvider` for
/// details). Non-address configuration does not expire, but is replaced by
/// new configuration once a new DHCP lease is obtained.
///
/// It is invalid to call this method while a previous call is pending.
/// Doing so causes the server end of the protocol to be closed.
///
/// - response `address` the assigned address. If set, the client has
/// acquired a new lease on an IP address. If not set, then either the
/// client has not requested an IP address (in which case this `Client`
/// instance has never yielded an address), or the client continues to
/// hold a lease on a previously-acquired IP address (whose lifetime is
/// updated via `AddressStateProvider`).
/// - response `dns_servers` addresses of discovered DNS servers. If absent,
/// must be interpreted as empty (the client's configuration indicates
/// no DNS servers, even if previously-yielded configuration included
/// DNS servers).
/// - response `routers` addresses of discovered routers on the client's
/// subnet, in descending order of preference according to the DHCP
/// server. If absent, must be interpreted as empty (the client's
/// configuration indicates no routers, even if previously-yielded
/// configuration included routers).
strict WatchConfiguration() -> (resource table {
1: address resource table {
/// The assigned address and prefix length.
1: address fuchsia.net.Ipv4AddressWithPrefix;
/// The parameters of the address.
2: address_parameters fuchsia.net.interfaces.admin.AddressParameters;
/// Provides address assignment state and enables updating address
/// properties; the DHCP client closes the client end if the address
/// becomes invalid (its valid lifetime expires and Renew and Rebind
/// have not succeeded).
/// The server end can be closed with a terminal OnAddressRemoved
/// value in order to signal to the DHCP client that an address is
/// rejected (e.g. due to failing duplicate address detection).
3: address_state_provider server_end:fuchsia.net.interfaces.admin.AddressStateProvider;
};
2: dns_servers vector<fuchsia.net.Ipv4Address>:MAX_DNS_SERVERS;
3: routers vector<fuchsia.net.Ipv4Address>:MAX_ROUTERS;
});
/// Instructs the client to shut down gracefully (releasing any DHCP lease
/// currently held). When the client is finished shutting down, it yields
/// the `ClientExitReason::GRACEFUL_SHUTDOWN` `OnExit` event.
strict Shutdown();
/// Terminal event yielded by the server before the server end is closed.
///
/// - response `reason` the reason the DHCP client was closed.
strict -> OnExit(struct {
reason @generated_name("ClientExitReason") strict enum {
/// A client already exists on the interface.
CLIENT_ALREADY_EXISTS_ON_INTERFACE = 1;
/// More than one concurrent call to `WatchConfiguration` was made.
WATCH_CONFIGURATION_ALREADY_PENDING = 2;
/// The interface identified is invalid for acquiring configuration.
INVALID_INTERFACE = 3;
/// Invalid `NewClientParams` were provided.
INVALID_PARAMS = 4;
/// The network was, or became, unreachable over the interface
/// provided to the DHCP client.
NETWORK_UNREACHABLE = 5;
/// The client was unable to open a socket.
UNABLE_TO_OPEN_SOCKET = 6;
/// Graceful shutdown was performed.
GRACEFUL_SHUTDOWN = 7;
/// An address acquired by this client was removed by a user.
ADDRESS_REMOVED_BY_USER = 8;
/// The `AddressStateProvider` for an address acquired by this
/// client exited with an error (or without providing a reason for
/// the address removal).
ADDRESS_STATE_PROVIDER_ERROR = 9;
};
});
};