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