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