Home | History | Annotate | Line # | Download | only in altq
      1  1.6     joe /*	$NetBSD: altq_jobs.h,v 1.6 2025/02/10 19:12:49 joe 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.6     joe  * 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.6     joe  * Redistribution and use in source and binary forms,
      9  1.6     joe  * with or without modification, are permitted provided
     10  1.2   peter  * that the following conditions are met:
     11  1.2   peter  *
     12  1.6     joe  * Redistributions of source code must retain the above
     13  1.6     joe  * copyright notice, this list of conditions and the following
     14  1.6     joe  * disclaimer.
     15  1.2   peter  *
     16  1.6     joe  * Redistributions in binary form must reproduce the above
     17  1.6     joe  * copyright notice, this list of conditions and the following
     18  1.6     joe  * disclaimer in the documentation and/or other materials provided
     19  1.6     joe  * with the distribution.
     20  1.2   peter  *
     21  1.6     joe  * Neither the name of the University of Virginia nor the names
     22  1.6     joe  * of its contributors may be used to endorse or promote products
     23  1.6     joe  * derived from this software without specific prior written
     24  1.6     joe  * permission.
     25  1.2   peter  *
     26  1.6     joe  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
     27  1.6     joe  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
     28  1.6     joe  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     29  1.6     joe  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     30  1.6     joe  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
     31  1.6     joe  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
     32  1.6     joe  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     33  1.6     joe  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     34  1.6     joe  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     35  1.6     joe  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  1.6     joe  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     37  1.6     joe  * 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.6     joe /*
     41  1.6     joe  * JoBS - altq prototype implementation
     42  1.6     joe  *
     43  1.2   peter  * Author: Nicolas Christin <nicolas (at) cs.virginia.edu>
     44  1.2   peter  *
     45  1.6     joe  * JoBS algorithms originally devised and proposed by
     46  1.2   peter  * Nicolas Christin and Jorg Liebeherr.
     47  1.6     joe  * 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.6     joe  * of Virginia.
     51  1.2   peter  *
     52  1.6     joe  * Papers and additional info can be found at
     53  1.2   peter  * http://qosbox.cs.virginia.edu
     54  1.6     joe  *
     55  1.6     joe  */
     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.5  plunky #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.6     joe 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