blob: 4c29a3a258aa54426f8f43a31180329cf9f18594 [file] [log] [blame]
// 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.stack;
using fuchsia.hardware.ethernet;
using fuchsia.hardware.network;
using fuchsia.net;
using fuchsia.net.name;
using fuchsia.posix.socket;
/// A path to a device node.
alias device_path = string:255;
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
enum PhysicalStatus {
/// The link is not attached to the medium.
DOWN = 1;
/// The link is attached to the medium.
UP = 2;
};
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
enum AdministrativeStatus {
/// The interface is administratively disabled.
DISABLED = 1;
/// The interface is administratively enabled.
ENABLED = 2;
};
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
struct InterfaceInfo {
/// An opaque identifier for the interface, assigned by the stack.
/// This identifier will never be 0, and will not be reused even if the device is removed and
/// subsequently re-added. It is not stable across netstack instances.
fuchsia.net.interface_id id;
/// All info of an interface except the interface name.
InterfaceProperties properties;
};
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
struct InterfaceProperties {
/// Human-readable name of the interface. eg. eth001, wlanx35.
fuchsia.posix.socket.interface_name name;
/// The topological path to the device, representing a stable identifier for the interface
/// hardware.
device_path topopath;
/// An unstable file path corresponding to the interface. Used in watching the creation
/// and destruction of the interface, or in accessing the interface using netdump.
device_path filepath;
/// The MAC address of the interface, if available.
fuchsia.hardware.ethernet.MacAddress? mac;
/// The maximum transmission unit for the interface in bytes.
uint32 mtu;
/// The features present on the interface.
fuchsia.hardware.ethernet.Features features;
/// The administrative status of the interface.
AdministrativeStatus administrative_status;
/// The physical link status of the interface.
PhysicalStatus physical_status;
/// The list of addresses currently assigned to the interface.
vector<fuchsia.net.Subnet>:MAX addresses;
};
/// A ForwardingDestination represents either the device that should transmit a packet or the address
/// of the next hop in the route.
union ForwardingDestination {
/// The opaque identifier of the device to which packets should be forwarded.
1: fuchsia.net.interface_id device_id;
/// The IP address of the next hop, used to look up the next forwarding entry.
2: fuchsia.net.IpAddress next_hop;
};
/// An entry in the forwarding table for the network stack.
struct ForwardingEntry {
/// The subnet is the key for the entry in the table.
fuchsia.net.Subnet subnet;
/// The destination that will receive the forwarded packet.
ForwardingDestination destination;
};
enum Error {
INTERNAL = 1;
NOT_SUPPORTED = 2;
INVALID_ARGS = 3;
BAD_STATE = 4;
TIME_OUT = 5;
NOT_FOUND = 6;
ALREADY_EXISTS = 7;
IO = 8;
};
/// An Ethernet device.
/// The provided `network_device` is expected to support `Ethernet` frames.
/// Its MAC address and MAC filtering is controlled by the provided `mac` channel.
resource struct EthernetDeviceDefinition {
/// The connection to the device's data plane.
fuchsia.hardware.network.Device network_device;
/// The connection to the device's addressing control plane.
fuchsia.hardware.network.MacAddressing mac;
};
/// Devices that can be used to back a `Stack` interface.
resource union DeviceDefinition {
/// A `fuchsia.hardware.network.Device` that exchanges only IP frames. It either doesn't have a
/// layer 2 or its layer 2 is irrelevant to the `Stack`.
1: fuchsia.hardware.network.Device ip;
/// An Ethernet device.
2: EthernetDeviceDefinition ethernet;
};
/// Base configuration for `Stack` interfaces.
table InterfaceConfig {
/// Human-readable name of the interface. eg. eth001, wlanx35.
/// Will be set to a default generic name if not provided.
1: fuchsia.posix.socket.interface_name name;
/// The topological path to the device, representing a stable identifier for the interface
/// hardware.
2: device_path topopath;
/// The default metric value used for routes to this interface.
3: uint32 metric;
};
[Discoverable]
protocol Stack {
/// Add an Ethernet interface to the network stack. On success, returns the identifier assigned
/// by the stack for use in subsequent calls.
AddEthernetInterface(device_path topological_path, fuchsia.hardware.ethernet.Device device) -> (fuchsia.net.interface_id id) error Error;
/// Add a new interface to the network stack backed by the provided `DeviceDefinition`. On
/// success, returns the identifier assigned by the stack for use in subsequent calls.
AddInterface(InterfaceConfig config, DeviceDefinition device) -> (fuchsia.net.interface_id id) error Error;
/// Remove an Ethernet interface from the network stack.
DelEthernetInterface(fuchsia.net.interface_id id) -> () error Error;
/// List all the interfaces available in the network stack.
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
ListInterfaces() -> (vector<InterfaceInfo>:255 ifs);
/// Retrieve info about a specific interface.
// TODO(https://fxbug.dev/75554): Migrate callers and remove this.
[Deprecated = "Use fuchsia.net.interfaces/Watcher"]
GetInterfaceInfo(fuchsia.net.interface_id id) -> (InterfaceInfo info) error Error;
/// Enable the interface. Packets may be processed by the stack after this call is processed.
EnableInterface(fuchsia.net.interface_id id) -> () error Error;
/// Disable the interface. The stack will no longer process packets after this call.
DisableInterface(fuchsia.net.interface_id id) -> () error Error;
/// Add an address to the interface. If the interface already has an address of a given type that
/// does not allow duplicates, this method will return an error.
AddInterfaceAddress(fuchsia.net.interface_id id, fuchsia.net.Subnet addr) -> () error Error;
/// Remove the address from the interface. If the address is not assigned to the interface, an
/// error is returned.
DelInterfaceAddress(fuchsia.net.interface_id id, fuchsia.net.Subnet addr) -> () error Error;
/// List all the entries in the forwarding table for the network stack.
// TODO(fxbug.dev/38528): This is unbounded for now, until we change the API to allow for
// pagination.
GetForwardingTable() -> (vector<ForwardingEntry>:MAX table);
/// Add a new entry to the forwarding table.
///
/// If the table already contains an entry with the same subnet and destination, an already
/// exists error is returned.
AddForwardingEntry(ForwardingEntry entry) -> () error Error;
/// Removes the forwarding entry with the given subnet. This will not affect any overlapping
/// subnets (superset or subset) so the subnet must exactly match an entry in the forwarding
/// table. If no entry for the subnet exists, an error is returned.
DelForwardingEntry(fuchsia.net.Subnet subnet) -> () error Error;
/// Enable the packet filter on a specific interface.
EnablePacketFilter(fuchsia.net.interface_id id) -> () error Error;
/// Disable the packet filter on a specific interface.
DisablePacketFilter(fuchsia.net.interface_id id) -> () error Error;
/// Enable IP Forwarding for all interfaces and IP versions.
EnableIpForwarding() -> ();
/// Disable IP Forwarding for all interfaces and IP versions.
DisableIpForwarding() -> ();
/// Returns the IP forwarding state for an interface.
GetInterfaceIpForwarding(fuchsia.net.interface_id id, fuchsia.net.IpVersion ip_version) -> (bool enabled) error Error;
/// Sets the IP forwarding state for an interface.
SetInterfaceIpForwarding(fuchsia.net.interface_id id, fuchsia.net.IpVersion ip_version, bool enabled) -> () error Error;
/// Get a [`fuchsia.net.name/DnsServerWatcher`].
GetDnsServerWatcher(request<fuchsia.net.name.DnsServerWatcher> watcher);
};
[Discoverable]
protocol Log {
/// Dynamically set packet logging.
// TODO(fxbug.dev/42432): replace with optional packet captures in Inspect
// output.
SetLogPackets(bool enabled) -> ();
};