1 1.6 joe /* $NetBSD: altq_jobs.h,v 1.6 2025/02/10 19:12:49 joe Exp $ */ 2 1.2 peter /* $KAME: altq_jobs.h,v 1.6 2003/07/10 12:07:48 kjc Exp $ */ 3 1.2 peter /* 4 1.6 joe * Copyright (c) 2001, Rector and Visitors of the University of 5 1.2 peter * Virginia. 6 1.2 peter * All rights reserved. 7 1.2 peter * 8 1.6 joe * Redistribution and use in source and binary forms, 9 1.6 joe * with or without modification, are permitted provided 10 1.2 peter * that the following conditions are met: 11 1.2 peter * 12 1.6 joe * Redistributions of source code must retain the above 13 1.6 joe * copyright notice, this list of conditions and the following 14 1.6 joe * disclaimer. 15 1.2 peter * 16 1.6 joe * Redistributions in binary form must reproduce the above 17 1.6 joe * copyright notice, this list of conditions and the following 18 1.6 joe * disclaimer in the documentation and/or other materials provided 19 1.6 joe * with the distribution. 20 1.2 peter * 21 1.6 joe * Neither the name of the University of Virginia nor the names 22 1.6 joe * of its contributors may be used to endorse or promote products 23 1.6 joe * derived from this software without specific prior written 24 1.6 joe * permission. 25 1.2 peter * 26 1.6 joe * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 27 1.6 joe * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 28 1.6 joe * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 29 1.6 joe * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 30 1.6 joe * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE 31 1.6 joe * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 32 1.6 joe * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 33 1.6 joe * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 34 1.6 joe * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 35 1.6 joe * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36 1.6 joe * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 37 1.6 joe * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 38 1.2 peter * THE POSSIBILITY OF SUCH DAMAGE. 39 1.2 peter */ 40 1.6 joe /* 41 1.6 joe * JoBS - altq prototype implementation 42 1.6 joe * 43 1.2 peter * Author: Nicolas Christin <nicolas (at) cs.virginia.edu> 44 1.2 peter * 45 1.6 joe * JoBS algorithms originally devised and proposed by 46 1.2 peter * Nicolas Christin and Jorg Liebeherr. 47 1.6 joe * Grateful Acknowledgments to Tarek Abdelzaher for his help and 48 1.2 peter * comments, and to Kenjiro Cho for some helpful advice. 49 1.2 peter * Contributed by the Multimedia Networks Group at the University 50 1.6 joe * of Virginia. 51 1.2 peter * 52 1.6 joe * Papers and additional info can be found at 53 1.2 peter * http://qosbox.cs.virginia.edu 54 1.6 joe * 55 1.6 joe */ 56 1.2 peter 57 1.2 peter #ifndef _ALTQ_ALTQ_JOBS_H_ 58 1.2 peter #define _ALTQ_ALTQ_JOBS_H_ 59 1.2 peter 60 1.2 peter #include <altq/altq.h> 61 1.2 peter #include <altq/altq_classq.h> 62 1.2 peter 63 1.2 peter #ifdef __cplusplus 64 1.2 peter extern "C" { 65 1.2 peter #endif 66 1.2 peter 67 1.2 peter #define JOBS_MAXPRI 16 /* upper limit on the number of priorities */ 68 1.2 peter #define SCALE_RATE 32 69 1.2 peter #define SCALE_LOSS 32 70 1.2 peter #define SCALE_SHARE 16 71 1.2 peter #define GRANULARITY 1000000 /* microseconds */ 72 1.5 plunky #define ALTQ_INFINITY LLONG_MAX /* not infinite, just large */ 73 1.2 peter 74 1.2 peter /* list of packet arrival times */ 75 1.2 peter struct _tsentry; 76 1.6 joe typedef TAILQ_HEAD(_timestamps, _tsentry) TSLIST; 77 1.2 peter typedef struct _tsentry { 78 1.2 peter TAILQ_ENTRY(_tsentry) ts_list; 79 1.2 peter uint64_t timestamp; 80 1.2 peter } TSENTRY; 81 1.2 peter 82 1.2 peter /* 83 1.2 peter * timestamp list macros 84 1.2 peter */ 85 1.2 peter 86 1.2 peter #define tslist_first(s) TAILQ_FIRST(s) 87 1.2 peter #define tslist_last(s) TAILQ_LAST(s, _timestamps) 88 1.2 peter #define tslist_empty(s) TAILQ_EMPTY(s) 89 1.2 peter 90 1.2 peter /* 91 1.2 peter * scaling/conversion macros 92 1.2 peter * none of these macros present side-effects, hence the lowercase 93 1.2 peter */ 94 1.2 peter 95 1.2 peter #define secs_to_ticks(x) ((x) * machclk_freq) 96 1.2 peter #define ticks_to_secs(x) ((x) / machclk_freq) 97 1.2 peter #define invsecs_to_invticks(x) ticks_to_secs(x) 98 1.2 peter #define invticks_to_invsecs(x) secs_to_ticks(x) 99 1.2 peter #define bits_to_bytes(x) ((x) >> 3) 100 1.2 peter #define bytes_to_bits(x) ((x) << 3) 101 1.2 peter #define scale_rate(x) ((x) << SCALE_RATE) 102 1.2 peter #define unscale_rate(x) ((x) >> SCALE_RATE) 103 1.2 peter #define bps_to_internal(x) (invsecs_to_invticks(bits_to_bytes(scale_rate(x)))) 104 1.2 peter #define internal_to_bps(x) (unscale_rate(invticks_to_invsecs(bytes_to_bits(x)))) 105 1.2 peter 106 1.2 peter /* 107 1.2 peter * this macro takes care of possible wraparound 108 1.2 peter * effects in the computation of a delay 109 1.2 peter * no side-effects here either 110 1.2 peter */ 111 1.2 peter 112 1.2 peter #define delay_diff(x, y) ((x >= y)?(x - y):((ULLONG_MAX-y)+x+1)) 113 1.2 peter 114 1.2 peter /* 115 1.2 peter * additional macros (PKTCNTR_ADD can be found 116 1.2 peter * in the original distribution) 117 1.2 peter */ 118 1.2 peter 119 1.2 peter #define PKTCNTR_SUB(cntr, len) do { \ 120 1.2 peter (cntr)->packets--; \ 121 1.2 peter (cntr)->bytes -= len; \ 122 1.2 peter } while (/*CONSTCOND*/ 0) 123 1.2 peter 124 1.2 peter #define PKTCNTR_RESET(cntr) do { \ 125 1.2 peter (cntr)->packets = 0; \ 126 1.2 peter (cntr)->bytes = 0; \ 127 1.2 peter } while (/*CONSTCOND*/ 0) 128 1.2 peter 129 1.2 peter struct jobs_interface { 130 1.2 peter char jobs_ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */ 131 1.2 peter u_long arg; /* request-specific argument */ 132 1.2 peter }; 133 1.2 peter struct jobs_attach { 134 1.2 peter struct jobs_interface iface; 135 1.2 peter u_int bandwidth; /* link bandwidth in bits/sec */ 136 1.2 peter u_int qlimit; /* buffer size in packets */ 137 1.2 peter u_int separate; /* separate buffers flag */ 138 1.2 peter }; 139 1.2 peter 140 1.2 peter struct jobs_add_class { 141 1.2 peter struct jobs_interface iface; 142 1.2 peter int pri; /* priority (0 is the lowest) */ 143 1.2 peter int flags; /* misc flags (see below) */ 144 1.2 peter 145 1.2 peter /* 146 1.2 peter * Delay Bound (-1 = NO ADC) is provided in us, 147 1.2 peter * and is converted to clock ticks 148 1.2 peter */ 149 1.2 peter int64_t cl_adc; 150 1.2 peter 151 1.2 peter /* 152 1.2 peter * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1 153 1.2 peter * and is converted to a fraction of 2^(SCALE_LOSS) 154 1.2 peter */ 155 1.2 peter int64_t cl_alc; 156 1.2 peter 157 1.2 peter /* 158 1.2 peter * lower bound on throughput (-1 = no ARC) 159 1.2 peter * is provided in (string) and 160 1.2 peter * is converted to internal format 161 1.2 peter */ 162 1.2 peter int64_t cl_arc; 163 1.2 peter 164 1.2 peter /* RDC weight (-1 = NO RDC) - no unit */ 165 1.2 peter int64_t cl_rdc; 166 1.2 peter 167 1.2 peter /* RLC weight (-1 = NO RLC) - no unit */ 168 1.2 peter int64_t cl_rlc; 169 1.2 peter 170 1.2 peter u_long class_handle; /* return value */ 171 1.2 peter }; 172 1.2 peter 173 1.2 peter /* jobs class flags */ 174 1.2 peter #define JOCF_CLEARDSCP 0x0010 /* clear diffserv codepoint */ 175 1.2 peter #define JOCF_DEFAULTCLASS 0x1000 /* default class */ 176 1.2 peter 177 1.2 peter /* special class handles */ 178 1.2 peter #define JOBS_NULLCLASS_HANDLE 0 179 1.2 peter 180 1.2 peter struct jobs_delete_class { 181 1.2 peter struct jobs_interface iface; 182 1.2 peter u_long class_handle; 183 1.2 peter }; 184 1.2 peter 185 1.2 peter struct jobs_modify_class { 186 1.2 peter struct jobs_interface iface; 187 1.2 peter u_long class_handle; 188 1.2 peter int pri; 189 1.2 peter 190 1.2 peter /* 191 1.2 peter * Delay Bound (-1 = NO ADC) is provided in us, 192 1.2 peter * and is converted to clock ticks 193 1.2 peter */ 194 1.2 peter int64_t cl_adc; 195 1.2 peter 196 1.2 peter /* 197 1.2 peter * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1 198 1.2 peter * and is converted to a fraction of 2^(SCALE_LOSS) 199 1.2 peter */ 200 1.2 peter int64_t cl_alc; 201 1.2 peter 202 1.2 peter /* 203 1.2 peter * lower bound on throughput (-1 = no ARC) 204 1.2 peter * is provided in (string) and 205 1.2 peter * is converted to internal format 206 1.2 peter */ 207 1.2 peter int64_t cl_arc; 208 1.2 peter 209 1.2 peter /* RDC weight (-1 = NO RDC) - no unit */ 210 1.2 peter int64_t cl_rdc; 211 1.2 peter 212 1.2 peter /* RLC weight (-1 = NO RLC) - no unit */ 213 1.2 peter int64_t cl_rlc; 214 1.2 peter 215 1.2 peter int flags; 216 1.2 peter }; 217 1.2 peter 218 1.2 peter struct jobs_add_filter { 219 1.2 peter struct jobs_interface iface; 220 1.2 peter u_long class_handle; 221 1.2 peter #ifdef ALTQ3_CLFIER_COMPAT 222 1.2 peter struct flow_filter filter; 223 1.2 peter #endif 224 1.2 peter u_long filter_handle; /* return value */ 225 1.2 peter }; 226 1.2 peter 227 1.2 peter struct jobs_delete_filter { 228 1.2 peter struct jobs_interface iface; 229 1.2 peter u_long filter_handle; 230 1.2 peter }; 231 1.2 peter 232 1.2 peter struct class_stats { 233 1.2 peter u_int adc_violations; 234 1.2 peter u_int totallength; 235 1.2 peter u_int period; 236 1.2 peter u_int qlength; 237 1.2 peter 238 1.2 peter u_long class_handle; 239 1.2 peter 240 1.2 peter int64_t service_rate; /* bps that should be out */ 241 1.2 peter 242 1.2 peter u_int64_t avg_cycles_dequeue; 243 1.2 peter u_int64_t avg_cycles_enqueue; 244 1.2 peter u_int64_t avg_cycles2_dequeue; 245 1.2 peter u_int64_t avg_cycles2_enqueue; 246 1.2 peter u_int64_t avgdel; /* in us */ 247 1.2 peter u_int64_t bc_cycles_dequeue; 248 1.2 peter u_int64_t bc_cycles_enqueue; 249 1.2 peter u_int64_t busylength; /* in ms */ 250 1.2 peter u_int64_t lastdel; /* in us */ 251 1.2 peter u_int64_t total_dequeued; 252 1.2 peter u_int64_t total_enqueued; 253 1.2 peter u_int64_t wc_cycles_dequeue; 254 1.2 peter u_int64_t wc_cycles_enqueue; 255 1.2 peter 256 1.2 peter struct pktcntr arrival; /* rin+dropped */ 257 1.2 peter struct pktcntr arrivalbusy; 258 1.2 peter struct pktcntr rin; /* dropped packet counter */ 259 1.2 peter struct pktcntr rout; /* transmitted packet counter */ 260 1.2 peter struct pktcntr dropcnt; /* dropped packet counter */ 261 1.2 peter }; 262 1.2 peter 263 1.2 peter struct jobs_class_stats { 264 1.2 peter struct class_stats *stats; /* pointer to stats array */ 265 1.2 peter int maxpri; /* in/out */ 266 1.2 peter struct jobs_interface iface; 267 1.2 peter }; 268 1.2 peter 269 1.2 peter #define JOBS_IF_ATTACH _IOW('Q', 1, struct jobs_attach) 270 1.2 peter #define JOBS_IF_DETACH _IOW('Q', 2, struct jobs_interface) 271 1.2 peter #define JOBS_ENABLE _IOW('Q', 3, struct jobs_interface) 272 1.2 peter #define JOBS_DISABLE _IOW('Q', 4, struct jobs_interface) 273 1.3 peter #define JOBS_CLEAR _IOW('Q', 6, struct jobs_interface) 274 1.2 peter #define JOBS_ADD_CLASS _IOWR('Q', 7, struct jobs_add_class) 275 1.2 peter #define JOBS_DEL_CLASS _IOW('Q', 8, struct jobs_delete_class) 276 1.2 peter #define JOBS_MOD_CLASS _IOW('Q', 9, struct jobs_modify_class) 277 1.2 peter #define JOBS_ADD_FILTER _IOWR('Q', 10, struct jobs_add_filter) 278 1.2 peter #define JOBS_DEL_FILTER _IOW('Q', 11, struct jobs_delete_filter) 279 1.2 peter #define JOBS_GETSTATS _IOWR('Q', 12, struct jobs_class_stats) 280 1.2 peter 281 1.2 peter #ifdef _KERNEL 282 1.2 peter 283 1.2 peter struct jobs_class { 284 1.2 peter TSLIST *arv_tm; /* list of timestamps */ 285 1.2 peter struct jobs_if *cl_jif; /* back pointer to jif */ 286 1.2 peter class_queue_t *cl_q; /* class queue structure */ 287 1.2 peter 288 1.2 peter int cl_pri; /* priority */ 289 1.2 peter int cl_flags; /* class flags */ 290 1.2 peter 291 1.2 peter u_long cl_handle; /* class handle */ 292 1.2 peter 293 1.2 peter /* control variables */ 294 1.2 peter 295 1.2 peter /* 296 1.2 peter * internal representation: 297 1.2 peter * bytes/unit_time << 32 = (bps /8 << 32)*1/machclk_freq 298 1.2 peter */ 299 1.2 peter int64_t service_rate; /* bps that should be out */ 300 1.2 peter int64_t min_rate_adc; /* bps that should be out for ADC/ARC */ 301 1.2 peter 302 1.2 peter u_int64_t current_loss; /* % of packets dropped */ 303 1.2 peter u_int64_t cl_lastdel; /* in clock ticks */ 304 1.2 peter u_int64_t cl_avgdel; 305 1.2 peter 306 1.2 peter /* statistics */ 307 1.2 peter u_int cl_period; /* backlog period */ 308 1.2 peter struct pktcntr cl_arrival; /* arrived packet counter */ 309 1.2 peter struct pktcntr cl_dropcnt; /* dropped packet counter */ 310 1.2 peter struct pktcntr cl_rin; /* let in packet counter */ 311 1.2 peter struct pktcntr cl_rout; /* transmitted packet counter */ 312 1.2 peter 313 1.2 peter 314 1.2 peter /* modified deficit round-robin specific variables */ 315 1.2 peter 316 1.2 peter /* 317 1.2 peter * rout_th is SCALED for precision, as opposed to rout. 318 1.2 peter */ 319 1.2 peter int64_t st_service_rate; 320 1.2 peter u_int64_t cl_last_rate_update; 321 1.2 peter struct pktcntr cl_rout_th; /* theoretical transmissions */ 322 1.2 peter struct pktcntr st_arrival; /* rin+dropped */ 323 1.2 peter struct pktcntr st_rin; /* dropped packet counter */ 324 1.2 peter struct pktcntr st_rout; /* transmitted packet counter */ 325 1.2 peter struct pktcntr st_dropcnt; /* dropped packet counter */ 326 1.2 peter 327 1.2 peter /* service guarantees */ 328 1.2 peter u_int adc_violations; 329 1.2 peter int concerned_adc; 330 1.2 peter int concerned_alc; 331 1.2 peter int concerned_arc; 332 1.2 peter int concerned_rdc; 333 1.2 peter int concerned_rlc; 334 1.2 peter /* 335 1.2 peter * Delay Bound (-1 = NO ADC) is provided in us, 336 1.2 peter * and is converted to clock ticks 337 1.2 peter */ 338 1.2 peter int64_t cl_adc; 339 1.2 peter 340 1.2 peter /* 341 1.2 peter * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1 342 1.2 peter * and is converted to a fraction of 2^(SCALE_LOSS) 343 1.2 peter */ 344 1.2 peter int64_t cl_alc; 345 1.2 peter 346 1.2 peter /* 347 1.2 peter * lower bound on throughput (-1 = no ARC) 348 1.2 peter * is provided in (string) and 349 1.2 peter * is converted to internal format 350 1.2 peter */ 351 1.2 peter int64_t cl_arc; 352 1.2 peter 353 1.2 peter /* RDC weight (-1 = NO RDC) - no unit */ 354 1.2 peter int64_t cl_rdc; 355 1.2 peter 356 1.2 peter /* RLC weight (-1 = NO RLC) - no unit */ 357 1.2 peter int64_t cl_rlc; 358 1.2 peter 359 1.2 peter u_int64_t delay_prod_others; 360 1.2 peter u_int64_t loss_prod_others; 361 1.2 peter u_int64_t idletime; 362 1.2 peter }; 363 1.2 peter 364 1.2 peter /* 365 1.2 peter * jobs interface state 366 1.2 peter */ 367 1.2 peter struct jobs_if { 368 1.2 peter struct jobs_if *jif_next; /* interface state list */ 369 1.2 peter struct ifaltq *jif_ifq; /* backpointer to ifaltq */ 370 1.2 peter struct jobs_class *jif_default; /* default class */ 371 1.2 peter struct jobs_class *jif_classes[JOBS_MAXPRI]; /* classes */ 372 1.2 peter #ifdef ALTQ3_CLFIER_COMPAT 373 1.2 peter struct acc_classifier jif_classifier; /* classifier */ 374 1.2 peter #endif 375 1.2 peter int jif_maxpri; /* max priority in use */ 376 1.2 peter 377 1.2 peter u_int jif_bandwidth; /* link bandwidth in bps */ 378 1.2 peter u_int jif_qlimit; /* buffer size in packets */ 379 1.2 peter u_int jif_separate; /* separate buffers or not */ 380 1.2 peter u_int64_t avg_cycles_dequeue; 381 1.2 peter u_int64_t avg_cycles_enqueue; 382 1.2 peter u_int64_t avg_cycles2_dequeue; 383 1.2 peter u_int64_t avg_cycles2_enqueue; 384 1.2 peter u_int64_t bc_cycles_dequeue; 385 1.2 peter u_int64_t bc_cycles_enqueue; 386 1.2 peter u_int64_t wc_cycles_dequeue; 387 1.2 peter u_int64_t wc_cycles_enqueue; 388 1.2 peter u_int64_t total_dequeued; 389 1.2 peter u_int64_t total_enqueued; 390 1.2 peter }; 391 1.2 peter 392 1.2 peter #endif /* _KERNEL */ 393 1.2 peter 394 1.2 peter #ifdef __cplusplus 395 1.2 peter } 396 1.2 peter #endif 397 1.2 peter 398 1.2 peter #endif /* _ALTQ_ALTQ_JOBS_H_ */ 399