blob: 001ac7298ec82eecdf2cec50b4b47297603f60ea [file] [log] [blame]
// Copyright 2021 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.interfaces.admin;
using fuchsia.net;
using fuchsia.hardware.network;
using fuchsia.net.interfaces;
using zx;
/// NudConfiguration for an interface.
///
/// This is scoped to IPv4 or IPv6 configuration by the [`Configuration`] type.
type NudConfiguration = table {
/// The number of multicast solicitations before considering a neighbor
/// unreachable.
///
/// Must be nonzero. `ILLEGAL_ZERO_VALUE` is returned on
/// [`Control.SetConfiguration`] otherwise.
1: max_multicast_solicitations uint16;
/// The number of unicast solicitations before considering a neighbor
/// unreachable.
///
/// Must be nonzero.
2: max_unicast_solicitations uint16;
/// A base duration for computing the random reachable time.
///
/// Reachable time is the duration for which a neighbor is considered
/// reachable after a positive reachability confirmation is received.
/// After this time, an entry will transition from REACHABLE to STALE state.
///
/// Referred to as "BaseReachableTime" by RFC 4861.
///
/// Must be greater than 0.
3: base_reachable_time zx.Duration;
};
/// DAD (Duplicate Address Detection) configuration for an interface.
type DadConfiguration = table {
/// Number of transmissions before an address is considered available for
/// use.
///
/// A value of zero effectively disables DAD for the interface.
1: transmits uint16;
};
/// The configuration for an interface.
type Configuration = table {
/// The IPv4 configuration for an interface.
1: ipv4 @generated_name("Ipv4Configuration") table {
/// Controls whether or not IPv4 unicast packets may be forwarded if not
/// destined to the host.
/// TODO(https://fxbug.dev/42052564): Rename this field to
/// unicast_forwarding.
1: forwarding bool;
/// Controls whether or not IPv4 multicast packets may be forwarded.
2: multicast_forwarding bool;
/// Controls IGMP configuration.
3: igmp @generated_name("IgmpConfiguration") table {
/// Indicates the version of IGMP to be performed.
///
/// Note that the stack may perform lower versioned IGMP as required
/// for backwards compatibility with other nodes on the network per
/// IGMP requirements.
1: version @generated_name("IgmpVersion") flexible enum : uint8 {
/// IGMPv1.
V1 = 1;
/// IGMPv2.
V2 = 2;
/// IGMPv3.
V3 = 3;
};
};
/// Controls ARP configuration.
4: arp @generated_name("ArpConfiguration") table {
/// Neighbor Unreachabilty Detection over ARP configuration.
1: nud NudConfiguration;
// TODO(https://fxbug.dev/42077260): Add DAD configuration when DAD
// over IPv4 is supported.
};
};
/// The IPv6 configuration for an interface.
2: ipv6 @generated_name("Ipv6Configuration") table {
/// Controls whether or not IPv6 unicast packets may be forwarded if not
/// destined to the host.
/// TODO(https://fxbug.dev/42052564): Rename this field to
/// unicast_forwarding.
1: forwarding bool;
/// Controls whether or not IPv6 multicast packets may be forwarded.
2: multicast_forwarding bool;
/// Controls MLD configuration.
3: mld @generated_name("MldConfiguration") table {
/// Indicates the version of MLD to be performed.
///
/// Note that the stack may perform lower versioned MLD as required
/// for backwards compatibility with other nodes on the network per
/// MLD requirements.
1: version @generated_name("MldVersion") flexible enum : uint8 {
/// MLDv1.
V1 = 1;
/// MLDv2.
V2 = 2;
};
};
/// Controls NDP configuration.
4: ndp @generated_name("NdpConfiguration") table {
/// Neighbor Unreachabilty Detection over NDP configuration.
1: nud NudConfiguration;
/// Duplicate Address Detection over NDP configuration.
2: dad DadConfiguration;
};
};
};
/// A credential passed into the `fuchsia.net.*` family of APIs to authenticate
/// access to a particular interface. The Netstack only needs the ability to
/// inspect the token's basic info when proving that the client is authorized
/// to access a resource.
type ProofOfInterfaceAuthorization = resource struct {
/// The ID of the interface this credential is authenticating.
interface_id fuchsia.net.InterfaceId;
/// The EVENT providing authentication over this interface. The token
/// only requires the `TRANSFER` right so that it can be sent to the
/// Netstack.
token zx.Handle:<EVENT, zx.Rights.TRANSFER>;
};
/// Provides control over an interface.
///
/// This protocol encodes the underlying interface's lifetime in both
/// directions; the interface exists iff both ends of the protocol are open.
/// That is:
///
/// - Closing the client end causes the interface to be removed.
/// - Observing a closure of the server end indicates the interface no longer
/// exists.
closed protocol Control {
// TODO(https://fxbug.dev/42160986): Currently Netstack2's implementation
// does not support any values being present in `parameters`, and will
// cause an event containing `AddressRemovalReason.INVALID` to be sent
// and the server end of the protocol to be closed.
// TODO(https://fxbug.dev/42051260): Clarify address semantics in regards to
// adding and removing same address on different subnets and/or interfaces.
/// Assigns an address to the interface.
///
/// Errors are communicated via
/// [`fuchsia.net.interfaces.admin/AddressStateProvider.OnAddressRemoved`].
///
/// + request `address` the address to assign to the interface.
/// + request `parameters` additional address-specific options.
/// + request `address_state_provider` provides address assignment state
/// and enables updating address properties.
strict AddAddress(resource struct {
address fuchsia.net.Subnet;
parameters AddressParameters;
address_state_provider server_end:AddressStateProvider;
});
/// Removes an address from the interface.
///
/// + request `address` the address to remove.
/// - response `did_remove` `true` iff `address` was removed from the
/// interface as a consequence of this call.
strict RemoveAddress(struct {
address fuchsia.net.Subnet;
}) -> (struct {
did_remove bool;
}) error flexible enum {};
/// Gets the interface identifier.
///
/// - response `id` the interface identifier.
strict GetId() -> (struct {
id fuchsia.net.InterfaceId;
});
/// Sets the configuration for the interface.
///
/// Only set fields that are supported in the provided [`Configuration`]
/// will be set; unset fields will be left unmodified. The server will
/// return a [`Configuration`] which holds the previous configuration for
/// fields that the interface supports and set, even if the call did not
/// update the configuration's value.
///
/// + request `config` the configuration fields to update on the interface.
/// - response `previous_config` a snapshot of the interface's previous
/// configuration. Only supported fields present in `config` will be set.
strict SetConfiguration(struct {
config Configuration;
}) -> (struct {
previous_config Configuration;
}) error flexible enum {
/// Indicates that the provided value for `config.ipv4.forwarding` is
/// unsupported.
IPV4_FORWARDING_UNSUPPORTED = 1;
/// Indicates that the provided value for `config.ipv4.multicast_forwarding`
/// is unsupported.
IPV4_MULTICAST_FORWARDING_UNSUPPORTED = 2;
/// Indicates that the provided value for `config.ipv4.igmp.version` is
/// unsupported.
IPV4_IGMP_VERSION_UNSUPPORTED = 3;
/// Indicates that the provided value for `config.ipv6.forwarding` is
/// unsupported.
IPV6_FORWARDING_UNSUPPORTED = 4;
/// Indicates that the provided value for `config.ipv6.multicast_forwarding`
/// is unsupported.
IPV6_MULTICAST_FORWARDING_UNSUPPORTED = 5;
/// Indicates that the provided value for `config.ipv6.mld.version` is
/// unsupported.
IPV6_MLD_VERSION_UNSUPPORTED = 6;
/// Indicates that a zero value was provided for a field that must be
/// nonzero.
ILLEGAL_ZERO_VALUE = 7;
/// Indicates that ARP configurations are not supported for this device.
///
/// Devices without a link (notably loopback) do not support ARP.
ARP_NOT_SUPPORTED = 8;
/// Indicates that NDP configurations are not supported for this device.
///
/// Devices without a link (notably loopback) do not support NDP.
NDP_NOT_SUPPORTED = 9;
/// Indicates that a negative value was provided for a field that must be
/// non-negative.
ILLEGAL_NEGATIVE_VALUE = 10;
};
/// Gets a snapshot of the interface's configuration.
///
/// The server will populate the returned [`Configuration`] with the
/// configuration for features/protocols that the interface supports. That
/// is, fields for unsupported configurations will be unset in the returned
/// [`Configuration`].
///
/// - response `config` a snapshot of the interface's configuration.
strict GetConfiguration() -> (struct {
config Configuration;
}) error flexible enum {};
/// Enables the interface.
///
/// - response `did_enable` `true` iff the interface moved from disabled to
/// enabled as a consequence of this call.
strict Enable() -> (struct {
did_enable bool;
}) error flexible enum {};
/// Disables the interface.
///
/// - response `did_disable` `true` iff the interface moved from enabled to
/// disabled as a consequence of this call.
strict Disable() -> (struct {
did_disable bool;
}) error flexible enum {};
/// Detaches the client end from the interface's lifetime.
///
/// After calling `Detach`, closing this client end no longer causes the
/// interface to be removed.
strict Detach();
/// Get an authentication credential for this interface.
///
/// The credential contains a [`zx::handle::EVENT`], whose entangled
/// partner is held by the server. This credential can be converted into a
/// [`ProofOfInterfaceAuthorization`] and then passed into `fuchsia.net.*`
/// API calls to prove ownership of this interface. The `EVENT` is
/// stable throughout the lifetime of the interface. Clients may duplicate
/// this `EVENT` to make multiple API calls, or transfer the `EVENT`
/// to other clients.
///
/// - response `credential` the authorization credential for this interface.
strict GetAuthorizationForInterface() -> (resource struct {
credential @generated_name("GrantForInterfaceAuthorization") resource struct {
/// The ID of the interface this credential is authenticating.
interface_id fuchsia.net.InterfaceId;
/// The EVENT providing authentication over this interface.
token zx.Handle:<EVENT, zx.Rights.TRANSFER | zx.Rights.DUPLICATE>;
};
});
/// Initiates interface removal.
///
/// This method returns success once interface removal has started. When the
/// interface is removed, a `USER` removed reason is issued in
/// [`OnInterfaceRemoved`] and the server end is closed.
strict Remove() -> () error flexible enum {
/// This interface can't be removed.
NOT_ALLOWED = 1;
};
/// Terminal event. Immediately precedes the closure of the server end of
/// the protocol.
///
/// - response `reason` the removal reason.
strict -> OnInterfaceRemoved(struct {
reason @generated_name("InterfaceRemovedReason") flexible enum {
/// Interface failed to be instantiated because the requested name
/// is in use.
DUPLICATE_NAME = 1;
/// The requested port is already bound to an interface.
PORT_ALREADY_BOUND = 2;
/// The provided device port can't be made into an interface because
/// of incompatible configuration.
BAD_PORT = 3;
/// The device port backing this interface has been closed.
PORT_CLOSED = 4;
/// Administrative user action removed the interface.
USER = 5;
};
});
};
/// Installs devices on the network stack.
@discoverable
closed protocol Installer {
/// Installs a device on the network stack.
///
/// + request `device` the device to install on the network stack.
/// + request `device_control` grants access to the installed device.
strict InstallDevice(resource struct {
device client_end:fuchsia.hardware.network.Device;
device_control server_end:DeviceControl;
});
};
/// Administrative control over an installed device on the network stack.
///
/// An instance of `DeviceControl` maps to an instance of
/// [`fuchsia.hardware.network/Session`]. All interfaces generated from a single
/// `DeviceControl` instance share the same `Session` and set of device buffers;
/// and are therefore subject to backpressure over the same pool of resources.
///
/// By the same measure, creating multiple `DeviceControl` instances attached to
/// the same underlying device causes data copies, because each `DeviceControl`
/// starts a new `Session`. For that reason, users should avoid creating
/// multiple `DeviceControl` instances for the same device and prefer
/// instantiating ports into interfaces from a single `DeviceControl` instance
/// per device.
///
/// This protocol encodes the underlying device's lifetime in both
/// directions; the device exists iff both ends of the protocol are open.
/// That is:
///
/// - Closing the client end causes the device to be removed, including all
/// interfaces created from it.
/// - Observing a closure of the server end indicates the device (and all
/// interfaces created from it) no longer exists.
closed protocol DeviceControl {
/// Creates an interface on the network stack.
///
/// + request `port` the device's port to instantiate as an interface.
/// + request `control` grants access to the created interface.
strict CreateInterface(resource struct {
port fuchsia.hardware.network.PortId;
control server_end:Control;
options table {
/// New interface name.
///
/// If not set, an implementation-defined name will be selected.
1: name fuchsia.net.interfaces.Name;
/// The default metric value used for routes through this interface.
///
/// If not set, the server will use a sensible default.
2: metric fuchsia.net.RouteMetric;
};
});
/// Detaches the client end from the device's lifetime.
///
/// After calling `Detach`, closing this client end no longer causes the
/// device or any of the interfaces created from it to be removed. Note that
/// the lifetime of any created interface will continue to be coupled with
/// the associated [`Control`] client end.
strict Detach();
};