master
  1/*	$NetBSD: altq_jobs.h,v 1.5 2010/04/09 19:32:45 plunky 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
 64extern "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#define ALTQ_INFINITY	LLONG_MAX	/* not infinite, just large */
 73
 74/* list of packet arrival times */
 75struct _tsentry;
 76typedef TAILQ_HEAD(_timestamps, _tsentry) TSLIST;  
 77typedef struct _tsentry {
 78	TAILQ_ENTRY(_tsentry) ts_list;
 79	uint64_t	timestamp;
 80} TSENTRY;
 81
 82/*
 83 * timestamp list macros
 84 */
 85
 86#define tslist_first(s)	TAILQ_FIRST(s)
 87#define tslist_last(s)	TAILQ_LAST(s, _timestamps)
 88#define tslist_empty(s) TAILQ_EMPTY(s)
 89
 90/*
 91 * scaling/conversion macros
 92 * none of these macros present side-effects, hence the lowercase
 93 */
 94
 95#define	secs_to_ticks(x)	((x) * machclk_freq)
 96#define ticks_to_secs(x)	((x) / machclk_freq)
 97#define invsecs_to_invticks(x)	ticks_to_secs(x)
 98#define invticks_to_invsecs(x)	secs_to_ticks(x)
 99#define bits_to_bytes(x)	((x) >> 3)
