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 * 31*d2c71fa0SMatthew Dillon * $DragonFly: src/sys/net/ifq_var.h,v 1.5 2005/11/22 00:24:34 dillon Exp $ 324d723e5aSJoerg Sonnenberger */ 334d723e5aSJoerg Sonnenberger #ifndef _NET_IFQ_VAR_H 344d723e5aSJoerg Sonnenberger #define _NET_IFQ_VAR_H 354d723e5aSJoerg Sonnenberger 364986965bSJoerg Sonnenberger #include <sys/thread2.h> 374986965bSJoerg Sonnenberger 384d723e5aSJoerg Sonnenberger #ifdef ALTQ 394d723e5aSJoerg Sonnenberger static __inline int 404d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 414d723e5aSJoerg Sonnenberger { 424d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_ENABLED); 434d723e5aSJoerg Sonnenberger } 444d723e5aSJoerg Sonnenberger 454d723e5aSJoerg Sonnenberger static __inline int 464d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 474d723e5aSJoerg Sonnenberger { 484d723e5aSJoerg Sonnenberger return(_ifq->altq_disc != NULL); 494d723e5aSJoerg Sonnenberger } 504d723e5aSJoerg Sonnenberger #else 514d723e5aSJoerg Sonnenberger static __inline int 524d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 534d723e5aSJoerg Sonnenberger { 544d723e5aSJoerg Sonnenberger return(0); 554d723e5aSJoerg Sonnenberger } 564d723e5aSJoerg Sonnenberger 574d723e5aSJoerg Sonnenberger static __inline int 584d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 594d723e5aSJoerg Sonnenberger { 604d723e5aSJoerg Sonnenberger return(0); 614d723e5aSJoerg Sonnenberger } 624d723e5aSJoerg Sonnenberger #endif 634d723e5aSJoerg Sonnenberger 644d723e5aSJoerg Sonnenberger static __inline int 654d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq) 664d723e5aSJoerg Sonnenberger { 674d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_READY); 684d723e5aSJoerg Sonnenberger } 694d723e5aSJoerg Sonnenberger 704d723e5aSJoerg Sonnenberger static __inline void 714d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq) 724d723e5aSJoerg Sonnenberger { 734d723e5aSJoerg Sonnenberger _ifq->altq_flags |= ALTQF_READY; 744d723e5aSJoerg Sonnenberger } 754d723e5aSJoerg Sonnenberger 764d723e5aSJoerg Sonnenberger static __inline int 774d723e5aSJoerg Sonnenberger ifq_enqueue(struct ifaltq *_ifq, struct mbuf *_m, struct altq_pktattr *_pa) 784d723e5aSJoerg Sonnenberger { 794d723e5aSJoerg Sonnenberger return((*_ifq->altq_enqueue)(_ifq, _m, _pa)); 804d723e5aSJoerg Sonnenberger } 814d723e5aSJoerg Sonnenberger 824d723e5aSJoerg Sonnenberger static __inline struct mbuf * 83*d2c71fa0SMatthew Dillon ifq_dequeue(struct ifaltq *_ifq, struct mbuf *_mpolled) 844d723e5aSJoerg Sonnenberger { 854d723e5aSJoerg Sonnenberger #ifdef ALTQ 864d723e5aSJoerg Sonnenberger if (_ifq->altq_tbr != NULL) 87*d2c71fa0SMatthew Dillon return(tbr_dequeue(_ifq, _mpolled, ALTDQ_REMOVE)); 884d723e5aSJoerg Sonnenberger #endif 89*d2c71fa0SMatthew Dillon return((*_ifq->altq_dequeue)(_ifq, _mpolled, ALTDQ_REMOVE)); 904d723e5aSJoerg Sonnenberger } 914d723e5aSJoerg Sonnenberger 924d723e5aSJoerg Sonnenberger static __inline struct mbuf * 934d723e5aSJoerg Sonnenberger ifq_poll(struct ifaltq *_ifq) 944d723e5aSJoerg Sonnenberger { 954d723e5aSJoerg Sonnenberger #ifdef ALTQ 964d723e5aSJoerg Sonnenberger if (_ifq->altq_tbr != NULL) 97*d2c71fa0SMatthew Dillon return(tbr_dequeue(_ifq, NULL, ALTDQ_POLL)); 984d723e5aSJoerg Sonnenberger #endif 99*d2c71fa0SMatthew Dillon return((*_ifq->altq_dequeue)(_ifq, NULL, ALTDQ_POLL)); 1004d723e5aSJoerg Sonnenberger } 1014d723e5aSJoerg Sonnenberger 1024d723e5aSJoerg Sonnenberger static __inline void 1034d723e5aSJoerg Sonnenberger ifq_purge(struct ifaltq *_ifq) 1044d723e5aSJoerg Sonnenberger { 1054d723e5aSJoerg Sonnenberger (*_ifq->altq_request)(_ifq, ALTRQ_PURGE, NULL); 1064d723e5aSJoerg Sonnenberger } 1074d723e5aSJoerg Sonnenberger 1084d723e5aSJoerg Sonnenberger static __inline void 1094d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 1104d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 1114d723e5aSJoerg Sonnenberger { 1124d723e5aSJoerg Sonnenberger if (!ifq_is_enabled(_ifq)) 1134d723e5aSJoerg Sonnenberger return; 1144d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 1154d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 1164d723e5aSJoerg Sonnenberger if (_ifq->altq_flags & ALTQF_CLASSIFY) 1174d723e5aSJoerg Sonnenberger (*_ifq->altq_classify)(_ifq, _m, _pa); 1184d723e5aSJoerg Sonnenberger } 1194d723e5aSJoerg Sonnenberger 1204d723e5aSJoerg Sonnenberger static __inline int 1214d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 1224d723e5aSJoerg Sonnenberger { 1234986965bSJoerg Sonnenberger int _error; 1244d723e5aSJoerg Sonnenberger 1254986965bSJoerg Sonnenberger crit_enter(); 1264d723e5aSJoerg Sonnenberger _error = ifq_enqueue(&_ifp->if_snd, _m, _pa); 1274d723e5aSJoerg Sonnenberger if (_error == 0) { 1284d723e5aSJoerg Sonnenberger _ifp->if_obytes += _m->m_pkthdr.len; 1294d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 1304d723e5aSJoerg Sonnenberger _ifp->if_omcasts++; 1314d723e5aSJoerg Sonnenberger if ((_ifp->if_flags & IFF_OACTIVE) == 0) 1324d723e5aSJoerg Sonnenberger (*_ifp->if_start)(_ifp); 1334d723e5aSJoerg Sonnenberger } 1344986965bSJoerg Sonnenberger crit_exit(); 1354d723e5aSJoerg Sonnenberger return(_error); 1364d723e5aSJoerg Sonnenberger } 1374d723e5aSJoerg Sonnenberger 1384d723e5aSJoerg Sonnenberger static __inline int 1394d723e5aSJoerg Sonnenberger ifq_is_empty(struct ifaltq *_ifq) 1404d723e5aSJoerg Sonnenberger { 1414d723e5aSJoerg Sonnenberger return(_ifq->ifq_len == 0); 1424d723e5aSJoerg Sonnenberger } 1434d723e5aSJoerg Sonnenberger 1444d723e5aSJoerg Sonnenberger static __inline void 1454d723e5aSJoerg Sonnenberger ifq_set_maxlen(struct ifaltq *_ifq, int _len) 1464d723e5aSJoerg Sonnenberger { 1474d723e5aSJoerg Sonnenberger _ifq->ifq_maxlen = _len; 1484d723e5aSJoerg Sonnenberger } 1494d723e5aSJoerg Sonnenberger 150b2f93efeSJoerg Sonnenberger void ifq_set_classic(struct ifaltq *); 151b2f93efeSJoerg Sonnenberger 1524d723e5aSJoerg Sonnenberger #endif 153