1 /*- 2 * Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the SMCC Technology 18 * Development Group at Sun Microsystems, Inc. 19 * 20 * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or 21 * promote products derived from this software without specific prior 22 * written permission. 23 * 24 * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE 25 * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is 26 * provided "as is" without express or implied warranty of any kind. 27 * 28 * These notices must be retained in any copies of any part of this software. 29 * 30 * $KAME: altq_cbq.h,v 1.12 2003/10/03 05:05:15 kjc Exp $ 31 * $FreeBSD$ 32 */ 33 34 #ifndef _ALTQ_ALTQ_CBQ_H_ 35 #define _ALTQ_ALTQ_CBQ_H_ 36 37 #include <net/altq/altq.h> 38 #include <net/altq/altq_rmclass.h> 39 #include <net/altq/altq_codel.h> 40 #include <net/altq/altq_red.h> 41 #include <net/altq/altq_rio.h> 42 43 #ifdef __cplusplus 44 extern "C" { 45 #endif 46 47 #define NULL_CLASS_HANDLE 0 48 49 /* class flags must be same as class flags in altq_rmclass.h */ 50 #define CBQCLF_RED 0x0001 /* use RED */ 51 #define CBQCLF_ECN 0x0002 /* use RED/ECN */ 52 #define CBQCLF_RIO 0x0004 /* use RIO */ 53 #define CBQCLF_FLOWVALVE 0x0008 /* use flowvalve (aka penalty-box) */ 54 #define CBQCLF_CLEARDSCP 0x0010 /* clear diffserv codepoint */ 55 #define CBQCLF_BORROW 0x0020 /* borrow from parent */ 56 #define CBQCLF_CODEL 0x0040 /* use CoDel */ 57 58 #ifdef _KERNEL 59 CTASSERT(CBQCLF_RED == RMCF_RED); 60 CTASSERT(CBQCLF_ECN == RMCF_ECN); 61 CTASSERT(CBQCLF_RIO == RMCF_RIO); 62 CTASSERT(CBQCLF_FLOWVALVE == RMCF_FLOWVALVE); 63 CTASSERT(CBQCLF_CLEARDSCP == RMCF_CLEARDSCP); 64 CTASSERT(CBQCLF_CODEL == RMCF_CODEL); 65 #endif 66 67 /* class flags only for root class */ 68 #define CBQCLF_WRR 0x0100 /* weighted-round robin */ 69 #define CBQCLF_EFFICIENT 0x0200 /* work-conserving */ 70 71 /* class flags for special classes */ 72 #define CBQCLF_ROOTCLASS 0x1000 /* root class */ 73 #define CBQCLF_DEFCLASS 0x2000 /* default class */ 74 #ifdef ALTQ3_COMPAT 75 #define CBQCLF_CTLCLASS 0x4000 /* control class */ 76 #endif 77 #define CBQCLF_CLASSMASK 0xf000 /* class mask */ 78 79 #define CBQ_MAXQSIZE 200 80 #define CBQ_MAXPRI RM_MAXPRIO 81 82 typedef struct _cbq_class_stats_ { 83 u_int32_t handle; 84 u_int depth; 85 86 struct pktcntr xmit_cnt; /* packets sent in this class */ 87 struct pktcntr drop_cnt; /* dropped packets */ 88 u_int over; /* # times went over limit */ 89 u_int borrows; /* # times tried to borrow */ 90 u_int overactions; /* # times invoked overlimit action */ 91 u_int delays; /* # times invoked delay actions */ 92 93 /* other static class parameters useful for debugging */ 94 int priority; 95 int maxidle; 96 int minidle; 97 int offtime; 98 int qmax; 99 int ns_per_byte; 100 int wrr_allot; 101 102 int qcnt; /* # packets in queue */ 103 int avgidle; 104 105 /* codel, red and rio related info */ 106 int qtype; 107 struct redstats red[3]; 108 struct codel_stats codel; 109 } class_stats_t; 110 111 /* 112 * CBQ_STATS_VERSION is defined in altq.h to work around issues stemming 113 * from mixing of public-API and internal bits in each scheduler-specific 114 * header. 115 */ 116 117 #ifdef ALTQ3_COMPAT 118 /* 119 * Define structures associated with IOCTLS for cbq. 120 */ 121 122 /* 123 * Define the CBQ interface structure. This must be included in all 124 * IOCTL's such that the CBQ driver may find the appropriate CBQ module 125 * associated with the network interface to be affected. 126 */ 127 struct cbq_interface { 128 char cbq_ifacename[IFNAMSIZ]; 129 }; 130 131 typedef struct cbq_class_spec { 132 u_int priority; 133 u_int nano_sec_per_byte; 134 u_int maxq; 135 u_int maxidle; 136 int minidle; 137 u_int offtime; 138 u_int32_t parent_class_handle; 139 u_int32_t borrow_class_handle; 140 141 u_int pktsize; 142 int flags; 143 } cbq_class_spec_t; 144 145 struct cbq_add_class { 146 struct cbq_interface cbq_iface; 147 148 cbq_class_spec_t cbq_class; 149 u_int32_t cbq_class_handle; 150 }; 151 152 struct cbq_delete_class { 153 struct cbq_interface cbq_iface; 154 u_int32_t cbq_class_handle; 155 }; 156 157 struct cbq_modify_class { 158 struct cbq_interface cbq_iface; 159 160 cbq_class_spec_t cbq_class; 161 u_int32_t cbq_class_handle; 162 }; 163 164 struct cbq_add_filter { 165 struct cbq_interface cbq_iface; 166 u_int32_t cbq_class_handle; 167 struct flow_filter cbq_filter; 168 169 u_long cbq_filter_handle; 170 }; 171 172 struct cbq_delete_filter { 173 struct cbq_interface cbq_iface; 174 u_long cbq_filter_handle; 175 }; 176 177 /* number of classes are returned in nclasses field */ 178 struct cbq_getstats { 179 struct cbq_interface iface; 180 int nclasses; 181 class_stats_t *stats; 182 }; 183 184 /* 185 * Define IOCTLs for CBQ. 186 */ 187 #define CBQ_IF_ATTACH _IOW('Q', 1, struct cbq_interface) 188 #define CBQ_IF_DETACH _IOW('Q', 2, struct cbq_interface) 189 #define CBQ_ENABLE _IOW('Q', 3, struct cbq_interface) 190 #define CBQ_DISABLE _IOW('Q', 4, struct cbq_interface) 191 #define CBQ_CLEAR_HIERARCHY _IOW('Q', 5, struct cbq_interface) 192 #define CBQ_ADD_CLASS _IOWR('Q', 7, struct cbq_add_class) 193 #define CBQ_DEL_CLASS _IOW('Q', 8, struct cbq_delete_class) 194 #define CBQ_MODIFY_CLASS _IOWR('Q', 9, struct cbq_modify_class) 195 #define CBQ_ADD_FILTER _IOWR('Q', 10, struct cbq_add_filter) 196 #define CBQ_DEL_FILTER _IOW('Q', 11, struct cbq_delete_filter) 197 #define CBQ_GETSTATS _IOWR('Q', 12, struct cbq_getstats) 198 #endif /* ALTQ3_COMPAT */ 199 200 #ifdef _KERNEL 201 /* 202 * Define macros only good for kernel drivers and modules. 203 */ 204 #define CBQ_WATCHDOG (hz / 20) 205 #define CBQ_TIMEOUT 10 206 #define CBQ_LS_TIMEOUT (20 * hz / 1000) 207 208 #define CBQ_MAX_CLASSES 256 209 210 #ifdef ALTQ3_COMPAT 211 #define CBQ_MAX_FILTERS 256 212 213 #define DISABLE 0x00 214 #define ENABLE 0x01 215 #endif /* ALTQ3_COMPAT */ 216 217 /* 218 * Define State structures. 219 */ 220 typedef struct cbqstate { 221 #ifdef ALTQ3_COMPAT 222 struct cbqstate *cbq_next; 223 #endif 224 int cbq_qlen; /* # of packets in cbq */ 225 struct rm_class *cbq_class_tbl[CBQ_MAX_CLASSES]; 226 227 struct rm_ifdat ifnp; 228 struct callout cbq_callout; /* for timeouts */ 229 #ifdef ALTQ3_CLFIER_COMPAT 230 struct acc_classifier cbq_classifier; 231 #endif 232 } cbq_state_t; 233 234 #endif /* _KERNEL */ 235 236 #ifdef __cplusplus 237 } 238 #endif 239 240 #endif /* !_ALTQ_ALTQ_CBQ_H_ */ 241