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*1bd40720SMatthew Dillon * $DragonFly: src/sys/net/ifq_var.h,v 1.7 2006/05/20 02:42:08 dillon Exp $ 324d723e5aSJoerg Sonnenberger */ 3378195a76SMatthew Dillon /* 3478195a76SMatthew Dillon * NOTE ON MPSAFE access. Routines which manipulate the packet queue must 3578195a76SMatthew Dillon * be called within a critical section to interlock subsystems based on 3678195a76SMatthew Dillon * the MP lock, and must be holding the interface serializer to interlock 3778195a76SMatthew Dillon * MPSAFE subsystems. Once all subsystems are made MPSAFE, the critical 3878195a76SMatthew Dillon * section will no longer be required. 3978195a76SMatthew Dillon */ 4078195a76SMatthew Dillon 41*1bd40720SMatthew Dillon #ifndef _NET_IFQ_VAR_H_ 42*1bd40720SMatthew Dillon #define _NET_IFQ_VAR_H_ 434d723e5aSJoerg Sonnenberger 44*1bd40720SMatthew Dillon #if defined(_KERNEL) && !defined(_SYS_SYSTM_H_) 45*1bd40720SMatthew Dillon #include <sys/systm.h> 46*1bd40720SMatthew Dillon #endif 47*1bd40720SMatthew Dillon #ifndef _SYS_THREAD2_H_ 484986965bSJoerg Sonnenberger #include <sys/thread2.h> 49*1bd40720SMatthew Dillon #endif 50*1bd40720SMatthew Dillon #ifndef _SYS_SERIALIZE_H_ 51*1bd40720SMatthew Dillon #include <sys/serialize.h> 52*1bd40720SMatthew Dillon #endif 53*1bd40720SMatthew Dillon #ifndef _SYS_MBUF_H_ 54*1bd40720SMatthew Dillon #include <sys/mbuf.h> 55*1bd40720SMatthew Dillon #endif 56*1bd40720SMatthew Dillon #ifndef _NET_IF_VAR_H_ 57*1bd40720SMatthew Dillon #include <net/if_var.h> 58*1bd40720SMatthew Dillon #endif 59*1bd40720SMatthew Dillon #ifndef _NET_ALTQ_IF_ALTQ_H_ 60*1bd40720SMatthew Dillon #include <net/altq/if_altq.h> 61*1bd40720SMatthew Dillon #endif 62*1bd40720SMatthew Dillon 63*1bd40720SMatthew Dillon struct ifaltq; 644986965bSJoerg Sonnenberger 654d723e5aSJoerg Sonnenberger #ifdef ALTQ 664d723e5aSJoerg Sonnenberger static __inline int 674d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 684d723e5aSJoerg Sonnenberger { 694d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_ENABLED); 704d723e5aSJoerg Sonnenberger } 714d723e5aSJoerg Sonnenberger 724d723e5aSJoerg Sonnenberger static __inline int 734d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 744d723e5aSJoerg Sonnenberger { 754d723e5aSJoerg Sonnenberger return(_ifq->altq_disc != NULL); 764d723e5aSJoerg Sonnenberger } 774d723e5aSJoerg Sonnenberger #else 784d723e5aSJoerg Sonnenberger static __inline int 794d723e5aSJoerg Sonnenberger ifq_is_enabled(struct ifaltq *_ifq) 804d723e5aSJoerg Sonnenberger { 814d723e5aSJoerg Sonnenberger return(0); 824d723e5aSJoerg Sonnenberger } 834d723e5aSJoerg Sonnenberger 844d723e5aSJoerg Sonnenberger static __inline int 854d723e5aSJoerg Sonnenberger ifq_is_attached(struct ifaltq *_ifq) 864d723e5aSJoerg Sonnenberger { 874d723e5aSJoerg Sonnenberger return(0); 884d723e5aSJoerg Sonnenberger } 894d723e5aSJoerg Sonnenberger #endif 904d723e5aSJoerg Sonnenberger 9178195a76SMatthew Dillon /* 9278195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 9378195a76SMatthew Dillon */ 944d723e5aSJoerg Sonnenberger static __inline int 954d723e5aSJoerg Sonnenberger ifq_is_ready(struct ifaltq *_ifq) 964d723e5aSJoerg Sonnenberger { 974d723e5aSJoerg Sonnenberger return(_ifq->altq_flags & ALTQF_READY); 984d723e5aSJoerg Sonnenberger } 994d723e5aSJoerg Sonnenberger 10078195a76SMatthew Dillon /* 10178195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 10278195a76SMatthew Dillon */ 1034d723e5aSJoerg Sonnenberger static __inline void 1044d723e5aSJoerg Sonnenberger ifq_set_ready(struct ifaltq *_ifq) 1054d723e5aSJoerg Sonnenberger { 1064d723e5aSJoerg Sonnenberger _ifq->altq_flags |= ALTQF_READY; 1074d723e5aSJoerg Sonnenberger } 1084d723e5aSJoerg Sonnenberger 10978195a76SMatthew Dillon /* 11078195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 11178195a76SMatthew Dillon */ 1124d723e5aSJoerg Sonnenberger static __inline int 1134d723e5aSJoerg Sonnenberger ifq_enqueue(struct ifaltq *_ifq, struct mbuf *_m, struct altq_pktattr *_pa) 1144d723e5aSJoerg Sonnenberger { 1154d723e5aSJoerg Sonnenberger return((*_ifq->altq_enqueue)(_ifq, _m, _pa)); 1164d723e5aSJoerg Sonnenberger } 1174d723e5aSJoerg Sonnenberger 11878195a76SMatthew Dillon /* 11978195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 12078195a76SMatthew Dillon */ 1214d723e5aSJoerg Sonnenberger static __inline struct mbuf * 122d2c71fa0SMatthew Dillon ifq_dequeue(struct ifaltq *_ifq, struct mbuf *_mpolled) 1234d723e5aSJoerg Sonnenberger { 1244d723e5aSJoerg Sonnenberger #ifdef ALTQ 1254d723e5aSJoerg Sonnenberger if (_ifq->altq_tbr != NULL) 126d2c71fa0SMatthew Dillon return(tbr_dequeue(_ifq, _mpolled, ALTDQ_REMOVE)); 1274d723e5aSJoerg Sonnenberger #endif 128d2c71fa0SMatthew Dillon return((*_ifq->altq_dequeue)(_ifq, _mpolled, ALTDQ_REMOVE)); 1294d723e5aSJoerg Sonnenberger } 1304d723e5aSJoerg Sonnenberger 13178195a76SMatthew Dillon /* 13278195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 13378195a76SMatthew Dillon */ 1344d723e5aSJoerg Sonnenberger static __inline struct mbuf * 1354d723e5aSJoerg Sonnenberger ifq_poll(struct ifaltq *_ifq) 1364d723e5aSJoerg Sonnenberger { 1374d723e5aSJoerg Sonnenberger #ifdef ALTQ 1384d723e5aSJoerg Sonnenberger if (_ifq->altq_tbr != NULL) 139d2c71fa0SMatthew Dillon return(tbr_dequeue(_ifq, NULL, ALTDQ_POLL)); 1404d723e5aSJoerg Sonnenberger #endif 141d2c71fa0SMatthew Dillon return((*_ifq->altq_dequeue)(_ifq, NULL, ALTDQ_POLL)); 1424d723e5aSJoerg Sonnenberger } 1434d723e5aSJoerg Sonnenberger 14478195a76SMatthew Dillon /* 14578195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 14678195a76SMatthew Dillon */ 1474d723e5aSJoerg Sonnenberger static __inline void 1484d723e5aSJoerg Sonnenberger ifq_purge(struct ifaltq *_ifq) 1494d723e5aSJoerg Sonnenberger { 1504d723e5aSJoerg Sonnenberger (*_ifq->altq_request)(_ifq, ALTRQ_PURGE, NULL); 1514d723e5aSJoerg Sonnenberger } 1524d723e5aSJoerg Sonnenberger 15378195a76SMatthew Dillon /* 15478195a76SMatthew Dillon * WARNING: Should only be called in an MPSAFE manner. 15578195a76SMatthew Dillon */ 1564d723e5aSJoerg Sonnenberger static __inline void 1574d723e5aSJoerg Sonnenberger ifq_classify(struct ifaltq *_ifq, struct mbuf *_m, uint8_t _af, 1584d723e5aSJoerg Sonnenberger struct altq_pktattr *_pa) 1594d723e5aSJoerg Sonnenberger { 1604d723e5aSJoerg Sonnenberger if (!ifq_is_enabled(_ifq)) 1614d723e5aSJoerg Sonnenberger return; 1624d723e5aSJoerg Sonnenberger _pa->pattr_af = _af; 1634d723e5aSJoerg Sonnenberger _pa->pattr_hdr = mtod(_m, caddr_t); 1644d723e5aSJoerg Sonnenberger if (_ifq->altq_flags & ALTQF_CLASSIFY) 1654d723e5aSJoerg Sonnenberger (*_ifq->altq_classify)(_ifq, _m, _pa); 1664d723e5aSJoerg Sonnenberger } 1674d723e5aSJoerg Sonnenberger 16878195a76SMatthew Dillon /* 16978195a76SMatthew Dillon * Hand a packet to an interface. 17078195a76SMatthew Dillon * 17178195a76SMatthew Dillon * For subsystems protected by the MP lock, access to the queue is protected 17278195a76SMatthew Dillon * by a critical section. 17378195a76SMatthew Dillon * 17478195a76SMatthew Dillon * For MPSAFE subsystems and drivers, access to the queue is protected by 17578195a76SMatthew Dillon * the ifnet serializer. 17678195a76SMatthew Dillon */ 1774d723e5aSJoerg Sonnenberger static __inline int 1784d723e5aSJoerg Sonnenberger ifq_handoff(struct ifnet *_ifp, struct mbuf *_m, struct altq_pktattr *_pa) 1794d723e5aSJoerg Sonnenberger { 1804986965bSJoerg Sonnenberger int _error; 1814d723e5aSJoerg Sonnenberger 18278195a76SMatthew Dillon ASSERT_SERIALIZED(_ifp->if_serializer); 1834d723e5aSJoerg Sonnenberger _error = ifq_enqueue(&_ifp->if_snd, _m, _pa); 1844d723e5aSJoerg Sonnenberger if (_error == 0) { 1854d723e5aSJoerg Sonnenberger _ifp->if_obytes += _m->m_pkthdr.len; 1864d723e5aSJoerg Sonnenberger if (_m->m_flags & M_MCAST) 1874d723e5aSJoerg Sonnenberger _ifp->if_omcasts++; 1884d723e5aSJoerg Sonnenberger if ((_ifp->if_flags & IFF_OACTIVE) == 0) 1894d723e5aSJoerg Sonnenberger (*_ifp->if_start)(_ifp); 1904d723e5aSJoerg Sonnenberger } 1914d723e5aSJoerg Sonnenberger return(_error); 1924d723e5aSJoerg Sonnenberger } 1934d723e5aSJoerg Sonnenberger 1944d723e5aSJoerg Sonnenberger static __inline int 1954d723e5aSJoerg Sonnenberger ifq_is_empty(struct ifaltq *_ifq) 1964d723e5aSJoerg Sonnenberger { 1974d723e5aSJoerg Sonnenberger return(_ifq->ifq_len == 0); 1984d723e5aSJoerg Sonnenberger } 1994d723e5aSJoerg Sonnenberger 2004d723e5aSJoerg Sonnenberger static __inline void 2014d723e5aSJoerg Sonnenberger ifq_set_maxlen(struct ifaltq *_ifq, int _len) 2024d723e5aSJoerg Sonnenberger { 2034d723e5aSJoerg Sonnenberger _ifq->ifq_maxlen = _len; 2044d723e5aSJoerg Sonnenberger } 2054d723e5aSJoerg Sonnenberger 206b2f93efeSJoerg Sonnenberger void ifq_set_classic(struct ifaltq *); 207b2f93efeSJoerg Sonnenberger 2084d723e5aSJoerg Sonnenberger #endif 209