| // 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.hardware.network; |
| |
| using zx; |
| |
| /// Network device class. |
| /// The network device's class is part of its [`fuchsia.hardware.network/Info`] reporting and can be |
| /// used by tools that enumerate network devices to present human-readable types, so it is easier |
| /// for a user to identify the listed devices. The [`fuchsia.hardware.network/Info.class`] value |
| /// does not imply any kind of capabilities or behavior. |
| enum DeviceClass : uint16 { |
| UNKNOWN = 0x00; |
| ETHERNET = 0x01; |
| WLAN = 0x02; |
| PPP = 0x03; |
| BRIDGE = 0x04; |
| }; |
| |
| /// Device status bits, reported in [`fuchsia.hardware.network/Info`]. |
| bits StatusFlags : uint32 { |
| /// Device is online, i.e., data path is open and any ongoing sessions may send |
| /// and receive frames. |
| ONLINE = 0x01; |
| }; |
| |
| /// Dynamic device information. |
| table Status { |
| /// Device status flags. |
| 1: StatusFlags flags; |
| /// Maximum transmit unit for this device, in bytes. The reported `MTU` is the size of an ENTIRE |
| /// frame, including any header and trailer bytes for whatever protocol the |
| /// [`fuchsia.hardware.network/FrameType`]s of this device support. |
| 2: uint32 mtu; |
| }; |
| |
| /// Maximum numbers of supported frame types for rx or tx. |
| // NOTE(brunodalbo) 4 seems a sensible number for maximum number of frame types supported by a |
| // single device. Most common use cases are going to use 1 or 2 types (1 if device operates at L2, 2 |
| // if at L3). |
| const uint32 MAX_FRAME_TYPES = 4; |
| |
| /// Maximum length of session label. |
| const uint32 MAX_SESSION_NAME = 64; |
| |
| /// Maximum number of acceleration flags. |
| /// Each descriptor has 16 bits of space for acceleration flags |
| /// ([`fuchsia.hardware.network/RxFlags`] and [`fuchsia.hardware.network/TxFlags`]) thus the maximum |
| /// number of reported accelerations is 16. Each descriptor reports which accelerations were applied |
| /// (`RxFlags`) or are requested (`TxFlags`) by mapping indexes in the vector of supported |
| /// accelerations ([`fuchsia.hardware.network/Info.rx_accel`] and |
| /// ([`fuchsia.hardware.network/Info.tx_accel`]) to bits in the respective acceleration flags |
| /// bitfield. |
| const uint32 MAX_ACCEL_FLAGS = 16; |
| |
| /// Network device information. |
| struct Info { |
| /// Device's class, defined in [`fuchsia.hardware.network/DeviceClass`]. |
| DeviceClass class; |
| /// Minimum descriptor length, in 64-bit words. |
| /// Expresses the minimum length that each buffer descriptor must have for correct operation |
| /// with this device. Devices that support extra frame metadata inform larger minimum descriptor |
| /// lengths that reflect the minimum space needed to be able to store frame metadata. |
| uint8 min_descriptor_length; |
| /// Accepted descriptor version. |
| uint8 descriptor_version; |
| /// Maximum number of items in rx FIFO (per session). |
| /// `rx_depth` is calculated based on the size of the actual backing hardware rx queue. |
| uint16 rx_depth; |
| /// Maximum number of items in tx FIFO (per session). |
| /// `tx_depth` is calculated based on the size of the actual backing hardware tx queue. |
| uint16 tx_depth; |
| /// Alignment requirement for buffers in the data VMO. All buffers in the data VMO *must* be |
| /// aligned to `buffer_alignment` relative to the start of the VMO. `buffer_alignment == 0` is |
| /// never reported. |
| uint32 buffer_alignment; |
| /// Maximum supported length of buffers in the data VMO, in bytes. |
| uint32 max_buffer_length; |
| /// The minimum rx buffer length required for device. |
| uint32 min_rx_buffer_length; |
| /// The minimum tx buffer length required for the device. |
| /// |
| /// This value accounts only for tx payload length, `min_tx_buffer_head` and |
| /// `min_tx_buffer_tail` are not part of this value. |
| /// |
| /// Clients must zero pad outgoing frames to meet the required minimum length. |
| uint32 min_tx_buffer_length; |
| /// The number of bytes the device requests be free as `head` space in a tx buffer. |
| uint16 min_tx_buffer_head; |
| /// The amount of bytes the device requests be free as `tail` space in a tx buffer. |
| uint16 min_tx_buffer_tail; |
| /// Supported rx frame types on this device. |
| /// |
| /// Clients may open sessions subscribing to a subset of `rx_types` frame types on this device. |
| /// Clients will only receive the frame types they are subscribed to in this session |
| vector<FrameType>:MAX_FRAME_TYPES rx_types; |
| /// Supported tx frame types on this device. |
| /// |
| /// A client is free to send any frame type on an open session, as long as the frame type is |
| /// part of `tx_types`. Some network devices may need to perform partial frame parsing and |
| /// serialization and, for that reason, `tx_types` is a vector of |
| /// [`fuchsia.hardware.network/FrameTypeSupport`] which includes specific features per frame |
| /// type. |
| /// |
| /// For example, a device that supports Ethernet frames but needs to convert the Ethernet header |
| /// may only support standard EthernetII frames, and not any "raw" Ethernet frame. |
| vector<FrameTypeSupport>:MAX_FRAME_TYPES tx_types; |
| /// Available rx acceleration flags for this device. `rx_accel` maps the `RX_ACCEL_*` flags in |
| /// the frame descriptors with semantic acceleration features described by |
| /// [`fuchsia.hardware.network/RxAcceleration`]. Position `n` of `rx_accel` conveys the meaning |
| /// of the `RX_ACCEL_n` flag. |
| vector<RxAcceleration>:MAX_ACCEL_FLAGS rx_accel; |
| /// Available tx acceleration flags for this device. `tx_accel` maps the `TX_ACCEL_*` flags in |
| /// the frame descriptors with semantic acceleration features described by |
| /// [`fuchsia.hardware.network/TxAcceleration]`. Position `n` of `tx_accel` conveys the meaning |
| /// of the `TX_ACCEL_n` flag. |
| vector<TxAcceleration>:MAX_ACCEL_FLAGS tx_accel; |
| }; |
| |
| /// The maximum number of status samples that can be buffered by a |
| /// [`fuchsia.hardware.network/StatusWatcher`]. |
| const uint32 MAX_STATUS_BUFFER = 50; |
| |
| /// Provides a way to receive updates on device status changes. |
| protocol StatusWatcher { |
| /// `WatchStatus` will block until the device's status has changed. |
| /// The first call to `WatchStatus` will always return immediately with the current device |
| /// status, subsequent calls will only complete when the device status differs from the last one |
| /// that was returned through this `StatusWatcher`. |
| /// If `StatusWatcher` was created with a buffer value larger than 1, `WatchStatus` may return a |
| /// queued status change, depending on how many status changed happened since the last call to |
| /// `WatchStatus`. |
| WatchStatus() -> (Status device_status); |
| }; |
| |
| /// A Network Device. |
| [Discoverable] |
| protocol Device { |
| /// Obtain information about device |
| GetInfo() -> (Info info); |
| /// Obtain the operating device status. |
| GetStatus() -> (Status device_status); |
| /// Connects to a [`fuchsia.hardware.network/StatusWatcher`] to observe device status changes. |
| /// |
| /// `buffer` is the number of status changes that the client requests to be stored by |
| /// `StatusWatcher`, limited to [`fuchsia.hardware.network/MAX_STATUS_BUFFER`]. A value of 0 or |
| /// 1 will cause the `StatusWatcher` to not keep any buffers on status changed. Clients that |
| /// need to observe all changes to status (as opposed to only the current state) are encouraged |
| /// to set a buffer value larger than 1, so that all edges can be observed. If `StatusWatcher`'s |
| /// internal queue is filled and new status changes occur, the oldest samples will be dropped to |
| /// make room for new ones. |
| GetStatusWatcher(request<StatusWatcher> watcher, uint32 buffer); |
| /// Opens a new session with the network device. |
| /// `session_name` is used only as a debug label. |
| /// `session_info` contains the necessary information to setup the session's data exchange. |
| OpenSession(string:MAX_SESSION_NAME session_name, SessionInfo session_info) -> (Session session, Fifos fifos) error zx.status; |
| }; |