| // 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.hardware.ethernet; |
| |
| using zx; |
| |
| @for_deprecated_c_bindings |
| type MacAddress = struct { |
| octets array<uint8, 6>; |
| }; |
| |
| /// Features distinguishes between NICs with different features. |
| type Features = strict bits : uint32 { |
| WLAN = 0x01; |
| SYNTHETIC = 0x02; |
| LOOPBACK = 0x04; |
| WLAN_AP = 0x08; |
| }; |
| |
| @for_deprecated_c_bindings |
| type Info = struct { |
| features Features; |
| mtu uint32; |
| mac MacAddress; |
| }; |
| |
| @for_deprecated_c_bindings |
| type Fifos = resource struct { |
| // handles for the rx and tx fifo |
| rx zx.handle:FIFO; |
| tx zx.handle:FIFO; |
| |
| // maximum number of items in rx and tx fifo |
| rx_depth uint32; |
| tx_depth uint32; |
| }; |
| |
| /// Signal that is asserted on the RX fifo whenever the Device has a status |
| /// change. This is ZX_USER_SIGNAL_0. |
| // TODO(teisenbe/kulakowski): find a better way to represent this |
| const SIGNAL_STATUS uint32 = 0x01000000; |
| |
| type DeviceStatus = strict bits : uint32 { |
| ONLINE = 1; |
| }; |
| |
| /// Max client name length |
| const MAX_CLIENT_NAME_LEN uint32 = 15; |
| |
| /// For compatibility with a past revision, allow one extra byte for an optional |
| /// null-terminator. |
| const SET_CLIENT_NAME_MAX_LEN uint32 = 16; |
| |
| /// Operation |
| /// |
| /// Packets are transmitted by writing data into the IO buffer and writing |
| /// a FifoEntry referencing that data (offset + length) into the tx fifo. |
| /// When the driver is done accessing the data, a FifoEntry with the same |
| /// cookie value (opaque to the driver) will be readable from the tx fifo. |
| /// |
| /// Packets are received by writing a FifoEntry referencing an available |
| /// buffer (offset + length) in the IO buffer. When a packet is received, |
| /// a FifoEntry with the same cookie value (opaque to the driver) will be |
| /// readable from the rx fifo. The offset field will be the same as was |
| /// sent. The length field will reflect the actual size of the received |
| /// packet. The flags field will indicate success or a specific failure |
| /// condition. |
| /// |
| /// IMPORTANT: The driver *will not* buffer response messages. It is the |
| /// client's responsibility to ensure that there is space in the reply side |
| /// of each fifo for each outstanding tx or rx request. The fifo sizes |
| /// are returned along with the fifo handles from GetFifos(). |
| /// |
| /// See //zircon/system/public/zircon/device/ethernet.h for fifo entry layout |
| /// and request / response message bits. |
| @for_deprecated_c_bindings |
| protocol Device { |
| /// Obtain information about device |
| GetInfo() -> (struct { |
| info Info; |
| }); |
| |
| /// Obtain a pair of fifos for queueing tx and rx operations |
| GetFifos() -> (resource struct { |
| status zx.status; |
| info box<Fifos>; |
| }); |
| |
| /// Set the IO Buffer that will provide the data buffers for tx and rx operations |
| SetIOBuffer(resource struct { |
| h zx.handle:VMO; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| /// Start transferring packets |
| /// Start will not succeed (ZX_ERR_BAD_STATE) until the fifos have been |
| /// obtained and an io buffer vmo has been registered. |
| Start() -> (struct { |
| status zx.status; |
| }); |
| |
| /// Stop transferring packets |
| Stop() -> (); |
| |
| /// Start listening to the packets that we're transmitting |
| /// as well as the packets we're receiving. |
| ListenStart() -> (struct { |
| status zx.status; |
| }); |
| |
| /// Stop listening to the packets that we're transmitting. |
| ListenStop() -> (); |
| |
| SetClientName(struct { |
| name string:SET_CLIENT_NAME_MAX_LEN; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| /// Obtain the device status bits |
| /// When these change, the signal SIGNAL_STATUS is asserted on the rx fifo. |
| /// When these are read, the signal is deasserted. |
| GetStatus() -> (struct { |
| device_status DeviceStatus; |
| }); |
| |
| SetPromiscuousMode(struct { |
| enabled bool; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| ConfigMulticastAddMac(struct { |
| addr MacAddress; |
| }) -> (struct { |
| status zx.status; |
| }); |
| ConfigMulticastDeleteMac(struct { |
| addr MacAddress; |
| }) -> (struct { |
| status zx.status; |
| }); |
| ConfigMulticastSetPromiscuousMode(struct { |
| enabled bool; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| // TODO(teisenbe): We should probably remove these? They are only used for testing. |
| ConfigMulticastTestFilter() -> (struct { |
| status zx.status; |
| }); |
| DumpRegisters() -> (struct { |
| status zx.status; |
| }); |
| }; |