100#define bytes_to_bits(x)	((x) << 3)
101#define scale_rate(x)		((x) << SCALE_RATE)
102#define unscale_rate(x)		((x) >> SCALE_RATE)
103#define bps_to_internal(x)	(invsecs_to_invticks(bits_to_bytes(scale_rate(x))))
104#define internal_to_bps(x)	(unscale_rate(invticks_to_invsecs(bytes_to_bits(x))))
105
106/*
107 * this macro takes care of possible wraparound
108 * effects in the computation of a delay
109 * no side-effects here either
110 */
111
112#define delay_diff(x, y) ((x >= y)?(x - y):((ULLONG_MAX-y)+x+1))
113
114/*
115 * additional macros (PKTCNTR_ADD can be found
116 * in the original distribution)
117 */
118
119#define PKTCNTR_SUB(cntr, len) do {                                     \
120        (cntr)->packets--;                                              \
121        (cntr)->bytes -= len;                                           \
122} while (/*CONSTCOND*/ 0)
123
124#define PKTCNTR_RESET(cntr) do {                                        \
125        (cntr)->packets = 0;                                            \
126        (cntr)->bytes = 0;                                              \
127} while (/*CONSTCOND*/ 0)
128
129struct jobs_interface {
130	char	jobs_ifname[IFNAMSIZ];	/* interface name (e.g., fxp0) */
131	u_long	arg;			/* request-specific argument */
132};
133struct jobs_attach {
134	struct	jobs_interface iface;
135	u_int	bandwidth;		/* link bandwidth in bits/sec */
136	u_int	qlimit;			/* buffer size in packets */
137	u_int	separate;		/* separate buffers flag */
138};
139
140struct jobs_add_class {
141	struct	jobs_interface	iface;
142	int	pri;			/* priority (0 is the lowest) */
143	int	flags;			/* misc flags (see below) */
144
145	/*
146	 * Delay Bound (-1 = NO ADC) is provided in us,
147	 * and is converted to clock ticks
148	 */
149	int64_t	cl_adc;
150
151	/*
152	 * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
153	 * and is converted to a fraction of  2^(SCALE_LOSS)
154	 */
155	int64_t	cl_alc;
156
157	/*
158	 * lower bound on throughput (-1 = no ARC)
159	 * is provided in (string) and
160	 * is converted to internal format
161	 */
162	int64_t	cl_arc;
163
164	/* RDC weight (-1 = NO RDC) - no unit */
165	int64_t	cl_rdc;
166
167	/* RLC weight (-1 = NO RLC) - no unit */
168	int64_t	cl_rlc;
169
170	u_long	class_handle;		/* return value */
171};
172
173/* jobs class flags */
174#define	JOCF_CLEARDSCP		0x0010  /* clear diffserv codepoint */
175#define	JOCF_DEFAULTCLASS	0x1000	/* default class */
176
177/* special class handles */
178#define	JOBS_NULLCLASS_HANDLE	0
179
180struct jobs_delete_class {
181	struct	jobs_interface	iface;
182	u_long	class_handle;
183};
184
185struct jobs_modify_class {
186	struct	jobs_interface	iface;
187	u_long	class_handle;
188	int	pri;
189
190	/* 
191	 * Delay Bound (-1 = NO ADC) is provided in us,
192	 * and is converted to clock ticks
193	 */
194	int64_t	cl_adc;
195
196	/*
197	 * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
198	 * and is converted to a fraction of  2^(SCALE_LOSS)
199	 */
200	int64_t	cl_alc;
201
202	/*
203	 * lower bound on throughput (-1 = no ARC)
204	 * is provided in (string) and
205	 * is converted to internal format
206	 */
207	int64_t	cl_arc;
208
209	/* RDC weight (-1 = NO RDC) - no unit */
210	int64_t	cl_rdc;
211
212	/* RLC weight (-1 = NO RLC) - no unit */
213	int64_t	cl_rlc;
214
215	int	flags;
216};
217
218struct jobs_add_filter {
219	struct	jobs_interface iface;
220	u_long	class_handle;
221#ifdef ALTQ3_CLFIER_COMPAT
222	struct	flow_filter filter;
223#endif
224	u_long	filter_handle;		/* return value */
225};
226
227struct jobs_delete_filter {
228	struct	jobs_interface iface;
229	u_long	filter_handle;
230};
231
232struct class_stats {
233	u_int	adc_violations;
234	u_int	totallength;
235	u_int 	period;
236	u_int	qlength;
237
238	u_long	class_handle;
239
240	int64_t	service_rate;		/* bps that should be out */
241
242	u_int64_t	avg_cycles_dequeue;
243	u_int64_t	avg_cycles_enqueue;
244	u_int64_t	avg_cycles2_dequeue;
245	u_int64_t	avg_cycles2_enqueue;
246	u_int64_t	avgdel;		/* in us */
247	u_int64_t	bc_cycles_dequeue;
248	u_int64_t	bc_cycles_enqueue;
249	u_int64_t	busylength;	/* in ms */
250	u_int64_t	lastdel;	/* in us */
251	u_int64_t	total_dequeued;
252	u_int64_t	total_enqueued;
253	u_int64_t	wc_cycles_dequeue;
254	u_int64_t	wc_cycles_enqueue;
255
256	struct	pktcntr	arrival;	/* rin+dropped */
257	struct	pktcntr	arrivalbusy;
258	struct	pktcntr	rin;		/* dropped packet counter */
259	struct	pktcntr	rout;		/* transmitted packet counter */
260	struct	pktcntr	dropcnt;	/* dropped packet counter */
261};
262
263struct jobs_class_stats {
264	struct	class_stats *stats;	/* pointer to stats array */
265	int	maxpri;			/* in/out */
266	struct	jobs_interface iface;
267};
268
269#define	JOBS_IF_ATTACH		_IOW('Q', 1, struct jobs_attach)
270#define	JOBS_IF_DETACH		_IOW('Q', 2, struct jobs_interface)
271#define	JOBS_ENABLE		_IOW('Q', 3, struct jobs_interface)
272#define	JOBS_DISABLE		_IOW('Q', 4, struct jobs_interface)
273#define	JOBS_CLEAR		_IOW('Q', 6, struct jobs_interface)
274#define	JOBS_ADD_CLASS		_IOWR('Q', 7, struct jobs_add_class)
275#define	JOBS_DEL_CLASS		_IOW('Q', 8, struct jobs_delete_class)
276#define	JOBS_MOD_CLASS		_IOW('Q', 9, struct jobs_modify_class)
277#define	JOBS_ADD_FILTER		_IOWR('Q', 10, struct jobs_add_filter)
278#define	JOBS_DEL_FILTER		_IOW('Q', 11, struct jobs_delete_filter)
279#define	JOBS_GETSTATS		_IOWR('Q', 12, struct jobs_class_stats)
280
281#ifdef _KERNEL
282
283struct jobs_class {
284        TSLIST	*arv_tm;		/* list of timestamps */
285	struct	jobs_if	*cl_jif;	/* back pointer to jif */
286	class_queue_t	*cl_q;		/* class queue structure */
287
288	int	cl_pri;			/* priority */
289	int	cl_flags;		/* class flags */
290
291	u_long	cl_handle;		/* class handle */
292
293	/* control variables */
294
295        /*
296	 * internal representation:
297	 * bytes/unit_time << 32 = (bps /8 << 32)*1/machclk_freq
298         */
299	int64_t	service_rate;		/* bps that should be out */
300        int64_t	min_rate_adc;		/* bps that should be out for ADC/ARC */
301
302	u_int64_t	current_loss;	/* % of packets dropped */
303	u_int64_t	cl_lastdel;     /* in clock ticks */
304	u_int64_t	cl_avgdel;
305
306	/* statistics */
307	u_int	cl_period;		/* backlog period */
308	struct	pktcntr cl_arrival;	/* arrived packet counter */
309	struct	pktcntr cl_dropcnt;	/* dropped packet counter */
310	struct	pktcntr cl_rin;		/* let in packet counter */
311	struct	pktcntr cl_rout;	/* transmitted packet counter */
312
313
314	/* modified deficit round-robin specific variables */
315
316	/*
317	 * rout_th is SCALED for precision, as opposed to rout.
318	 */
319	int64_t st_service_rate;
320	u_int64_t	cl_last_rate_update;
321	struct	pktcntr	cl_rout_th;	/* theoretical transmissions */
322	struct	pktcntr st_arrival;	/* rin+dropped */
323	struct	pktcntr	st_rin;		/* dropped packet counter */
324	struct	pktcntr	st_rout;	/* transmitted packet counter */
325	struct	pktcntr	st_dropcnt;	/* dropped packet counter */
326
327	/* service guarantees */
328	u_int	adc_violations;
329	int	concerned_adc;
330	int	concerned_alc;
331	int	concerned_arc;
332	int	concerned_rdc;
333	int	concerned_rlc;
334	/*
335	 * Delay Bound (-1 = NO ADC) is provided in us,
336	 * and is converted to clock ticks
337	 */
338	int64_t	cl_adc;
339
340	/*
341	 * Loss Rate Bound (-1 = NO ALC) is provided in fraction of 1
342	 * and is converted to a fraction of  2^(SCALE_LOSS)
343	 */
344	int64_t	cl_alc;
345
346	/*
347	 * lower bound on throughput (-1 = no ARC)
348	 * is provided in (string) and
349	 * is converted to internal format
350	 */
351	int64_t	cl_arc;
352
353	/* RDC weight (-1 = NO RDC) - no unit */
354	int64_t	cl_rdc;
355
356	/* RLC weight (-1 = NO RLC) - no unit */
357	int64_t	cl_rlc;
358
359	u_int64_t	delay_prod_others;
360	u_int64_t	loss_prod_others;
361	u_int64_t	idletime;
362};
363
364/*
365 * jobs interface state
366 */
367struct jobs_if {
368	struct	jobs_if	*jif_next;		/* interface state list */
369	struct	ifaltq	*jif_ifq;		/* backpointer to ifaltq */
370	struct	jobs_class *jif_default;	/* default class */
371	struct	jobs_class *jif_classes[JOBS_MAXPRI]; /* classes */
372#ifdef ALTQ3_CLFIER_COMPAT
373	struct	acc_classifier jif_classifier;	/* classifier */
374#endif
375	int	jif_maxpri;			/* max priority in use */
376
377	u_int	jif_bandwidth;			/* link bandwidth in bps */
378	u_int	jif_qlimit;			/* buffer size in packets */
379	u_int	jif_separate;			/* separate buffers or not */
380	u_int64_t	avg_cycles_dequeue;
381	u_int64_t	avg_cycles_enqueue;
382	u_int64_t	avg_cycles2_dequeue;
383	u_int64_t	avg_cycles2_enqueue;
384	u_int64_t	bc_cycles_dequeue;
385	u_int64_t	bc_cycles_enqueue;
386	u_int64_t	wc_cycles_dequeue;
387	u_int64_t	wc_cycles_enqueue;
388	u_int64_t	total_dequeued;
389	u_int64_t	total_enqueued;
390};
391
392#endif /* _KERNEL */
393
394#ifdef __cplusplus
395}
396#endif
397
398#endif /* _ALTQ_ALTQ_JOBS_H_ */