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_THREAD2_H_ 434986965bSJoerg Sonnenberger #include <sys/thread2.h> 441bd40720SMatthew Dillon #endif 451bd40720SMatthew Dillon #ifndef _SYS_SERIALIZE_H_ 461bd40720SMatthew Dillon #include <sys/serialize.h> 471bd40720SMatthew Dillon #endif 481bd40720SMatthew Dillon #ifndef _SYS_MBUF_H_ 491bd40720SMatthew Dillon #include <sys/mbuf.h> 501bd40720SMatthew Dillon #endif 511bd40720SMatthew Dillon #ifndef _NET_IF_VAR_H_ 521bd40720SMatthew Dillon #include <net/if_var.h> 531bd40720SMatthew Dillon #endif 541bd40720SMatthew Dillon #ifndef _NET_ALTQ_IF_ALTQ_H_ 551bd40720SMatthew Dillon #include <net/altq/if_altq.h> 561bd40720SMatthew Dillon #endif 571bd40720SMatthew Dillon 58f0a26983SSepherosa Ziehau #define ASSERT_ALTQ_SQ_DEFAULT(ifp, ifsq) \ 59f0a26983SSepherosa Ziehau KASSERT(ifsq_get_ifp((ifsq)) == (ifp) && \ 60f0a26983SSepherosa Ziehau ifsq_get_index((ifsq)) == ALTQ_SUBQ_INDEX_DEFAULT, \ 61f0a26983SSepherosa Ziehau ("not ifp's default subqueue")); 62f0a26983SSepherosa Ziehau 631bd40720SMatthew Dillon struct ifaltq; 648a248085SSepherosa Ziehau struct ifaltq_subque; 658a248085SSepherosa Ziehau 6674f8b40cSSepherosa Ziehau /* 6774f8b40cSSepherosa Ziehau * Subqueue watchdog 6874f8b40cSSepherosa Ziehau */ 698a248085SSepherosa Ziehau typedef void (*ifsq_watchdog_t)(struct ifaltq_subque *); 708a248085SSepherosa Ziehau 718a248085SSepherosa Ziehau struct ifsubq_watchdog { 728a248085SSepherosa Ziehau struct callout wd_callout; 738a248085SSepherosa Ziehau int wd_timer; 748a248085SSepherosa Ziehau struct ifaltq_subque *wd_subq; 758a248085SSepherosa Ziehau ifsq_watchdog_t wd_watchdog; 768a248085SSepherosa Ziehau }; 774986965bSJoerg Sonnenberger 789db4b353SSepherosa Ziehau /* 79058d1cd0SSepherosa Ziehau * Support for "classic" ALTQ interfaces. 809db4b353SSepherosa Ziehau */ 81f0a26983SSepherosa Ziehau int ifsq_classic_enqueue(struct ifaltq_subque *, struct mbuf *, 829db4b353SSepherosa Ziehau struct altq_pktattr *); 836dadc833SSepherosa Ziehau struct mbuf *ifsq_classic_dequeue(struct ifaltq_subque *, int); 84f0a26983SSepherosa Ziehau int ifsq_classic_request(struct ifaltq_subque *, int, void *); 859db4b353SSepherosa Ziehau void ifq_set_classic(struct ifaltq *); 869db4b353SSepherosa Ziehau 870faec0d1SSepherosa Ziehau void ifq_set_maxlen(struct ifaltq *, int); 882cc2f639SSepherosa Ziehau void ifq_set_methods(struct ifaltq *, altq_mapsubq_t, 892cc2f639SSepherosa Ziehau ifsq_enqueue_t, ifsq_dequeue_t, ifsq_request_t); 902cc2f639SSepherosa Ziehau int ifq_mapsubq_default(struct ifaltq *, int); 91c3fb75ddSSepherosa Ziehau int ifq_mapsubq_mask(struct ifaltq *, int); 92f0a26983SSepherosa Ziehau 93f0a26983SSepherosa Ziehau void ifsq_devstart(struct ifaltq_subque *ifsq); 94f0a26983SSepherosa Ziehau void ifsq_devstart_sched(struct ifaltq_subque *ifsq); 95058d1cd0SSepherosa Ziehau 968a248085SSepherosa Ziehau void ifsq_watchdog_init(struct ifsubq_watchdog *, 978a248085SSepherosa Ziehau struct ifaltq_subque *, ifsq_watchdog_t); 988a248085SSepherosa Ziehau void ifsq_watchdog_start(struct ifsubq_watchdog *); 998a248085SSepherosa Ziehau void ifsq_watchdog_stop(struct ifsubq_watchdog *); 1008a248085SSepherosa Ziehau 101058d1cd0SSepherosa Ziehau /* 102058d1cd0SSepherosa Ziehau * Dispatch a packet to an interface. 103058d1cd0SSepherosa Ziehau */ 1049db4b353SSepherosa Ziehau int ifq_dispatch(struct ifnet *, struct mbuf *, 1059db4b353SSepherosa Ziehau struct altq_pktattr *); 1069db4b353SSepherosa Ziehau 1074d723e5aSJoerg Sonnenberger #ifdef ALTQ 108058d1cd0SSepherosa Ziehau 1094d723e5aSJoerg Sonnenberger static __inline int 1104d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1114d723e5aSJoerg Sonnenberger { 1124d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_ENABLED); 1134d723e5aSJoerg Sonnenberger } 1144d723e5aSJoerg Sonnenberger 1154d723e5aSJoerg Sonnenberger static __inline int 1164d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1174d723e5aSJoerg Sonnenberger { 1184d723e5aSJoerg Sonnenberger return(_ifq->altq_disc != NULL); 1194d723e5aSJoerg Sonnenberger } 120058d1cd0SSepherosa Ziehau 121058d1cd0SSepherosa Ziehau #else /* !ALTQ */ 122058d1cd0SSepherosa Ziehau 1234d723e5aSJoerg Sonnenberger static __inline int 1244d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1254d723e5aSJoerg Sonnenberger { 1264d723e5aSJoerg Sonnenberger return(0); 1274d723e5aSJoerg Sonnenberger } 1284d723e5aSJoerg Sonnenberger 1294d723e5aSJoerg Sonnenberger static __inline int 1304d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1314d723e5aSJoerg Sonnenberger { 1324d723e5aSJoerg Sonnenberger return(0); 1334d723e5aSJoerg Sonnenberger } 1344d723e5aSJoerg Sonnenberger 135058d1cd0SSepherosa Ziehau #endif /* ALTQ */ 136058d1cd0SSepherosa Ziehau 1374d723e5aSJoerg Sonnenberger static __inline int 1384d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq) 1394d723e5aSJoerg Sonnenberger { 1404d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_READY); 1414d723e5aSJoerg Sonnenberger } 1424d723e5aSJoerg Sonnenberger 1434d723e5aSJoerg Sonnenberger static __inline void 1444d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq) 1454d723e5aSJoerg Sonnenberger { 1464d723e5aSJoerg Sonnenberger _ifq->altq_flags |= ALTQF_READY; 1474d723e5aSJoerg Sonnenberger } 1484d723e5aSJoerg Sonnenberger 14978195a76SMatthew Dillon /* 15074f8b40cSSepherosa Ziehau * Subqueue lock must be held 15178195a76SMatthew Dillon */ 1524d723e5aSJoerg Sonnenberger static __inline int 153f0a26983SSepherosa Ziehau ifsq_enqueue_locked(struct ifaltq_subque *_ifsq, struct mbuf *_m, 1549db4b353SSepherosa Ziehau struct altq_pktattr *_pa) 1559db4b353SSepherosa Ziehau { 1569db4b353SSepherosa Ziehau #ifdef ALTQ 157f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 158f0a26983SSepherosa Ziehau return ifsq_classic_enqueue(_ifsq, _m, _pa); 1599db4b353SSepherosa Ziehau else 1609db4b353SSepherosa Ziehau #endif 161f0a26983SSepherosa Ziehau return _ifsq->ifsq_enqueue(_ifsq, _m, _pa); 1629db4b353SSepherosa Ziehau } 1639db4b353SSepherosa Ziehau 1649db4b353SSepherosa Ziehau static __inline int 165f0a26983SSepherosa Ziehau ifsq_enqueue(struct ifaltq_subque *_ifsq, struct mbuf *_m, 166f0a26983SSepherosa Ziehau struct altq_pktattr *_pa) 1674d723e5aSJoerg Sonnenberger { 1689db4b353SSepherosa Ziehau int _error; 1699db4b353SSepherosa Ziehau 170f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 171f0a26983SSepherosa Ziehau _error = ifsq_enqueue_locked(_ifsq, _m, _pa); 172f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1739db4b353SSepherosa Ziehau return _error; 1744d723e5aSJoerg Sonnenberger } 1754d723e5aSJoerg Sonnenberger 1764d723e5aSJoerg Sonnenberger static __inline struct mbuf * 177ac9843a1SSepherosa Ziehau ifsq_dequeue(struct ifaltq_subque *_ifsq) 1784d723e5aSJoerg Sonnenberger { 1799db4b353SSepherosa Ziehau struct mbuf *_m; 1809db4b353SSepherosa Ziehau 181f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 182f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 183f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_prepended; 184f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 185*68dc1916SSepherosa Ziehau ALTQ_SQ_CNTR_DEC(_ifsq, _m->m_pkthdr.len); 186f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1879db4b353SSepherosa Ziehau return _m; 1889db4b353SSepherosa Ziehau } 1899db4b353SSepherosa Ziehau 1904d723e5aSJoerg Sonnenberger #ifdef ALTQ 191f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 192ac9843a1SSepherosa Ziehau _m = tbr_dequeue(_ifsq, ALTDQ_REMOVE); 193f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 1946dadc833SSepherosa Ziehau _m = ifsq_classic_dequeue(_ifsq, ALTDQ_REMOVE); 1959db4b353SSepherosa Ziehau else 1964d723e5aSJoerg Sonnenberger #endif 1976dadc833SSepherosa Ziehau _m = _ifsq->ifsq_dequeue(_ifsq, ALTDQ_REMOVE); 198f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1999db4b353SSepherosa Ziehau return _m; 2004d723e5aSJoerg Sonnenberger } 2014d723e5aSJoerg Sonnenberger 20278195a76SMatthew Dillon /* 20374f8b40cSSepherosa Ziehau * Subqueue lock must be held 20478195a76SMatthew Dillon */ 2054d723e5aSJoerg Sonnenberger static __inline struct mbuf * 206f0a26983SSepherosa Ziehau ifsq_poll_locked(struct ifaltq_subque *_ifsq) 2074d723e5aSJoerg Sonnenberger { 208f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) 209f0a26983SSepherosa Ziehau return _ifsq->ifsq_prepended; 2109db4b353SSepherosa Ziehau 2114d723e5aSJoerg Sonnenberger #ifdef ALTQ 212f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 213ac9843a1SSepherosa Ziehau return tbr_dequeue(_ifsq, ALTDQ_POLL); 214f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 2156dadc833SSepherosa Ziehau return ifsq_classic_dequeue(_ifsq, ALTDQ_POLL); 2169db4b353SSepherosa Ziehau else 2174d723e5aSJoerg Sonnenberger #endif 2186dadc833SSepherosa Ziehau return _ifsq->ifsq_dequeue(_ifsq, ALTDQ_POLL); 2199db4b353SSepherosa Ziehau } 2209db4b353SSepherosa Ziehau 2219db4b353SSepherosa Ziehau static __inline struct mbuf * 222f0a26983SSepherosa Ziehau ifsq_poll(struct ifaltq_subque *_ifsq) 2239db4b353SSepherosa Ziehau { 2249db4b353SSepherosa Ziehau struct mbuf *_m; 2259db4b353SSepherosa Ziehau 226f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 227f0a26983SSepherosa Ziehau _m = ifsq_poll_locked(_ifsq); 228f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 2299db4b353SSepherosa Ziehau return _m; 2304d723e5aSJoerg Sonnenberger } 2314d723e5aSJoerg Sonnenberger 23213f46fcaSSepherosa Ziehau static __inline int 23313f46fcaSSepherosa Ziehau ifsq_poll_pktlen(struct ifaltq_subque *_ifsq) 23413f46fcaSSepherosa Ziehau { 23513f46fcaSSepherosa Ziehau struct mbuf *_m; 23613f46fcaSSepherosa Ziehau int _len = 0; 23713f46fcaSSepherosa Ziehau 23813f46fcaSSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 23913f46fcaSSepherosa Ziehau 24013f46fcaSSepherosa Ziehau _m = ifsq_poll_locked(_ifsq); 24113f46fcaSSepherosa Ziehau if (_m != NULL) { 24213f46fcaSSepherosa Ziehau M_ASSERTPKTHDR(_m); 24313f46fcaSSepherosa Ziehau _len = _m->m_pkthdr.len; 24413f46fcaSSepherosa Ziehau } 24513f46fcaSSepherosa Ziehau 24613f46fcaSSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 24713f46fcaSSepherosa Ziehau 24813f46fcaSSepherosa Ziehau return _len; 24913f46fcaSSepherosa Ziehau } 25013f46fcaSSepherosa Ziehau 25178195a76SMatthew Dillon /* 25274f8b40cSSepherosa Ziehau * Subqueue lock must be held 25378195a76SMatthew Dillon */ 2544d723e5aSJoerg Sonnenberger static __inline void 255f0a26983SSepherosa Ziehau ifsq_purge_locked(struct ifaltq_subque *_ifsq) 2569db4b353SSepherosa Ziehau { 257f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 258*68dc1916SSepherosa Ziehau ALTQ_SQ_CNTR_DEC(_ifsq, _ifsq->ifsq_prepended->m_pkthdr.len); 259f0a26983SSepherosa Ziehau m_freem(_ifsq->ifsq_prepended); 260f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 2619db4b353SSepherosa Ziehau } 2629db4b353SSepherosa Ziehau 2639db4b353SSepherosa Ziehau #ifdef ALTQ 264f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 265f0a26983SSepherosa Ziehau ifsq_classic_request(_ifsq, ALTRQ_PURGE, NULL); 2669db4b353SSepherosa Ziehau else 2679db4b353SSepherosa Ziehau #endif 268f0a26983SSepherosa Ziehau _ifsq->ifsq_request(_ifsq, ALTRQ_PURGE, NULL); 2699db4b353SSepherosa Ziehau } 2709db4b353SSepherosa Ziehau 2719db4b353SSepherosa Ziehau static __inline void 272f0a26983SSepherosa Ziehau ifsq_purge(struct ifaltq_subque *_ifsq) 2734d723e5aSJoerg Sonnenberger { 274f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 275f0a26983SSepherosa Ziehau ifsq_purge_locked(_ifsq); 276f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 277f0a26983SSepherosa Ziehau } 278f0a26983SSepherosa Ziehau 279f0a26983SSepherosa Ziehau static __inline void 280f0a26983SSepherosa Ziehau ifq_lock_all(struct ifaltq *_ifq) 281f0a26983SSepherosa Ziehau { 282f0a26983SSepherosa Ziehau int _q; 283f0a26983SSepherosa Ziehau 284f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 285f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(&_ifq->altq_subq[_q]); 286f0a26983SSepherosa Ziehau } 287f0a26983SSepherosa Ziehau 288f0a26983SSepherosa Ziehau static __inline void 289f0a26983SSepherosa Ziehau ifq_unlock_all(struct ifaltq *_ifq) 290f0a26983SSepherosa Ziehau { 291f0a26983SSepherosa Ziehau int _q; 292f0a26983SSepherosa Ziehau 293f0a26983SSepherosa Ziehau for (_q = _ifq->altq_subq_cnt - 1; _q >= 0; --_q) 294f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(&_ifq->altq_subq[_q]); 2954d723e5aSJoerg Sonnenberger } 2964d723e5aSJoerg Sonnenberger 29778195a76SMatthew Dillon /* 29874f8b40cSSepherosa Ziehau * All of the subqueue locks must be held 29978195a76SMatthew Dillon */ 3004d723e5aSJoerg Sonnenberger static __inline void 3019275f515SSepherosa Ziehau ifq_purge_all_locked(struct ifaltq *_ifq) 3029275f515SSepherosa Ziehau { 303f0a26983SSepherosa Ziehau int _q; 304f0a26983SSepherosa Ziehau 305f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 306f0a26983SSepherosa Ziehau ifsq_purge_locked(&_ifq->altq_subq[_q]); 3079275f515SSepherosa Ziehau } 3089275f515SSepherosa Ziehau 3099275f515SSepherosa Ziehau static __inline void 3109275f515SSepherosa Ziehau ifq_purge_all(struct ifaltq *_ifq) 3119275f515SSepherosa Ziehau { 312f0a26983SSepherosa Ziehau ifq_lock_all(_ifq); 3139275f515SSepherosa Ziehau ifq_purge_all_locked(_ifq); 314f0a26983SSepherosa Ziehau ifq_unlock_all(_ifq); 3159275f515SSepherosa Ziehau } 3169275f515SSepherosa Ziehau 3179275f515SSepherosa Ziehau static __inline void 3184d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 3194d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 3204d723e5aSJoerg Sonnenberger { 3219db4b353SSepherosa Ziehau #ifdef ALTQ 3229db4b353SSepherosa Ziehau if (ifq_is_enabled(_ifq)) { 3234d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 3244d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 325f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 326f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) { 327f0a26983SSepherosa Ziehau /* XXX default subqueue */ 328f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq = 329f0a26983SSepherosa Ziehau &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 330f0a26983SSepherosa Ziehau 331f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 332f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 333f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) 3349db4b353SSepherosa Ziehau _ifq->altq_classify(_ifq, _m, _pa); 335f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3369db4b353SSepherosa Ziehau } 337f0a26983SSepherosa Ziehau } 3389db4b353SSepherosa Ziehau #endif 3399db4b353SSepherosa Ziehau } 3409db4b353SSepherosa Ziehau 3419db4b353SSepherosa Ziehau static __inline void 342f0a26983SSepherosa Ziehau ifsq_prepend(struct ifaltq_subque *_ifsq, struct mbuf *_m) 3439db4b353SSepherosa Ziehau { 344f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 345f0a26983SSepherosa Ziehau KASSERT(_ifsq->ifsq_prepended == NULL, ("pending prepended mbuf")); 346f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = _m; 347*68dc1916SSepherosa Ziehau ALTQ_SQ_CNTR_INC(_ifsq, _m->m_pkthdr.len); 348f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3494d723e5aSJoerg Sonnenberger } 3504d723e5aSJoerg Sonnenberger 351058d1cd0SSepherosa Ziehau /* 35274f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 353058d1cd0SSepherosa Ziehau */ 3549ed293e0SSepherosa Ziehau static __inline void 355f0a26983SSepherosa Ziehau ifsq_set_oactive(struct ifaltq_subque *_ifsq) 3569ed293e0SSepherosa Ziehau { 357f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 1; 3589ed293e0SSepherosa Ziehau } 3599ed293e0SSepherosa Ziehau 360058d1cd0SSepherosa Ziehau /* 36174f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 362058d1cd0SSepherosa Ziehau */ 3639ed293e0SSepherosa Ziehau static __inline void 364f0a26983SSepherosa Ziehau ifsq_clr_oactive(struct ifaltq_subque *_ifsq) 3659ed293e0SSepherosa Ziehau { 366f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 0; 3679ed293e0SSepherosa Ziehau } 3689ed293e0SSepherosa Ziehau 369058d1cd0SSepherosa Ziehau /* 37074f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 371058d1cd0SSepherosa Ziehau */ 3729ed293e0SSepherosa Ziehau static __inline int 373f0a26983SSepherosa Ziehau ifsq_is_oactive(const struct ifaltq_subque *_ifsq) 3749ed293e0SSepherosa Ziehau { 375f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_oactive; 3769ed293e0SSepherosa Ziehau } 3779ed293e0SSepherosa Ziehau 37878195a76SMatthew Dillon /* 37974f8b40cSSepherosa Ziehau * Hand a packet to the interface's default subqueue. 38078195a76SMatthew Dillon * 38174f8b40cSSepherosa Ziehau * The default subqueue hardware serializer must be held. If the 38274f8b40cSSepherosa Ziehau * subqueue hardware serializer is not held yet, ifq_dispatch() 38374f8b40cSSepherosa Ziehau * should be used to get better performance. 38478195a76SMatthew Dillon */ 3854d723e5aSJoerg Sonnenberger static __inline int 3864d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 3874d723e5aSJoerg Sonnenberger { 388f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq; 3894986965bSJoerg Sonnenberger int _error; 390f0a26983SSepherosa Ziehau int _qid = ALTQ_SUBQ_INDEX_DEFAULT; /* XXX default subqueue */ 391f0a26983SSepherosa Ziehau 392f0a26983SSepherosa Ziehau _ifsq = &_ifp->if_snd.altq_subq[_qid]; 3934d723e5aSJoerg Sonnenberger 394bfefe4a6SSepherosa Ziehau ASSERT_ALTQ_SQ_SERIALIZED_HW(_ifsq); 395f0a26983SSepherosa Ziehau _error = ifsq_enqueue(_ifsq, _m, _pa); 3964d723e5aSJoerg Sonnenberger if (_error == 0) { 397d40991efSSepherosa Ziehau IFNET_STAT_INC(_ifp, obytes, _m->m_pkthdr.len); 3984d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 399d40991efSSepherosa Ziehau IFNET_STAT_INC(_ifp, omcasts, 1); 400f0a26983SSepherosa Ziehau if (!ifsq_is_oactive(_ifsq)) 401f0a26983SSepherosa Ziehau (*_ifp->if_start)(_ifp, _ifsq); 4024d723e5aSJoerg Sonnenberger } 4034d723e5aSJoerg Sonnenberger return(_error); 4044d723e5aSJoerg Sonnenberger } 4054d723e5aSJoerg Sonnenberger 4064d723e5aSJoerg Sonnenberger static __inline int 407f0a26983SSepherosa Ziehau ifsq_is_empty(const struct ifaltq_subque *_ifsq) 4084d723e5aSJoerg Sonnenberger { 409b21c2105SSepherosa Ziehau return(_ifsq->ifsq_len == 0); 4104d723e5aSJoerg Sonnenberger } 4114d723e5aSJoerg Sonnenberger 412058d1cd0SSepherosa Ziehau /* 41374f8b40cSSepherosa Ziehau * Subqueue lock must be held 414058d1cd0SSepherosa Ziehau */ 4159db4b353SSepherosa Ziehau static __inline int 416f0a26983SSepherosa Ziehau ifsq_data_ready(struct ifaltq_subque *_ifsq) 4179db4b353SSepherosa Ziehau { 4189db4b353SSepherosa Ziehau #ifdef ALTQ 419f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 420f0a26983SSepherosa Ziehau return (ifsq_poll_locked(_ifsq) != NULL); 4219db4b353SSepherosa Ziehau else 4229db4b353SSepherosa Ziehau #endif 423f0a26983SSepherosa Ziehau return !ifsq_is_empty(_ifsq); 4249db4b353SSepherosa Ziehau } 425b2f93efeSJoerg Sonnenberger 426acf18b65SSepherosa Ziehau /* 42774f8b40cSSepherosa Ziehau * Subqueue lock must be held 428acf18b65SSepherosa Ziehau */ 429acf18b65SSepherosa Ziehau static __inline int 430f0a26983SSepherosa Ziehau ifsq_is_started(const struct ifaltq_subque *_ifsq) 431acf18b65SSepherosa Ziehau { 432f0a26983SSepherosa Ziehau return _ifsq->ifsq_started; 433acf18b65SSepherosa Ziehau } 434acf18b65SSepherosa Ziehau 435acf18b65SSepherosa Ziehau /* 43674f8b40cSSepherosa Ziehau * Subqueue lock must be held 437acf18b65SSepherosa Ziehau */ 438acf18b65SSepherosa Ziehau static __inline void 439f0a26983SSepherosa Ziehau ifsq_set_started(struct ifaltq_subque *_ifsq) 440acf18b65SSepherosa Ziehau { 441f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 1; 442acf18b65SSepherosa Ziehau } 443acf18b65SSepherosa Ziehau 444acf18b65SSepherosa Ziehau /* 44574f8b40cSSepherosa Ziehau * Subqueue lock must be held 446acf18b65SSepherosa Ziehau */ 447acf18b65SSepherosa Ziehau static __inline void 448f0a26983SSepherosa Ziehau ifsq_clr_started(struct ifaltq_subque *_ifsq) 449acf18b65SSepherosa Ziehau { 450f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 0; 451acf18b65SSepherosa Ziehau } 452acf18b65SSepherosa Ziehau 453f0a26983SSepherosa Ziehau static __inline struct ifsubq_stage * 454f0a26983SSepherosa Ziehau ifsq_get_stage(struct ifaltq_subque *_ifsq, int _cpuid) 455928e2027SSepherosa Ziehau { 456f0a26983SSepherosa Ziehau return &_ifsq->ifsq_stage[_cpuid]; 457928e2027SSepherosa Ziehau } 458928e2027SSepherosa Ziehau 459dfd3b18bSSepherosa Ziehau static __inline int 460f0a26983SSepherosa Ziehau ifsq_get_cpuid(const struct ifaltq_subque *_ifsq) 461dfd3b18bSSepherosa Ziehau { 462f0a26983SSepherosa Ziehau return _ifsq->ifsq_cpuid; 463dfd3b18bSSepherosa Ziehau } 464dfd3b18bSSepherosa Ziehau 465dfd3b18bSSepherosa Ziehau static __inline void 466f0a26983SSepherosa Ziehau ifsq_set_cpuid(struct ifaltq_subque *_ifsq, int _cpuid) 467dfd3b18bSSepherosa Ziehau { 468f0a26983SSepherosa Ziehau KASSERT(_cpuid >= 0 && _cpuid < ncpus, 469f0a26983SSepherosa Ziehau ("invalid ifsq_cpuid %d", _cpuid)); 470f0a26983SSepherosa Ziehau _ifsq->ifsq_cpuid = _cpuid; 471dfd3b18bSSepherosa Ziehau } 472dfd3b18bSSepherosa Ziehau 47342fdf81eSSepherosa Ziehau static __inline struct lwkt_msg * 474f0a26983SSepherosa Ziehau ifsq_get_ifstart_lmsg(struct ifaltq_subque *_ifsq, int _cpuid) 47542fdf81eSSepherosa Ziehau { 476f0a26983SSepherosa Ziehau return &_ifsq->ifsq_ifstart_nmsg[_cpuid].lmsg; 477f0a26983SSepherosa Ziehau } 478f0a26983SSepherosa Ziehau 479f0a26983SSepherosa Ziehau static __inline int 480f0a26983SSepherosa Ziehau ifsq_get_index(const struct ifaltq_subque *_ifsq) 481f0a26983SSepherosa Ziehau { 482f0a26983SSepherosa Ziehau return _ifsq->ifsq_index; 483f0a26983SSepherosa Ziehau } 484f0a26983SSepherosa Ziehau 485f0a26983SSepherosa Ziehau static __inline void 486f0a26983SSepherosa Ziehau ifsq_set_priv(struct ifaltq_subque *_ifsq, void *_priv) 487f0a26983SSepherosa Ziehau { 488f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_priv = _priv; 489f0a26983SSepherosa Ziehau } 490f0a26983SSepherosa Ziehau 491f0a26983SSepherosa Ziehau static __inline void * 492f0a26983SSepherosa Ziehau ifsq_get_priv(const struct ifaltq_subque *_ifsq) 493f0a26983SSepherosa Ziehau { 494f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_priv; 495f0a26983SSepherosa Ziehau } 496f0a26983SSepherosa Ziehau 497f0a26983SSepherosa Ziehau static __inline struct ifnet * 498f0a26983SSepherosa Ziehau ifsq_get_ifp(const struct ifaltq_subque *_ifsq) 499f0a26983SSepherosa Ziehau { 500f0a26983SSepherosa Ziehau return _ifsq->ifsq_ifp; 501f0a26983SSepherosa Ziehau } 502f0a26983SSepherosa Ziehau 503bfefe4a6SSepherosa Ziehau static __inline void 504bfefe4a6SSepherosa Ziehau ifsq_set_hw_serialize(struct ifaltq_subque *_ifsq, 505bfefe4a6SSepherosa Ziehau struct lwkt_serialize *_hwslz) 506bfefe4a6SSepherosa Ziehau { 507bfefe4a6SSepherosa Ziehau KASSERT(_hwslz != NULL, ("NULL hw serialize")); 508bfefe4a6SSepherosa Ziehau KASSERT(_ifsq->ifsq_hw_serialize == NULL, 509bfefe4a6SSepherosa Ziehau ("hw serialize has been setup")); 510bfefe4a6SSepherosa Ziehau _ifsq->ifsq_hw_serialize = _hwslz; 511bfefe4a6SSepherosa Ziehau } 512bfefe4a6SSepherosa Ziehau 513bfefe4a6SSepherosa Ziehau static __inline void 514bfefe4a6SSepherosa Ziehau ifsq_serialize_hw(struct ifaltq_subque *_ifsq) 515bfefe4a6SSepherosa Ziehau { 516bfefe4a6SSepherosa Ziehau lwkt_serialize_enter(_ifsq->ifsq_hw_serialize); 517bfefe4a6SSepherosa Ziehau } 518bfefe4a6SSepherosa Ziehau 519bfefe4a6SSepherosa Ziehau static __inline void 520bfefe4a6SSepherosa Ziehau ifsq_deserialize_hw(struct ifaltq_subque *_ifsq) 521bfefe4a6SSepherosa Ziehau { 522bfefe4a6SSepherosa Ziehau lwkt_serialize_exit(_ifsq->ifsq_hw_serialize); 523bfefe4a6SSepherosa Ziehau } 524bfefe4a6SSepherosa Ziehau 525bfefe4a6SSepherosa Ziehau static __inline int 526bfefe4a6SSepherosa Ziehau ifsq_tryserialize_hw(struct ifaltq_subque *_ifsq) 527bfefe4a6SSepherosa Ziehau { 528bfefe4a6SSepherosa Ziehau return lwkt_serialize_try(_ifsq->ifsq_hw_serialize); 529bfefe4a6SSepherosa Ziehau } 530bfefe4a6SSepherosa Ziehau 531f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 532f0a26983SSepherosa Ziehau ifq_get_subq_default(const struct ifaltq *_ifq) 533f0a26983SSepherosa Ziehau { 534f0a26983SSepherosa Ziehau return &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 535f0a26983SSepherosa Ziehau } 536f0a26983SSepherosa Ziehau 537f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 538f0a26983SSepherosa Ziehau ifq_get_subq(const struct ifaltq *_ifq, int _idx) 539f0a26983SSepherosa Ziehau { 540f0a26983SSepherosa Ziehau KASSERT(_idx >= 0 && _idx < _ifq->altq_subq_cnt, 541f0a26983SSepherosa Ziehau ("invalid qid %d", _idx)); 542f0a26983SSepherosa Ziehau return &_ifq->altq_subq[_idx]; 543f0a26983SSepherosa Ziehau } 544f0a26983SSepherosa Ziehau 5452cc2f639SSepherosa Ziehau static __inline struct ifaltq_subque * 5462cc2f639SSepherosa Ziehau ifq_map_subq(struct ifaltq *_ifq, int _cpuid) 5472cc2f639SSepherosa Ziehau { 5482cc2f639SSepherosa Ziehau int _idx = _ifq->altq_mapsubq(_ifq, _cpuid); 5492cc2f639SSepherosa Ziehau return ifq_get_subq(_ifq, _idx); 5502cc2f639SSepherosa Ziehau } 5512cc2f639SSepherosa Ziehau 5529469a4a2SSepherosa Ziehau static __inline void 5539469a4a2SSepherosa Ziehau ifq_set_subq_cnt(struct ifaltq *_ifq, int _cnt) 5549469a4a2SSepherosa Ziehau { 5559469a4a2SSepherosa Ziehau _ifq->altq_subq_cnt = _cnt; 5569469a4a2SSepherosa Ziehau } 5579469a4a2SSepherosa Ziehau 558c3fb75ddSSepherosa Ziehau static __inline void 559c3fb75ddSSepherosa Ziehau ifq_set_subq_mask(struct ifaltq *_ifq, uint32_t _mask) 560c3fb75ddSSepherosa Ziehau { 56156e9b3a1SSepherosa Ziehau KASSERT(((_mask + 1) & _mask) == 0, ("invalid mask %08x", _mask)); 562c3fb75ddSSepherosa Ziehau _ifq->altq_subq_mask = _mask; 563c3fb75ddSSepherosa Ziehau } 564c3fb75ddSSepherosa Ziehau 565f0a26983SSepherosa Ziehau /* COMPAT */ 566f0a26983SSepherosa Ziehau static __inline int 567f0a26983SSepherosa Ziehau ifq_is_oactive(const struct ifaltq *_ifq) 568f0a26983SSepherosa Ziehau { 569f0a26983SSepherosa Ziehau return ifsq_is_oactive(ifq_get_subq_default(_ifq)); 570f0a26983SSepherosa Ziehau } 571f0a26983SSepherosa Ziehau 572f0a26983SSepherosa Ziehau /* COMPAT */ 573f0a26983SSepherosa Ziehau static __inline void 574f0a26983SSepherosa Ziehau ifq_set_oactive(struct ifaltq *_ifq) 575f0a26983SSepherosa Ziehau { 576f0a26983SSepherosa Ziehau ifsq_set_oactive(ifq_get_subq_default(_ifq)); 577f0a26983SSepherosa Ziehau } 578f0a26983SSepherosa Ziehau 579f0a26983SSepherosa Ziehau /* COMPAT */ 580f0a26983SSepherosa Ziehau static __inline void 581f0a26983SSepherosa Ziehau ifq_clr_oactive(struct ifaltq *_ifq) 582f0a26983SSepherosa Ziehau { 583f0a26983SSepherosa Ziehau ifsq_clr_oactive(ifq_get_subq_default(_ifq)); 584f0a26983SSepherosa Ziehau } 585f0a26983SSepherosa Ziehau 586f0a26983SSepherosa Ziehau /* COMPAT */ 587f0a26983SSepherosa Ziehau static __inline int 588f0a26983SSepherosa Ziehau ifq_is_empty(struct ifaltq *_ifq) 589f0a26983SSepherosa Ziehau { 590f0a26983SSepherosa Ziehau return ifsq_is_empty(ifq_get_subq_default(_ifq)); 591f0a26983SSepherosa Ziehau } 592f0a26983SSepherosa Ziehau 593f0a26983SSepherosa Ziehau /* COMPAT */ 594f0a26983SSepherosa Ziehau static __inline void 595f0a26983SSepherosa Ziehau ifq_purge(struct ifaltq *_ifq) 596f0a26983SSepherosa Ziehau { 597f0a26983SSepherosa Ziehau ifsq_purge(ifq_get_subq_default(_ifq)); 598f0a26983SSepherosa Ziehau } 599f0a26983SSepherosa Ziehau 600f0a26983SSepherosa Ziehau /* COMPAT */ 601f0a26983SSepherosa Ziehau static __inline struct mbuf * 602ac9843a1SSepherosa Ziehau ifq_dequeue(struct ifaltq *_ifq) 603f0a26983SSepherosa Ziehau { 604ac9843a1SSepherosa Ziehau return ifsq_dequeue(ifq_get_subq_default(_ifq)); 605f0a26983SSepherosa Ziehau } 606f0a26983SSepherosa Ziehau 607f0a26983SSepherosa Ziehau /* COMPAT */ 608f0a26983SSepherosa Ziehau static __inline void 609f0a26983SSepherosa Ziehau ifq_prepend(struct ifaltq *_ifq, struct mbuf *_m) 610f0a26983SSepherosa Ziehau { 611f0a26983SSepherosa Ziehau ifsq_prepend(ifq_get_subq_default(_ifq), _m); 612f0a26983SSepherosa Ziehau } 613f0a26983SSepherosa Ziehau 614f0a26983SSepherosa Ziehau /* COMPAT */ 615f0a26983SSepherosa Ziehau static __inline void 616f0a26983SSepherosa Ziehau ifq_set_cpuid(struct ifaltq *_ifq, int _cpuid) 617f0a26983SSepherosa Ziehau { 618f0a26983SSepherosa Ziehau KASSERT(_ifq->altq_subq_cnt == 1, 619f0a26983SSepherosa Ziehau ("invalid subqueue count %d", _ifq->altq_subq_cnt)); 620f0a26983SSepherosa Ziehau ifsq_set_cpuid(ifq_get_subq_default(_ifq), _cpuid); 62142fdf81eSSepherosa Ziehau } 62242fdf81eSSepherosa Ziehau 62303d6a592SMatthew Dillon #endif /* _NET_IFQ_VAR_H_ */ 624