1 1.16 msaitoh /* $NetBSD: if_altq.h,v 1.16 2022/10/24 08:11:24 msaitoh Exp $ */ 2 1.11 peter /* $KAME: if_altq.h,v 1.12 2005/04/13 03:44:25 suz Exp $ */ 3 1.1 thorpej 4 1.1 thorpej /* 5 1.11 peter * Copyright (C) 1997-2003 6 1.1 thorpej * Sony Computer Science Laboratories Inc. All rights reserved. 7 1.1 thorpej * 8 1.1 thorpej * Redistribution and use in source and binary forms, with or without 9 1.1 thorpej * modification, are permitted provided that the following conditions 10 1.1 thorpej * are met: 11 1.1 thorpej * 1. Redistributions of source code must retain the above copyright 12 1.1 thorpej * notice, this list of conditions and the following disclaimer. 13 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 thorpej * notice, this list of conditions and the following disclaimer in the 15 1.1 thorpej * documentation and/or other materials provided with the distribution. 16 1.1 thorpej * 17 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND 18 1.1 thorpej * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 1.1 thorpej * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 1.1 thorpej * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE 21 1.1 thorpej * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 1.1 thorpej * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 1.1 thorpej * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 1.1 thorpej * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 1.1 thorpej * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 1.1 thorpej * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 1.1 thorpej * SUCH DAMAGE. 28 1.1 thorpej */ 29 1.1 thorpej #ifndef _ALTQ_IF_ALTQ_H_ 30 1.1 thorpej #define _ALTQ_IF_ALTQ_H_ 31 1.4 thorpej 32 1.8 jdolecek #if defined(_KERNEL_OPT) 33 1.8 jdolecek #include "opt_altq_enabled.h" 34 1.4 thorpej #endif 35 1.1 thorpej 36 1.1 thorpej struct altq_pktattr; struct tb_regulator; struct top_cdnr; 37 1.1 thorpej 38 1.1 thorpej /* 39 1.1 thorpej * Structure defining a queue for a network interface. 40 1.1 thorpej */ 41 1.1 thorpej struct ifaltq { 42 1.1 thorpej /* fields compatible with struct ifqueue */ 43 1.1 thorpej struct mbuf *ifq_head; 44 1.1 thorpej struct mbuf *ifq_tail; 45 1.1 thorpej int ifq_len; 46 1.1 thorpej int ifq_maxlen; 47 1.16 msaitoh uint64_t ifq_drops; 48 1.16 msaitoh kmutex_t *ifq_lock; 49 1.1 thorpej 50 1.1 thorpej /* alternate queueing related fields */ 51 1.1 thorpej int altq_type; /* discipline type */ 52 1.1 thorpej int altq_flags; /* flags (e.g. ready, in-use) */ 53 1.1 thorpej void *altq_disc; /* for discipline-specific use */ 54 1.1 thorpej struct ifnet *altq_ifp; /* back pointer to interface */ 55 1.1 thorpej 56 1.15 knakahar int (*altq_enqueue)(struct ifaltq *, struct mbuf *); 57 1.11 peter struct mbuf *(*altq_dequeue)(struct ifaltq *, int); 58 1.11 peter int (*altq_request)(struct ifaltq *, int, void *); 59 1.1 thorpej 60 1.1 thorpej /* classifier fields */ 61 1.1 thorpej void *altq_clfier; /* classifier-specific use */ 62 1.11 peter void *(*altq_classify)(void *, struct mbuf *, int); 63 1.1 thorpej 64 1.1 thorpej /* token bucket regulator */ 65 1.1 thorpej struct tb_regulator *altq_tbr; 66 1.1 thorpej 67 1.1 thorpej /* input traffic conditioner (doesn't belong to the output queue...) */ 68 1.1 thorpej struct top_cdnr *altq_cdnr; 69 1.1 thorpej }; 70 1.1 thorpej 71 1.1 thorpej 72 1.1 thorpej #ifdef _KERNEL 73 1.1 thorpej 74 1.1 thorpej /* 75 1.1 thorpej * packet attributes used by queueing disciplines. 76 1.1 thorpej * pattr_class is a discipline-dependent scheduling class that is 77 1.1 thorpej * set by a classifier. 78 1.1 thorpej * pattr_hdr and pattr_af may be used by a discipline to access 79 1.1 thorpej * the header within a mbuf. (e.g. ECN needs to update the CE bit) 80 1.1 thorpej * note that pattr_hdr could be stale after m_pullup, though link 81 1.1 thorpej * layer output routines usually don't use m_pullup. link-level 82 1.1 thorpej * compression also invalidates these fields. thus, pattr_hdr needs 83 1.1 thorpej * to be verified when a discipline touches the header. 84 1.1 thorpej */ 85 1.1 thorpej struct altq_pktattr { 86 1.1 thorpej void *pattr_class; /* sched class set by classifier */ 87 1.1 thorpej int pattr_af; /* address family */ 88 1.12 christos void * pattr_hdr; /* saved header position in mbuf */ 89 1.1 thorpej }; 90 1.1 thorpej 91 1.1 thorpej /* 92 1.11 peter * mbuf tag to carry a queue id (and hints for ECN). 93 1.11 peter */ 94 1.11 peter struct altq_tag { 95 1.11 peter u_int32_t qid; /* queue id */ 96 1.11 peter /* hints for ecn */ 97 1.11 peter int af; /* address family */ 98 1.11 peter void *hdr; /* saved header position in mbuf */ 99 1.11 peter }; 100 1.11 peter 101 1.11 peter /* 102 1.1 thorpej * a token-bucket regulator limits the rate that a network driver can 103 1.1 thorpej * dequeue packets from the output queue. 104 1.1 thorpej * modern cards are able to buffer a large amount of packets and dequeue 105 1.1 thorpej * too many packets at a time. this bursty dequeue behavior makes it 106 1.1 thorpej * impossible to schedule packets by queueing disciplines. 107 1.1 thorpej * a token-bucket is used to control the burst size in a device 108 1.1 thorpej * independent manner. 109 1.1 thorpej */ 110 1.1 thorpej struct tb_regulator { 111 1.1 thorpej int64_t tbr_rate; /* (scaled) token bucket rate */ 112 1.1 thorpej int64_t tbr_depth; /* (scaled) token bucket depth */ 113 1.1 thorpej 114 1.1 thorpej int64_t tbr_token; /* (scaled) current token */ 115 1.1 thorpej int64_t tbr_filluptime; /* (scaled) time to fill up bucket */ 116 1.1 thorpej u_int64_t tbr_last; /* last time token was updated */ 117 1.1 thorpej 118 1.1 thorpej int tbr_lastop; /* last dequeue operation type 119 1.1 thorpej needed for poll-and-dequeue */ 120 1.1 thorpej }; 121 1.1 thorpej 122 1.1 thorpej /* if_altqflags */ 123 1.1 thorpej #define ALTQF_READY 0x01 /* driver supports alternate queueing */ 124 1.1 thorpej #define ALTQF_ENABLED 0x02 /* altq is in use */ 125 1.1 thorpej #define ALTQF_CLASSIFY 0x04 /* classify packets */ 126 1.1 thorpej #define ALTQF_CNDTNING 0x08 /* altq traffic conditioning is enabled */ 127 1.1 thorpej #define ALTQF_DRIVER1 0x40 /* driver specific */ 128 1.1 thorpej 129 1.1 thorpej /* if_altqflags set internally only: */ 130 1.1 thorpej #define ALTQF_CANTCHANGE (ALTQF_READY) 131 1.1 thorpej 132 1.1 thorpej /* altq_dequeue 2nd arg */ 133 1.1 thorpej #define ALTDQ_REMOVE 1 /* dequeue mbuf from the queue */ 134 1.1 thorpej #define ALTDQ_POLL 2 /* don't dequeue mbuf from the queue */ 135 1.1 thorpej 136 1.1 thorpej /* altq request types (currently only purge is defined) */ 137 1.1 thorpej #define ALTRQ_PURGE 1 /* purge all packets */ 138 1.1 thorpej 139 1.1 thorpej #define ALTQ_IS_READY(ifq) ((ifq)->altq_flags & ALTQF_READY) 140 1.1 thorpej #define ALTQ_IS_ENABLED(ifq) ((ifq)->altq_flags & ALTQF_ENABLED) 141 1.1 thorpej #define ALTQ_NEEDS_CLASSIFY(ifq) ((ifq)->altq_flags & ALTQF_CLASSIFY) 142 1.1 thorpej #define ALTQ_IS_CNDTNING(ifq) ((ifq)->altq_flags & ALTQF_CNDTNING) 143 1.1 thorpej 144 1.1 thorpej #define ALTQ_SET_CNDTNING(ifq) ((ifq)->altq_flags |= ALTQF_CNDTNING) 145 1.1 thorpej #define ALTQ_CLEAR_CNDTNING(ifq) ((ifq)->altq_flags &= ~ALTQF_CNDTNING) 146 1.1 thorpej #define ALTQ_IS_ATTACHED(ifq) ((ifq)->altq_disc != NULL) 147 1.1 thorpej 148 1.15 knakahar #define ALTQ_ENQUEUE(ifq, m, err) \ 149 1.15 knakahar (err) = (*(ifq)->altq_enqueue)((ifq),(m)) 150 1.1 thorpej #define ALTQ_DEQUEUE(ifq, m) \ 151 1.1 thorpej (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_REMOVE) 152 1.1 thorpej #define ALTQ_POLL(ifq, m) \ 153 1.1 thorpej (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_POLL) 154 1.1 thorpej #define ALTQ_PURGE(ifq) \ 155 1.1 thorpej (void)(*(ifq)->altq_request)((ifq), ALTRQ_PURGE, (void *)0) 156 1.1 thorpej #define ALTQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0) 157 1.1 thorpej #define TBR_IS_ENABLED(ifq) ((ifq)->altq_tbr != NULL) 158 1.1 thorpej 159 1.11 peter extern int altq_attach(struct ifaltq *, int, void *, 160 1.15 knakahar int (*)(struct ifaltq *, struct mbuf *), 161 1.11 peter struct mbuf *(*)(struct ifaltq *, int), 162 1.11 peter int (*)(struct ifaltq *, int, void *), 163 1.11 peter void *, 164 1.11 peter void *(*)(void *, struct mbuf *, int)); 165 1.11 peter extern int altq_detach(struct ifaltq *); 166 1.11 peter extern int altq_enable(struct ifaltq *); 167 1.11 peter extern int altq_disable(struct ifaltq *); 168 1.11 peter extern struct mbuf *tbr_dequeue(struct ifaltq *, int); 169 1.11 peter extern int (*altq_input)(struct mbuf *, int); 170 1.11 peter #if 1 /* ALTQ3_CLFIER_COMPAT */ 171 1.15 knakahar void altq_etherclassify(struct ifaltq *, struct mbuf *); 172 1.11 peter #endif 173 1.1 thorpej #endif /* _KERNEL */ 174 1.1 thorpej 175 1.1 thorpej #endif /* _ALTQ_IF_ALTQ_H_ */ 176