NAME¶
drbr,
drbr_free,
drbr_enqueue,
drbr_dequeue,
drbr_dequeue_cond,
drbr_flush,
drbr_empty,
drbr_inuse, —
network driver interface to buf_ring
SYNOPSIS¶
#include
<sys/param.h>
#include
<net/if.h>
#include
<net/if_var.h>
void
drbr_free(
struct
buf_ring *br,
struct malloc_type
*type);
int
drbr_enqueue(
struct
ifnet *ifp,
struct buf_ring
*br,
struct mbuf
*m);
struct mbuf *
drbr_dequeue(
struct
ifnet *ifp,
struct buf_ring
*br);
struct mbuf *
drbr_dequeue_cond(
struct
ifnet *ifp,
struct buf_ring
*br,
int (*func)
(struct mbuf *, void *),
void *arg);
void
drbr_flush(
struct
ifnet *ifp,
struct buf_ring
*br);
int
drbr_empty(
struct
ifnet *ifp,
struct buf_ring
*br);
int
drbr_inuse(
struct
ifnet *ifp,
struct buf_ring
*br);
DESCRIPTION¶
The
drbr functions provide an API to network
drivers for using
buf_ring(9) for enqueueing and
dequeueing packets. This is meant as a replacement for the IFQ interface for
packet queuing. It allows a packet to be enqueued with a single atomic and
packet dequeue to be done without any per-packet atomics as it is protected by
the driver's tx queue lock. If
INVARIANTS
is enabled,
drbr_dequeue() will assert that
the tx queue lock is held when it is called.
The
drbr_free() function frees all the
enqueued mbufs and then frees the buf_ring.
The
drbr_enqueue() function is used to
enqueue an mbuf to a buf_ring, falling back to the ifnet's IFQ if
ALTQ(4) is enabled.
The
drbr_dequeue() function is used to
dequeue an mbuf from a buf_ring or, if
ALTQ(4) is
enabled, from the ifnet's IFQ.
The
drbr_dequeue_cond() function is used to
conditionally dequeue an mbuf from a buf_ring based on whether
func returns
TRUE or
FALSE.
The
drbr_flush() function frees all mbufs
enqueued in the buf_ring and the ifnet's IFQ.
The
drbr_empty() function returns
TRUE if there are no mbufs enqueued,
FALSE otherwise.
The
drbr_inuse() function returns the number
of mbufs enqueued. Note to users that this is intrinsically racy as there is
no guarantee that there will not be more mbufs when
drbr_dequeue() is actually called. Provided
the tx queue lock is held there will not be less.
RETURN VALUES¶
The
drbr_enqueue() function returns
ENOBUFS if there are no slots available in
the buf_ring and
0 on success.
The
drbr_dequeue() and
drbr_dequeue_cond() functions return an
mbuf on success and
NULL if the buf_ring is
empty.
HISTORY¶
These functions were introduced in
FreeBSD 8.0.