| // 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; |
| |
| /// Types of frames. |
| enum FrameType : uint8 { |
| ETHERNET = 0x01; |
| IPV4 = 0x02; |
| IPV6 = 0x03; |
| }; |
| |
| /// Blanket definition for raw frames. Devices that do not perform any sort of parsing of outbound |
| /// traffic should define `FRAME_FEATURES_RAW` in the [`fuchsia.hardware.network/FrameTypeSupport`] |
| /// entry. |
| const uint32 FRAME_FEATURES_RAW = 1; |
| |
| /// Ethernet frame sub-types and features. |
| bits EthernetFeatures : uint32 { |
| /// Device supports any type of ethernet frame. Same as specifying all other flags. Used by |
| /// devices that do not inspect or parse outbound traffic. |
| RAW = 1; |
| /// Device supports EthernetII frames. |
| ETHERNET_II = 2; |
| /// Device supports 802.1q VLAN additions. |
| E_802_1_Q = 4; |
| /// Device supports 802.1 q-in-q Multiple VLAN tagging additions. Only meaningful if `E_802_1_Q` |
| /// is also present. |
| E_802_1_Q_IN_Q = 8; |
| /// Device supports 802.3 LLC + SNAP Ethernet frame format. |
| E_802_3_LLC_SNAP = 16; |
| }; |
| |
| /// Specifies a frame type and features and supported flags associated with that type. |
| /// This is used by clients to read the supported frames on the tx path for a given |
| /// Network Device. |
| /// Some Network Devices may parse outgoing frames to perform frame transformation or specific |
| /// hardware support. Each frame type has an associated |
| /// [`fuchsia.hardware.network/FrameTypeSupport.features`] bits enumeration that lists |
| /// FrameType-specific features that may or may not be supported. Devices that do not perform |
| /// parsing are encouraged to just use the [`fuchsia.hardware.network/FRAME_FEATURES_RAW`] bit in |
| /// `features`, which will inform the client that all frame features are allowed. |
| struct FrameTypeSupport { |
| /// The frame type this support entry refers to. |
| FrameType type; |
| /// The frame type-specific features supported. |
| uint32 features; |
| /// The flags supported for the given frame type. |
| TxFlags supported_flags; |
| }; |
| |
| /// Maximum number of chained descriptors that describe a single frame. |
| const uint8 MAX_DESCRIPTOR_CHAIN = 4; |
| |
| /// The type of metadata information appended to a frame, included in the descriptors VMO. |
| enum InfoType : uint32 { |
| /// No extra information is available. |
| NO_INFO = 0x00; |
| }; |
| |
| /// Available rx acceleration features. Features are mapped to the `RX_ACCEL_*` bits in descriptors |
| /// by the available values reported in [`fuchsia.hardware.network/Info.rx_accel`]. |
| enum RxAcceleration : uint8 { |
| /// Inbound rx frame validated the Ethernet Frame Check Sequence. |
| VALIDATED_ETHERNET_FCS = 0; |
| /// Inbound rx frame validated the IPv4 checksum. |
| VALIDATED_IPV4_CHECKSUM = 1; |
| /// Inbound rx frame validated the TCP checksum. |
| VALIDATED_TCP_CHECKSUM = 2; |
| /// Inbound rx frame validated the UDP checksum. |
| VALIDATED_UDP_CHECKSUM = 3; |
| }; |
| |
| /// Available tx acceleration features. Features are mapped to the `TX_ACCEL_*` bits in descriptors |
| /// by the available values reported in [`fuchsia.hardware.network/Info.tx_accel`]. |
| enum TxAcceleration : uint8 { |
| /// Request that device calculate the Ethernet Frame Check Sequence and write it in place. |
| COMPUTE_ETHERNET_FCS = 0; |
| /// Request that the device calculate the IPv4 checksum and write it in place. |
| COMPUTE_IPV4_CHECKSUM = 1; |
| /// Request that the device calculate the TCP checksum and write it in place. |
| COMPUTE_TCP_CHECKSUM = 2; |
| /// Request that the device calculate the UDP checksum and write it in place. |
| COMPUTE_UDP_CHECKSUM = 3; |
| // Future expansions: TCP segmentation acceleration |
| }; |
| |
| /// Flags set by a Device when handing a buffer to a client on the rx path. Set by devices on the |
| /// `inbound_flags` field of an rx descriptor. |
| bits RxFlags : uint32 { |
| /// Acceleration flag 0. Acceleration flags are mapped to the acceleration features reported by |
| /// the [`fuchsia.hardware.network/Device`] in [`fuchsia.hardware.network/Info.rx_accel`]. The |
| /// n-th feature in `rx_accel` maps to the `RX_ACCEL_n` `RxFlag`. |
| RX_ACCEL_0 = 0x00000001; |
| RX_ACCEL_1 = 0x00000002; |
| RX_ACCEL_2 = 0x00000004; |
| RX_ACCEL_3 = 0x00000008; |
| RX_ACCEL_4 = 0x00000010; |
| RX_ACCEL_5 = 0x00000020; |
| RX_ACCEL_6 = 0x00000040; |
| RX_ACCEL_7 = 0x00000080; |
| RX_ACCEL_8 = 0x00000100; |
| RX_ACCEL_9 = 0x00000200; |
| RX_ACCEL_10 = 0x00000400; |
| RX_ACCEL_11 = 0x00000800; |
| RX_ACCEL_12 = 0x00001000; |
| RX_ACCEL_13 = 0x00002000; |
| RX_ACCEL_14 = 0x00004000; |
| RX_ACCEL_15 = 0x00008000; |
| |
| // RESERVED - bits 16 to 28 reserved for future expansions |
| |
| /// Device experienced a hardware rx overrun. Rx overruns are typically set by hardware |
| /// controllers when a frame event was detected but the frame data couldn't be captured. Devices |
| /// should clear the controller flag once this is set on an inbound frame, so future overruns |
| /// can be detected and reported. |
| RX_OVERRUN = 0x20000000; |
| /// This bit is set if frame validation is performed (such as by hardware acceleration features) |
| /// and fails. It's important to note that some devices may simply discard frames for which |
| /// validation fails and never notify the client. Rx frames that failed validation are only |
| /// transmitted to the client if the `SessionFlags::REPORT_INVALID_RX` option is selected when |
| /// creating a session. |
| RX_VALIDATION_ERROR = 0x40000000; |
| /// This is an echoed tx frame, created by a tx request. Can only be set in sessions that have |
| /// the `LISTEN_TX` flag. |
| RX_ECHOED_TX = 0x80000000; |
| }; |
| |
| /// Flags set by a Client when handing a buffer to a client on the tx path. Set by Clients on the |
| /// `inbound_flags` field of a tx descriptor. |
| bits TxFlags : uint32 { |
| /// Acceleration flag 0. Acceleration flags are mapped to the acceleration features reported by |
| /// the [`fuchsia.hardware.network/Device`] in [`fuchsia.hardware.network/Info.tx_accel`]. The |
| /// n-th feature in `tx_accel` maps to the `TX_ACCEL_n` `TxFlag`. |
| TX_ACCEL_0 = 0x00000001; |
| TX_ACCEL_1 = 0x00000002; |
| TX_ACCEL_2 = 0x00000004; |
| TX_ACCEL_3 = 0x00000008; |
| TX_ACCEL_4 = 0x00000010; |
| TX_ACCEL_5 = 0x00000020; |
| TX_ACCEL_6 = 0x00000040; |
| TX_ACCEL_7 = 0x00000080; |
| TX_ACCEL_8 = 0x00000100; |
| TX_ACCEL_9 = 0x00000200; |
| TX_ACCEL_10 = 0x00000400; |
| TX_ACCEL_11 = 0x00000800; |
| TX_ACCEL_12 = 0x00001000; |
| TX_ACCEL_13 = 0x00002000; |
| TX_ACCEL_14 = 0x00004000; |
| TX_ACCEL_15 = 0x00008000; |
| }; |
| |
| /// Flags set by a Device when returning a tx buffer back to a client. Set by Devices on the |
| /// `return_flags` field of a tx descriptor. |
| bits TxReturnFlags : uint32 { |
| /// Requested operation in `inbound_flags` is not supported; the frame was not sent. |
| /// Always set in conjunction with `TX_RET_ERROR`. |
| TX_RET_NOT_SUPPORTED = 1; |
| /// Could not allocate resources to send frame. |
| /// Always set in conjunction with `TX_RET_ERROR`. |
| TX_RET_OUT_OF_RESOURCES = 2; |
| /// Device is not available (offline or disconnected); the frame was not sent. |
| /// Always set in conjunction with `TX_RET_ERROR`. |
| TX_RET_NOT_AVAILABLE = 4; |
| |
| // An error occurred sending this frame. |
| TX_RET_ERROR = 0x80000000; |
| }; |