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); 91f0a26983SSepherosa Ziehau 92f0a26983SSepherosa Ziehau void ifsq_devstart(struct ifaltq_subque *ifsq); 93f0a26983SSepherosa Ziehau void ifsq_devstart_sched(struct ifaltq_subque *ifsq); 94058d1cd0SSepherosa Ziehau 958a248085SSepherosa Ziehau void ifsq_watchdog_init(struct ifsubq_watchdog *, 968a248085SSepherosa Ziehau struct ifaltq_subque *, ifsq_watchdog_t); 978a248085SSepherosa Ziehau void ifsq_watchdog_start(struct ifsubq_watchdog *); 988a248085SSepherosa Ziehau void ifsq_watchdog_stop(struct ifsubq_watchdog *); 998a248085SSepherosa Ziehau 100058d1cd0SSepherosa Ziehau /* 101058d1cd0SSepherosa Ziehau * Dispatch a packet to an interface. 102058d1cd0SSepherosa Ziehau */ 1039db4b353SSepherosa Ziehau int ifq_dispatch(struct ifnet *, struct mbuf *, 1049db4b353SSepherosa Ziehau struct altq_pktattr *); 1059db4b353SSepherosa Ziehau 1064d723e5aSJoerg Sonnenberger #ifdef ALTQ 107058d1cd0SSepherosa Ziehau 1084d723e5aSJoerg Sonnenberger static __inline int 1094d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1104d723e5aSJoerg Sonnenberger { 1114d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_ENABLED); 1124d723e5aSJoerg Sonnenberger } 1134d723e5aSJoerg Sonnenberger 1144d723e5aSJoerg Sonnenberger static __inline int 1154d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1164d723e5aSJoerg Sonnenberger { 1174d723e5aSJoerg Sonnenberger return(_ifq->altq_disc != NULL); 1184d723e5aSJoerg Sonnenberger } 119058d1cd0SSepherosa Ziehau 120058d1cd0SSepherosa Ziehau #else /* !ALTQ */ 121058d1cd0SSepherosa Ziehau 1224d723e5aSJoerg Sonnenberger static __inline int 1234d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 1244d723e5aSJoerg Sonnenberger { 1254d723e5aSJoerg Sonnenberger return(0); 1264d723e5aSJoerg Sonnenberger } 1274d723e5aSJoerg Sonnenberger 1284d723e5aSJoerg Sonnenberger static __inline int 1294d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 1304d723e5aSJoerg Sonnenberger { 1314d723e5aSJoerg Sonnenberger return(0); 1324d723e5aSJoerg Sonnenberger } 1334d723e5aSJoerg Sonnenberger 134058d1cd0SSepherosa Ziehau #endif /* ALTQ */ 135058d1cd0SSepherosa Ziehau 1364d723e5aSJoerg Sonnenberger static __inline int 1374d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq) 1384d723e5aSJoerg Sonnenberger { 1394d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_READY); 1404d723e5aSJoerg Sonnenberger } 1414d723e5aSJoerg Sonnenberger 1424d723e5aSJoerg Sonnenberger static __inline void 1434d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq) 1444d723e5aSJoerg Sonnenberger { 1454d723e5aSJoerg Sonnenberger _ifq->altq_flags |= ALTQF_READY; 1464d723e5aSJoerg Sonnenberger } 1474d723e5aSJoerg Sonnenberger 14878195a76SMatthew Dillon /* 149058d1cd0SSepherosa Ziehau * ALTQ lock must be held 15078195a76SMatthew Dillon */ 1514d723e5aSJoerg Sonnenberger static __inline int 152f0a26983SSepherosa Ziehau ifsq_enqueue_locked(struct ifaltq_subque *_ifsq, struct mbuf *_m, 1539db4b353SSepherosa Ziehau struct altq_pktattr *_pa) 1549db4b353SSepherosa Ziehau { 1559db4b353SSepherosa Ziehau #ifdef ALTQ 156f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 157f0a26983SSepherosa Ziehau return ifsq_classic_enqueue(_ifsq, _m, _pa); 1589db4b353SSepherosa Ziehau else 1599db4b353SSepherosa Ziehau #endif 160f0a26983SSepherosa Ziehau return _ifsq->ifsq_enqueue(_ifsq, _m, _pa); 1619db4b353SSepherosa Ziehau } 1629db4b353SSepherosa Ziehau 1639db4b353SSepherosa Ziehau static __inline int 164f0a26983SSepherosa Ziehau ifsq_enqueue(struct ifaltq_subque *_ifsq, struct mbuf *_m, 165f0a26983SSepherosa Ziehau struct altq_pktattr *_pa) 1664d723e5aSJoerg Sonnenberger { 1679db4b353SSepherosa Ziehau int _error; 1689db4b353SSepherosa Ziehau 169f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 170f0a26983SSepherosa Ziehau _error = ifsq_enqueue_locked(_ifsq, _m, _pa); 171f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1729db4b353SSepherosa Ziehau return _error; 1734d723e5aSJoerg Sonnenberger } 1744d723e5aSJoerg Sonnenberger 1754d723e5aSJoerg Sonnenberger static __inline struct mbuf * 176f0a26983SSepherosa Ziehau ifsq_dequeue(struct ifaltq_subque *_ifsq, struct mbuf *_mpolled) 1774d723e5aSJoerg Sonnenberger { 1789db4b353SSepherosa Ziehau struct mbuf *_m; 1799db4b353SSepherosa Ziehau 180f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 181f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 182f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_prepended; 183f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 184f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 185f0a26983SSepherosa Ziehau _ifsq->ifq_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) 192f0a26983SSepherosa Ziehau _m = tbr_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 193f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 194f0a26983SSepherosa Ziehau _m = ifsq_classic_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 1959db4b353SSepherosa Ziehau else 1964d723e5aSJoerg Sonnenberger #endif 197f0a26983SSepherosa Ziehau _m = _ifsq->ifsq_dequeue(_ifsq, _mpolled, ALTDQ_REMOVE); 198f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 1999db4b353SSepherosa Ziehau return _m; 2004d723e5aSJoerg Sonnenberger } 2014d723e5aSJoerg Sonnenberger 20278195a76SMatthew Dillon /* 203058d1cd0SSepherosa Ziehau * ALTQ 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) 213f0a26983SSepherosa Ziehau return tbr_dequeue(_ifsq, NULL, ALTDQ_POLL); 214f0a26983SSepherosa Ziehau else if (!ifq_is_enabled(_ifsq->ifsq_altq)) 215f0a26983SSepherosa Ziehau return ifsq_classic_dequeue(_ifsq, NULL, ALTDQ_POLL); 2169db4b353SSepherosa Ziehau else 2174d723e5aSJoerg Sonnenberger #endif 218f0a26983SSepherosa Ziehau return _ifsq->ifsq_dequeue(_ifsq, NULL, 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 23278195a76SMatthew Dillon /* 233058d1cd0SSepherosa Ziehau * ALTQ lock must be held 23478195a76SMatthew Dillon */ 2354d723e5aSJoerg Sonnenberger static __inline void 236f0a26983SSepherosa Ziehau ifsq_purge_locked(struct ifaltq_subque *_ifsq) 2379db4b353SSepherosa Ziehau { 238f0a26983SSepherosa Ziehau if (_ifsq->ifsq_prepended != NULL) { 239f0a26983SSepherosa Ziehau m_freem(_ifsq->ifsq_prepended); 240f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = NULL; 241f0a26983SSepherosa Ziehau KKASSERT(_ifsq->ifq_len > 0); 242f0a26983SSepherosa Ziehau _ifsq->ifq_len--; 2439db4b353SSepherosa Ziehau } 2449db4b353SSepherosa Ziehau 2459db4b353SSepherosa Ziehau #ifdef ALTQ 246f0a26983SSepherosa Ziehau if (!ifq_is_enabled(_ifsq->ifsq_altq)) 247f0a26983SSepherosa Ziehau ifsq_classic_request(_ifsq, ALTRQ_PURGE, NULL); 2489db4b353SSepherosa Ziehau else 2499db4b353SSepherosa Ziehau #endif 250f0a26983SSepherosa Ziehau _ifsq->ifsq_request(_ifsq, ALTRQ_PURGE, NULL); 2519db4b353SSepherosa Ziehau } 2529db4b353SSepherosa Ziehau 2539db4b353SSepherosa Ziehau static __inline void 254f0a26983SSepherosa Ziehau ifsq_purge(struct ifaltq_subque *_ifsq) 2554d723e5aSJoerg Sonnenberger { 256f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 257f0a26983SSepherosa Ziehau ifsq_purge_locked(_ifsq); 258f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 259f0a26983SSepherosa Ziehau } 260f0a26983SSepherosa Ziehau 261f0a26983SSepherosa Ziehau static __inline void 262f0a26983SSepherosa Ziehau ifq_lock_all(struct ifaltq *_ifq) 263f0a26983SSepherosa Ziehau { 264f0a26983SSepherosa Ziehau int _q; 265f0a26983SSepherosa Ziehau 266f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 267f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(&_ifq->altq_subq[_q]); 268f0a26983SSepherosa Ziehau } 269f0a26983SSepherosa Ziehau 270f0a26983SSepherosa Ziehau static __inline void 271f0a26983SSepherosa Ziehau ifq_unlock_all(struct ifaltq *_ifq) 272f0a26983SSepherosa Ziehau { 273f0a26983SSepherosa Ziehau int _q; 274f0a26983SSepherosa Ziehau 275f0a26983SSepherosa Ziehau for (_q = _ifq->altq_subq_cnt - 1; _q >= 0; --_q) 276f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(&_ifq->altq_subq[_q]); 2774d723e5aSJoerg Sonnenberger } 2784d723e5aSJoerg Sonnenberger 27978195a76SMatthew Dillon /* 280058d1cd0SSepherosa Ziehau * ALTQ lock must be held 28178195a76SMatthew Dillon */ 2824d723e5aSJoerg Sonnenberger static __inline void 2839275f515SSepherosa Ziehau ifq_purge_all_locked(struct ifaltq *_ifq) 2849275f515SSepherosa Ziehau { 285f0a26983SSepherosa Ziehau int _q; 286f0a26983SSepherosa Ziehau 287f0a26983SSepherosa Ziehau for (_q = 0; _q < _ifq->altq_subq_cnt; ++_q) 288f0a26983SSepherosa Ziehau ifsq_purge_locked(&_ifq->altq_subq[_q]); 2899275f515SSepherosa Ziehau } 2909275f515SSepherosa Ziehau 2919275f515SSepherosa Ziehau static __inline void 2929275f515SSepherosa Ziehau ifq_purge_all(struct ifaltq *_ifq) 2939275f515SSepherosa Ziehau { 294f0a26983SSepherosa Ziehau ifq_lock_all(_ifq); 2959275f515SSepherosa Ziehau ifq_purge_all_locked(_ifq); 296f0a26983SSepherosa Ziehau ifq_unlock_all(_ifq); 2979275f515SSepherosa Ziehau } 2989275f515SSepherosa Ziehau 2999275f515SSepherosa Ziehau static __inline void 3004d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 3014d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 3024d723e5aSJoerg Sonnenberger { 3039db4b353SSepherosa Ziehau #ifdef ALTQ 3049db4b353SSepherosa Ziehau if (ifq_is_enabled(_ifq)) { 3054d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 3064d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 307f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 308f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) { 309f0a26983SSepherosa Ziehau /* XXX default subqueue */ 310f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq = 311f0a26983SSepherosa Ziehau &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 312f0a26983SSepherosa Ziehau 313f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 314f0a26983SSepherosa Ziehau if (ifq_is_enabled(_ifq) && 315f0a26983SSepherosa Ziehau (_ifq->altq_flags & ALTQF_CLASSIFY)) 3169db4b353SSepherosa Ziehau _ifq->altq_classify(_ifq, _m, _pa); 317f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3189db4b353SSepherosa Ziehau } 319f0a26983SSepherosa Ziehau } 3209db4b353SSepherosa Ziehau #endif 3219db4b353SSepherosa Ziehau } 3229db4b353SSepherosa Ziehau 3239db4b353SSepherosa Ziehau static __inline void 324f0a26983SSepherosa Ziehau ifsq_prepend(struct ifaltq_subque *_ifsq, struct mbuf *_m) 3259db4b353SSepherosa Ziehau { 326f0a26983SSepherosa Ziehau ALTQ_SQ_LOCK(_ifsq); 327f0a26983SSepherosa Ziehau KASSERT(_ifsq->ifsq_prepended == NULL, ("pending prepended mbuf")); 328f0a26983SSepherosa Ziehau _ifsq->ifsq_prepended = _m; 329f0a26983SSepherosa Ziehau _ifsq->ifq_len++; 330f0a26983SSepherosa Ziehau ALTQ_SQ_UNLOCK(_ifsq); 3314d723e5aSJoerg Sonnenberger } 3324d723e5aSJoerg Sonnenberger 333058d1cd0SSepherosa Ziehau /* 334058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 335058d1cd0SSepherosa Ziehau */ 3369ed293e0SSepherosa Ziehau static __inline void 337f0a26983SSepherosa Ziehau ifsq_set_oactive(struct ifaltq_subque *_ifsq) 3389ed293e0SSepherosa Ziehau { 339f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 1; 3409ed293e0SSepherosa Ziehau } 3419ed293e0SSepherosa Ziehau 342058d1cd0SSepherosa Ziehau /* 343058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 344058d1cd0SSepherosa Ziehau */ 3459ed293e0SSepherosa Ziehau static __inline void 346f0a26983SSepherosa Ziehau ifsq_clr_oactive(struct ifaltq_subque *_ifsq) 3479ed293e0SSepherosa Ziehau { 348f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_oactive = 0; 3499ed293e0SSepherosa Ziehau } 3509ed293e0SSepherosa Ziehau 351058d1cd0SSepherosa Ziehau /* 352058d1cd0SSepherosa Ziehau * Interface TX serializer must be held 353058d1cd0SSepherosa Ziehau */ 3549ed293e0SSepherosa Ziehau static __inline int 355f0a26983SSepherosa Ziehau ifsq_is_oactive(const struct ifaltq_subque *_ifsq) 3569ed293e0SSepherosa Ziehau { 357f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_oactive; 3589ed293e0SSepherosa Ziehau } 3599ed293e0SSepherosa Ziehau 36078195a76SMatthew Dillon /* 36178195a76SMatthew Dillon * Hand a packet to an interface. 36278195a76SMatthew Dillon * 363058d1cd0SSepherosa Ziehau * Interface TX serializer must be held. If the interface TX 364058d1cd0SSepherosa Ziehau * serializer is not held yet, ifq_dispatch() should be used 365058d1cd0SSepherosa Ziehau * to get better performance. 36678195a76SMatthew Dillon */ 3674d723e5aSJoerg Sonnenberger static __inline int 3684d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 3694d723e5aSJoerg Sonnenberger { 370f0a26983SSepherosa Ziehau struct ifaltq_subque *_ifsq; 3714986965bSJoerg Sonnenberger int _error; 372f0a26983SSepherosa Ziehau int _qid = ALTQ_SUBQ_INDEX_DEFAULT; /* XXX default subqueue */ 373f0a26983SSepherosa Ziehau 374f0a26983SSepherosa Ziehau _ifsq = &_ifp->if_snd.altq_subq[_qid]; 3754d723e5aSJoerg Sonnenberger 3763c4cd924SSepherosa Ziehau ASSERT_IFNET_SERIALIZED_TX(_ifp, _ifsq); 377f0a26983SSepherosa Ziehau _error = ifsq_enqueue(_ifsq, _m, _pa); 3784d723e5aSJoerg Sonnenberger if (_error == 0) { 3794d723e5aSJoerg Sonnenberger _ifp->if_obytes += _m->m_pkthdr.len; 3804d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 3814d723e5aSJoerg Sonnenberger _ifp->if_omcasts++; 382f0a26983SSepherosa Ziehau if (!ifsq_is_oactive(_ifsq)) 383f0a26983SSepherosa Ziehau (*_ifp->if_start)(_ifp, _ifsq); 3844d723e5aSJoerg Sonnenberger } 3854d723e5aSJoerg Sonnenberger return(_error); 3864d723e5aSJoerg Sonnenberger } 3874d723e5aSJoerg Sonnenberger 3884d723e5aSJoerg Sonnenberger static __inline int 389f0a26983SSepherosa Ziehau ifsq_is_empty(const struct ifaltq_subque *_ifsq) 3904d723e5aSJoerg Sonnenberger { 391f0a26983SSepherosa Ziehau return(_ifsq->ifq_len == 0); 3924d723e5aSJoerg Sonnenberger } 3934d723e5aSJoerg Sonnenberger 394058d1cd0SSepherosa Ziehau /* 395058d1cd0SSepherosa Ziehau * ALTQ lock must be held 396058d1cd0SSepherosa Ziehau */ 3979db4b353SSepherosa Ziehau static __inline int 398f0a26983SSepherosa Ziehau ifsq_data_ready(struct ifaltq_subque *_ifsq) 3999db4b353SSepherosa Ziehau { 4009db4b353SSepherosa Ziehau #ifdef ALTQ 401f0a26983SSepherosa Ziehau if (_ifsq->ifsq_altq->altq_tbr != NULL) 402f0a26983SSepherosa Ziehau return (ifsq_poll_locked(_ifsq) != NULL); 4039db4b353SSepherosa Ziehau else 4049db4b353SSepherosa Ziehau #endif 405f0a26983SSepherosa Ziehau return !ifsq_is_empty(_ifsq); 4069db4b353SSepherosa Ziehau } 407b2f93efeSJoerg Sonnenberger 408acf18b65SSepherosa Ziehau /* 409acf18b65SSepherosa Ziehau * ALTQ lock must be held 410acf18b65SSepherosa Ziehau */ 411acf18b65SSepherosa Ziehau static __inline int 412f0a26983SSepherosa Ziehau ifsq_is_started(const struct ifaltq_subque *_ifsq) 413acf18b65SSepherosa Ziehau { 414f0a26983SSepherosa Ziehau return _ifsq->ifsq_started; 415acf18b65SSepherosa Ziehau } 416acf18b65SSepherosa Ziehau 417acf18b65SSepherosa Ziehau /* 418acf18b65SSepherosa Ziehau * ALTQ lock must be held 419acf18b65SSepherosa Ziehau */ 420acf18b65SSepherosa Ziehau static __inline void 421f0a26983SSepherosa Ziehau ifsq_set_started(struct ifaltq_subque *_ifsq) 422acf18b65SSepherosa Ziehau { 423f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 1; 424acf18b65SSepherosa Ziehau } 425acf18b65SSepherosa Ziehau 426acf18b65SSepherosa Ziehau /* 427acf18b65SSepherosa Ziehau * ALTQ lock must be held 428acf18b65SSepherosa Ziehau */ 429acf18b65SSepherosa Ziehau static __inline void 430f0a26983SSepherosa Ziehau ifsq_clr_started(struct ifaltq_subque *_ifsq) 431acf18b65SSepherosa Ziehau { 432f0a26983SSepherosa Ziehau _ifsq->ifsq_started = 0; 433acf18b65SSepherosa Ziehau } 434acf18b65SSepherosa Ziehau 435f0a26983SSepherosa Ziehau static __inline struct ifsubq_stage * 436f0a26983SSepherosa Ziehau ifsq_get_stage(struct ifaltq_subque *_ifsq, int _cpuid) 437928e2027SSepherosa Ziehau { 438f0a26983SSepherosa Ziehau return &_ifsq->ifsq_stage[_cpuid]; 439928e2027SSepherosa Ziehau } 440928e2027SSepherosa Ziehau 441dfd3b18bSSepherosa Ziehau static __inline int 442f0a26983SSepherosa Ziehau ifsq_get_cpuid(const struct ifaltq_subque *_ifsq) 443dfd3b18bSSepherosa Ziehau { 444f0a26983SSepherosa Ziehau return _ifsq->ifsq_cpuid; 445dfd3b18bSSepherosa Ziehau } 446dfd3b18bSSepherosa Ziehau 447dfd3b18bSSepherosa Ziehau static __inline void 448f0a26983SSepherosa Ziehau ifsq_set_cpuid(struct ifaltq_subque *_ifsq, int _cpuid) 449dfd3b18bSSepherosa Ziehau { 450f0a26983SSepherosa Ziehau KASSERT(_cpuid >= 0 && _cpuid < ncpus, 451f0a26983SSepherosa Ziehau ("invalid ifsq_cpuid %d", _cpuid)); 452f0a26983SSepherosa Ziehau _ifsq->ifsq_cpuid = _cpuid; 453dfd3b18bSSepherosa Ziehau } 454dfd3b18bSSepherosa Ziehau 45542fdf81eSSepherosa Ziehau static __inline struct lwkt_msg * 456f0a26983SSepherosa Ziehau ifsq_get_ifstart_lmsg(struct ifaltq_subque *_ifsq, int _cpuid) 45742fdf81eSSepherosa Ziehau { 458f0a26983SSepherosa Ziehau return &_ifsq->ifsq_ifstart_nmsg[_cpuid].lmsg; 459f0a26983SSepherosa Ziehau } 460f0a26983SSepherosa Ziehau 461f0a26983SSepherosa Ziehau static __inline int 462f0a26983SSepherosa Ziehau ifsq_get_index(const struct ifaltq_subque *_ifsq) 463f0a26983SSepherosa Ziehau { 464f0a26983SSepherosa Ziehau return _ifsq->ifsq_index; 465f0a26983SSepherosa Ziehau } 466f0a26983SSepherosa Ziehau 467f0a26983SSepherosa Ziehau static __inline void 468f0a26983SSepherosa Ziehau ifsq_set_priv(struct ifaltq_subque *_ifsq, void *_priv) 469f0a26983SSepherosa Ziehau { 470f0a26983SSepherosa Ziehau _ifsq->ifsq_hw_priv = _priv; 471f0a26983SSepherosa Ziehau } 472f0a26983SSepherosa Ziehau 473f0a26983SSepherosa Ziehau static __inline void * 474f0a26983SSepherosa Ziehau ifsq_get_priv(const struct ifaltq_subque *_ifsq) 475f0a26983SSepherosa Ziehau { 476f0a26983SSepherosa Ziehau return _ifsq->ifsq_hw_priv; 477f0a26983SSepherosa Ziehau } 478f0a26983SSepherosa Ziehau 479f0a26983SSepherosa Ziehau static __inline struct ifnet * 480f0a26983SSepherosa Ziehau ifsq_get_ifp(const struct ifaltq_subque *_ifsq) 481f0a26983SSepherosa Ziehau { 482f0a26983SSepherosa Ziehau return _ifsq->ifsq_ifp; 483f0a26983SSepherosa Ziehau } 484f0a26983SSepherosa Ziehau 485f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 486f0a26983SSepherosa Ziehau ifq_get_subq_default(const struct ifaltq *_ifq) 487f0a26983SSepherosa Ziehau { 488f0a26983SSepherosa Ziehau return &_ifq->altq_subq[ALTQ_SUBQ_INDEX_DEFAULT]; 489f0a26983SSepherosa Ziehau } 490f0a26983SSepherosa Ziehau 491f0a26983SSepherosa Ziehau static __inline struct ifaltq_subque * 492f0a26983SSepherosa Ziehau ifq_get_subq(const struct ifaltq *_ifq, int _idx) 493f0a26983SSepherosa Ziehau { 494f0a26983SSepherosa Ziehau KASSERT(_idx >= 0 && _idx < _ifq->altq_subq_cnt, 495f0a26983SSepherosa Ziehau ("invalid qid %d", _idx)); 496f0a26983SSepherosa Ziehau return &_ifq->altq_subq[_idx]; 497f0a26983SSepherosa Ziehau } 498f0a26983SSepherosa Ziehau 4992cc2f639SSepherosa Ziehau static __inline struct ifaltq_subque * 5002cc2f639SSepherosa Ziehau ifq_map_subq(struct ifaltq *_ifq, int _cpuid) 5012cc2f639SSepherosa Ziehau { 5022cc2f639SSepherosa Ziehau int _idx = _ifq->altq_mapsubq(_ifq, _cpuid); 5032cc2f639SSepherosa Ziehau return ifq_get_subq(_ifq, _idx); 5042cc2f639SSepherosa Ziehau } 5052cc2f639SSepherosa Ziehau 506*9469a4a2SSepherosa Ziehau static __inline void 507*9469a4a2SSepherosa Ziehau ifq_set_subq_cnt(struct ifaltq *_ifq, int _cnt) 508*9469a4a2SSepherosa Ziehau { 509*9469a4a2SSepherosa Ziehau _ifq->altq_subq_cnt = _cnt; 510*9469a4a2SSepherosa Ziehau } 511*9469a4a2SSepherosa Ziehau 512f0a26983SSepherosa Ziehau /* COMPAT */ 513f0a26983SSepherosa Ziehau static __inline int 514f0a26983SSepherosa Ziehau ifq_is_oactive(const struct ifaltq *_ifq) 515f0a26983SSepherosa Ziehau { 516f0a26983SSepherosa Ziehau return ifsq_is_oactive(ifq_get_subq_default(_ifq)); 517f0a26983SSepherosa Ziehau } 518f0a26983SSepherosa Ziehau 519f0a26983SSepherosa Ziehau /* COMPAT */ 520f0a26983SSepherosa Ziehau static __inline void 521f0a26983SSepherosa Ziehau ifq_set_oactive(struct ifaltq *_ifq) 522f0a26983SSepherosa Ziehau { 523f0a26983SSepherosa Ziehau ifsq_set_oactive(ifq_get_subq_default(_ifq)); 524f0a26983SSepherosa Ziehau } 525f0a26983SSepherosa Ziehau 526f0a26983SSepherosa Ziehau /* COMPAT */ 527f0a26983SSepherosa Ziehau static __inline void 528f0a26983SSepherosa Ziehau ifq_clr_oactive(struct ifaltq *_ifq) 529f0a26983SSepherosa Ziehau { 530f0a26983SSepherosa Ziehau ifsq_clr_oactive(ifq_get_subq_default(_ifq)); 531f0a26983SSepherosa Ziehau } 532f0a26983SSepherosa Ziehau 533f0a26983SSepherosa Ziehau /* COMPAT */ 534f0a26983SSepherosa Ziehau static __inline int 535f0a26983SSepherosa Ziehau ifq_is_empty(struct ifaltq *_ifq) 536f0a26983SSepherosa Ziehau { 537f0a26983SSepherosa Ziehau return ifsq_is_empty(ifq_get_subq_default(_ifq)); 538f0a26983SSepherosa Ziehau } 539f0a26983SSepherosa Ziehau 540f0a26983SSepherosa Ziehau /* COMPAT */ 541f0a26983SSepherosa Ziehau static __inline void 542f0a26983SSepherosa Ziehau ifq_purge(struct ifaltq *_ifq) 543f0a26983SSepherosa Ziehau { 544f0a26983SSepherosa Ziehau ifsq_purge(ifq_get_subq_default(_ifq)); 545f0a26983SSepherosa Ziehau } 546f0a26983SSepherosa Ziehau 547f0a26983SSepherosa Ziehau /* COMPAT */ 548f0a26983SSepherosa Ziehau static __inline struct mbuf * 549f0a26983SSepherosa Ziehau ifq_dequeue(struct ifaltq *_ifq, struct mbuf *_mpolled) 550f0a26983SSepherosa Ziehau { 551f0a26983SSepherosa Ziehau return ifsq_dequeue(ifq_get_subq_default(_ifq), _mpolled); 552f0a26983SSepherosa Ziehau } 553f0a26983SSepherosa Ziehau 554f0a26983SSepherosa Ziehau /* COMPAT */ 555f0a26983SSepherosa Ziehau static __inline void 556f0a26983SSepherosa Ziehau ifq_prepend(struct ifaltq *_ifq, struct mbuf *_m) 557f0a26983SSepherosa Ziehau { 558f0a26983SSepherosa Ziehau ifsq_prepend(ifq_get_subq_default(_ifq), _m); 559f0a26983SSepherosa Ziehau } 560f0a26983SSepherosa Ziehau 561f0a26983SSepherosa Ziehau /* COMPAT */ 562f0a26983SSepherosa Ziehau static __inline void 563f0a26983SSepherosa Ziehau ifq_set_cpuid(struct ifaltq *_ifq, int _cpuid) 564f0a26983SSepherosa Ziehau { 565f0a26983SSepherosa Ziehau KASSERT(_ifq->altq_subq_cnt == 1, 566f0a26983SSepherosa Ziehau ("invalid subqueue count %d", _ifq->altq_subq_cnt)); 567f0a26983SSepherosa Ziehau ifsq_set_cpuid(ifq_get_subq_default(_ifq), _cpuid); 56842fdf81eSSepherosa Ziehau } 56942fdf81eSSepherosa Ziehau 57003d6a592SMatthew Dillon #endif /* _KERNEL */ 57103d6a592SMatthew Dillon #endif /* _NET_IFQ_VAR_H_ */ 572