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 3703d6a592SMatthew Dillon #error "This file should not be included by userland programs." 3803d6a592SMatthew Dillon 3903d6a592SMatthew Dillon #else 4003d6a592SMatthew Dillon 4103d6a592SMatthew Dillon #ifndef _SYS_SYSTM_H_ 421bd40720SMatthew Dillon #include <sys/systm.h> 431bd40720SMatthew Dillon #endif 441bd40720SMatthew Dillon #ifndef _SYS_THREAD2_H_ 454986965bSJoerg Sonnenberger #include <sys/thread2.h> 461bd40720SMatthew Dillon #endif 471bd40720SMatthew Dillon #ifndef _SYS_SERIALIZE_H_ 481bd40720SMatthew Dillon #include <sys/serialize.h> 491bd40720SMatthew Dillon #endif 501bd40720SMatthew Dillon #ifndef _SYS_MBUF_H_ 511bd40720SMatthew Dillon #include <sys/mbuf.h> 521bd40720SMatthew Dillon #endif 531bd40720SMatthew Dillon #ifndef _NET_IF_VAR_H_ 541bd40720SMatthew Dillon #include <net/if_var.h> 551bd40720SMatthew Dillon #endif 561bd40720SMatthew Dillon #ifndef _NET_ALTQ_IF_ALTQ_H_ 571bd40720SMatthew Dillon #include <net/altq/if_altq.h> 581bd40720SMatthew Dillon #endif 591bd40720SMatthew Dillon 60f0a26983SSepherosa Ziehau #define ASSERT_ALTQ_SQ_DEFAULT(ifp, ifsq) \ 61f0a26983SSepherosa Ziehau KASSERT(ifsq_get_ifp((ifsq)) == (ifp) && \ 62f0a26983SSepherosa Ziehau ifsq_get_index((ifsq)) == ALTQ_SUBQ_INDEX_DEFAULT, \ 63f0a26983SSepherosa Ziehau ("not ifp's default subqueue")); 64f0a26983SSepherosa Ziehau 651bd40720SMatthew Dillon struct ifaltq; 668a248085SSepherosa Ziehau struct ifaltq_subque; 678a248085SSepherosa Ziehau 688a248085SSepherosa Ziehau typedef void (*ifsq_watchdog_t)(struct ifaltq_subque *); 698a248085SSepherosa Ziehau 708a248085SSepherosa Ziehau struct ifsubq_watchdog { 718a248085SSepherosa Ziehau struct callout wd_callout; 728a248085SSepherosa Ziehau int wd_timer; 738a248085SSepherosa Ziehau struct ifaltq_subque *wd_subq; 748a248085SSepherosa Ziehau ifsq_watchdog_t wd_watchdog; 758a248085SSepherosa Ziehau }; 764986965bSJoerg Sonnenberger 779db4b353SSepherosa Ziehau /* 78058d1cd0SSepherosa Ziehau * Support for "classic" ALTQ interfaces. 799db4b353SSepherosa Ziehau */ 80f0a26983SSepherosa Ziehau int ifsq_classic_enqueue(struct ifaltq_subque *, struct mbuf *, 819db4b353SSepherosa Ziehau struct altq_pktattr *); 82f0a26983SSepherosa Ziehau struct mbuf *ifsq_classic_dequeue(struct ifaltq_subque *, struct mbuf *, 83f0a26983SSepherosa Ziehau 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); 91*c3fb75ddSSepherosa 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 /* 150058d1cd0SSepherosa Ziehau * ALTQ 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 * 177f0a26983SSepherosa Ziehau ifsq_dequeue(struct ifaltq_subque *_ifsq, struct mbuf *_mpolled) 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; 185f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 186f0a26983SSepherosa Ziehau _ifsq->ifq_len--; 187f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1889db4b353SSepherosa Ziehau return _m; 1899db4b353SSepherosa Ziehau } 1909db4b353SSepherosa Ziehau 1914d723e5aSJoerg Sonnenberger #ifdef ALTQ 192f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 193f0a26983SSepherosa Ziehau _m = tbr_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 194f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 195f0a26983SSepherosa Ziehau _m = ifsq_classic_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 1969db4b353SSepherosa Ziehau else 1974d723e5aSJoerg Sonnenberger #endif 198f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 199f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 2009db4b353SSepherosa Ziehau return _m; 2014d723e5aSJoerg Sonnenberger } 2024d723e5aSJoerg Sonnenberger 20378195a76SMatthew Dillon /* 204058d1cd0SSepherosa Ziehau * ALTQ lock must be held 20578195a76SMatthew Dillon */ 2064d723e5aSJoerg Sonnenberger static __inline struct mbuf * 207f0a26983SSepherosa Ziehau ifsq_poll_locked(struct ifaltq_subque *_ifsq) 2084d723e5aSJoerg Sonnenberger { 209f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) 210f0a26983SSepherosa Ziehau return _ifsq->ifsq_prepended; 2119db4b353SSepherosa Ziehau 2124d723e5aSJoerg Sonnenberger #ifdef ALTQ 213f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 214f0a26983SSepherosa Ziehau return tbr_dequeue(_ifsq, NULL, ALTDQ_POLL); 215f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 216f0a26983SSepherosa Ziehau return ifsq_classic_dequeue(_ifsq, NULL, ALTDQ_POLL); 2179db4b353SSepherosa Ziehau else 2184d723e5aSJoerg Sonnenberger #endif 219f0a26983SSepherosa Ziehau return _ifsq->ifsq_dequeue(_ifsq, NULL, ALTDQ_POLL); 2209db4b353SSepherosa Ziehau } 2219db4b353SSepherosa Ziehau 2229db4b353SSepherosa Ziehau static __inline struct mbuf * 223f0a26983SSepherosa Ziehau ifsq_poll(struct ifaltq_subque *_ifsq) 2249db4b353SSepherosa Ziehau { 2259db4b353SSepherosa Ziehau struct mbuf *_m; 2269db4b353SSepherosa Ziehau 227f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 228f0a26983SSepherosa Ziehau _m = ifsq_poll_locked(_ifsq); 229f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 2309db4b353SSepherosa Ziehau return _m; 2314d723e5aSJoerg Sonnenberger } 2324d723e5aSJoerg Sonnenberger 23378195a76SMatthew Dillon /* 234058d1cd0SSepherosa Ziehau * ALTQ lock must be held 23578195a76SMatthew Dillon */ 2364d723e5aSJoerg Sonnenberger static __inline void 237f0a26983SSepherosa Ziehau ifsq_purge_locked(struct ifaltq_subque *_ifsq) 2389db4b353SSepherosa Ziehau { 239f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 240f0a26983SSepherosa Ziehau m_freem(_ifsq->ifsq_prepended); 241f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 242f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 243f0a26983SSepherosa Ziehau _ifsq->ifq_len--; 2449db4b353SSepherosa Ziehau } 2459db4b353SSepherosa Ziehau 2469db4b353SSepherosa Ziehau #ifdef ALTQ 247f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 248f0a26983SSepherosa Ziehau ifsq_classic_request(_ifsq, ALTRQ_PURGE, NULL); 2499db4b353SSepherosa Ziehau else 2509db4b353SSepherosa Ziehau #endif 251f0a26983SSepherosa Ziehau _ifsq->ifsq_request(_ifsq, ALTRQ_PURGE, NULL); 2529db4b353SSepherosa Ziehau } 2539db4b353SSepherosa Ziehau 2549db4b353SSepherosa Ziehau static __inline void 255f0a26983SSepherosa Ziehau ifsq_purge(struct ifaltq_subque *_ifsq) 2564d723e5aSJoerg Sonnenberger { 257f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 258f0a26983SSepherosa Ziehau ifsq_purge_locked(_ifsq); 259f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 260f0a26983SSepherosa Ziehau } 261f0a26983SSepherosa Ziehau 262f0a26983SSepherosa Ziehau static __inline void 263f0a26983SSepherosa Ziehau ifq_lock_all(struct ifaltq *_ifq) 264f0a26983SSepherosa Ziehau { 265f0a26983SSepherosa Ziehau int _q; 266f0a26983SSepherosa Ziehau 267f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 268f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(&_ifq->altq_subq[_q]); 269f0a26983SSepherosa Ziehau } 270f0a26983SSepherosa Ziehau 271f0a26983SSepherosa Ziehau static __inline void 272f0a26983SSepherosa Ziehau ifq_unlock_all(struct ifaltq *_ifq) 273f0a26983SSepherosa Ziehau { 274f0a26983SSepherosa Ziehau int _q; 275f0a26983SSepherosa Ziehau 276f0a26983SSepherosa Ziehau for (_q = _ifq->altq_subq_cnt - 1; _q >= 0; --_q) 277f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(&_ifq->altq_subq[_q]); 2784d723e5aSJoerg Sonnenberger } 2794d723e5aSJoerg Sonnenberger 28078195a76SMatthew Dillon /* 281058d1cd0SSepherosa Ziehau * ALTQ lock must be held 28278195a76SMatthew Dillon */ 2834d723e5aSJoerg Sonnenberger static __inline void 2849275f515SSepherosa Ziehau ifq_purge_all_locked(struct ifaltq *_ifq) 2859275f515SSepherosa Ziehau { 286f0a26983SSepherosa Ziehau int _q; 287f0a26983SSepherosa Ziehau 288f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 289f0a26983SSepherosa Ziehau ifsq_purge_locked(&_ifq->altq_subq[_q]); 2909275f515SSepherosa Ziehau } 2919275f515SSepherosa Ziehau 2929275f515SSepherosa Ziehau static __inline void 2939275f515SSepherosa Ziehau ifq_purge_all(struct ifaltq *_ifq) 2949275f515SSepherosa Ziehau { 295f0a26983SSepherosa Ziehau ifq_lock_all(_ifq); 2969275f515SSepherosa Ziehau ifq_purge_all_locked(_ifq); 297f0a26983SSepherosa Ziehau ifq_unlock_all(_ifq); 2989275f515SSepherosa Ziehau } 2999275f515SSepherosa Ziehau 3009275f515SSepherosa Ziehau static __inline void 3014d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 3024d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 3034d723e5aSJoerg Sonnenberger { 3049db4b353SSepherosa Ziehau #ifdef ALTQ 3059db4b353SSepherosa Ziehau if (ifq_is_enabled(_ifq)) { 3064d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 3074d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 308f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 309f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) { 310f0a26983SSepherosa Ziehau /* XXX default subqueue */ 311f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq = 312f0a26983SSepherosa Ziehau &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 313f0a26983SSepherosa Ziehau 314f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 315f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 316f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) 3179db4b353SSepherosa Ziehau _ifq->altq_classify(_ifq, _m, _pa); 318f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3199db4b353SSepherosa Ziehau } 320f0a26983SSepherosa Ziehau } 3219db4b353SSepherosa Ziehau #endif 3229db4b353SSepherosa Ziehau } 3239db4b353SSepherosa Ziehau 3249db4b353SSepherosa Ziehau static __inline void 325f0a26983SSepherosa Ziehau ifsq_prepend(struct ifaltq_subque *_ifsq, struct mbuf *_m) 3269db4b353SSepherosa Ziehau { 327f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 328f0a26983SSepherosa Ziehau KASSERT(_ifsq->ifsq_prepended == NULL, ("pending prepended mbuf")); 329f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = _m; 330f0a26983SSepherosa Ziehau _ifsq->ifq_len++; 331f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3324d723e5aSJoerg Sonnenberger } 3334d723e5aSJoerg Sonnenberger 334058d1cd0SSepherosa Ziehau /* 335058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 336058d1cd0SSepherosa Ziehau */ 3379ed293e0SSepherosa Ziehau static __inline void 338f0a26983SSepherosa Ziehau ifsq_set_oactive(struct ifaltq_subque *_ifsq) 3399ed293e0SSepherosa Ziehau { 340f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 1; 3419ed293e0SSepherosa Ziehau } 3429ed293e0SSepherosa Ziehau 343058d1cd0SSepherosa Ziehau /* 344058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 345058d1cd0SSepherosa Ziehau */ 3469ed293e0SSepherosa Ziehau static __inline void 347f0a26983SSepherosa Ziehau ifsq_clr_oactive(struct ifaltq_subque *_ifsq) 3489ed293e0SSepherosa Ziehau { 349f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 0; 3509ed293e0SSepherosa Ziehau } 3519ed293e0SSepherosa Ziehau 352058d1cd0SSepherosa Ziehau /* 353058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 354058d1cd0SSepherosa Ziehau */ 3559ed293e0SSepherosa Ziehau static __inline int 356f0a26983SSepherosa Ziehau ifsq_is_oactive(const struct ifaltq_subque *_ifsq) 3579ed293e0SSepherosa Ziehau { 358f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_oactive; 3599ed293e0SSepherosa Ziehau } 3609ed293e0SSepherosa Ziehau 36178195a76SMatthew Dillon /* 36278195a76SMatthew Dillon * Hand a packet to an interface. 36378195a76SMatthew Dillon * 364058d1cd0SSepherosa Ziehau * Interface TX serializer must be held. If the interface TX 365058d1cd0SSepherosa Ziehau * serializer is not held yet, ifq_dispatch() should be used 366058d1cd0SSepherosa Ziehau * to get better performance. 36778195a76SMatthew Dillon */ 3684d723e5aSJoerg Sonnenberger static __inline int 3694d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 3704d723e5aSJoerg Sonnenberger { 371f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq; 3724986965bSJoerg Sonnenberger int _error; 373f0a26983SSepherosa Ziehau int _qid = ALTQ_SUBQ_INDEX_DEFAULT; /* XXX default subqueue */ 374f0a26983SSepherosa Ziehau 375f0a26983SSepherosa Ziehau _ifsq = &_ifp->if_snd.altq_subq[_qid]; 3764d723e5aSJoerg Sonnenberger 3773c4cd924SSepherosa Ziehau ASSERT_IFNET_SERIALIZED_TX(_ifp, _ifsq); 378f0a26983SSepherosa Ziehau _error = ifsq_enqueue(_ifsq, _m, _pa); 3794d723e5aSJoerg Sonnenberger if (_error == 0) { 3804d723e5aSJoerg Sonnenberger _ifp->if_obytes += _m->m_pkthdr.len; 3814d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 3824d723e5aSJoerg Sonnenberger _ifp->if_omcasts++; 383f0a26983SSepherosa Ziehau if (!ifsq_is_oactive(_ifsq)) 384f0a26983SSepherosa Ziehau (*_ifp->if_start)(_ifp, _ifsq); 3854d723e5aSJoerg Sonnenberger } 3864d723e5aSJoerg Sonnenberger return(_error); 3874d723e5aSJoerg Sonnenberger } 3884d723e5aSJoerg Sonnenberger 3894d723e5aSJoerg Sonnenberger static __inline int 390f0a26983SSepherosa Ziehau ifsq_is_empty(const struct ifaltq_subque *_ifsq) 3914d723e5aSJoerg Sonnenberger { 392f0a26983SSepherosa Ziehau return(_ifsq->ifq_len == 0); 3934d723e5aSJoerg Sonnenberger } 3944d723e5aSJoerg Sonnenberger 395058d1cd0SSepherosa Ziehau /* 396058d1cd0SSepherosa Ziehau * ALTQ lock must be held 397058d1cd0SSepherosa Ziehau */ 3989db4b353SSepherosa Ziehau static __inline int 399f0a26983SSepherosa Ziehau ifsq_data_ready(struct ifaltq_subque *_ifsq) 4009db4b353SSepherosa Ziehau { 4019db4b353SSepherosa Ziehau #ifdef ALTQ 402f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 403f0a26983SSepherosa Ziehau return (ifsq_poll_locked(_ifsq) != NULL); 4049db4b353SSepherosa Ziehau else 4059db4b353SSepherosa Ziehau #endif 406f0a26983SSepherosa Ziehau return !ifsq_is_empty(_ifsq); 4079db4b353SSepherosa Ziehau } 408b2f93efeSJoerg Sonnenberger 409acf18b65SSepherosa Ziehau /* 410acf18b65SSepherosa Ziehau * ALTQ lock must be held 411acf18b65SSepherosa Ziehau */ 412acf18b65SSepherosa Ziehau static __inline int 413f0a26983SSepherosa Ziehau ifsq_is_started(const struct ifaltq_subque *_ifsq) 414acf18b65SSepherosa Ziehau { 415f0a26983SSepherosa Ziehau return _ifsq->ifsq_started; 416acf18b65SSepherosa Ziehau } 417acf18b65SSepherosa Ziehau 418acf18b65SSepherosa Ziehau /* 419acf18b65SSepherosa Ziehau * ALTQ lock must be held 420acf18b65SSepherosa Ziehau */ 421acf18b65SSepherosa Ziehau static __inline void 422f0a26983SSepherosa Ziehau ifsq_set_started(struct ifaltq_subque *_ifsq) 423acf18b65SSepherosa Ziehau { 424f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 1; 425acf18b65SSepherosa Ziehau } 426acf18b65SSepherosa Ziehau 427acf18b65SSepherosa Ziehau /* 428acf18b65SSepherosa Ziehau * ALTQ lock must be held 429acf18b65SSepherosa Ziehau */ 430acf18b65SSepherosa Ziehau static __inline void 431f0a26983SSepherosa Ziehau ifsq_clr_started(struct ifaltq_subque *_ifsq) 432acf18b65SSepherosa Ziehau { 433f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 0; 434acf18b65SSepherosa Ziehau } 435acf18b65SSepherosa Ziehau 436f0a26983SSepherosa Ziehau static __inline struct ifsubq_stage * 437f0a26983SSepherosa Ziehau ifsq_get_stage(struct ifaltq_subque *_ifsq, int _cpuid) 438928e2027SSepherosa Ziehau { 439f0a26983SSepherosa Ziehau return &_ifsq->ifsq_stage[_cpuid]; 440928e2027SSepherosa Ziehau } 441928e2027SSepherosa Ziehau 442dfd3b18bSSepherosa Ziehau static __inline int 443f0a26983SSepherosa Ziehau ifsq_get_cpuid(const struct ifaltq_subque *_ifsq) 444dfd3b18bSSepherosa Ziehau { 445f0a26983SSepherosa Ziehau return _ifsq->ifsq_cpuid; 446dfd3b18bSSepherosa Ziehau } 447dfd3b18bSSepherosa Ziehau 448dfd3b18bSSepherosa Ziehau static __inline void 449f0a26983SSepherosa Ziehau ifsq_set_cpuid(struct ifaltq_subque *_ifsq, int _cpuid) 450dfd3b18bSSepherosa Ziehau { 451f0a26983SSepherosa Ziehau KASSERT(_cpuid >= 0 && _cpuid < ncpus, 452f0a26983SSepherosa Ziehau ("invalid ifsq_cpuid %d", _cpuid)); 453f0a26983SSepherosa Ziehau _ifsq->ifsq_cpuid = _cpuid; 454dfd3b18bSSepherosa Ziehau } 455dfd3b18bSSepherosa Ziehau 45642fdf81eSSepherosa Ziehau static __inline struct lwkt_msg * 457f0a26983SSepherosa Ziehau ifsq_get_ifstart_lmsg(struct ifaltq_subque *_ifsq, int _cpuid) 45842fdf81eSSepherosa Ziehau { 459f0a26983SSepherosa Ziehau return &_ifsq->ifsq_ifstart_nmsg[_cpuid].lmsg; 460f0a26983SSepherosa Ziehau } 461f0a26983SSepherosa Ziehau 462f0a26983SSepherosa Ziehau static __inline int 463f0a26983SSepherosa Ziehau ifsq_get_index(const struct ifaltq_subque *_ifsq) 464f0a26983SSepherosa Ziehau { 465f0a26983SSepherosa Ziehau return _ifsq->ifsq_index; 466f0a26983SSepherosa Ziehau } 467f0a26983SSepherosa Ziehau 468f0a26983SSepherosa Ziehau static __inline void 469f0a26983SSepherosa Ziehau ifsq_set_priv(struct ifaltq_subque *_ifsq, void *_priv) 470f0a26983SSepherosa Ziehau { 471f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_priv = _priv; 472f0a26983SSepherosa Ziehau } 473f0a26983SSepherosa Ziehau 474f0a26983SSepherosa Ziehau static __inline void * 475f0a26983SSepherosa Ziehau ifsq_get_priv(const struct ifaltq_subque *_ifsq) 476f0a26983SSepherosa Ziehau { 477f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_priv; 478f0a26983SSepherosa Ziehau } 479f0a26983SSepherosa Ziehau 480f0a26983SSepherosa Ziehau static __inline struct ifnet * 481f0a26983SSepherosa Ziehau ifsq_get_ifp(const struct ifaltq_subque *_ifsq) 482f0a26983SSepherosa Ziehau { 483f0a26983SSepherosa Ziehau return _ifsq->ifsq_ifp; 484f0a26983SSepherosa Ziehau } 485f0a26983SSepherosa Ziehau 486f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 487f0a26983SSepherosa Ziehau ifq_get_subq_default(const struct ifaltq *_ifq) 488f0a26983SSepherosa Ziehau { 489f0a26983SSepherosa Ziehau return &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 490f0a26983SSepherosa Ziehau } 491f0a26983SSepherosa Ziehau 492f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 493f0a26983SSepherosa Ziehau ifq_get_subq(const struct ifaltq *_ifq, int _idx) 494f0a26983SSepherosa Ziehau { 495f0a26983SSepherosa Ziehau KASSERT(_idx >= 0 && _idx < _ifq->altq_subq_cnt, 496f0a26983SSepherosa Ziehau ("invalid qid %d", _idx)); 497f0a26983SSepherosa Ziehau return &_ifq->altq_subq[_idx]; 498f0a26983SSepherosa Ziehau } 499f0a26983SSepherosa Ziehau 5002cc2f639SSepherosa Ziehau static __inline struct ifaltq_subque * 5012cc2f639SSepherosa Ziehau ifq_map_subq(struct ifaltq *_ifq, int _cpuid) 5022cc2f639SSepherosa Ziehau { 5032cc2f639SSepherosa Ziehau int _idx = _ifq->altq_mapsubq(_ifq, _cpuid); 5042cc2f639SSepherosa Ziehau return ifq_get_subq(_ifq, _idx); 5052cc2f639SSepherosa Ziehau } 5062cc2f639SSepherosa Ziehau 5079469a4a2SSepherosa Ziehau static __inline void 5089469a4a2SSepherosa Ziehau ifq_set_subq_cnt(struct ifaltq *_ifq, int _cnt) 5099469a4a2SSepherosa Ziehau { 5109469a4a2SSepherosa Ziehau _ifq->altq_subq_cnt = _cnt; 5119469a4a2SSepherosa Ziehau } 5129469a4a2SSepherosa Ziehau 513*c3fb75ddSSepherosa Ziehau static __inline void 514*c3fb75ddSSepherosa Ziehau ifq_set_subq_mask(struct ifaltq *_ifq, uint32_t _mask) 515*c3fb75ddSSepherosa Ziehau { 516*c3fb75ddSSepherosa Ziehau KASSERT(((_mask - 1) & _mask) == 0, ("invalid mask %08x", _mask)); 517*c3fb75ddSSepherosa Ziehau _ifq->altq_subq_mask = _mask; 518*c3fb75ddSSepherosa Ziehau } 519*c3fb75ddSSepherosa Ziehau 520f0a26983SSepherosa Ziehau /* COMPAT */ 521f0a26983SSepherosa Ziehau static __inline int 522f0a26983SSepherosa Ziehau ifq_is_oactive(const struct ifaltq *_ifq) 523f0a26983SSepherosa Ziehau { 524f0a26983SSepherosa Ziehau return ifsq_is_oactive(ifq_get_subq_default(_ifq)); 525f0a26983SSepherosa Ziehau } 526f0a26983SSepherosa Ziehau 527f0a26983SSepherosa Ziehau /* COMPAT */ 528f0a26983SSepherosa Ziehau static __inline void 529f0a26983SSepherosa Ziehau ifq_set_oactive(struct ifaltq *_ifq) 530f0a26983SSepherosa Ziehau { 531f0a26983SSepherosa Ziehau ifsq_set_oactive(ifq_get_subq_default(_ifq)); 532f0a26983SSepherosa Ziehau } 533f0a26983SSepherosa Ziehau 534f0a26983SSepherosa Ziehau /* COMPAT */ 535f0a26983SSepherosa Ziehau static __inline void 536f0a26983SSepherosa Ziehau ifq_clr_oactive(struct ifaltq *_ifq) 537f0a26983SSepherosa Ziehau { 538f0a26983SSepherosa Ziehau ifsq_clr_oactive(ifq_get_subq_default(_ifq)); 539f0a26983SSepherosa Ziehau } 540f0a26983SSepherosa Ziehau 541f0a26983SSepherosa Ziehau /* COMPAT */ 542f0a26983SSepherosa Ziehau static __inline int 543f0a26983SSepherosa Ziehau ifq_is_empty(struct ifaltq *_ifq) 544f0a26983SSepherosa Ziehau { 545f0a26983SSepherosa Ziehau return ifsq_is_empty(ifq_get_subq_default(_ifq)); 546f0a26983SSepherosa Ziehau } 547f0a26983SSepherosa Ziehau 548f0a26983SSepherosa Ziehau /* COMPAT */ 549f0a26983SSepherosa Ziehau static __inline void 550f0a26983SSepherosa Ziehau ifq_purge(struct ifaltq *_ifq) 551f0a26983SSepherosa Ziehau { 552f0a26983SSepherosa Ziehau ifsq_purge(ifq_get_subq_default(_ifq)); 553f0a26983SSepherosa Ziehau } 554f0a26983SSepherosa Ziehau 555f0a26983SSepherosa Ziehau /* COMPAT */ 556f0a26983SSepherosa Ziehau static __inline struct mbuf * 557f0a26983SSepherosa Ziehau ifq_dequeue(struct ifaltq *_ifq, struct mbuf *_mpolled) 558f0a26983SSepherosa Ziehau { 559f0a26983SSepherosa Ziehau return ifsq_dequeue(ifq_get_subq_default(_ifq), _mpolled); 560f0a26983SSepherosa Ziehau } 561f0a26983SSepherosa Ziehau 562f0a26983SSepherosa Ziehau /* COMPAT */ 563f0a26983SSepherosa Ziehau static __inline void 564f0a26983SSepherosa Ziehau ifq_prepend(struct ifaltq *_ifq, struct mbuf *_m) 565f0a26983SSepherosa Ziehau { 566f0a26983SSepherosa Ziehau ifsq_prepend(ifq_get_subq_default(_ifq), _m); 567f0a26983SSepherosa Ziehau } 568f0a26983SSepherosa Ziehau 569f0a26983SSepherosa Ziehau /* COMPAT */ 570f0a26983SSepherosa Ziehau static __inline void 571f0a26983SSepherosa Ziehau ifq_set_cpuid(struct ifaltq *_ifq, int _cpuid) 572f0a26983SSepherosa Ziehau { 573f0a26983SSepherosa Ziehau KASSERT(_ifq->altq_subq_cnt == 1, 574f0a26983SSepherosa Ziehau ("invalid subqueue count %d", _ifq->altq_subq_cnt)); 575f0a26983SSepherosa Ziehau ifsq_set_cpuid(ifq_get_subq_default(_ifq), _cpuid); 57642fdf81eSSepherosa Ziehau } 57742fdf81eSSepherosa Ziehau 57803d6a592SMatthew Dillon #endif /* _KERNEL */ 57903d6a592SMatthew Dillon #endif /* _NET_IFQ_VAR_H_ */ 580