Home | History | Annotate | Line # | Download | only in altq
altq_jobs.h revision 1.3.50.1
      1 /*	$NetBSD: altq_jobs.h,v 1.3.50.1 2008/09/28 10:39:44 mjf 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 (at) 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