xref: /dragonfly/sys/net/ifq_var.h (revision 1bd40720)
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