xref: /dragonfly/sys/net/ifq_var.h (revision e2292763)
14d723e5aSJoerg Sonnenberger /*-
24d723e5aSJoerg Sonnenberger  * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
34d723e5aSJoerg Sonnenberger  *
44d723e5aSJoerg Sonnenberger  * Redistribution and use in source and binary forms, with or without
54d723e5aSJoerg Sonnenberger  * modification, are permitted provided that the following conditions
64d723e5aSJoerg Sonnenberger  * are met:
74d723e5aSJoerg Sonnenberger  *
84d723e5aSJoerg Sonnenberger  * 1. Redistributions of source code must retain the above copyright
94d723e5aSJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer.
104d723e5aSJoerg Sonnenberger  * 2. Redistributions in binary form must reproduce the above copyright
114d723e5aSJoerg Sonnenberger  *    notice, this list of conditions and the following disclaimer in
124d723e5aSJoerg Sonnenberger  *    the documentation and/or other materials provided with the
134d723e5aSJoerg Sonnenberger  *    distribution.
144d723e5aSJoerg Sonnenberger  * 3. Neither the name of The DragonFly Project nor the names of its
154d723e5aSJoerg Sonnenberger  *    contributors may be used to endorse or promote products derived
164d723e5aSJoerg Sonnenberger  *    from this software without specific, prior written permission.
174d723e5aSJoerg Sonnenberger  *
184d723e5aSJoerg Sonnenberger  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
194d723e5aSJoerg Sonnenberger  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
204d723e5aSJoerg Sonnenberger  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
214d723e5aSJoerg Sonnenberger  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
224d723e5aSJoerg Sonnenberger  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
234d723e5aSJoerg Sonnenberger  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
244d723e5aSJoerg Sonnenberger  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
254d723e5aSJoerg Sonnenberger  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
264d723e5aSJoerg Sonnenberger  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
274d723e5aSJoerg Sonnenberger  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
284d723e5aSJoerg Sonnenberger  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
294d723e5aSJoerg Sonnenberger  * SUCH DAMAGE.
304d723e5aSJoerg Sonnenberger  */
3178195a76SMatthew Dillon 
321bd40720SMatthew Dillon #ifndef _NET_IFQ_VAR_H_
331bd40720SMatthew Dillon #define _NET_IFQ_VAR_H_
344d723e5aSJoerg Sonnenberger 
3503d6a592SMatthew Dillon #ifndef _KERNEL
3603d6a592SMatthew Dillon #error "This file should not be included by userland programs."
3774f8b40cSSepherosa Ziehau #endif
3803d6a592SMatthew Dillon 
3903d6a592SMatthew Dillon #ifndef _SYS_SYSTM_H_
401bd40720SMatthew Dillon #include <sys/systm.h>
411bd40720SMatthew Dillon #endif
421bd40720SMatthew Dillon #ifndef _SYS_SERIALIZE_H_
431bd40720SMatthew Dillon #include <sys/serialize.h>
441bd40720SMatthew Dillon #endif
451bd40720SMatthew Dillon #ifndef _SYS_MBUF_H_
461bd40720SMatthew Dillon #include <sys/mbuf.h>
471bd40720SMatthew Dillon #endif
481bd40720SMatthew Dillon #ifndef _NET_IF_VAR_H_
491bd40720SMatthew Dillon #include <net/if_var.h>
501bd40720SMatthew Dillon #endif
511bd40720SMatthew Dillon #ifndef _NET_ALTQ_IF_ALTQ_H_
521bd40720SMatthew Dillon #include <net/altq/if_altq.h>
531bd40720SMatthew Dillon #endif
541bd40720SMatthew Dillon 
55f0a26983SSepherosa Ziehau #define ASSERT_ALTQ_SQ_DEFAULT(ifp, ifsq) \
56f0a26983SSepherosa Ziehau 	KASSERT(ifsq_get_ifp((ifsq)) == (ifp) && \
57f0a26983SSepherosa Ziehau 	    ifsq_get_index((ifsq)) == ALTQ_SUBQ_INDEX_DEFAULT, \
58f0a26983SSepherosa Ziehau 	    ("not ifp's default subqueue"));
59f0a26983SSepherosa Ziehau 
601bd40720SMatthew Dillon struct ifaltq;
618a248085SSepherosa Ziehau struct ifaltq_subque;
628a248085SSepherosa Ziehau 
6374f8b40cSSepherosa Ziehau /*
6474f8b40cSSepherosa Ziehau  * Subqueue watchdog
6574f8b40cSSepherosa Ziehau  */
668a248085SSepherosa Ziehau typedef void	(*ifsq_watchdog_t)(struct ifaltq_subque *);
678a248085SSepherosa Ziehau 
688a248085SSepherosa Ziehau struct ifsubq_watchdog {
698a248085SSepherosa Ziehau 	struct callout	wd_callout;
708a248085SSepherosa Ziehau 	int		wd_timer;
71*e2292763SMatthew Dillon 	int		wd_flags;
728a248085SSepherosa Ziehau 	struct ifaltq_subque *wd_subq;
738a248085SSepherosa Ziehau 	ifsq_watchdog_t	wd_watchdog;
748a248085SSepherosa Ziehau };
754986965bSJoerg Sonnenberger 
76*e2292763SMatthew Dillon #define IF_WDOG_ALLTICKS	0x00000001
77*e2292763SMatthew Dillon #define IF_WDOG_LASTTICK	0x00000002
78*e2292763SMatthew Dillon 
799db4b353SSepherosa Ziehau /*
80058d1cd0SSepherosa Ziehau  * Support for "classic" ALTQ interfaces.
819db4b353SSepherosa Ziehau  */
82f0a26983SSepherosa Ziehau int		ifsq_classic_enqueue(struct ifaltq_subque *, struct mbuf *,
839db4b353SSepherosa Ziehau 		    struct altq_pktattr *);
846dadc833SSepherosa Ziehau struct mbuf	*ifsq_classic_dequeue(struct ifaltq_subque *, int);
85f0a26983SSepherosa Ziehau int		ifsq_classic_request(struct ifaltq_subque *, int, void *);
869db4b353SSepherosa Ziehau void		ifq_set_classic(struct ifaltq *);
879db4b353SSepherosa Ziehau 
880faec0d1SSepherosa Ziehau void		ifq_set_maxlen(struct ifaltq *, int);
892cc2f639SSepherosa Ziehau void		ifq_set_methods(struct ifaltq *, altq_mapsubq_t,
902cc2f639SSepherosa Ziehau 		    ifsq_enqueue_t, ifsq_dequeue_t, ifsq_request_t);
912cc2f639SSepherosa Ziehau int		ifq_mapsubq_default(struct ifaltq *, int);
9268732d8fSSepherosa Ziehau int		ifq_mapsubq_modulo(struct ifaltq *, int);
93f0a26983SSepherosa Ziehau 
94f0a26983SSepherosa Ziehau void		ifsq_devstart(struct ifaltq_subque *ifsq);
95f0a26983SSepherosa Ziehau void		ifsq_devstart_sched(struct ifaltq_subque *ifsq);
96058d1cd0SSepherosa Ziehau 
978a248085SSepherosa Ziehau void		ifsq_watchdog_init(struct ifsubq_watchdog *,
98*e2292763SMatthew Dillon 		    struct ifaltq_subque *, ifsq_watchdog_t, int);
998a248085SSepherosa Ziehau void		ifsq_watchdog_start(struct ifsubq_watchdog *);
1008a248085SSepherosa Ziehau void		ifsq_watchdog_stop(struct ifsubq_watchdog *);
101*e2292763SMatthew Dillon void		ifsq_watchdog_set_count(struct ifsubq_watchdog *, int);
1028a248085SSepherosa Ziehau 
103058d1cd0SSepherosa Ziehau /*
104058d1cd0SSepherosa Ziehau  * Dispatch a packet to an interface.
105058d1cd0SSepherosa Ziehau  */
1069db4b353SSepherosa Ziehau int		ifq_dispatch(struct ifnet *, struct mbuf *,
1079db4b353SSepherosa Ziehau 		    struct altq_pktattr *);
1089db4b353SSepherosa Ziehau 
1094d723e5aSJoerg Sonnenberger #ifdef ALTQ
110058d1cd0SSepherosa Ziehau 
1114d723e5aSJoerg Sonnenberger static __inline int
ifq_is_enabled(struct ifaltq * _ifq)1124d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq)
1134d723e5aSJoerg Sonnenberger {
1144d723e5aSJoerg Sonnenberger 	return(_ifq->altq_flags & ALTQF_ENABLED);
1154d723e5aSJoerg Sonnenberger }
1164d723e5aSJoerg Sonnenberger 
1174d723e5aSJoerg Sonnenberger static __inline int
ifq_is_attached(struct ifaltq * _ifq)1184d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq)
1194d723e5aSJoerg Sonnenberger {
1204d723e5aSJoerg Sonnenberger 	return(_ifq->altq_disc != NULL);
1214d723e5aSJoerg Sonnenberger }
122058d1cd0SSepherosa Ziehau 
123058d1cd0SSepherosa Ziehau #else	/* !ALTQ */
124058d1cd0SSepherosa Ziehau 
1254d723e5aSJoerg Sonnenberger static __inline int
ifq_is_enabled(struct ifaltq * _ifq)1264d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq)
1274d723e5aSJoerg Sonnenberger {
1284d723e5aSJoerg Sonnenberger 	return(0);
1294d723e5aSJoerg Sonnenberger }
1304d723e5aSJoerg Sonnenberger 
1314d723e5aSJoerg Sonnenberger static __inline int
ifq_is_attached(struct ifaltq * _ifq)1324d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq)
1334d723e5aSJoerg Sonnenberger {
1344d723e5aSJoerg Sonnenberger 	return(0);
1354d723e5aSJoerg Sonnenberger }
1364d723e5aSJoerg Sonnenberger 
137058d1cd0SSepherosa Ziehau #endif	/* ALTQ */
138058d1cd0SSepherosa Ziehau 
1394d723e5aSJoerg Sonnenberger static __inline int
ifq_is_ready(struct ifaltq * _ifq)1404d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq)
1414d723e5aSJoerg Sonnenberger {
1424d723e5aSJoerg Sonnenberger 	return(_ifq->altq_flags & ALTQF_READY);
1434d723e5aSJoerg Sonnenberger }
1444d723e5aSJoerg Sonnenberger 
1454d723e5aSJoerg Sonnenberger static __inline void
ifq_set_ready(struct ifaltq * _ifq)1464d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq)
1474d723e5aSJoerg Sonnenberger {
1484d723e5aSJoerg Sonnenberger 	_ifq->altq_flags |= ALTQF_READY;
1494d723e5aSJoerg Sonnenberger }
1504d723e5aSJoerg Sonnenberger 
15178195a76SMatthew Dillon /*
15274f8b40cSSepherosa Ziehau  * Subqueue lock must be held
15378195a76SMatthew Dillon  */
1544d723e5aSJoerg Sonnenberger static __inline int
ifsq_enqueue_locked(struct ifaltq_subque * _ifsq,struct mbuf * _m,struct altq_pktattr * _pa)155f0a26983SSepherosa Ziehau ifsq_enqueue_locked(struct ifaltq_subque *_ifsq, struct mbuf *_m,
1569db4b353SSepherosa Ziehau     struct altq_pktattr *_pa)
1579db4b353SSepherosa Ziehau {
1589db4b353SSepherosa Ziehau #ifdef ALTQ
159f0a26983SSepherosa Ziehau 	if (!ifq_is_enabled(_ifsq->ifsq_altq))
160f0a26983SSepherosa Ziehau 		return ifsq_classic_enqueue(_ifsq, _m, _pa);
1619db4b353SSepherosa Ziehau 	else
1629db4b353SSepherosa Ziehau #endif
163f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_enqueue(_ifsq, _m, _pa);
1649db4b353SSepherosa Ziehau }
1659db4b353SSepherosa Ziehau 
1669db4b353SSepherosa Ziehau static __inline int
ifsq_enqueue(struct ifaltq_subque * _ifsq,struct mbuf * _m,struct altq_pktattr * _pa)167f0a26983SSepherosa Ziehau ifsq_enqueue(struct ifaltq_subque *_ifsq, struct mbuf *_m,
168f0a26983SSepherosa Ziehau     struct altq_pktattr *_pa)
1694d723e5aSJoerg Sonnenberger {
1709db4b353SSepherosa Ziehau 	int _error;
1719db4b353SSepherosa Ziehau 
172f0a26983SSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
173f0a26983SSepherosa Ziehau 	_error = ifsq_enqueue_locked(_ifsq, _m, _pa);
174f0a26983SSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
1759db4b353SSepherosa Ziehau 	return _error;
1764d723e5aSJoerg Sonnenberger }
1774d723e5aSJoerg Sonnenberger 
1784d723e5aSJoerg Sonnenberger static __inline struct mbuf *
ifsq_dequeue(struct ifaltq_subque * _ifsq)179ac9843a1SSepherosa Ziehau ifsq_dequeue(struct ifaltq_subque *_ifsq)
1804d723e5aSJoerg Sonnenberger {
1819db4b353SSepherosa Ziehau 	struct mbuf *_m;
1829db4b353SSepherosa Ziehau 
183f0a26983SSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
184f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_prepended != NULL) {
185f0a26983SSepherosa Ziehau 		_m = _ifsq->ifsq_prepended;
186f0a26983SSepherosa Ziehau 		_ifsq->ifsq_prepended = NULL;
18768dc1916SSepherosa Ziehau 		ALTQ_SQ_CNTR_DEC(_ifsq, _m->m_pkthdr.len);
188f0a26983SSepherosa Ziehau 		ALTQ_SQ_UNLOCK(_ifsq);
1899db4b353SSepherosa Ziehau 		return _m;
1909db4b353SSepherosa Ziehau 	}
1919db4b353SSepherosa Ziehau 
1924d723e5aSJoerg Sonnenberger #ifdef ALTQ
193f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_altq->altq_tbr != NULL)
194ac9843a1SSepherosa Ziehau 		_m = tbr_dequeue(_ifsq, ALTDQ_REMOVE);
195f0a26983SSepherosa Ziehau 	else if (!ifq_is_enabled(_ifsq->ifsq_altq))
1966dadc833SSepherosa Ziehau 		_m = ifsq_classic_dequeue(_ifsq, ALTDQ_REMOVE);
1979db4b353SSepherosa Ziehau 	else
1984d723e5aSJoerg Sonnenberger #endif
1996dadc833SSepherosa Ziehau 	_m = _ifsq->ifsq_dequeue(_ifsq, ALTDQ_REMOVE);
200f0a26983SSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
2019db4b353SSepherosa Ziehau 	return _m;
2024d723e5aSJoerg Sonnenberger }
2034d723e5aSJoerg Sonnenberger 
20478195a76SMatthew Dillon /*
20574f8b40cSSepherosa Ziehau  * Subqueue lock must be held
20678195a76SMatthew Dillon  */
2074d723e5aSJoerg Sonnenberger static __inline struct mbuf *
ifsq_poll_locked(struct ifaltq_subque * _ifsq)208f0a26983SSepherosa Ziehau ifsq_poll_locked(struct ifaltq_subque *_ifsq)
2094d723e5aSJoerg Sonnenberger {
210f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_prepended != NULL)
211f0a26983SSepherosa Ziehau 		return _ifsq->ifsq_prepended;
2129db4b353SSepherosa Ziehau 
2134d723e5aSJoerg Sonnenberger #ifdef ALTQ
214f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_altq->altq_tbr != NULL)
215ac9843a1SSepherosa Ziehau 		return tbr_dequeue(_ifsq, ALTDQ_POLL);
216f0a26983SSepherosa Ziehau 	else if (!ifq_is_enabled(_ifsq->ifsq_altq))
2176dadc833SSepherosa Ziehau 		return ifsq_classic_dequeue(_ifsq, ALTDQ_POLL);
2189db4b353SSepherosa Ziehau 	else
2194d723e5aSJoerg Sonnenberger #endif
2206dadc833SSepherosa Ziehau 	return _ifsq->ifsq_dequeue(_ifsq, ALTDQ_POLL);
2219db4b353SSepherosa Ziehau }
2229db4b353SSepherosa Ziehau 
2239db4b353SSepherosa Ziehau static __inline struct mbuf *
ifsq_poll(struct ifaltq_subque * _ifsq)224f0a26983SSepherosa Ziehau ifsq_poll(struct ifaltq_subque *_ifsq)
2259db4b353SSepherosa Ziehau {
2269db4b353SSepherosa Ziehau 	struct mbuf *_m;
2279db4b353SSepherosa Ziehau 
228f0a26983SSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
229f0a26983SSepherosa Ziehau 	_m = ifsq_poll_locked(_ifsq);
230f0a26983SSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
2319db4b353SSepherosa Ziehau 	return _m;
2324d723e5aSJoerg Sonnenberger }
2334d723e5aSJoerg Sonnenberger 
23413f46fcaSSepherosa Ziehau static __inline int
ifsq_poll_pktlen(struct ifaltq_subque * _ifsq)23513f46fcaSSepherosa Ziehau ifsq_poll_pktlen(struct ifaltq_subque *_ifsq)
23613f46fcaSSepherosa Ziehau {
23713f46fcaSSepherosa Ziehau 	struct mbuf *_m;
23813f46fcaSSepherosa Ziehau 	int _len = 0;
23913f46fcaSSepherosa Ziehau 
24013f46fcaSSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
24113f46fcaSSepherosa Ziehau 
24213f46fcaSSepherosa Ziehau 	_m = ifsq_poll_locked(_ifsq);
24313f46fcaSSepherosa Ziehau 	if (_m != NULL) {
24413f46fcaSSepherosa Ziehau 		M_ASSERTPKTHDR(_m);
24513f46fcaSSepherosa Ziehau 		_len = _m->m_pkthdr.len;
24613f46fcaSSepherosa Ziehau 	}
24713f46fcaSSepherosa Ziehau 
24813f46fcaSSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
24913f46fcaSSepherosa Ziehau 
25013f46fcaSSepherosa Ziehau 	return _len;
25113f46fcaSSepherosa Ziehau }
25213f46fcaSSepherosa Ziehau 
25378195a76SMatthew Dillon /*
25474f8b40cSSepherosa Ziehau  * Subqueue lock must be held
25578195a76SMatthew Dillon  */
2564d723e5aSJoerg Sonnenberger static __inline void
ifsq_purge_locked(struct ifaltq_subque * _ifsq)257f0a26983SSepherosa Ziehau ifsq_purge_locked(struct ifaltq_subque *_ifsq)
2589db4b353SSepherosa Ziehau {
259f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_prepended != NULL) {
26068dc1916SSepherosa Ziehau 		ALTQ_SQ_CNTR_DEC(_ifsq, _ifsq->ifsq_prepended->m_pkthdr.len);
261f0a26983SSepherosa Ziehau 		m_freem(_ifsq->ifsq_prepended);
262f0a26983SSepherosa Ziehau 		_ifsq->ifsq_prepended = NULL;
2639db4b353SSepherosa Ziehau 	}
2649db4b353SSepherosa Ziehau 
2659db4b353SSepherosa Ziehau #ifdef ALTQ
266f0a26983SSepherosa Ziehau 	if (!ifq_is_enabled(_ifsq->ifsq_altq))
267f0a26983SSepherosa Ziehau 		ifsq_classic_request(_ifsq, ALTRQ_PURGE, NULL);
2689db4b353SSepherosa Ziehau 	else
2699db4b353SSepherosa Ziehau #endif
270f0a26983SSepherosa Ziehau 	_ifsq->ifsq_request(_ifsq, ALTRQ_PURGE, NULL);
2719db4b353SSepherosa Ziehau }
2729db4b353SSepherosa Ziehau 
2739db4b353SSepherosa Ziehau static __inline void
ifsq_purge(struct ifaltq_subque * _ifsq)274f0a26983SSepherosa Ziehau ifsq_purge(struct ifaltq_subque *_ifsq)
2754d723e5aSJoerg Sonnenberger {
276f0a26983SSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
277f0a26983SSepherosa Ziehau 	ifsq_purge_locked(_ifsq);
278f0a26983SSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
279f0a26983SSepherosa Ziehau }
280f0a26983SSepherosa Ziehau 
281f0a26983SSepherosa Ziehau static __inline void
ifq_lock_all(struct ifaltq * _ifq)282f0a26983SSepherosa Ziehau ifq_lock_all(struct ifaltq *_ifq)
283f0a26983SSepherosa Ziehau {
284f0a26983SSepherosa Ziehau 	int _q;
285f0a26983SSepherosa Ziehau 
286f0a26983SSepherosa Ziehau 	for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q)
287f0a26983SSepherosa Ziehau 		ALTQ_SQ_LOCK(&_ifq->altq_subq[_q]);
288f0a26983SSepherosa Ziehau }
289f0a26983SSepherosa Ziehau 
290f0a26983SSepherosa Ziehau static __inline void
ifq_unlock_all(struct ifaltq * _ifq)291f0a26983SSepherosa Ziehau ifq_unlock_all(struct ifaltq *_ifq)
292f0a26983SSepherosa Ziehau {
293f0a26983SSepherosa Ziehau 	int _q;
294f0a26983SSepherosa Ziehau 
295f0a26983SSepherosa Ziehau 	for (_q = _ifq->altq_subq_cnt - 1; _q >= 0; --_q)
296f0a26983SSepherosa Ziehau 		ALTQ_SQ_UNLOCK(&_ifq->altq_subq[_q]);
2974d723e5aSJoerg Sonnenberger }
2984d723e5aSJoerg Sonnenberger 
29978195a76SMatthew Dillon /*
30074f8b40cSSepherosa Ziehau  * All of the subqueue locks must be held
30178195a76SMatthew Dillon  */
3024d723e5aSJoerg Sonnenberger static __inline void
ifq_purge_all_locked(struct ifaltq * _ifq)3039275f515SSepherosa Ziehau ifq_purge_all_locked(struct ifaltq *_ifq)
3049275f515SSepherosa Ziehau {
305f0a26983SSepherosa Ziehau 	int _q;
306f0a26983SSepherosa Ziehau 
307f0a26983SSepherosa Ziehau 	for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q)
308f0a26983SSepherosa Ziehau 		ifsq_purge_locked(&_ifq->altq_subq[_q]);
3099275f515SSepherosa Ziehau }
3109275f515SSepherosa Ziehau 
3119275f515SSepherosa Ziehau static __inline void
ifq_purge_all(struct ifaltq * _ifq)3129275f515SSepherosa Ziehau ifq_purge_all(struct ifaltq *_ifq)
3139275f515SSepherosa Ziehau {
314f0a26983SSepherosa Ziehau 	ifq_lock_all(_ifq);
3159275f515SSepherosa Ziehau 	ifq_purge_all_locked(_ifq);
316f0a26983SSepherosa Ziehau 	ifq_unlock_all(_ifq);
3179275f515SSepherosa Ziehau }
3189275f515SSepherosa Ziehau 
3199275f515SSepherosa Ziehau static __inline void
ifq_classify(struct ifaltq * _ifq,struct mbuf * _m,uint8_t _af,struct altq_pktattr * _pa)3204d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af,
3214d723e5aSJoerg Sonnenberger     struct altq_pktattr *_pa)
3224d723e5aSJoerg Sonnenberger {
3239db4b353SSepherosa Ziehau #ifdef ALTQ
3249db4b353SSepherosa Ziehau 	if (ifq_is_enabled(_ifq)) {
3254d723e5aSJoerg Sonnenberger 		_pa->pattr_af = _af;
3264d723e5aSJoerg Sonnenberger 		_pa->pattr_hdr = mtod(_m, caddr_t);
327f0a26983SSepherosa Ziehau 		if (ifq_is_enabled(_ifq) &&
328f0a26983SSepherosa Ziehau 		    (_ifq->altq_flags & ALTQF_CLASSIFY)) {
329f0a26983SSepherosa Ziehau 			/* XXX default subqueue */
330f0a26983SSepherosa Ziehau 			struct ifaltq_subque *_ifsq =
331f0a26983SSepherosa Ziehau 			    &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT];
332f0a26983SSepherosa Ziehau 
333f0a26983SSepherosa Ziehau 			ALTQ_SQ_LOCK(_ifsq);
334f0a26983SSepherosa Ziehau 			if (ifq_is_enabled(_ifq) &&
335f0a26983SSepherosa Ziehau 			    (_ifq->altq_flags & ALTQF_CLASSIFY))
3369db4b353SSepherosa Ziehau 				_ifq->altq_classify(_ifq, _m, _pa);
337f0a26983SSepherosa Ziehau 			ALTQ_SQ_UNLOCK(_ifsq);
3389db4b353SSepherosa Ziehau 		}
339f0a26983SSepherosa Ziehau 	}
3409db4b353SSepherosa Ziehau #endif
3419db4b353SSepherosa Ziehau }
3429db4b353SSepherosa Ziehau 
3439db4b353SSepherosa Ziehau static __inline void
ifsq_prepend(struct ifaltq_subque * _ifsq,struct mbuf * _m)344f0a26983SSepherosa Ziehau ifsq_prepend(struct ifaltq_subque *_ifsq, struct mbuf *_m)
3459db4b353SSepherosa Ziehau {
346f0a26983SSepherosa Ziehau 	ALTQ_SQ_LOCK(_ifsq);
347f0a26983SSepherosa Ziehau 	KASSERT(_ifsq->ifsq_prepended == NULL, ("pending prepended mbuf"));
348f0a26983SSepherosa Ziehau 	_ifsq->ifsq_prepended = _m;
34968dc1916SSepherosa Ziehau 	ALTQ_SQ_CNTR_INC(_ifsq, _m->m_pkthdr.len);
350f0a26983SSepherosa Ziehau 	ALTQ_SQ_UNLOCK(_ifsq);
3514d723e5aSJoerg Sonnenberger }
3524d723e5aSJoerg Sonnenberger 
353058d1cd0SSepherosa Ziehau /*
35474f8b40cSSepherosa Ziehau  * Subqueue hardware serializer must be held
355058d1cd0SSepherosa Ziehau  */
3569ed293e0SSepherosa Ziehau static __inline void
ifsq_set_oactive(struct ifaltq_subque * _ifsq)357f0a26983SSepherosa Ziehau ifsq_set_oactive(struct ifaltq_subque *_ifsq)
3589ed293e0SSepherosa Ziehau {
359f0a26983SSepherosa Ziehau 	_ifsq->ifsq_hw_oactive = 1;
3609ed293e0SSepherosa Ziehau }
3619ed293e0SSepherosa Ziehau 
362058d1cd0SSepherosa Ziehau /*
36374f8b40cSSepherosa Ziehau  * Subqueue hardware serializer must be held
364058d1cd0SSepherosa Ziehau  */
3659ed293e0SSepherosa Ziehau static __inline void
ifsq_clr_oactive(struct ifaltq_subque * _ifsq)366f0a26983SSepherosa Ziehau ifsq_clr_oactive(struct ifaltq_subque *_ifsq)
3679ed293e0SSepherosa Ziehau {
368f0a26983SSepherosa Ziehau 	_ifsq->ifsq_hw_oactive = 0;
3699ed293e0SSepherosa Ziehau }
3709ed293e0SSepherosa Ziehau 
371058d1cd0SSepherosa Ziehau /*
37274f8b40cSSepherosa Ziehau  * Subqueue hardware serializer must be held
373058d1cd0SSepherosa Ziehau  */
3749ed293e0SSepherosa Ziehau static __inline int
ifsq_is_oactive(const struct ifaltq_subque * _ifsq)375f0a26983SSepherosa Ziehau ifsq_is_oactive(const struct ifaltq_subque *_ifsq)
3769ed293e0SSepherosa Ziehau {
377f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_hw_oactive;
3789ed293e0SSepherosa Ziehau }
3799ed293e0SSepherosa Ziehau 
38078195a76SMatthew Dillon /*
38174f8b40cSSepherosa Ziehau  * Hand a packet to the interface's default subqueue.
38278195a76SMatthew Dillon  *
38374f8b40cSSepherosa Ziehau  * The default subqueue hardware serializer must be held.  If the
38474f8b40cSSepherosa Ziehau  * subqueue hardware serializer is not held yet, ifq_dispatch()
38574f8b40cSSepherosa Ziehau  * should be used to get better performance.
38678195a76SMatthew Dillon  */
3874d723e5aSJoerg Sonnenberger static __inline int
ifq_handoff(struct ifnet * _ifp,struct mbuf * _m,struct altq_pktattr * _pa)3884d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa)
3894d723e5aSJoerg Sonnenberger {
390f0a26983SSepherosa Ziehau 	struct ifaltq_subque *_ifsq;
3914986965bSJoerg Sonnenberger 	int _error;
392f0a26983SSepherosa Ziehau 	int _qid = ALTQ_SUBQ_INDEX_DEFAULT; /* XXX default subqueue */
393f0a26983SSepherosa Ziehau 
394f0a26983SSepherosa Ziehau 	_ifsq = &_ifp->if_snd.altq_subq[_qid];
3954d723e5aSJoerg Sonnenberger 
396bfefe4a6SSepherosa Ziehau 	ASSERT_ALTQ_SQ_SERIALIZED_HW(_ifsq);
397f0a26983SSepherosa Ziehau 	_error = ifsq_enqueue(_ifsq, _m, _pa);
3984d723e5aSJoerg Sonnenberger 	if (_error == 0) {
399d40991efSSepherosa Ziehau 		IFNET_STAT_INC(_ifp, obytes, _m->m_pkthdr.len);
4004d723e5aSJoerg Sonnenberger 		if (_m->m_flags & M_MCAST)
401d40991efSSepherosa Ziehau 			IFNET_STAT_INC(_ifp, omcasts, 1);
402f0a26983SSepherosa Ziehau 		if (!ifsq_is_oactive(_ifsq))
403f0a26983SSepherosa Ziehau 			(*_ifp->if_start)(_ifp, _ifsq);
4046de344baSSepherosa Ziehau 	} else {
4056de344baSSepherosa Ziehau 		IFNET_STAT_INC(_ifp, oqdrops, 1);
4064d723e5aSJoerg Sonnenberger 	}
4074d723e5aSJoerg Sonnenberger 	return(_error);
4084d723e5aSJoerg Sonnenberger }
4094d723e5aSJoerg Sonnenberger 
4104d723e5aSJoerg Sonnenberger static __inline int
ifsq_is_empty(const struct ifaltq_subque * _ifsq)411f0a26983SSepherosa Ziehau ifsq_is_empty(const struct ifaltq_subque *_ifsq)
4124d723e5aSJoerg Sonnenberger {
413b21c2105SSepherosa Ziehau 	return(_ifsq->ifsq_len == 0);
4144d723e5aSJoerg Sonnenberger }
4154d723e5aSJoerg Sonnenberger 
416058d1cd0SSepherosa Ziehau /*
41774f8b40cSSepherosa Ziehau  * Subqueue lock must be held
418058d1cd0SSepherosa Ziehau  */
4199db4b353SSepherosa Ziehau static __inline int
ifsq_data_ready(struct ifaltq_subque * _ifsq)420f0a26983SSepherosa Ziehau ifsq_data_ready(struct ifaltq_subque *_ifsq)
4219db4b353SSepherosa Ziehau {
4229db4b353SSepherosa Ziehau #ifdef ALTQ
423f0a26983SSepherosa Ziehau 	if (_ifsq->ifsq_altq->altq_tbr != NULL)
424f0a26983SSepherosa Ziehau 		return (ifsq_poll_locked(_ifsq) != NULL);
4259db4b353SSepherosa Ziehau 	else
4269db4b353SSepherosa Ziehau #endif
427f0a26983SSepherosa Ziehau 	return !ifsq_is_empty(_ifsq);
4289db4b353SSepherosa Ziehau }
429b2f93efeSJoerg Sonnenberger 
430acf18b65SSepherosa Ziehau /*
43174f8b40cSSepherosa Ziehau  * Subqueue lock must be held
432acf18b65SSepherosa Ziehau  */
433acf18b65SSepherosa Ziehau static __inline int
ifsq_is_started(const struct ifaltq_subque * _ifsq)434f0a26983SSepherosa Ziehau ifsq_is_started(const struct ifaltq_subque *_ifsq)
435acf18b65SSepherosa Ziehau {
436f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_started;
437acf18b65SSepherosa Ziehau }
438acf18b65SSepherosa Ziehau 
439acf18b65SSepherosa Ziehau /*
44074f8b40cSSepherosa Ziehau  * Subqueue lock must be held
441acf18b65SSepherosa Ziehau  */
442acf18b65SSepherosa Ziehau static __inline void
ifsq_set_started(struct ifaltq_subque * _ifsq)443f0a26983SSepherosa Ziehau ifsq_set_started(struct ifaltq_subque *_ifsq)
444acf18b65SSepherosa Ziehau {
445f0a26983SSepherosa Ziehau 	_ifsq->ifsq_started = 1;
446acf18b65SSepherosa Ziehau }
447acf18b65SSepherosa Ziehau 
448acf18b65SSepherosa Ziehau /*
44974f8b40cSSepherosa Ziehau  * Subqueue lock must be held
450acf18b65SSepherosa Ziehau  */
451acf18b65SSepherosa Ziehau static __inline void
ifsq_clr_started(struct ifaltq_subque * _ifsq)452f0a26983SSepherosa Ziehau ifsq_clr_started(struct ifaltq_subque *_ifsq)
453acf18b65SSepherosa Ziehau {
454f0a26983SSepherosa Ziehau 	_ifsq->ifsq_started = 0;
455acf18b65SSepherosa Ziehau }
456acf18b65SSepherosa Ziehau 
457f0a26983SSepherosa Ziehau static __inline struct ifsubq_stage *
ifsq_get_stage(struct ifaltq_subque * _ifsq,int _cpuid)458f0a26983SSepherosa Ziehau ifsq_get_stage(struct ifaltq_subque *_ifsq, int _cpuid)
459928e2027SSepherosa Ziehau {
460f0a26983SSepherosa Ziehau 	return &_ifsq->ifsq_stage[_cpuid];
461928e2027SSepherosa Ziehau }
462928e2027SSepherosa Ziehau 
463dfd3b18bSSepherosa Ziehau static __inline int
ifsq_get_cpuid(const struct ifaltq_subque * _ifsq)464f0a26983SSepherosa Ziehau ifsq_get_cpuid(const struct ifaltq_subque *_ifsq)
465dfd3b18bSSepherosa Ziehau {
466f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_cpuid;
467dfd3b18bSSepherosa Ziehau }
468dfd3b18bSSepherosa Ziehau 
469dfd3b18bSSepherosa Ziehau static __inline void
ifsq_set_cpuid(struct ifaltq_subque * _ifsq,int _cpuid)470f0a26983SSepherosa Ziehau ifsq_set_cpuid(struct ifaltq_subque *_ifsq, int _cpuid)
471dfd3b18bSSepherosa Ziehau {
472f0a26983SSepherosa Ziehau 	KASSERT(_cpuid >= 0 && _cpuid < ncpus,
473f0a26983SSepherosa Ziehau 	    ("invalid ifsq_cpuid %d", _cpuid));
474f0a26983SSepherosa Ziehau 	_ifsq->ifsq_cpuid = _cpuid;
475dfd3b18bSSepherosa Ziehau }
476dfd3b18bSSepherosa Ziehau 
47742fdf81eSSepherosa Ziehau static __inline struct lwkt_msg *
ifsq_get_ifstart_lmsg(struct ifaltq_subque * _ifsq,int _cpuid)478f0a26983SSepherosa Ziehau ifsq_get_ifstart_lmsg(struct ifaltq_subque *_ifsq, int _cpuid)
47942fdf81eSSepherosa Ziehau {
480f0a26983SSepherosa Ziehau 	return &_ifsq->ifsq_ifstart_nmsg[_cpuid].lmsg;
481f0a26983SSepherosa Ziehau }
482f0a26983SSepherosa Ziehau 
483f0a26983SSepherosa Ziehau static __inline int
ifsq_get_index(const struct ifaltq_subque * _ifsq)484f0a26983SSepherosa Ziehau ifsq_get_index(const struct ifaltq_subque *_ifsq)
485f0a26983SSepherosa Ziehau {
486f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_index;
487f0a26983SSepherosa Ziehau }
488f0a26983SSepherosa Ziehau 
489f0a26983SSepherosa Ziehau static __inline void
ifsq_set_priv(struct ifaltq_subque * _ifsq,void * _priv)490f0a26983SSepherosa Ziehau ifsq_set_priv(struct ifaltq_subque *_ifsq, void *_priv)
491f0a26983SSepherosa Ziehau {
492f0a26983SSepherosa Ziehau 	_ifsq->ifsq_hw_priv = _priv;
493f0a26983SSepherosa Ziehau }
494f0a26983SSepherosa Ziehau 
495f0a26983SSepherosa Ziehau static __inline void *
ifsq_get_priv(const struct ifaltq_subque * _ifsq)496f0a26983SSepherosa Ziehau ifsq_get_priv(const struct ifaltq_subque *_ifsq)
497f0a26983SSepherosa Ziehau {
498f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_hw_priv;
499f0a26983SSepherosa Ziehau }
500f0a26983SSepherosa Ziehau 
501f0a26983SSepherosa Ziehau static __inline struct ifnet *
ifsq_get_ifp(const struct ifaltq_subque * _ifsq)502f0a26983SSepherosa Ziehau ifsq_get_ifp(const struct ifaltq_subque *_ifsq)
503f0a26983SSepherosa Ziehau {
504f0a26983SSepherosa Ziehau 	return _ifsq->ifsq_ifp;
505f0a26983SSepherosa Ziehau }
506f0a26983SSepherosa Ziehau 
507bfefe4a6SSepherosa Ziehau static __inline void
ifsq_set_hw_serialize(struct ifaltq_subque * _ifsq,struct lwkt_serialize * _hwslz)508bfefe4a6SSepherosa Ziehau ifsq_set_hw_serialize(struct ifaltq_subque *_ifsq,
509bfefe4a6SSepherosa Ziehau     struct lwkt_serialize *_hwslz)
510bfefe4a6SSepherosa Ziehau {
511bfefe4a6SSepherosa Ziehau 	KASSERT(_hwslz != NULL, ("NULL hw serialize"));
512bfefe4a6SSepherosa Ziehau 	KASSERT(_ifsq->ifsq_hw_serialize == NULL,
513bfefe4a6SSepherosa Ziehau 	    ("hw serialize has been setup"));
514bfefe4a6SSepherosa Ziehau 	_ifsq->ifsq_hw_serialize = _hwslz;
515bfefe4a6SSepherosa Ziehau }
516bfefe4a6SSepherosa Ziehau 
517bfefe4a6SSepherosa Ziehau static __inline void
ifsq_serialize_hw(struct ifaltq_subque * _ifsq)518bfefe4a6SSepherosa Ziehau ifsq_serialize_hw(struct ifaltq_subque *_ifsq)
519bfefe4a6SSepherosa Ziehau {
520bfefe4a6SSepherosa Ziehau 	lwkt_serialize_enter(_ifsq->ifsq_hw_serialize);
521bfefe4a6SSepherosa Ziehau }
522bfefe4a6SSepherosa Ziehau 
523bfefe4a6SSepherosa Ziehau static __inline void
ifsq_deserialize_hw(struct ifaltq_subque * _ifsq)524bfefe4a6SSepherosa Ziehau ifsq_deserialize_hw(struct ifaltq_subque *_ifsq)
525bfefe4a6SSepherosa Ziehau {
526bfefe4a6SSepherosa Ziehau 	lwkt_serialize_exit(_ifsq->ifsq_hw_serialize);
527bfefe4a6SSepherosa Ziehau }
528bfefe4a6SSepherosa Ziehau 
529bfefe4a6SSepherosa Ziehau static __inline int
ifsq_tryserialize_hw(struct ifaltq_subque * _ifsq)530bfefe4a6SSepherosa Ziehau ifsq_tryserialize_hw(struct ifaltq_subque *_ifsq)
531bfefe4a6SSepherosa Ziehau {
532bfefe4a6SSepherosa Ziehau 	return lwkt_serialize_try(_ifsq->ifsq_hw_serialize);
533bfefe4a6SSepherosa Ziehau }
534bfefe4a6SSepherosa Ziehau 
535f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque *
ifq_get_subq_default(const struct ifaltq * _ifq)536f0a26983SSepherosa Ziehau ifq_get_subq_default(const struct ifaltq *_ifq)
537f0a26983SSepherosa Ziehau {
538f0a26983SSepherosa Ziehau 	return &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT];
539f0a26983SSepherosa Ziehau }
540f0a26983SSepherosa Ziehau 
541f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque *
ifq_get_subq(const struct ifaltq * _ifq,int _idx)542f0a26983SSepherosa Ziehau ifq_get_subq(const struct ifaltq *_ifq, int _idx)
543f0a26983SSepherosa Ziehau {
544f0a26983SSepherosa Ziehau 	KASSERT(_idx >= 0 && _idx < _ifq->altq_subq_cnt,
545f0a26983SSepherosa Ziehau 	    ("invalid qid %d", _idx));
546f0a26983SSepherosa Ziehau 	return &_ifq->altq_subq[_idx];
547f0a26983SSepherosa Ziehau }
548f0a26983SSepherosa Ziehau 
5492cc2f639SSepherosa Ziehau static __inline struct ifaltq_subque *
ifq_map_subq(struct ifaltq * _ifq,int _cpuid)5502cc2f639SSepherosa Ziehau ifq_map_subq(struct ifaltq *_ifq, int _cpuid)
5512cc2f639SSepherosa Ziehau {
5522cc2f639SSepherosa Ziehau 	int _idx = _ifq->altq_mapsubq(_ifq, _cpuid);
5532cc2f639SSepherosa Ziehau 	return ifq_get_subq(_ifq, _idx);
5542cc2f639SSepherosa Ziehau }
5552cc2f639SSepherosa Ziehau 
5569469a4a2SSepherosa Ziehau static __inline void
ifq_set_subq_cnt(struct ifaltq * _ifq,int _cnt)5579469a4a2SSepherosa Ziehau ifq_set_subq_cnt(struct ifaltq *_ifq, int _cnt)
5589469a4a2SSepherosa Ziehau {
5599469a4a2SSepherosa Ziehau 	_ifq->altq_subq_cnt = _cnt;
5609469a4a2SSepherosa Ziehau }
5619469a4a2SSepherosa Ziehau 
562c3fb75ddSSepherosa Ziehau static __inline void
ifq_set_subq_divisor(struct ifaltq * _ifq,uint32_t _divisor)56368732d8fSSepherosa Ziehau ifq_set_subq_divisor(struct ifaltq *_ifq, uint32_t _divisor)
56468732d8fSSepherosa Ziehau {
56568732d8fSSepherosa Ziehau 
56668732d8fSSepherosa Ziehau 	KASSERT(_divisor > 0, ("invalid divisor %u", _divisor));
56768732d8fSSepherosa Ziehau 	KASSERT(_divisor <= _ifq->altq_subq_cnt,
56868732d8fSSepherosa Ziehau 	    ("invalid divisor %u, max %d", _divisor, _ifq->altq_subq_cnt));
56968732d8fSSepherosa Ziehau 	_ifq->altq_subq_mappriv = _divisor;
570c3fb75ddSSepherosa Ziehau }
571c3fb75ddSSepherosa Ziehau 
572f0a26983SSepherosa Ziehau /* COMPAT */
573f0a26983SSepherosa Ziehau static __inline int
ifq_is_oactive(const struct ifaltq * _ifq)574f0a26983SSepherosa Ziehau ifq_is_oactive(const struct ifaltq *_ifq)
575f0a26983SSepherosa Ziehau {
576f0a26983SSepherosa Ziehau 	return ifsq_is_oactive(ifq_get_subq_default(_ifq));
577f0a26983SSepherosa Ziehau }
578f0a26983SSepherosa Ziehau 
579f0a26983SSepherosa Ziehau /* COMPAT */
580f0a26983SSepherosa Ziehau static __inline void
ifq_set_oactive(struct ifaltq * _ifq)581f0a26983SSepherosa Ziehau ifq_set_oactive(struct ifaltq *_ifq)
582f0a26983SSepherosa Ziehau {
583f0a26983SSepherosa Ziehau 	ifsq_set_oactive(ifq_get_subq_default(_ifq));
584f0a26983SSepherosa Ziehau }
585f0a26983SSepherosa Ziehau 
586f0a26983SSepherosa Ziehau /* COMPAT */
587f0a26983SSepherosa Ziehau static __inline void
ifq_clr_oactive(struct ifaltq * _ifq)588f0a26983SSepherosa Ziehau ifq_clr_oactive(struct ifaltq *_ifq)
589f0a26983SSepherosa Ziehau {
590f0a26983SSepherosa Ziehau 	ifsq_clr_oactive(ifq_get_subq_default(_ifq));
591f0a26983SSepherosa Ziehau }
592f0a26983SSepherosa Ziehau 
593f0a26983SSepherosa Ziehau /* COMPAT */
594f0a26983SSepherosa Ziehau static __inline int
ifq_is_empty(struct ifaltq * _ifq)595f0a26983SSepherosa Ziehau ifq_is_empty(struct ifaltq *_ifq)
596f0a26983SSepherosa Ziehau {
597f0a26983SSepherosa Ziehau 	return ifsq_is_empty(ifq_get_subq_default(_ifq));
598f0a26983SSepherosa Ziehau }
599f0a26983SSepherosa Ziehau 
600f0a26983SSepherosa Ziehau /* COMPAT */
601f0a26983SSepherosa Ziehau static __inline void
ifq_purge(struct ifaltq * _ifq)602f0a26983SSepherosa Ziehau ifq_purge(struct ifaltq *_ifq)
603f0a26983SSepherosa Ziehau {
604f0a26983SSepherosa Ziehau 	ifsq_purge(ifq_get_subq_default(_ifq));
605f0a26983SSepherosa Ziehau }
606f0a26983SSepherosa Ziehau 
607f0a26983SSepherosa Ziehau /* COMPAT */
608f0a26983SSepherosa Ziehau static __inline struct mbuf *
ifq_dequeue(struct ifaltq * _ifq)609ac9843a1SSepherosa Ziehau ifq_dequeue(struct ifaltq *_ifq)
610f0a26983SSepherosa Ziehau {
611ac9843a1SSepherosa Ziehau 	return ifsq_dequeue(ifq_get_subq_default(_ifq));
612f0a26983SSepherosa Ziehau }
613f0a26983SSepherosa Ziehau 
614f0a26983SSepherosa Ziehau /* COMPAT */
615f0a26983SSepherosa Ziehau static __inline void
ifq_prepend(struct ifaltq * _ifq,struct mbuf * _m)616f0a26983SSepherosa Ziehau ifq_prepend(struct ifaltq *_ifq, struct mbuf *_m)
617f0a26983SSepherosa Ziehau {
618f0a26983SSepherosa Ziehau 	ifsq_prepend(ifq_get_subq_default(_ifq), _m);
619f0a26983SSepherosa Ziehau }
620f0a26983SSepherosa Ziehau 
621f0a26983SSepherosa Ziehau /* COMPAT */
622f0a26983SSepherosa Ziehau static __inline void
ifq_set_cpuid(struct ifaltq * _ifq,int _cpuid)623f0a26983SSepherosa Ziehau ifq_set_cpuid(struct ifaltq *_ifq, int _cpuid)
624f0a26983SSepherosa Ziehau {
625f0a26983SSepherosa Ziehau 	KASSERT(_ifq->altq_subq_cnt == 1,
626f0a26983SSepherosa Ziehau 	    ("invalid subqueue count %d", _ifq->altq_subq_cnt));
627f0a26983SSepherosa Ziehau 	ifsq_set_cpuid(ifq_get_subq_default(_ifq), _cpuid);
62842fdf81eSSepherosa Ziehau }
62942fdf81eSSepherosa Ziehau 
63054daabe8SSepherosa Ziehau /* COMPAT */
63154daabe8SSepherosa Ziehau static __inline void
ifq_set_hw_serialize(struct ifaltq * _ifq,struct lwkt_serialize * _hwslz)63254daabe8SSepherosa Ziehau ifq_set_hw_serialize(struct ifaltq *_ifq, struct lwkt_serialize *_hwslz)
63354daabe8SSepherosa Ziehau {
63454daabe8SSepherosa Ziehau 	KASSERT(_ifq->altq_subq_cnt == 1,
63554daabe8SSepherosa Ziehau 	    ("invalid subqueue count %d", _ifq->altq_subq_cnt));
63654daabe8SSepherosa Ziehau 	ifsq_set_hw_serialize(ifq_get_subq_default(_ifq), _hwslz);
63754daabe8SSepherosa Ziehau }
63854daabe8SSepherosa Ziehau 
63903d6a592SMatthew Dillon #endif	/* _NET_IFQ_VAR_H_ */
640