// 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 zircon.ethernet;
|
|
using zx;
|
|
struct MacAddress {
|
array<uint8>:6 octets;
|
};
|
|
const uint32 DEFAULT_BUFFER_SIZE = 2048; // bytes
|
/// When writing payload to a tx buffer, clients of a Device must skip this many bytes
|
/// so that lower-layer drivers can fill in additional headers in that space.
|
const uint32 MAC_HDR_MAX_SIZE = 64; // bytes, the closest power of 2 larger than 44, which is
|
// DataFrameHeader::max_size(36) + LlcHeader::max_size(8)
|
|
// Info.features bits
|
const uint32 INFO_FEATURE_WLAN = 0x00000001;
|
const uint32 INFO_FEATURE_SYNTH = 0x00000002;
|
const uint32 INFO_FEATURE_LOOPBACK = 0x00000004;
|
|
struct Info {
|
uint32 features;
|
uint32 mtu;
|
MacAddress mac;
|
};
|
|
struct Fifos {
|
// handles for the rx and tx fifo
|
handle<fifo> rx;
|
handle<fifo> tx;
|
|
// maximum number of items in rx and tx fifo
|
uint32 rx_depth;
|
uint32 tx_depth;
|
};
|
|
// 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 uint32 SIGNAL_STATUS = 0x01000000;
|
|
// device_status bits
|
const uint32 DEVICE_STATUS_ONLINE = 0x00000001;
|
|
// Max client name length
|
const uint32 MAX_CLIENT_NAME_LEN = 15;
|
|
// For compatibility with a past revision, allow one extra byte for an optional
|
// null-terminator.
|
const uint32 SET_CLIENT_NAME_MAX_LEN = 16;
|
|
// zircon/device/ethernet.h
|
[Layout = "Simple"]
|
interface Device {
|
// Obtain information about device
|
1: GetInfo() -> (Info info);
|
|
// Obtain a pair of fifos for queueing tx and rx operations
|
2: GetFifos() -> (zx.status status, Fifos? info);
|
|
// Set the IO Buffer that will provide the data buffers for tx and rx operations
|
3: SetIOBuffer(handle<vmo> h) -> (zx.status 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.
|
4: Start() -> (zx.status status);
|
|
// Stop transferring packets
|
5: Stop() -> ();
|
|
// Start listening to the packets that we're transmitting
|
// as well as the packets we're receiving.
|
6: ListenStart() -> (zx.status status);
|
|
// Stop listening to the packets that we're transmitting.
|
7: ListenStop() -> ();
|
|
8: SetClientName(string:SET_CLIENT_NAME_MAX_LEN name) -> (zx.status 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.
|
9: GetStatus() -> (uint32 device_status);
|
|
10: SetPromiscuousMode(bool enabled) -> (zx.status status);
|
|
11: ConfigMulticastAddMac(MacAddress addr) -> (zx.status status);
|
12: ConfigMulticastDeleteMac(MacAddress addr) -> (zx.status status);
|
13: ConfigMulticastSetPromiscuousMode(bool enabled) -> (zx.status status);
|
|
// TODO(teisenbe): We should probably remove these? They are only used for testing.
|
14: ConfigMulticastTestFilter() -> (zx.status status);
|
15: DumpRegisters() -> (zx.status status);
|
};
|
|
// Operation
|
//
|
// Packets are transmitted by writing data into the io_vmo and writing
|
// an 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 vmo. 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().
|
|
// flags values for request messages
|
// - none -
|
|
// flags values for response messages
|
const uint16 FIFO_RX_OK = 0x00000001; // packet received okay
|
const uint16 FIFO_TX_OK = 0x00000001; // packet transmitted okay
|
const uint16 FIFO_INVALID = 0x00000002; // offset+length not within io_vmo bounds
|
const uint16 FIFO_RX_TX = 0x00000004; // received our own tx packet (when Listen enabled)
|
|
struct FifoEntry {
|
// offset from start of io vmo to packet data
|
uint32 offset;
|
|
// length of packet data to tx or rx
|
uint16 length;
|
|
// FIFO_* flags as above
|
uint16 flags;
|
|
// opaque cookie
|
uint64 cookie;
|
};
|