MAC_RX(9F) Kernel Functions for Drivers MAC_RX(9F)

NAME


mac_rx, mac_rx_ring - deliver frames from a driver to the system

SYNOPSIS


#include <sys/mac_provider.h>

void
mac_rx(mac_handle_t mh, mac_resource_handle_t mrh, mblk_t *mp_chain);

void
mac_rx_ring(mac_handle_t mh, mac_ring_handle_t mring, mblk_t *mp_chain,
uint64_t mr_gen);

INTERFACE LEVEL


illumos DDI specific

The mac_rx_ring() function point is Uncommitted - API and ABI stability is
not guaranteed.

PARAMETERS


mh The MAC handle obtained from a call to mac_register(9F).

mrh A reserved parameter that should be passed as NULL.

mring A pointer to the ring handle that was passed to the driver in
the mr_rget(9E) entry point.

mp_chain A series of one or more mblk(9S) structures chained together
by their b_next member.

mr_gen The generation number for the current ring. The generation
comes from the mri_start(9E) entry point.

DESCRIPTION


The mac_rx() function is used by device drivers to deliver frames that a
device driver has received to the rest of the operating system. This will
generally be called at the end of a device driver's interrupt handler after
it is has converted all of the incoming data into a chain of mblk(9S)
structures. For a full description of the process that the device driver
should take as part of receiving data, see the Receiving Data section of
mac(9E).

Device drivers should ensure that they are not holding any of their own
locks when they call the mac_rx() function.

Device drivers should not call the mac_rx() function after each individual
mblk_t is assembled. Rather, the device driver should batch up as many
frames as it is willing to process in a given interrupt or are available.

The mac_rx_ring() function is similar to the mac_rx function; however, it
should be called by device drivers that have negotiated the MAC_CAPAB_RINGS
capability and indicated that it supports receive groups. Device drivers
that have negotiated this capability must not call the mac_rx() function,
but use the mac_rx_ring() function instead. The driver should pass the
ring handle in mring for the ring in question that it processed. If more
than one ring was processed during an interrupt, then the driver must call
mac_rx_ring() once for each ring and ensure that the mr_gen argument
matches what was passed to the driver during the mri_start(9E) entry point
for each ring. If the value of mr_gen does not match what the operating
system expects, all of the packets will be dropped. This is used to make
sure that the system is receiving what it considers valid data from the
device driver.

When a driver supporting the MAC_CAPAB_RINGS capability is asked to poll
via their mri_poll(9E) entry point, then the driver should not call the
mac_rx_ring() function to deliver packets and instead returns them during
the mri_poll(9E) call.

CONTEXT


The mac_rx() function can be called from user, kernel, or interrupt
context.

SEE ALSO


mac(9E), mac_capab_rings(9E), mr_rget(9E), mri_poll(9E), mri_start(9E),
mac_register(9F), mblk(9S)

illumos July 17, 2023 illumos