Home | History | Annotate | Line # | Download | only in altq
altq_jobs.h revision 1.4.14.1
      1  1.4.14.1  uebayasi /*	$NetBSD: altq_jobs.h,v 1.4.14.1 2010/04/30 14:42:55 uebayasi 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.4.14.1  uebayasi #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.2     peter 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