Generic Network Device interface.
The definitions herein provide the API surface to expose a hardware device
as a network device interface to the system through the FIDL protocol
fuchsia.hardware.network/Device. A network device interface is the
data-plane contract that allows the networking stack to send and receive
frames on a physical or virtual network. A device exposes this capability by
implementing the NetworkDeviceImpl protocol, which allows a middleware
implementation to bind to it and offer the FIDL protocol to applications.
The API contract is based on three key concepts:
- Frame Types
- Receive and Transmit buffers
- Memory layout
Frame Types are the defined contract that is exposed to applications, which
convey the data type contained in a tx or rx buffer. The supported frame
types are defined in fuchsia.hardware.network/FrameType. Upon
initialization, the middleware implementation will fetch the supported frame
types from the device through the GetInfo call.
Receive and Transmit buffers are buffers that are headed to different directions: a receive buffer is a piece of data that is received from the network, and makes its way to the application layer. A transmit buffer travels in the opposite direction: it originates in the application layer and makes its way out into the network. The device implementation receives buffers from the NetworkDeviceIfc, which is offered by the middleware implementation.
A receive buffer flows from NetworkDeviceIfc into NetworkDeviceImpl through the NetworkDeviceImpl.QueueRxSpace method, which gives access to receive buffers. The diagram below illustrates the mechanism:
++++++++++++++++++++ +++++++++++++++++++++
| (1) | => RxSpaceBuffer => | (2) |
| NetworkDeviceIfc | | NetworkDeviceImpl |
| (4) | <= RxBuffer <= | (3) | <= Network data
++++++++++++++++++++ +++++++++++++++++++++
- (1)
NetworkDeviceIfcpushes available rx buffer space toNetworkDeviceImplthrough NetworkDeviceImpl.QueueRxSpace. - (2)
NetworkDeviceImplretains the available space buffers until network data comes in. - (3)
NetworkDeviceImplreceives data from the network, stores it in one of its available RxSpaceBuffers, making it a NetworkDeviceImpl.RxBuffer. - (4)
NetworkDeviceImplsends the fulfilledRxBuffertoNetworkDeviceIfcthrough NetworkDeviceIfc.CompleteRx, which, in turn, sends that data over to applications.
A transmit buffer flows from NetworkDeviceIfc into NetworkDeviceImpl
through the NetworkDeviceImpl.QueueTx method, and it's returned to
NetworkDeviceIfc as a TxResult. The diagram below illustrates the
mechanism:
++++++++++++++++++++ +++++++++++++++++++++
| (1) | => TxBuffer => | (2) |
| NetworkDeviceIfc | | NetworkDeviceImpl |
| (4) | <= TxResult <= | (3) | => Network data
++++++++++++++++++++ +++++++++++++++++++++
- (1)
NetworkDeviceIfcreceives a transmit buffer from applications filled with data intended to be delivered to the network. - (2)
NetworkDeviceIfcpushes the buffer intoNetworkDeviceImplthrough the NetworkDeviceImpl.QueueTx call. - (3)
NetworkDeviceImplsends the data contained in the buffer out into the network. - (4) When the data is successfully transmitted,
NetworkDeviceImplmarks the transmission as complete referencing the buffer's identifier to NetworkDeviceIfc.CompleteTx.
PROTOCOLS
MacAddr
Defined in fuchsia.hardware.network.driver/network-mac.fidl
GetAddress
Gets this device's MAC address.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
mac |
fuchsia.net/MacAddress
|
GetFeatures
Gets this device's features.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
features |
Features
|
SetMode
Sets this device's operating mode.
mode is one of the variants in Mode, it's guaranteed to be one of
the reported modes in this device's reported features. multicast_macs
is only provided (though it can still be empty) when mode is
MULTICAST_FILTER. multicast_macs is always guaranteed to be at most
multicast_filter_count entries.
Request
| Name | Type |
|---|---|
mode |
fuchsia.hardware.network/MacFilterMode
|
multicast_macs |
vector<fuchsia.net/MacAddress>:64
|
Response
<EMPTY>
NetworkDeviceIfc
Defined in fuchsia.hardware.network.driver/network-device.fidl
AddPort
Instantiates a new port with id.
id must not be currently in use by any other ports. ids may be
reused once the provided port is destroyed by NetworkPort.Removed.
Port identifiers do not need to be stable across instantiations or reboots. Port identifiers don't need to be allocated in any specific order as long as MAX_PORTS is not exceeded.
- request
idnew port identifier. - request
porthandle to network port implementation.
Request
| Name | Type |
|---|---|
id |
fuchsia.hardware.network/BasePortId
|
port |
client_end:NetworkPort
|
Response
| Name | Type |
|---|---|
status |
zx/Status
|
CompleteRx
Notifies interface of incoming rx data, contained in RxBuffer.
Callers should attempt to batch as many buffers as possible in a single
call. Number of buffers in a single call must be limited to the
DeviceInfo.rx_depth reported by the NetworkDeviceImpl that is
returning the buffers.
Buffers with zero length are considered "unfulfilled". They're not reported to any sessions and the buffer space comprising them may be reused. Devices should return any outstanding buffer space as unfulfilled on stop. See NetworkDeviceImpl.Stop.
By calling CompleteRx the caller relinquishes ownership of all buffers
that are being marked as complete.
- request
rxbuffers containing incoming data.
Request
| Name | Type |
|---|---|
rx |
vector<RxBuffer>:818
|
CompleteTx
Notifies interface of complete transmit buffers.
Callers should attempt to batch as many buffers as possible in a single call.
Number of buffers in a single call must be limited to the
DeviceInfo.tx_depth reported by the NetworkDeviceImpl that is
returning the buffers.
By calling CompleteTx the caller relinquishes ownership of all buffers
that are being returned.
- request
txtransmit results.
Request
| Name | Type |
|---|---|
tx |
vector<TxResult>:8188
|
DelegateRxLease
Transfers a receive wake lease up to the application.
Devices that allow applications to fully deal with a frame after a wake from network traffic may use this method as a "lease baton passing" strategy. Applications that support wake handling hold on to the lease until the rx traffic is fully processed.
Devices must keep track of the number of rx frames sent over
NetworkDeviceIfc.CompleteRx and use the latest issued frame number
as fuchsia.hardware.network/DelegatedRxLease.hold_until_frame to
guarantee processing. Every frame successfully given to CompleteRx
should increase the rx frame count. Note that the frame number is
1-based, see hold_until_frame docs for details.
Note that this is a one-way method and flow-control is enforced via the regular rx space -> rx completion flow.
Request
| Name | Type |
|---|---|
delegated |
fuchsia.hardware.network/DelegatedRxLease
|
PortStatusChanged
Notifies the interface of status changes on port with id.
Port status changes must always be notified through StatusChanged. The
interface will not poll ports for status via NetworkPort.GetStatus.
- request
idport identifier. - request
new_statusnew port's status.
Request
| Name | Type |
|---|---|
id |
fuchsia.hardware.network/BasePortId
|
new_status |
fuchsia.hardware.network/PortStatus
|
RemovePort
Destroys port with id.
NOTE: Resources associated with the port must not be freed until NetworkPort.Removed is called.
- request
idremoved port identifier.
Request
| Name | Type |
|---|---|
id |
fuchsia.hardware.network/BasePortId
|
NetworkDeviceImpl
Defined in fuchsia.hardware.network.driver/network-device.fidl
GetInfo
Gets information about the device.
Device information must not change over the course of the lifetime of the device.
- response
infodevice information.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
info |
DeviceImplInfo
|
Init
Initializes the network device.
Init is only called once during the lifetime of the device to register
iface as the callback target for the Network Device implementation.
Upon initialization, the device is expected to be in the "Stopped"
state, the Start method will be called once the data path needs to be
opened.
- request
ifacehandle to the device interface.
- response
sinitialization status. A value other thanZX_OKwill cause the device to unbind.
Request
| Name | Type |
|---|---|
iface |
client_end:NetworkDeviceIfc
|
Response
| Name | Type |
|---|---|
s |
zx/Status
|
PrepareVmo
Informs device that a new VMO is being used to store frame data.
Implementers must store the VMO handle referenced by id until
NetworkDeviceImpl.ReleaseVmo is called with the same id.
- request
ididentifier used to reference this VMO. - request
vmoVMO where frame data will be stored.
- response
svmo registration status.ZX_OKindicates a successful VMO preparation. Any other status value indicates an implementation specific error and causes the client session which owns the VMO to be closed.
Request
| Name | Type |
|---|---|
id |
VmoId
|
vmo |
handle<vmo>
|
Response
| Name | Type |
|---|---|
s |
zx/Status
|
QueueRxSpace
Enqueues a list of rx buffer space on the network device.
The driver takes ownership of the buffer and must complete the transaction (once network data arrives) using NetworkDeviceIfc.CompleteRx.
The total number of outstanding rx buffers given to a device will never
exceed the reported DeviceInfo.rx_depth value. Which also means that
no more than rx_depth buffers are going to be informed at once in a
single call to QueueRxSpace.
Buffers enqueued while the device in is the stopped state must be returned with a zero length.
- request
buffersrx space buffers to be filled with network data when it arrives.
Request
| Name | Type |
|---|---|
buffers |
vector<RxSpaceBuffer>:2047
|
QueueTx
Enqueues a list of buffers for transmission on the network device.
The driver takes ownership of the buffer and must complete the tx
transaction by using NetworkDeviceIfc.CompleteTx operations once it
is done with each buffer in buffers.
The total number of outstanding tx buffers given to a device will never
exceed the reported DeviceInfo.tx_depth value. Which also means that
no more than tx_depth buffers are going to be informed at once in a
single call to QueueTx.
Buffers enqueued while the device in is the stopped state must be returned with an appropriate error. See TxResult.status for specific error codes.
- request
bufferstx buffers to enqueue for sending.
Request
| Name | Type |
|---|---|
buffers |
vector<TxBuffer>:481
|
ReleaseVmo
Device may dispose of all references to the VMO referenced by id.
No more buffers will be sent with this id.
ReleaseVmo is guaranteed to only be called when the implementation
holds no buffers that reference that id.
- request
idVMO identifier.
Request
| Name | Type |
|---|---|
id |
VmoId
|
Response
<EMPTY>
Start
Starts the device's data path.
start signals to the device implementation that it should bring up its
data path and be ready to receive tx frames and iface will start
accepting rx frames.
The device is only considered started once Start returns successfully.
Until then, the contract guarantees that no other data-path calls will
be made to the device (QueueTx, RxAvailable, Stop, or a second
call to Start), so implementers can safely assume or assert that this
contract is upheld.
- response
sstart status.ZX_OKindicates a successful start.ZX_ERR_ALREADY_BOUNDindicates that the device has already been successfully started. Any other status value indicates an implementation specific error.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
s |
zx/Status
|
Stop
Stops the network device.
The device implementation must return all outstanding Tx and Rx buffers upon receiving this call. Any new buffers received in the stopped state must be returned with an appropriate error (tx) or unfulfilled (rx). See NetworkDeviceIfc.CompleteTx and NetworkDeviceIfc.CompleteRx for details.
The device implementation may perform any power saving measures after observing stop.
Request
<EMPTY>
Response
<EMPTY>
NetworkPort
Defined in fuchsia.hardware.network.driver/network-device.fidl
GetInfo
Gets information about the port.
Port information must not change over the port's lifetime.
- response
infoport information.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
info |
fuchsia.hardware.network/PortBaseInfo
|
GetMac
Gets an interface to the MAC addressing layer of the port.
Ports that do not support MAC addressing must return an empty interface.
That means the generated-banjo bindings ctx and ops fields must both
be null.
- response
mac_ifcmac addressing handle.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
mac_ifc |
client_end:MacAddr?
|
GetStatus
Gets operational status of the port.
Changes to operational status must be reported via NetworkDeviceIfc.StatusChanged
- response
statussnapshot of port's operational status.
Request
<EMPTY>
Response
| Name | Type |
|---|---|
status |
fuchsia.hardware.network/PortStatus
|
Removed
Notifies this port has been removed from the interface.
Resources associated with the port must only be freed upon receiving the
Removed call. Note that Removed will ONLY be called if AddPort has
returned and indicated success. If AddPort fails this will not be called,
check the return status of AddPort instead.
Request
<EMPTY>
SetActive
Notifies the port that there are sessions interested in it.
An active port has sessions attached to it. Implementations may employ power saving or other strategies on disabled ports. Implementations that do employ such strategies:
- should not report inbound frames for inactive ports;
- must return errors for outbound frames destined to inactive ports.
All ports are inactive on creation.
- request
activetrueif port has sessions attached to it,falseotherwise.
Request
| Name | Type |
|---|---|
active |
bool
|
STRUCTS
BufferMetadata
Defined in fuchsia.hardware.network.driver/network-device.fidl
Metadata associated with a TxBuffer or an RxBuffer.
| Field | Type | Description | Default |
|---|---|---|---|
port |
fuchsia.hardware.network/BasePortId
|
Destination or source port identifier for this buffer. |
No default |
flags |
uint32
|
Frame tx or rx flags, as defined in fuchsia.hardware.network/RxFlags, fuchsia.hardware.network/TxFlags, and fuchsia.hardware.network/TxReturnFlags. |
No default |
frame_type |
fuchsia.hardware.network/FrameType
|
Type of frame contained in this buffer, as defined in fuchsia.hardware.network/FrameType. |
No default |
BufferRegion
Defined in fuchsia.hardware.network.driver/network-device.fidl
A contiguous memory region in a VMO.
Note that a BufferRegion is only contiguous in terms of the VMO it
references, it does not necessarily translate into contiguous physical
memory.
| Field | Type | Description | Default |
|---|---|---|---|
vmo |
VmoId
|
VMO backing this region. |
No default |
offset |
uint64
|
Offset, in bytes, of data chunk in VMO. |
No default |
length |
uint64
|
Length, in bytes, of data chunk in VMO. |
No default |
RxBuffer
Defined in fuchsia.hardware.network.driver/network-device.fidl
A buffer containing a single frame received by the device.
| Field | Type | Description | Default |
|---|---|---|---|
meta |
BufferMetadata
|
Metadata associated with buffer. |
No default |
data |
vector<RxBufferPart>:4
|
Fulfilled rx buffer space comprising this frame. Must have at least one part. |
No default |
RxBufferPart
Defined in fuchsia.hardware.network.driver/network-device.fidl
A single contiguous part of an RxBuffer, created from an RxSpaceBuffer.
| Field | Type | Description | Default |
|---|---|---|---|
id |
BufferId
|
The buffer identifier informed in the RxSpaceBuffer that originated
this |
No default |
offset |
uint32
|
Offset in bytes from RxSpaceBuffer's start where inbound data begins. This is a relative offset within the region defined by the originating space, not an absolute offset in the space's VMO. |
No default |
length |
uint32
|
The total length in bytes written in the RxSpaceBuffer referenced by
|
No default |
RxSpaceBuffer
Defined in fuchsia.hardware.network.driver/network-device.fidl
A buffer with allocated space to receive frames in. An RxSpaceBuffer must
always be returned as an RxBufferPart within an RxBuffer.
| Field | Type | Description | Default |
|---|---|---|---|
id |
BufferId
|
Unique buffer identifier. |
No default |
region |
BufferRegion
|
VMO region where buffer space is located. |
No default |
TxBuffer
Defined in fuchsia.hardware.network.driver/network-device.fidl
A transmit buffer containing a single frame.
| Field | Type | Description | Default |
|---|---|---|---|
id |
BufferId
|
Unique buffer identifier. |
No default |
data |
vector<BufferRegion>:4
|
Regions of VMO holding frame data. |
No default |
meta |
BufferMetadata
|
Metadata associated with this buffer. |
No default |
head_length |
uint16
|
Length of header bytes in the data contained in this buffer. Will always be either 0 or the requested DeviceInfo.tx_head_length value. The head bytes are always at the beginning of the buffer. |
No default |
tail_length |
uint16
|
Length of tail bytes in the data contained in this buffer. Will always be either 0 or the requested DeviceInfo.tx_tail_length value. The tail bytes are always at the end of the buffer. |
No default |
TxResult
Defined in fuchsia.hardware.network.driver/network-device.fidl
The result of a tx operation, reported to NetworkDeviceIfc through NetworkDeviceIfc.CompleteTx.
| Field | Type | Description | Default |
|---|---|---|---|
id |
BufferId
|
The buffer identifier informed in the TxBuffer that originated this
|
No default |
status |
zx/Status
|
The result status to report. Error results map to their equivalents in fuchsia.hardware.network/TxReturnFlags.
|
No default |
TABLES
DeviceImplInfo
Defined in fuchsia.hardware.network.driver/network-device.fidl
Static device information.
DeviceImplInfo must not change for the entire lifetime of a device.
| Ordinal | Field | Type | Description |
|---|---|---|---|
1 |
device_features |
uint32
|
Device features Required. |
2 |
tx_depth |
uint16
|
Maximum depth of tx frames in device's outgoing queue. Required. |
3 |
rx_depth |
uint16
|
Maximum number of rx frames in a device's incoming queue. Required. |
4 |
rx_threshold |
uint16
|
Rx depth threshold at which the device should be fed new rx buffers. New buffer notifications from NetworkDeviceIfc may be skipped while
the number of rx buffers held by the implementation is larger than
A large value (close to |
5 |
max_buffer_parts |
uint8
|
Maximum virtual discontiguous buffer parts accepted by the device. Devices that can't perform scatter-gather operations must set
Must be in the range [1, |
6 |
max_buffer_length |
uint32
|
Maximum total length of buffers. May be set to zero for no maximum. Devices that do not support scatter-gather DMA may set this to a value smaller than a page size to guarantee compatibility. Required. |
7 |
buffer_alignment |
uint32
|
Alignment requirement for buffers relative to the start of VMOs. Must be greater than zero. Required. |
8 |
min_rx_buffer_length |
uint32
|
The minimum rx buffer length for correct operation, in bytes. Required. |
9 |
min_tx_buffer_length |
uint32
|
The minimum tx buffer length for correct operation, in bytes. This length accounts only for the buffer's body, and should not account
for |
10 |
tx_head_length |
uint16
|
Number of bytes requested as header bytes on tx buffers. If set to zero, tx buffers will never contain header space. Otherwise, tx buffers will start at the beginning of the header space, and the header region will be informed. Required. |
11 |
tx_tail_length |
uint16
|
Number of bytes requested as tail bytes on tx buffers. If set to zero, tx buffers will never contain tail space. Otherwise, tx buffers will end at the end of the tail space, and the tail region will be informed. Required. |
12 |
rx_accel |
vector<fuchsia.hardware.network/RxAcceleration>
|
Available Rx acceleration flags for this device, as defined in fuchsia.hardware.network/RxAcceleration.
|
13 |
tx_accel |
vector<fuchsia.hardware.network/TxAcceleration>
|
Available tx acceleration flags for this device, as defined in fuchsia.hardware.network/TxAcceleration.
|
Features
Defined in fuchsia.hardware.network.driver/network-mac.fidl
Device features reported by MacAddr.GetFeatures.
| Ordinal | Field | Type | Description |
|---|---|---|---|
1 |
multicast_filter_count |
uint32
|
The maximum number of multicast filtering entries available on this device. Implementations must set 0 if multicast filtering is not supported. Values will always be saturated to MAX_MAC_FILTER. Optional, interpreted as zero if absent. |
2 |
supported_modes |
SupportedMacFilterMode
|
The filtering operating modes supported by this device. Bitfield of possible SupportedMacFilterMode values that can be passed to MacAddr.SetMode. |
BITS
SupportedMacFilterMode flexible
Type: uint32
Defined in fuchsia.hardware.network.driver/network-mac.fidl
Device MAC filtering modes supported.
The variants of this type should match fuchsia.hardware.network.MacFilterMode.
| Name | Value | Description |
|---|---|---|
MULTICAST_FILTER |
1 | Device accepts only unicast frames addressed to its own unicast address, or multicast frames that are part of the multicast address filter list. |
MULTICAST_PROMISCUOUS |
2 | Device accepts unicast frames addressed to its own unicast address, or any multicast frames. |
PROMISCUOUS |
4 | Device accepts all frames. |
CONSTANTS
| Name | Value | Type | Description |
|---|---|---|---|
| MAC_SIZE |
6
|
uint64 |
The length of an IEEE 802 MAC Address, in bytes. |
| MAX_BUFFER_PARTS |
4
|
uint32 |
Maximum number of disjoint parts a buffer may have. |
| MAX_MAC_FILTER |
64
|
uint64 |
The maximum number of multicast MAC addresses set to filter. |
| MAX_RX_BUFFERS |
818
|
uint32 |
The maximum number of At the time of writing, FIDL messages are limited to 65 KiB. In the current
FIDL wire format, the size of an
|
| MAX_RX_SPACE_BUFFERS |
2047
|
uint32 |
The maximum number of At the time of writing, FIDL messages are limited to 65 KiB. In the current
FIDL wire format, the maximum size of an |
| MAX_TX_BUFFERS |
481
|
uint32 |
The maximum number of At the time of writing, FIDL messages are limited to 65 KiB. In the current
FIDL wire format, the size of a |
| MAX_TX_RESULTS |
8188
|
uint32 |
The maximum number of At the time of writing, FIDL messages are limited to 65 KiB. In the current
FIDL wire format, the size of each |
| MAX_VMOS |
32
|
uint8 |
The maximum number of concurrent shared VMOs that may exist. |
ALIASES
| Name | Value | Description |
|---|---|---|
| BufferId |
uint32 |
Buffer identifier. Rx space buffers and tx buffers are identified by these when exchanged between interface and implementation. |
| VmoId |
uint8 |
VMO identifier. VMO identifiers are always in the range [0, MAX_VMOS). VMO identifiers are reported to devices through NetworkDeviceImpl.PrepareVmo. |
SERVICES
Service
Defined in fuchsia.hardware.network.driver/network-device.fidl
| Name | Type | Transport |
|---|---|---|
| network_device_impl |
fuchsia.hardware.network.driver/NetworkDeviceImpl
|
Driver |