NAME
ALTQ
—
kernel interfaces for manipulating
output queues on network interfaces
SYNOPSIS
#include
<sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/ifq_var.h>
static int
ifq_enqueue
(struct
ifaltq *_ifq, struct mbuf
*_m, struct altq_pktattr
*_pa);
static int
ifq_handoff
(struct
ifnet *_ifp, struct mbuf
*_m, struct altq_pktattr
*_pa);
struct mbuf *
ifq_dequeue
(struct
ifaltq *_ifq, struct mbuf
*_mpolled);
struct mbuf *
ifq_poll
(struct
ifaltq *_ifq);
void
ifq_purge
(struct
ifaltq *_ifq);
void
ifq_classify
(struct
ifaltq *_ifq, struct mbuf
*_m, uint8_t _af,
struct altq_pktattr
*_pa);
int
ifq_is_empty
(struct
ifaltq *_ifq);
void
ifq_set_maxlen
(struct
ifaltq *_ifq, int
_len);
void
ifq_set_ready
(struct
ifaltq *_ifq);
int
ifq_is_enabled
(struct
ifaltq *_ifq);
DESCRIPTION
TheALTQ
system is a framework to manage queueing
disciplines on network interfaces. ALTQ
introduces new
functions to manipulate output queues. The output queue functions are used to
abstract queue operations and not to touch the internal fields of the output
queue structure.
ifq_enqueue
()
and
ifq_handoff
()
enqueue a packet _m to the queue
_ifq. The underlying queueing discipline may discard
the packet. They return 0 on success, or ENOBUFS
if
the packet is discarded. The packet pointed to by _m
will be freed by the device driver on success or by the queueing discipline
on failure, so that the caller should not touch _m
after calling ifq_enqueue
().
ifq_handoff
() combines the enqueue operation with
statistic generation and calls
if_start
()
upon successful enqueue to initiate the actual send.
ifq_dequeue
()
dequeues a packet from the queue. It returns the dequeued packet, or
NULL
if no packet is dequeued. The caller must
always check the return value since a non-empty queue could return
NULL
under rate-limiting.
ifq_poll
()
returns the next packet without removing it from the queue. It is guaranteed
by the underlying queueing discipline that
ifq_dequeue
() immediately after
ifq_poll
() returns the same packet.
ifq_purge
()
discards all the packets in the queue. The purge operation is needed since a
non-work conserving queue cannot be emptied by a dequeue loop.
ifq_classify
()
classifies a packet to a scheduling class, and returns the result in
_pa.
ifq_is_empty
()
can be used to check if the queue is empty. Note that
ifq_dequeue
() could still return
NULL
if the queueing discipline is non-work
conserving.
ifq_set_maxlen
()
sets the queue length limit to the default FIFO queue.
ifq_set_ready
()
sets a flag to indicate that this driver is converted to use the new macros.
ALTQ
can be enabled only on interfaces with this
flag.
ifq_is_enabled
()
returns 1 if ALTQ
is enabled for the queue, 0 if
not.
QUEUEING DISCIPLINES
Queueing disciplines need to maintain
ifq_len (used by
ifq_is_empty
()). Queueing disciplines also need to
guarantee that the same mbuf is returned if
ifq_dequeue
() is called immediately after
ifq_poll
().
SEE ALSO
HISTORY
The ALTQ
system first appeared in March
1997 and was imported into DragonFly 1.1.