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