blob: ba263ab91b9447c1f8e23f2a27f5753d63ee7d7d [file] [log] [blame]
// 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;
});
};