DRBR(9) | Kernel Developer's Manual | DRBR(9) |
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.
September 27, 2012 | Debian |