• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __LINUX_PKT_SCHED_H
2 #define __LINUX_PKT_SCHED_H
3 
4 #include <linux/types.h>
5 
6 /* Logical priority bands not depending on specific packet scheduler.
7    Every scheduler will map them to real traffic classes, if it has
8    no more precise mechanism to classify packets.
9 
10    These numbers have no special meaning, though their coincidence
11    with obsolete IPv6 values is not occasional :-). New IPv6 drafts
12    preferred full anarchy inspired by diffserv group.
13 
14    Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
15    class, actually, as rule it will be handled with more care than
16    filler or even bulk.
17  */
18 
19 #define TC_PRIO_BESTEFFORT		0
20 #define TC_PRIO_FILLER			1
21 #define TC_PRIO_BULK			2
22 #define TC_PRIO_INTERACTIVE_BULK	4
23 #define TC_PRIO_INTERACTIVE		6
24 #define TC_PRIO_CONTROL			7
25 
26 #define TC_PRIO_MAX			15
27 
28 /* Generic queue statistics, available for all the elements.
29    Particular schedulers may have also their private records.
30  */
31 
32 struct tc_stats {
33 	__u64	bytes;			/* NUmber of enqueues bytes */
34 	__u32	packets;		/* Number of enqueued packets	*/
35 	__u32	drops;			/* Packets dropped because of lack of resources */
36 	__u32	overlimits;		/* Number of throttle events when this
37 					 * flow goes out of allocated bandwidth */
38 	__u32	bps;			/* Current flow byte rate */
39 	__u32	pps;			/* Current flow packet rate */
40 	__u32	qlen;
41 	__u32	backlog;
42 };
43 
44 struct tc_estimator {
45 	signed char	interval;
46 	unsigned char	ewma_log;
47 };
48 
49 /* "Handles"
50    ---------
51 
52     All the traffic control objects have 32bit identifiers, or "handles".
53 
54     They can be considered as opaque numbers from user API viewpoint,
55     but actually they always consist of two fields: major and
56     minor numbers, which are interpreted by kernel specially,
57     that may be used by applications, though not recommended.
58 
59     F.e. qdisc handles always have minor number equal to zero,
60     classes (or flows) have major equal to parent qdisc major, and
61     minor uniquely identifying class inside qdisc.
62 
63     Macros to manipulate handles:
64  */
65 
66 #define TC_H_MAJ_MASK (0xFFFF0000U)
67 #define TC_H_MIN_MASK (0x0000FFFFU)
68 #define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
69 #define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
70 #define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
71 
72 #define TC_H_UNSPEC	(0U)
73 #define TC_H_ROOT	(0xFFFFFFFFU)
74 #define TC_H_INGRESS    (0xFFFFFFF1U)
75 
76 struct tc_ratespec {
77 	unsigned char	cell_log;
78 	unsigned char	__reserved;
79 	unsigned short	overhead;
80 	short		cell_align;
81 	unsigned short	mpu;
82 	__u32		rate;
83 };
84 
85 #define TC_RTAB_SIZE	1024
86 
87 struct tc_sizespec {
88 	unsigned char	cell_log;
89 	unsigned char	size_log;
90 	short		cell_align;
91 	int		overhead;
92 	unsigned int	linklayer;
93 	unsigned int	mpu;
94 	unsigned int	mtu;
95 	unsigned int	tsize;
96 };
97 
98 enum {
99 	TCA_STAB_UNSPEC,
100 	TCA_STAB_BASE,
101 	TCA_STAB_DATA,
102 	__TCA_STAB_MAX
103 };
104 
105 #define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
106 
107 /* FIFO section */
108 
109 struct tc_fifo_qopt {
110 	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
111 };
112 
113 /* PRIO section */
114 
115 #define TCQ_PRIO_BANDS	16
116 #define TCQ_MIN_PRIO_BANDS 2
117 
118 struct tc_prio_qopt {
119 	int	bands;			/* Number of bands */
120 	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
121 };
122 
123 /* MULTIQ section */
124 
125 struct tc_multiq_qopt {
126 	__u16	bands;			/* Number of bands */
127 	__u16	max_bands;		/* Maximum number of queues */
128 };
129 
130 /* PLUG section */
131 
132 #define TCQ_PLUG_BUFFER                0
133 #define TCQ_PLUG_RELEASE_ONE           1
134 #define TCQ_PLUG_RELEASE_INDEFINITE    2
135 #define TCQ_PLUG_LIMIT                 3
136 
137 struct tc_plug_qopt {
138         /* TCQ_PLUG_BUFFER: Inset a plug into the queue and
139          *  buffer any incoming packets
140          * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
141          *   to beginning of the next plug.
142          * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
143          *   Stop buffering packets until the next TCQ_PLUG_BUFFER
144          *   command is received (just act as a pass-thru queue).
145          * TCQ_PLUG_LIMIT: Increase/decrease queue size
146          */
147         int             action;
148         __u32           limit;
149 };
150 
151 /* TBF section */
152 
153 struct tc_tbf_qopt {
154 	struct tc_ratespec rate;
155 	struct tc_ratespec peakrate;
156 	__u32		limit;
157 	__u32		buffer;
158 	__u32		mtu;
159 };
160 
161 enum {
162 	TCA_TBF_UNSPEC,
163 	TCA_TBF_PARMS,
164 	TCA_TBF_RTAB,
165 	TCA_TBF_PTAB,
166 	__TCA_TBF_MAX,
167 };
168 
169 #define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
170 
171 
172 /* TEQL section */
173 
174 /* TEQL does not require any parameters */
175 
176 /* SFQ section */
177 
178 struct tc_sfq_qopt {
179 	unsigned	quantum;	/* Bytes per round allocated to flow */
180 	int		perturb_period;	/* Period of hash perturbation */
181 	__u32		limit;		/* Maximal packets in queue */
182 	unsigned	divisor;	/* Hash divisor  */
183 	unsigned	flows;		/* Maximal number of flows  */
184 };
185 
186 struct tc_sfq_xstats {
187 	__s32		allot;
188 };
189 
190 /*
191  *  NOTE: limit, divisor and flows are hardwired to code at the moment.
192  *
193  *	limit=flows=128, divisor=1024;
194  *
195  *	The only reason for this is efficiency, it is possible
196  *	to change these parameters in compile time.
197  */
198 
199 /* RED section */
200 
201 enum {
202 	TCA_RED_UNSPEC,
203 	TCA_RED_PARMS,
204 	TCA_RED_STAB,
205 	__TCA_RED_MAX,
206 };
207 
208 #define TCA_RED_MAX (__TCA_RED_MAX - 1)
209 
210 struct tc_red_qopt {
211 	__u32		limit;		/* HARD maximal queue length (bytes)	*/
212 	__u32		qth_min;	/* Min average length threshold (bytes) */
213 	__u32		qth_max;	/* Max average length threshold (bytes) */
214 	unsigned char   Wlog;		/* log(W)		*/
215 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
216 	unsigned char   Scell_log;	/* cell size for idle damping */
217 	unsigned char	flags;
218 #define TC_RED_ECN	1
219 #define TC_RED_HARDDROP	2
220 };
221 
222 struct tc_red_xstats {
223 	__u32           early;          /* Early drops */
224 	__u32           pdrop;          /* Drops due to queue limits */
225 	__u32           other;          /* Drops due to drop() calls */
226 	__u32           marked;         /* Marked packets */
227 };
228 
229 /* GRED section */
230 
231 #define MAX_DPs 16
232 
233 enum {
234        TCA_GRED_UNSPEC,
235        TCA_GRED_PARMS,
236        TCA_GRED_STAB,
237        TCA_GRED_DPS,
238 	   __TCA_GRED_MAX,
239 };
240 
241 #define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
242 
243 struct tc_gred_qopt {
244 	__u32		limit;        /* HARD maximal queue length (bytes)    */
245 	__u32		qth_min;      /* Min average length threshold (bytes) */
246 	__u32		qth_max;      /* Max average length threshold (bytes) */
247 	__u32		DP;           /* up to 2^32 DPs */
248 	__u32		backlog;
249 	__u32		qave;
250 	__u32		forced;
251 	__u32		early;
252 	__u32		other;
253 	__u32		pdrop;
254 	__u8		Wlog;         /* log(W)               */
255 	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
256 	__u8		Scell_log;    /* cell size for idle damping */
257 	__u8		prio;         /* prio of this VQ */
258 	__u32		packets;
259 	__u32		bytesin;
260 };
261 
262 /* gred setup */
263 struct tc_gred_sopt {
264 	__u32		DPs;
265 	__u32		def_DP;
266 	__u8		grio;
267 	__u8		flags;
268 	__u16		pad1;
269 };
270 
271 /* CHOKe section */
272 
273 enum {
274 	TCA_CHOKE_UNSPEC,
275 	TCA_CHOKE_PARMS,
276 	TCA_CHOKE_STAB,
277 	__TCA_CHOKE_MAX,
278 };
279 
280 #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
281 
282 struct tc_choke_qopt {
283 	__u32		limit;		/* Hard queue length (packets)	*/
284 	__u32		qth_min;	/* Min average threshold (packets) */
285 	__u32		qth_max;	/* Max average threshold (packets) */
286 	unsigned char   Wlog;		/* log(W)		*/
287 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
288 	unsigned char   Scell_log;	/* cell size for idle damping */
289 	unsigned char	flags;		/* see RED flags */
290 };
291 
292 struct tc_choke_xstats {
293 	__u32		early;          /* Early drops */
294 	__u32		pdrop;          /* Drops due to queue limits */
295 	__u32		other;          /* Drops due to drop() calls */
296 	__u32		marked;         /* Marked packets */
297 	__u32		matched;	/* Drops due to flow match */
298 };
299 
300 /* HTB section */
301 #define TC_HTB_NUMPRIO		8
302 #define TC_HTB_MAXDEPTH		8
303 #define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
304 
305 struct tc_htb_opt {
306 	struct tc_ratespec 	rate;
307 	struct tc_ratespec 	ceil;
308 	__u32	buffer;
309 	__u32	cbuffer;
310 	__u32	quantum;
311 	__u32	level;		/* out only */
312 	__u32	prio;
313 };
314 struct tc_htb_glob {
315 	__u32 version;		/* to match HTB/TC */
316     	__u32 rate2quantum;	/* bps->quantum divisor */
317     	__u32 defcls;		/* default class number */
318 	__u32 debug;		/* debug flags */
319 
320 	/* stats */
321 	__u32 direct_pkts; /* count of non shapped packets */
322 };
323 enum {
324 	TCA_HTB_UNSPEC,
325 	TCA_HTB_PARMS,
326 	TCA_HTB_INIT,
327 	TCA_HTB_CTAB,
328 	TCA_HTB_RTAB,
329 	__TCA_HTB_MAX,
330 };
331 
332 #define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
333 
334 struct tc_htb_xstats {
335 	__u32 lends;
336 	__u32 borrows;
337 	__u32 giants;	/* too big packets (rate will not be accurate) */
338 	__u32 tokens;
339 	__u32 ctokens;
340 };
341 
342 /* HFSC section */
343 
344 struct tc_hfsc_qopt {
345 	__u16	defcls;		/* default class */
346 };
347 
348 struct tc_service_curve {
349 	__u32	m1;		/* slope of the first segment in bps */
350 	__u32	d;		/* x-projection of the first segment in us */
351 	__u32	m2;		/* slope of the second segment in bps */
352 };
353 
354 struct tc_hfsc_stats {
355 	__u64	work;		/* total work done */
356 	__u64	rtwork;		/* work done by real-time criteria */
357 	__u32	period;		/* current period */
358 	__u32	level;		/* class level in hierarchy */
359 };
360 
361 enum {
362 	TCA_HFSC_UNSPEC,
363 	TCA_HFSC_RSC,
364 	TCA_HFSC_FSC,
365 	TCA_HFSC_USC,
366 	__TCA_HFSC_MAX,
367 };
368 
369 #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
370 
371 
372 /* CBQ section */
373 
374 #define TC_CBQ_MAXPRIO		8
375 #define TC_CBQ_MAXLEVEL		8
376 #define TC_CBQ_DEF_EWMA		5
377 
378 struct tc_cbq_lssopt {
379 	unsigned char	change;
380 	unsigned char	flags;
381 #define TCF_CBQ_LSS_BOUNDED	1
382 #define TCF_CBQ_LSS_ISOLATED	2
383 	unsigned char  	ewma_log;
384 	unsigned char  	level;
385 #define TCF_CBQ_LSS_FLAGS	1
386 #define TCF_CBQ_LSS_EWMA	2
387 #define TCF_CBQ_LSS_MAXIDLE	4
388 #define TCF_CBQ_LSS_MINIDLE	8
389 #define TCF_CBQ_LSS_OFFTIME	0x10
390 #define TCF_CBQ_LSS_AVPKT	0x20
391 	__u32		maxidle;
392 	__u32		minidle;
393 	__u32		offtime;
394 	__u32		avpkt;
395 };
396 
397 struct tc_cbq_wrropt {
398 	unsigned char	flags;
399 	unsigned char	priority;
400 	unsigned char	cpriority;
401 	unsigned char	__reserved;
402 	__u32		allot;
403 	__u32		weight;
404 };
405 
406 struct tc_cbq_ovl {
407 	unsigned char	strategy;
408 #define	TC_CBQ_OVL_CLASSIC	0
409 #define	TC_CBQ_OVL_DELAY	1
410 #define	TC_CBQ_OVL_LOWPRIO	2
411 #define	TC_CBQ_OVL_DROP		3
412 #define	TC_CBQ_OVL_RCLASSIC	4
413 	unsigned char	priority2;
414 	__u16		pad;
415 	__u32		penalty;
416 };
417 
418 struct tc_cbq_police {
419 	unsigned char	police;
420 	unsigned char	__res1;
421 	unsigned short	__res2;
422 };
423 
424 struct tc_cbq_fopt {
425 	__u32		split;
426 	__u32		defmap;
427 	__u32		defchange;
428 };
429 
430 struct tc_cbq_xstats {
431 	__u32		borrows;
432 	__u32		overactions;
433 	__s32		avgidle;
434 	__s32		undertime;
435 };
436 
437 enum {
438 	TCA_CBQ_UNSPEC,
439 	TCA_CBQ_LSSOPT,
440 	TCA_CBQ_WRROPT,
441 	TCA_CBQ_FOPT,
442 	TCA_CBQ_OVL_STRATEGY,
443 	TCA_CBQ_RATE,
444 	TCA_CBQ_RTAB,
445 	TCA_CBQ_POLICE,
446 	__TCA_CBQ_MAX,
447 };
448 
449 #define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
450 
451 /* dsmark section */
452 
453 enum {
454 	TCA_DSMARK_UNSPEC,
455 	TCA_DSMARK_INDICES,
456 	TCA_DSMARK_DEFAULT_INDEX,
457 	TCA_DSMARK_SET_TC_INDEX,
458 	TCA_DSMARK_MASK,
459 	TCA_DSMARK_VALUE,
460 	__TCA_DSMARK_MAX,
461 };
462 
463 #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
464 
465 /* fq_codel section */
466 
467 enum {
468         TCA_FQ_CODEL_UNSPEC,
469         TCA_FQ_CODEL_TARGET,
470         TCA_FQ_CODEL_LIMIT,
471         TCA_FQ_CODEL_INTERVAL,
472         TCA_FQ_CODEL_ECN,
473         TCA_FQ_CODEL_FLOWS,
474         TCA_FQ_CODEL_QUANTUM,
475         __TCA_FQ_CODEL_MAX
476 };
477 
478 #define TCA_FQ_CODEL_MAX        (__TCA_FQ_CODEL_MAX - 1)
479 
480 /* ATM  section */
481 
482 enum {
483 	TCA_ATM_UNSPEC,
484 	TCA_ATM_FD,		/* file/socket descriptor */
485 	TCA_ATM_PTR,		/* pointer to descriptor - later */
486 	TCA_ATM_HDR,		/* LL header */
487 	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
488 	TCA_ATM_ADDR,		/* PVC address (for output only) */
489 	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
490 	__TCA_ATM_MAX,
491 };
492 
493 #define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
494 
495 /* Network emulator */
496 
497 enum {
498 	TCA_NETEM_UNSPEC,
499 	TCA_NETEM_CORR,
500 	TCA_NETEM_DELAY_DIST,
501 	TCA_NETEM_REORDER,
502 	TCA_NETEM_CORRUPT,
503 	TCA_NETEM_LOSS,
504 	__TCA_NETEM_MAX,
505 };
506 
507 #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
508 
509 struct tc_netem_qopt {
510 	__u32	latency;	/* added delay (us) */
511 	__u32   limit;		/* fifo limit (packets) */
512 	__u32	loss;		/* random packet loss (0=none ~0=100%) */
513 	__u32	gap;		/* re-ordering gap (0 for none) */
514 	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
515 	__u32	jitter;		/* random jitter in latency (us) */
516 };
517 
518 struct tc_netem_corr {
519 	__u32	delay_corr;	/* delay correlation */
520 	__u32	loss_corr;	/* packet loss correlation */
521 	__u32	dup_corr;	/* duplicate correlation  */
522 };
523 
524 struct tc_netem_reorder {
525 	__u32	probability;
526 	__u32	correlation;
527 };
528 
529 struct tc_netem_corrupt {
530 	__u32	probability;
531 	__u32	correlation;
532 };
533 
534 enum {
535 	NETEM_LOSS_UNSPEC,
536 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
537 	NETEM_LOSS_GE,		/* Gilbert Elliot models */
538 	__NETEM_LOSS_MAX
539 };
540 #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
541 
542 /* State transition probablities for 4 state model */
543 struct tc_netem_gimodel {
544 	__u32	p13;
545 	__u32	p31;
546 	__u32	p32;
547 	__u32	p14;
548 	__u32	p23;
549 };
550 
551 /* Gilbert-Elliot models */
552 struct tc_netem_gemodel {
553 	__u32 p;
554 	__u32 r;
555 	__u32 h;
556 	__u32 k1;
557 };
558 
559 #define NETEM_DIST_SCALE	8192
560 #define NETEM_DIST_MAX		16384
561 
562 /* DRR */
563 
564 enum {
565 	TCA_DRR_UNSPEC,
566 	TCA_DRR_QUANTUM,
567 	__TCA_DRR_MAX
568 };
569 
570 #define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
571 
572 struct tc_drr_stats {
573 	__u32	deficit;
574 };
575 
576 /* MQPRIO */
577 #define TC_QOPT_BITMASK 15
578 #define TC_QOPT_MAX_QUEUE 16
579 
580 struct tc_mqprio_qopt {
581 	__u8	num_tc;
582 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
583 	__u8	hw;
584 	__u16	count[TC_QOPT_MAX_QUEUE];
585 	__u16	offset[TC_QOPT_MAX_QUEUE];
586 };
587 
588 /* SFB */
589 
590 enum {
591 	TCA_SFB_UNSPEC,
592 	TCA_SFB_PARMS,
593 	__TCA_SFB_MAX,
594 };
595 
596 #define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
597 
598 /*
599  * Note: increment, decrement are Q0.16 fixed-point values.
600  */
601 struct tc_sfb_qopt {
602 	__u32 rehash_interval;	/* delay between hash move, in ms */
603 	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
604 	__u32 max;		/* max len of qlen_min */
605 	__u32 bin_size;		/* maximum queue length per bin */
606 	__u32 increment;	/* probability increment, (d1 in Blue) */
607 	__u32 decrement;	/* probability decrement, (d2 in Blue) */
608 	__u32 limit;		/* max SFB queue length */
609 	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
610 	__u32 penalty_burst;
611 };
612 
613 struct tc_sfb_xstats {
614 	__u32 earlydrop;
615 	__u32 penaltydrop;
616 	__u32 bucketdrop;
617 	__u32 queuedrop;
618 	__u32 childdrop; /* drops in child qdisc */
619 	__u32 marked;
620 	__u32 maxqlen;
621 	__u32 maxprob;
622 	__u32 avgprob;
623 };
624 
625 #define SFB_MAX_PROB 0xFFFF
626 
627 /* QFQ */
628 enum {
629 	TCA_QFQ_UNSPEC,
630 	TCA_QFQ_WEIGHT,
631 	TCA_QFQ_LMAX,
632 	__TCA_QFQ_MAX
633 };
634 
635 #define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
636 
637 struct tc_qfq_stats {
638 	__u32 weight;
639 	__u32 lmax;
640 };
641 
642 #endif
643