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.