Home | History | Annotate | Line # | Download | only in altq
      1 /*	$NetBSD: altq_jobs.h,v 1.6 2025/02/10 19:12:49 joe 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 #define ALTQ_INFINITY	LLONG_MAX	/* not infinite, just large */
     73 
     74 /* list of packet arrival times */
     75 struct _tsentry;
     76 typedef TAILQ_HEAD(_timestamps, _tsentry) TSLIST;
     77 typedef 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 
    129 struct jobs_interface {
    130 	char	jobs_ifname[IFNAMSIZ];	/* interface name (e.g., fxp0) */
    131 	u_long	arg;			/* request-specific argument */
    132 };
    133 struct 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 
    140 struct 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 
    180 struct jobs_delete_class {
    181 	struct	jobs_interface	iface;
    182 	u_long	class_handle;
    183 };
    184 
    185 struct 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 
    218 struct 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 
    227 struct jobs_delete_filter {
    228 	struct	jobs_interface iface;
    229 	u_long	filter_handle;
    230 };
    231 
    232 struct 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 
    263 struct 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 
    283 struct 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  */
    367 struct 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_ */
    399