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." 37*74f8b40cSSepherosa 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 66*74f8b40cSSepherosa Ziehau /* 67*74f8b40cSSepherosa Ziehau * Subqueue watchdog 68*74f8b40cSSepherosa 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 *); 83f0a26983SSepherosa Ziehau struct mbuf *ifsq_classic_dequeue(struct ifaltq_subque *, struct mbuf *, 84f0a26983SSepherosa Ziehau 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); 92c3fb75ddSSepherosa Ziehau int ifq_mapsubq_mask(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 *, 988a248085SSepherosa Ziehau struct ifaltq_subque *, ifsq_watchdog_t); 998a248085SSepherosa Ziehau void ifsq_watchdog_start(struct ifsubq_watchdog *); 1008a248085SSepherosa Ziehau void ifsq_watchdog_stop(struct ifsubq_watchdog *); 1018a248085SSepherosa Ziehau 102058d1cd0SSepherosa Ziehau /* 103058d1cd0SSepherosa Ziehau * Dispatch a packet to an interface. 104058d1cd0SSepherosa Ziehau */ 1059db4b353SSepherosa Ziehau int ifq_dispatch(struct ifnet *, struct mbuf *, 1069db4b353SSepherosa Ziehau struct altq_pktattr *); 1079db4b353SSepherosa Ziehau 1084d723e5aSJoerg Sonnenberger #ifdef ALTQ 109058d1cd0SSepherosa Ziehau 1104d723e5aSJoerg Sonnenberger static __inline int 1114d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1124d723e5aSJoerg Sonnenberger { 1134d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_ENABLED); 1144d723e5aSJoerg Sonnenberger } 1154d723e5aSJoerg Sonnenberger 1164d723e5aSJoerg Sonnenberger static __inline int 1174d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1184d723e5aSJoerg Sonnenberger { 1194d723e5aSJoerg Sonnenberger return(_ifq->altq_disc != NULL); 1204d723e5aSJoerg Sonnenberger } 121058d1cd0SSepherosa Ziehau 122058d1cd0SSepherosa Ziehau #else /* !ALTQ */ 123058d1cd0SSepherosa Ziehau 1244d723e5aSJoerg Sonnenberger static __inline int 1254d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1264d723e5aSJoerg Sonnenberger { 1274d723e5aSJoerg Sonnenberger return(0); 1284d723e5aSJoerg Sonnenberger } 1294d723e5aSJoerg Sonnenberger 1304d723e5aSJoerg Sonnenberger static __inline int 1314d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1324d723e5aSJoerg Sonnenberger { 1334d723e5aSJoerg Sonnenberger return(0); 1344d723e5aSJoerg Sonnenberger } 1354d723e5aSJoerg Sonnenberger 136058d1cd0SSepherosa Ziehau #endif /* ALTQ */ 137058d1cd0SSepherosa Ziehau 1384d723e5aSJoerg Sonnenberger static __inline int 1394d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq) 1404d723e5aSJoerg Sonnenberger { 1414d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_READY); 1424d723e5aSJoerg Sonnenberger } 1434d723e5aSJoerg Sonnenberger 1444d723e5aSJoerg Sonnenberger static __inline void 1454d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq) 1464d723e5aSJoerg Sonnenberger { 1474d723e5aSJoerg Sonnenberger _ifq->altq_flags |= ALTQF_READY; 1484d723e5aSJoerg Sonnenberger } 1494d723e5aSJoerg Sonnenberger 15078195a76SMatthew Dillon /* 151*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 15278195a76SMatthew Dillon */ 1534d723e5aSJoerg Sonnenberger static __inline int 154f0a26983SSepherosa Ziehau ifsq_enqueue_locked(struct ifaltq_subque *_ifsq, struct mbuf *_m, 1559db4b353SSepherosa Ziehau struct altq_pktattr *_pa) 1569db4b353SSepherosa Ziehau { 1579db4b353SSepherosa Ziehau #ifdef ALTQ 158f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 159f0a26983SSepherosa Ziehau return ifsq_classic_enqueue(_ifsq, _m, _pa); 1609db4b353SSepherosa Ziehau else 1619db4b353SSepherosa Ziehau #endif 162f0a26983SSepherosa Ziehau return _ifsq->ifsq_enqueue(_ifsq, _m, _pa); 1639db4b353SSepherosa Ziehau } 1649db4b353SSepherosa Ziehau 1659db4b353SSepherosa Ziehau static __inline int 166f0a26983SSepherosa Ziehau ifsq_enqueue(struct ifaltq_subque *_ifsq, struct mbuf *_m, 167f0a26983SSepherosa Ziehau struct altq_pktattr *_pa) 1684d723e5aSJoerg Sonnenberger { 1699db4b353SSepherosa Ziehau int _error; 1709db4b353SSepherosa Ziehau 171f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 172f0a26983SSepherosa Ziehau _error = ifsq_enqueue_locked(_ifsq, _m, _pa); 173f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1749db4b353SSepherosa Ziehau return _error; 1754d723e5aSJoerg Sonnenberger } 1764d723e5aSJoerg Sonnenberger 1774d723e5aSJoerg Sonnenberger static __inline struct mbuf * 178f0a26983SSepherosa Ziehau ifsq_dequeue(struct ifaltq_subque *_ifsq, struct mbuf *_mpolled) 1794d723e5aSJoerg Sonnenberger { 1809db4b353SSepherosa Ziehau struct mbuf *_m; 1819db4b353SSepherosa Ziehau 182f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 183f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 184f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_prepended; 185f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 186f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 187f0a26983SSepherosa Ziehau _ifsq->ifq_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) 194f0a26983SSepherosa Ziehau _m = tbr_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 195f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 196f0a26983SSepherosa Ziehau _m = ifsq_classic_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 1979db4b353SSepherosa Ziehau else 1984d723e5aSJoerg Sonnenberger #endif 199f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 200f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 2019db4b353SSepherosa Ziehau return _m; 2024d723e5aSJoerg Sonnenberger } 2034d723e5aSJoerg Sonnenberger 20478195a76SMatthew Dillon /* 205*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 20678195a76SMatthew Dillon */ 2074d723e5aSJoerg Sonnenberger static __inline struct mbuf * 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) 215f0a26983SSepherosa Ziehau return tbr_dequeue(_ifsq, NULL, ALTDQ_POLL); 216f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 217f0a26983SSepherosa Ziehau return ifsq_classic_dequeue(_ifsq, NULL, ALTDQ_POLL); 2189db4b353SSepherosa Ziehau else 2194d723e5aSJoerg Sonnenberger #endif 220f0a26983SSepherosa Ziehau return _ifsq->ifsq_dequeue(_ifsq, NULL, ALTDQ_POLL); 2219db4b353SSepherosa Ziehau } 2229db4b353SSepherosa Ziehau 2239db4b353SSepherosa Ziehau static __inline struct mbuf * 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 23478195a76SMatthew Dillon /* 235*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 23678195a76SMatthew Dillon */ 2374d723e5aSJoerg Sonnenberger static __inline void 238f0a26983SSepherosa Ziehau ifsq_purge_locked(struct ifaltq_subque *_ifsq) 2399db4b353SSepherosa Ziehau { 240f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 241f0a26983SSepherosa Ziehau m_freem(_ifsq->ifsq_prepended); 242f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 243f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 244f0a26983SSepherosa Ziehau _ifsq->ifq_len--; 2459db4b353SSepherosa Ziehau } 2469db4b353SSepherosa Ziehau 2479db4b353SSepherosa Ziehau #ifdef ALTQ 248f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 249f0a26983SSepherosa Ziehau ifsq_classic_request(_ifsq, ALTRQ_PURGE, NULL); 2509db4b353SSepherosa Ziehau else 2519db4b353SSepherosa Ziehau #endif 252f0a26983SSepherosa Ziehau _ifsq->ifsq_request(_ifsq, ALTRQ_PURGE, NULL); 2539db4b353SSepherosa Ziehau } 2549db4b353SSepherosa Ziehau 2559db4b353SSepherosa Ziehau static __inline void 256f0a26983SSepherosa Ziehau ifsq_purge(struct ifaltq_subque *_ifsq) 2574d723e5aSJoerg Sonnenberger { 258f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 259f0a26983SSepherosa Ziehau ifsq_purge_locked(_ifsq); 260f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 261f0a26983SSepherosa Ziehau } 262f0a26983SSepherosa Ziehau 263f0a26983SSepherosa Ziehau static __inline void 264f0a26983SSepherosa Ziehau ifq_lock_all(struct ifaltq *_ifq) 265f0a26983SSepherosa Ziehau { 266f0a26983SSepherosa Ziehau int _q; 267f0a26983SSepherosa Ziehau 268f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 269f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(&_ifq->altq_subq[_q]); 270f0a26983SSepherosa Ziehau } 271f0a26983SSepherosa Ziehau 272f0a26983SSepherosa Ziehau static __inline void 273f0a26983SSepherosa Ziehau ifq_unlock_all(struct ifaltq *_ifq) 274f0a26983SSepherosa Ziehau { 275f0a26983SSepherosa Ziehau int _q; 276f0a26983SSepherosa Ziehau 277f0a26983SSepherosa Ziehau for (_q = _ifq->altq_subq_cnt - 1; _q >= 0; --_q) 278f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(&_ifq->altq_subq[_q]); 2794d723e5aSJoerg Sonnenberger } 2804d723e5aSJoerg Sonnenberger 28178195a76SMatthew Dillon /* 282*74f8b40cSSepherosa Ziehau * All of the subqueue locks must be held 28378195a76SMatthew Dillon */ 2844d723e5aSJoerg Sonnenberger static __inline void 2859275f515SSepherosa Ziehau ifq_purge_all_locked(struct ifaltq *_ifq) 2869275f515SSepherosa Ziehau { 287f0a26983SSepherosa Ziehau int _q; 288f0a26983SSepherosa Ziehau 289f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 290f0a26983SSepherosa Ziehau ifsq_purge_locked(&_ifq->altq_subq[_q]); 2919275f515SSepherosa Ziehau } 2929275f515SSepherosa Ziehau 2939275f515SSepherosa Ziehau static __inline void 2949275f515SSepherosa Ziehau ifq_purge_all(struct ifaltq *_ifq) 2959275f515SSepherosa Ziehau { 296f0a26983SSepherosa Ziehau ifq_lock_all(_ifq); 2979275f515SSepherosa Ziehau ifq_purge_all_locked(_ifq); 298f0a26983SSepherosa Ziehau ifq_unlock_all(_ifq); 2999275f515SSepherosa Ziehau } 3009275f515SSepherosa Ziehau 3019275f515SSepherosa Ziehau static __inline void 3024d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 3034d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 3044d723e5aSJoerg Sonnenberger { 3059db4b353SSepherosa Ziehau #ifdef ALTQ 3069db4b353SSepherosa Ziehau if (ifq_is_enabled(_ifq)) { 3074d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 3084d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 309f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 310f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) { 311f0a26983SSepherosa Ziehau /* XXX default subqueue */ 312f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq = 313f0a26983SSepherosa Ziehau &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 314f0a26983SSepherosa Ziehau 315f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 316f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 317f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) 3189db4b353SSepherosa Ziehau _ifq->altq_classify(_ifq, _m, _pa); 319f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3209db4b353SSepherosa Ziehau } 321f0a26983SSepherosa Ziehau } 3229db4b353SSepherosa Ziehau #endif 3239db4b353SSepherosa Ziehau } 3249db4b353SSepherosa Ziehau 3259db4b353SSepherosa Ziehau static __inline void 326f0a26983SSepherosa Ziehau ifsq_prepend(struct ifaltq_subque *_ifsq, struct mbuf *_m) 3279db4b353SSepherosa Ziehau { 328f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 329f0a26983SSepherosa Ziehau KASSERT(_ifsq->ifsq_prepended == NULL, ("pending prepended mbuf")); 330f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = _m; 331f0a26983SSepherosa Ziehau _ifsq->ifq_len++; 332f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3334d723e5aSJoerg Sonnenberger } 3344d723e5aSJoerg Sonnenberger 335058d1cd0SSepherosa Ziehau /* 336*74f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 337058d1cd0SSepherosa Ziehau */ 3389ed293e0SSepherosa Ziehau static __inline void 339f0a26983SSepherosa Ziehau ifsq_set_oactive(struct ifaltq_subque *_ifsq) 3409ed293e0SSepherosa Ziehau { 341f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 1; 3429ed293e0SSepherosa Ziehau } 3439ed293e0SSepherosa Ziehau 344058d1cd0SSepherosa Ziehau /* 345*74f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 346058d1cd0SSepherosa Ziehau */ 3479ed293e0SSepherosa Ziehau static __inline void 348f0a26983SSepherosa Ziehau ifsq_clr_oactive(struct ifaltq_subque *_ifsq) 3499ed293e0SSepherosa Ziehau { 350f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 0; 3519ed293e0SSepherosa Ziehau } 3529ed293e0SSepherosa Ziehau 353058d1cd0SSepherosa Ziehau /* 354*74f8b40cSSepherosa Ziehau * Subqueue hardware serializer must be held 355058d1cd0SSepherosa Ziehau */ 3569ed293e0SSepherosa Ziehau static __inline int 357f0a26983SSepherosa Ziehau ifsq_is_oactive(const struct ifaltq_subque *_ifsq) 3589ed293e0SSepherosa Ziehau { 359f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_oactive; 3609ed293e0SSepherosa Ziehau } 3619ed293e0SSepherosa Ziehau 36278195a76SMatthew Dillon /* 363*74f8b40cSSepherosa Ziehau * Hand a packet to the interface's default subqueue. 36478195a76SMatthew Dillon * 365*74f8b40cSSepherosa Ziehau * The default subqueue hardware serializer must be held. If the 366*74f8b40cSSepherosa Ziehau * subqueue hardware serializer is not held yet, ifq_dispatch() 367*74f8b40cSSepherosa Ziehau * should be used to get better performance. 36878195a76SMatthew Dillon */ 3694d723e5aSJoerg Sonnenberger static __inline int 3704d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 3714d723e5aSJoerg Sonnenberger { 372f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq; 3734986965bSJoerg Sonnenberger int _error; 374f0a26983SSepherosa Ziehau int _qid = ALTQ_SUBQ_INDEX_DEFAULT; /* XXX default subqueue */ 375f0a26983SSepherosa Ziehau 376f0a26983SSepherosa Ziehau _ifsq = &_ifp->if_snd.altq_subq[_qid]; 3774d723e5aSJoerg Sonnenberger 378bfefe4a6SSepherosa Ziehau ASSERT_ALTQ_SQ_SERIALIZED_HW(_ifsq); 379f0a26983SSepherosa Ziehau _error = ifsq_enqueue(_ifsq, _m, _pa); 3804d723e5aSJoerg Sonnenberger if (_error == 0) { 381d40991efSSepherosa Ziehau IFNET_STAT_INC(_ifp, obytes, _m->m_pkthdr.len); 3824d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 383d40991efSSepherosa Ziehau IFNET_STAT_INC(_ifp, omcasts, 1); 384f0a26983SSepherosa Ziehau if (!ifsq_is_oactive(_ifsq)) 385f0a26983SSepherosa Ziehau (*_ifp->if_start)(_ifp, _ifsq); 3864d723e5aSJoerg Sonnenberger } 3874d723e5aSJoerg Sonnenberger return(_error); 3884d723e5aSJoerg Sonnenberger } 3894d723e5aSJoerg Sonnenberger 3904d723e5aSJoerg Sonnenberger static __inline int 391f0a26983SSepherosa Ziehau ifsq_is_empty(const struct ifaltq_subque *_ifsq) 3924d723e5aSJoerg Sonnenberger { 393f0a26983SSepherosa Ziehau return(_ifsq->ifq_len == 0); 3944d723e5aSJoerg Sonnenberger } 3954d723e5aSJoerg Sonnenberger 396058d1cd0SSepherosa Ziehau /* 397*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 398058d1cd0SSepherosa Ziehau */ 3999db4b353SSepherosa Ziehau static __inline int 400f0a26983SSepherosa Ziehau ifsq_data_ready(struct ifaltq_subque *_ifsq) 4019db4b353SSepherosa Ziehau { 4029db4b353SSepherosa Ziehau #ifdef ALTQ 403f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 404f0a26983SSepherosa Ziehau return (ifsq_poll_locked(_ifsq) != NULL); 4059db4b353SSepherosa Ziehau else 4069db4b353SSepherosa Ziehau #endif 407f0a26983SSepherosa Ziehau return !ifsq_is_empty(_ifsq); 4089db4b353SSepherosa Ziehau } 409b2f93efeSJoerg Sonnenberger 410acf18b65SSepherosa Ziehau /* 411*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 412acf18b65SSepherosa Ziehau */ 413acf18b65SSepherosa Ziehau static __inline int 414f0a26983SSepherosa Ziehau ifsq_is_started(const struct ifaltq_subque *_ifsq) 415acf18b65SSepherosa Ziehau { 416f0a26983SSepherosa Ziehau return _ifsq->ifsq_started; 417acf18b65SSepherosa Ziehau } 418acf18b65SSepherosa Ziehau 419acf18b65SSepherosa Ziehau /* 420*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 421acf18b65SSepherosa Ziehau */ 422acf18b65SSepherosa Ziehau static __inline void 423f0a26983SSepherosa Ziehau ifsq_set_started(struct ifaltq_subque *_ifsq) 424acf18b65SSepherosa Ziehau { 425f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 1; 426acf18b65SSepherosa Ziehau } 427acf18b65SSepherosa Ziehau 428acf18b65SSepherosa Ziehau /* 429*74f8b40cSSepherosa Ziehau * Subqueue lock must be held 430acf18b65SSepherosa Ziehau */ 431acf18b65SSepherosa Ziehau static __inline void 432f0a26983SSepherosa Ziehau ifsq_clr_started(struct ifaltq_subque *_ifsq) 433acf18b65SSepherosa Ziehau { 434f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 0; 435acf18b65SSepherosa Ziehau } 436acf18b65SSepherosa Ziehau 437f0a26983SSepherosa Ziehau static __inline struct ifsubq_stage * 438f0a26983SSepherosa Ziehau ifsq_get_stage(struct ifaltq_subque *_ifsq, int _cpuid) 439928e2027SSepherosa Ziehau { 440f0a26983SSepherosa Ziehau return &_ifsq->ifsq_stage[_cpuid]; 441928e2027SSepherosa Ziehau } 442928e2027SSepherosa Ziehau 443dfd3b18bSSepherosa Ziehau static __inline int 444f0a26983SSepherosa Ziehau ifsq_get_cpuid(const struct ifaltq_subque *_ifsq) 445dfd3b18bSSepherosa Ziehau { 446f0a26983SSepherosa Ziehau return _ifsq->ifsq_cpuid; 447dfd3b18bSSepherosa Ziehau } 448dfd3b18bSSepherosa Ziehau 449dfd3b18bSSepherosa Ziehau static __inline void 450f0a26983SSepherosa Ziehau ifsq_set_cpuid(struct ifaltq_subque *_ifsq, int _cpuid) 451dfd3b18bSSepherosa Ziehau { 452f0a26983SSepherosa Ziehau KASSERT(_cpuid >= 0 && _cpuid < ncpus, 453f0a26983SSepherosa Ziehau ("invalid ifsq_cpuid %d", _cpuid)); 454f0a26983SSepherosa Ziehau _ifsq->ifsq_cpuid = _cpuid; 455dfd3b18bSSepherosa Ziehau } 456dfd3b18bSSepherosa Ziehau 45742fdf81eSSepherosa Ziehau static __inline struct lwkt_msg * 458f0a26983SSepherosa Ziehau ifsq_get_ifstart_lmsg(struct ifaltq_subque *_ifsq, int _cpuid) 45942fdf81eSSepherosa Ziehau { 460f0a26983SSepherosa Ziehau return &_ifsq->ifsq_ifstart_nmsg[_cpuid].lmsg; 461f0a26983SSepherosa Ziehau } 462f0a26983SSepherosa Ziehau 463f0a26983SSepherosa Ziehau static __inline int 464f0a26983SSepherosa Ziehau ifsq_get_index(const struct ifaltq_subque *_ifsq) 465f0a26983SSepherosa Ziehau { 466f0a26983SSepherosa Ziehau return _ifsq->ifsq_index; 467f0a26983SSepherosa Ziehau } 468f0a26983SSepherosa Ziehau 469f0a26983SSepherosa Ziehau static __inline void 470f0a26983SSepherosa Ziehau ifsq_set_priv(struct ifaltq_subque *_ifsq, void *_priv) 471f0a26983SSepherosa Ziehau { 472f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_priv = _priv; 473f0a26983SSepherosa Ziehau } 474f0a26983SSepherosa Ziehau 475f0a26983SSepherosa Ziehau static __inline void * 476f0a26983SSepherosa Ziehau ifsq_get_priv(const struct ifaltq_subque *_ifsq) 477f0a26983SSepherosa Ziehau { 478f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_priv; 479f0a26983SSepherosa Ziehau } 480f0a26983SSepherosa Ziehau 481f0a26983SSepherosa Ziehau static __inline struct ifnet * 482f0a26983SSepherosa Ziehau ifsq_get_ifp(const struct ifaltq_subque *_ifsq) 483f0a26983SSepherosa Ziehau { 484f0a26983SSepherosa Ziehau return _ifsq->ifsq_ifp; 485f0a26983SSepherosa Ziehau } 486f0a26983SSepherosa Ziehau 487bfefe4a6SSepherosa Ziehau static __inline void 488bfefe4a6SSepherosa Ziehau ifsq_set_hw_serialize(struct ifaltq_subque *_ifsq, 489bfefe4a6SSepherosa Ziehau struct lwkt_serialize *_hwslz) 490bfefe4a6SSepherosa Ziehau { 491bfefe4a6SSepherosa Ziehau KASSERT(_hwslz != NULL, ("NULL hw serialize")); 492bfefe4a6SSepherosa Ziehau KASSERT(_ifsq->ifsq_hw_serialize == NULL, 493bfefe4a6SSepherosa Ziehau ("hw serialize has been setup")); 494bfefe4a6SSepherosa Ziehau _ifsq->ifsq_hw_serialize = _hwslz; 495bfefe4a6SSepherosa Ziehau } 496bfefe4a6SSepherosa Ziehau 497bfefe4a6SSepherosa Ziehau static __inline void 498bfefe4a6SSepherosa Ziehau ifsq_serialize_hw(struct ifaltq_subque *_ifsq) 499bfefe4a6SSepherosa Ziehau { 500bfefe4a6SSepherosa Ziehau lwkt_serialize_enter(_ifsq->ifsq_hw_serialize); 501bfefe4a6SSepherosa Ziehau } 502bfefe4a6SSepherosa Ziehau 503bfefe4a6SSepherosa Ziehau static __inline void 504bfefe4a6SSepherosa Ziehau ifsq_deserialize_hw(struct ifaltq_subque *_ifsq) 505bfefe4a6SSepherosa Ziehau { 506bfefe4a6SSepherosa Ziehau lwkt_serialize_exit(_ifsq->ifsq_hw_serialize); 507bfefe4a6SSepherosa Ziehau } 508bfefe4a6SSepherosa Ziehau 509bfefe4a6SSepherosa Ziehau static __inline int 510bfefe4a6SSepherosa Ziehau ifsq_tryserialize_hw(struct ifaltq_subque *_ifsq) 511bfefe4a6SSepherosa Ziehau { 512bfefe4a6SSepherosa Ziehau return lwkt_serialize_try(_ifsq->ifsq_hw_serialize); 513bfefe4a6SSepherosa Ziehau } 514bfefe4a6SSepherosa Ziehau 515f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 516f0a26983SSepherosa Ziehau ifq_get_subq_default(const struct ifaltq *_ifq) 517f0a26983SSepherosa Ziehau { 518f0a26983SSepherosa Ziehau return &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 519f0a26983SSepherosa Ziehau } 520f0a26983SSepherosa Ziehau 521f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 522f0a26983SSepherosa Ziehau ifq_get_subq(const struct ifaltq *_ifq, int _idx) 523f0a26983SSepherosa Ziehau { 524f0a26983SSepherosa Ziehau KASSERT(_idx >= 0 && _idx < _ifq->altq_subq_cnt, 525f0a26983SSepherosa Ziehau ("invalid qid %d", _idx)); 526f0a26983SSepherosa Ziehau return &_ifq->altq_subq[_idx]; 527f0a26983SSepherosa Ziehau } 528f0a26983SSepherosa Ziehau 5292cc2f639SSepherosa Ziehau static __inline struct ifaltq_subque * 5302cc2f639SSepherosa Ziehau ifq_map_subq(struct ifaltq *_ifq, int _cpuid) 5312cc2f639SSepherosa Ziehau { 5322cc2f639SSepherosa Ziehau int _idx = _ifq->altq_mapsubq(_ifq, _cpuid); 5332cc2f639SSepherosa Ziehau return ifq_get_subq(_ifq, _idx); 5342cc2f639SSepherosa Ziehau } 5352cc2f639SSepherosa Ziehau 5369469a4a2SSepherosa Ziehau static __inline void 5379469a4a2SSepherosa Ziehau ifq_set_subq_cnt(struct ifaltq *_ifq, int _cnt) 5389469a4a2SSepherosa Ziehau { 5399469a4a2SSepherosa Ziehau _ifq->altq_subq_cnt = _cnt; 5409469a4a2SSepherosa Ziehau } 5419469a4a2SSepherosa Ziehau 542c3fb75ddSSepherosa Ziehau static __inline void 543c3fb75ddSSepherosa Ziehau ifq_set_subq_mask(struct ifaltq *_ifq, uint32_t _mask) 544c3fb75ddSSepherosa Ziehau { 54556e9b3a1SSepherosa Ziehau KASSERT(((_mask + 1) & _mask) == 0, ("invalid mask %08x", _mask)); 546c3fb75ddSSepherosa Ziehau _ifq->altq_subq_mask = _mask; 547c3fb75ddSSepherosa Ziehau } 548c3fb75ddSSepherosa Ziehau 549f0a26983SSepherosa Ziehau /* COMPAT */ 550f0a26983SSepherosa Ziehau static __inline int 551f0a26983SSepherosa Ziehau ifq_is_oactive(const struct ifaltq *_ifq) 552f0a26983SSepherosa Ziehau { 553f0a26983SSepherosa Ziehau return ifsq_is_oactive(ifq_get_subq_default(_ifq)); 554f0a26983SSepherosa Ziehau } 555f0a26983SSepherosa Ziehau 556f0a26983SSepherosa Ziehau /* COMPAT */ 557f0a26983SSepherosa Ziehau static __inline void 558f0a26983SSepherosa Ziehau ifq_set_oactive(struct ifaltq *_ifq) 559f0a26983SSepherosa Ziehau { 560f0a26983SSepherosa Ziehau ifsq_set_oactive(ifq_get_subq_default(_ifq)); 561f0a26983SSepherosa Ziehau } 562f0a26983SSepherosa Ziehau 563f0a26983SSepherosa Ziehau /* COMPAT */ 564f0a26983SSepherosa Ziehau static __inline void 565f0a26983SSepherosa Ziehau ifq_clr_oactive(struct ifaltq *_ifq) 566f0a26983SSepherosa Ziehau { 567f0a26983SSepherosa Ziehau ifsq_clr_oactive(ifq_get_subq_default(_ifq)); 568f0a26983SSepherosa Ziehau } 569f0a26983SSepherosa Ziehau 570f0a26983SSepherosa Ziehau /* COMPAT */ 571f0a26983SSepherosa Ziehau static __inline int 572f0a26983SSepherosa Ziehau ifq_is_empty(struct ifaltq *_ifq) 573f0a26983SSepherosa Ziehau { 574f0a26983SSepherosa Ziehau return ifsq_is_empty(ifq_get_subq_default(_ifq)); 575f0a26983SSepherosa Ziehau } 576f0a26983SSepherosa Ziehau 577f0a26983SSepherosa Ziehau /* COMPAT */ 578f0a26983SSepherosa Ziehau static __inline void 579f0a26983SSepherosa Ziehau ifq_purge(struct ifaltq *_ifq) 580f0a26983SSepherosa Ziehau { 581f0a26983SSepherosa Ziehau ifsq_purge(ifq_get_subq_default(_ifq)); 582f0a26983SSepherosa Ziehau } 583f0a26983SSepherosa Ziehau 584f0a26983SSepherosa Ziehau /* COMPAT */ 585f0a26983SSepherosa Ziehau static __inline struct mbuf * 586f0a26983SSepherosa Ziehau ifq_dequeue(struct ifaltq *_ifq, struct mbuf *_mpolled) 587f0a26983SSepherosa Ziehau { 588f0a26983SSepherosa Ziehau return ifsq_dequeue(ifq_get_subq_default(_ifq), _mpolled); 589f0a26983SSepherosa Ziehau } 590f0a26983SSepherosa Ziehau 591f0a26983SSepherosa Ziehau /* COMPAT */ 592f0a26983SSepherosa Ziehau static __inline void 593f0a26983SSepherosa Ziehau ifq_prepend(struct ifaltq *_ifq, struct mbuf *_m) 594f0a26983SSepherosa Ziehau { 595f0a26983SSepherosa Ziehau ifsq_prepend(ifq_get_subq_default(_ifq), _m); 596f0a26983SSepherosa Ziehau } 597f0a26983SSepherosa Ziehau 598f0a26983SSepherosa Ziehau /* COMPAT */ 599f0a26983SSepherosa Ziehau static __inline void 600f0a26983SSepherosa Ziehau ifq_set_cpuid(struct ifaltq *_ifq, int _cpuid) 601f0a26983SSepherosa Ziehau { 602f0a26983SSepherosa Ziehau KASSERT(_ifq->altq_subq_cnt == 1, 603f0a26983SSepherosa Ziehau ("invalid subqueue count %d", _ifq->altq_subq_cnt)); 604f0a26983SSepherosa Ziehau ifsq_set_cpuid(ifq_get_subq_default(_ifq), _cpuid); 60542fdf81eSSepherosa Ziehau } 60642fdf81eSSepherosa Ziehau 60703d6a592SMatthew Dillon #endif /* _NET_IFQ_VAR_H_ */ 608