drbr
, drbr_free
,
drbr_enqueue
, drbr_dequeue
,
drbr_dequeue_cond
, drbr_flush
,
drbr_empty
, drbr_inuse
,
—
network driver interface to buf_ring
#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);
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.
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.
These functions were introduced in FreeBSD 8.0.