|  | // 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; | 
|  | }; |