|  | // 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; | 
|  |  | 
|  | /// Represents a session with a Network device. | 
|  | /// | 
|  | /// A session has a data plane and a control plane. The `Session` protocol represents the control | 
|  | /// plane of the session and the FIFOs and VMOs exchanged during the | 
|  | /// [`fuchsia.hardware.network/Device.OpenSession`] call are the data plane. Lifetime of the session | 
|  | /// is controlled by a `Session` protocol handle. Sessions are always created in a paused state. | 
|  | /// | 
|  | /// The session will be closed with an error epitaph if an invalid buffer descriptor is sent over | 
|  | /// either the tx or rx FIFOs. Invalid descriptors include: | 
|  | ///    - Descriptor index larger than [`fuchsia.hardware.network/SessionInfo.descriptor_count`]. | 
|  | ///    - Descriptor chains larger than [`fuchsia.hardware.network/MAX_DESCRIPTOR_CHAIN`]. | 
|  | ///    - rx buffers smaller than [`fuchsia.hardware.network/Info.min_rx_buffer_length`]. | 
|  | ///    - tx buffers smaller than [`fuchsia.hardware.network/Info.min_tx_buffer_length`]. | 
|  | ///    - tx buffers not respecting [`fuchsia.hardware.network/Info.min_tx_buffer_head`] or | 
|  | ///    [`fuchsia.hardware.network/Info.min_tx_buffer_tail`]. | 
|  | protocol Session { | 
|  | /// Pauses or unpauses reception of frames on this session. | 
|  | SetPaused(bool paused); | 
|  | /// Cleanly closes a session. This will cause the session to send a `ZX_ERR_CANCELLED` epitaph | 
|  | /// and proceed to close the Session channel. Clients may only assume that they own all the | 
|  | /// buffers that are currently owned by the session (sent over either the rx or tx FIFOs) once | 
|  | /// the epitaph is received. Closing the rx or tx FIFO is equivalent to calling `Close`. | 
|  | Close(); | 
|  | }; | 
|  |  | 
|  | /// Additional session options. | 
|  | bits SessionFlags : uint16 { | 
|  | /// Sessions marked with the `PRIMARY` bit get the following different treatment: | 
|  | /// - If no PRIMARY sessions are attached, the device will *not* serve rx frames to non-PRIMARY | 
|  | ///   sessions. | 
|  | /// - If there's only one PRIMARY session active, it may get a zero-copy data path from the | 
|  | ///   the backing hardware, if the underlying implementation supports it. | 
|  | PRIMARY = 0x0001; | 
|  | /// `LISTEN_TX` sessions will receive any outgoing frames (from all sessions) on its | 
|  | /// rx path. Can be used for snooping traffic. Sessions marked with `LISTEN_TX` may also send | 
|  | /// frames, but they should keep in mind that they'll ALWAYS receive those frames back on their | 
|  | /// rx path (no origin session filtering is performed). | 
|  | LISTEN_TX = 0x0002; | 
|  | /// Sessions marked with `REPORT_INVALID_RX` are interested in receiving frames that were | 
|  | /// rejected by internal device checks or payload validation performed by hardware. Due to the | 
|  | /// nature of some hardware platforms, sessions marked with `REPORT_INVALID_RX` may still not | 
|  | /// receive frames that fail validation if the hardware implementation simply drops the frame | 
|  | /// and doesn't expose it to the software stack. Sessions NOT marked with `REPORT_INVALID_RX`, | 
|  | /// in contrast, will NEVER receive an rx frame with the `RX_VALIDATION_ERROR` flag set. | 
|  | REPORT_INVALID_RX = 0x0004; | 
|  | }; | 
|  |  | 
|  | /// Data-plane FIFOs. | 
|  | resource struct Fifos { | 
|  | /// Handle for the rx FIFO. | 
|  | /// Clients must write 16-bit descriptor indexes to this FIFO to be able to receive | 
|  | /// frames. | 
|  | zx.handle:FIFO rx; | 
|  | /// Handle for the tx FIFO. | 
|  | /// Clients write 16-bit descriptor indexes to this FIFO to enqueue outgoing frames. | 
|  | zx.handle:FIFO tx; | 
|  | }; | 
|  |  | 
|  | /// Session configuration. | 
|  | resource struct SessionInfo { | 
|  | /// VMO containing the descriptors. 16-bit indices transmitted over the FIFOs index a descriptor | 
|  | /// in this VMO (byte offset = descriptor_length * 8 * index). | 
|  | zx.handle:VMO descriptors; | 
|  | /// VMO containing frame data. Descriptors contain byte-offsets that are used to index | 
|  | /// arbitrary regions in `data`. | 
|  | zx.handle:VMO data; | 
|  | /// Requested descriptor version. If the network device does not support the requested | 
|  | /// descriptor version, [`fuchsia.hardware.network/Device.OpenSession`] will fail with | 
|  | /// `ZX_ERR_NOT_SUPPORTED`. | 
|  | uint8 descriptor_version; | 
|  | /// Descriptor length, in 64-bit words. The length of each descriptor in the `descriptors` VMO. | 
|  | /// This is used as a multiplier to find byte offsets in `descriptors` given a descriptor index | 
|  | /// passed through the rx or tx FIFOs. | 
|  | uint8 descriptor_length; | 
|  | /// Total number of descriptors that can be used by this session. Descriptor indices transferred | 
|  | /// through either the rx or tx FIFO must be in the range [0, `descriptor_count`). | 
|  | uint16 descriptor_count; | 
|  | /// Extra options. | 
|  | SessionFlags options; | 
|  | /// List of frame types the client is subscribing to. | 
|  | vector<FrameType>:MAX_FRAME_TYPES rx_frames; | 
|  | }; |