xref: /linux-6.15/include/uapi/linux/pkt_sched.h (revision a22b8f4b)
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 enqueued 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 /* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */
77 enum tc_link_layer {
78 	TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */
79 	TC_LINKLAYER_ETHERNET,
80 	TC_LINKLAYER_ATM,
81 };
82 #define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */
83 
84 struct tc_ratespec {
85 	unsigned char	cell_log;
86 	__u8		linklayer; /* lower 4 bits */
87 	unsigned short	overhead;
88 	short		cell_align;
89 	unsigned short	mpu;
90 	__u32		rate;
91 };
92 
93 #define TC_RTAB_SIZE	1024
94 
95 struct tc_sizespec {
96 	unsigned char	cell_log;
97 	unsigned char	size_log;
98 	short		cell_align;
99 	int		overhead;
100 	unsigned int	linklayer;
101 	unsigned int	mpu;
102 	unsigned int	mtu;
103 	unsigned int	tsize;
104 };
105 
106 enum {
107 	TCA_STAB_UNSPEC,
108 	TCA_STAB_BASE,
109 	TCA_STAB_DATA,
110 	__TCA_STAB_MAX
111 };
112 
113 #define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
114 
115 /* FIFO section */
116 
117 struct tc_fifo_qopt {
118 	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
119 };
120 
121 /* PRIO section */
122 
123 #define TCQ_PRIO_BANDS	16
124 #define TCQ_MIN_PRIO_BANDS 2
125 
126 struct tc_prio_qopt {
127 	int	bands;			/* Number of bands */
128 	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
129 };
130 
131 /* MULTIQ section */
132 
133 struct tc_multiq_qopt {
134 	__u16	bands;			/* Number of bands */
135 	__u16	max_bands;		/* Maximum number of queues */
136 };
137 
138 /* PLUG section */
139 
140 #define TCQ_PLUG_BUFFER                0
141 #define TCQ_PLUG_RELEASE_ONE           1
142 #define TCQ_PLUG_RELEASE_INDEFINITE    2
143 #define TCQ_PLUG_LIMIT                 3
144 
145 struct tc_plug_qopt {
146 	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and
147 	 *  buffer any incoming packets
148 	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
149 	 *   to beginning of the next plug.
150 	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
151 	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER
152 	 *   command is received (just act as a pass-thru queue).
153 	 * TCQ_PLUG_LIMIT: Increase/decrease queue size
154 	 */
155 	int             action;
156 	__u32           limit;
157 };
158 
159 /* TBF section */
160 
161 struct tc_tbf_qopt {
162 	struct tc_ratespec rate;
163 	struct tc_ratespec peakrate;
164 	__u32		limit;
165 	__u32		buffer;
166 	__u32		mtu;
167 };
168 
169 enum {
170 	TCA_TBF_UNSPEC,
171 	TCA_TBF_PARMS,
172 	TCA_TBF_RTAB,
173 	TCA_TBF_PTAB,
174 	__TCA_TBF_MAX,
175 };
176 
177 #define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
178 
179 
180 /* TEQL section */
181 
182 /* TEQL does not require any parameters */
183 
184 /* SFQ section */
185 
186 struct tc_sfq_qopt {
187 	unsigned	quantum;	/* Bytes per round allocated to flow */
188 	int		perturb_period;	/* Period of hash perturbation */
189 	__u32		limit;		/* Maximal packets in queue */
190 	unsigned	divisor;	/* Hash divisor  */
191 	unsigned	flows;		/* Maximal number of flows  */
192 };
193 
194 struct tc_sfqred_stats {
195 	__u32           prob_drop;      /* Early drops, below max threshold */
196 	__u32           forced_drop;	/* Early drops, after max threshold */
197 	__u32           prob_mark;      /* Marked packets, below max threshold */
198 	__u32           forced_mark;    /* Marked packets, after max threshold */
199 	__u32           prob_mark_head; /* Marked packets, below max threshold */
200 	__u32           forced_mark_head;/* Marked packets, after max threshold */
201 };
202 
203 struct tc_sfq_qopt_v1 {
204 	struct tc_sfq_qopt v0;
205 	unsigned int	depth;		/* max number of packets per flow */
206 	unsigned int	headdrop;
207 /* SFQRED parameters */
208 	__u32		limit;		/* HARD maximal flow queue length (bytes) */
209 	__u32		qth_min;	/* Min average length threshold (bytes) */
210 	__u32		qth_max;	/* Max average length threshold (bytes) */
211 	unsigned char   Wlog;		/* log(W)		*/
212 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
213 	unsigned char   Scell_log;	/* cell size for idle damping */
214 	unsigned char	flags;
215 	__u32		max_P;		/* probability, high resolution */
216 /* SFQRED stats */
217 	struct tc_sfqred_stats stats;
218 };
219 
220 
221 struct tc_sfq_xstats {
222 	__s32		allot;
223 };
224 
225 /* RED section */
226 
227 enum {
228 	TCA_RED_UNSPEC,
229 	TCA_RED_PARMS,
230 	TCA_RED_STAB,
231 	TCA_RED_MAX_P,
232 	__TCA_RED_MAX,
233 };
234 
235 #define TCA_RED_MAX (__TCA_RED_MAX - 1)
236 
237 struct tc_red_qopt {
238 	__u32		limit;		/* HARD maximal queue length (bytes)	*/
239 	__u32		qth_min;	/* Min average length threshold (bytes) */
240 	__u32		qth_max;	/* Max average length threshold (bytes) */
241 	unsigned char   Wlog;		/* log(W)		*/
242 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
243 	unsigned char   Scell_log;	/* cell size for idle damping */
244 	unsigned char	flags;
245 #define TC_RED_ECN		1
246 #define TC_RED_HARDDROP		2
247 #define TC_RED_ADAPTATIVE	4
248 };
249 
250 struct tc_red_xstats {
251 	__u32           early;          /* Early drops */
252 	__u32           pdrop;          /* Drops due to queue limits */
253 	__u32           other;          /* Drops due to drop() calls */
254 	__u32           marked;         /* Marked packets */
255 };
256 
257 /* GRED section */
258 
259 #define MAX_DPs 16
260 
261 enum {
262        TCA_GRED_UNSPEC,
263        TCA_GRED_PARMS,
264        TCA_GRED_STAB,
265        TCA_GRED_DPS,
266        TCA_GRED_MAX_P,
267 	   __TCA_GRED_MAX,
268 };
269 
270 #define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
271 
272 struct tc_gred_qopt {
273 	__u32		limit;        /* HARD maximal queue length (bytes)    */
274 	__u32		qth_min;      /* Min average length threshold (bytes) */
275 	__u32		qth_max;      /* Max average length threshold (bytes) */
276 	__u32		DP;           /* up to 2^32 DPs */
277 	__u32		backlog;
278 	__u32		qave;
279 	__u32		forced;
280 	__u32		early;
281 	__u32		other;
282 	__u32		pdrop;
283 	__u8		Wlog;         /* log(W)               */
284 	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
285 	__u8		Scell_log;    /* cell size for idle damping */
286 	__u8		prio;         /* prio of this VQ */
287 	__u32		packets;
288 	__u32		bytesin;
289 };
290 
291 /* gred setup */
292 struct tc_gred_sopt {
293 	__u32		DPs;
294 	__u32		def_DP;
295 	__u8		grio;
296 	__u8		flags;
297 	__u16		pad1;
298 };
299 
300 /* CHOKe section */
301 
302 enum {
303 	TCA_CHOKE_UNSPEC,
304 	TCA_CHOKE_PARMS,
305 	TCA_CHOKE_STAB,
306 	TCA_CHOKE_MAX_P,
307 	__TCA_CHOKE_MAX,
308 };
309 
310 #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
311 
312 struct tc_choke_qopt {
313 	__u32		limit;		/* Hard queue length (packets)	*/
314 	__u32		qth_min;	/* Min average threshold (packets) */
315 	__u32		qth_max;	/* Max average threshold (packets) */
316 	unsigned char   Wlog;		/* log(W)		*/
317 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
318 	unsigned char   Scell_log;	/* cell size for idle damping */
319 	unsigned char	flags;		/* see RED flags */
320 };
321 
322 struct tc_choke_xstats {
323 	__u32		early;          /* Early drops */
324 	__u32		pdrop;          /* Drops due to queue limits */
325 	__u32		other;          /* Drops due to drop() calls */
326 	__u32		marked;         /* Marked packets */
327 	__u32		matched;	/* Drops due to flow match */
328 };
329 
330 /* HTB section */
331 #define TC_HTB_NUMPRIO		8
332 #define TC_HTB_MAXDEPTH		8
333 #define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
334 
335 struct tc_htb_opt {
336 	struct tc_ratespec 	rate;
337 	struct tc_ratespec 	ceil;
338 	__u32	buffer;
339 	__u32	cbuffer;
340 	__u32	quantum;
341 	__u32	level;		/* out only */
342 	__u32	prio;
343 };
344 struct tc_htb_glob {
345 	__u32 version;		/* to match HTB/TC */
346     	__u32 rate2quantum;	/* bps->quantum divisor */
347     	__u32 defcls;		/* default class number */
348 	__u32 debug;		/* debug flags */
349 
350 	/* stats */
351 	__u32 direct_pkts; /* count of non shaped packets */
352 };
353 enum {
354 	TCA_HTB_UNSPEC,
355 	TCA_HTB_PARMS,
356 	TCA_HTB_INIT,
357 	TCA_HTB_CTAB,
358 	TCA_HTB_RTAB,
359 	TCA_HTB_DIRECT_QLEN,
360 	TCA_HTB_RATE64,
361 	TCA_HTB_CEIL64,
362 	__TCA_HTB_MAX,
363 };
364 
365 #define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
366 
367 struct tc_htb_xstats {
368 	__u32 lends;
369 	__u32 borrows;
370 	__u32 giants;	/* too big packets (rate will not be accurate) */
371 	__u32 tokens;
372 	__u32 ctokens;
373 };
374 
375 /* HFSC section */
376 
377 struct tc_hfsc_qopt {
378 	__u16	defcls;		/* default class */
379 };
380 
381 struct tc_service_curve {
382 	__u32	m1;		/* slope of the first segment in bps */
383 	__u32	d;		/* x-projection of the first segment in us */
384 	__u32	m2;		/* slope of the second segment in bps */
385 };
386 
387 struct tc_hfsc_stats {
388 	__u64	work;		/* total work done */
389 	__u64	rtwork;		/* work done by real-time criteria */
390 	__u32	period;		/* current period */
391 	__u32	level;		/* class level in hierarchy */
392 };
393 
394 enum {
395 	TCA_HFSC_UNSPEC,
396 	TCA_HFSC_RSC,
397 	TCA_HFSC_FSC,
398 	TCA_HFSC_USC,
399 	__TCA_HFSC_MAX,
400 };
401 
402 #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
403 
404 
405 /* CBQ section */
406 
407 #define TC_CBQ_MAXPRIO		8
408 #define TC_CBQ_MAXLEVEL		8
409 #define TC_CBQ_DEF_EWMA		5
410 
411 struct tc_cbq_lssopt {
412 	unsigned char	change;
413 	unsigned char	flags;
414 #define TCF_CBQ_LSS_BOUNDED	1
415 #define TCF_CBQ_LSS_ISOLATED	2
416 	unsigned char  	ewma_log;
417 	unsigned char  	level;
418 #define TCF_CBQ_LSS_FLAGS	1
419 #define TCF_CBQ_LSS_EWMA	2
420 #define TCF_CBQ_LSS_MAXIDLE	4
421 #define TCF_CBQ_LSS_MINIDLE	8
422 #define TCF_CBQ_LSS_OFFTIME	0x10
423 #define TCF_CBQ_LSS_AVPKT	0x20
424 	__u32		maxidle;
425 	__u32		minidle;
426 	__u32		offtime;
427 	__u32		avpkt;
428 };
429 
430 struct tc_cbq_wrropt {
431 	unsigned char	flags;
432 	unsigned char	priority;
433 	unsigned char	cpriority;
434 	unsigned char	__reserved;
435 	__u32		allot;
436 	__u32		weight;
437 };
438 
439 struct tc_cbq_ovl {
440 	unsigned char	strategy;
441 #define	TC_CBQ_OVL_CLASSIC	0
442 #define	TC_CBQ_OVL_DELAY	1
443 #define	TC_CBQ_OVL_LOWPRIO	2
444 #define	TC_CBQ_OVL_DROP		3
445 #define	TC_CBQ_OVL_RCLASSIC	4
446 	unsigned char	priority2;
447 	__u16		pad;
448 	__u32		penalty;
449 };
450 
451 struct tc_cbq_police {
452 	unsigned char	police;
453 	unsigned char	__res1;
454 	unsigned short	__res2;
455 };
456 
457 struct tc_cbq_fopt {
458 	__u32		split;
459 	__u32		defmap;
460 	__u32		defchange;
461 };
462 
463 struct tc_cbq_xstats {
464 	__u32		borrows;
465 	__u32		overactions;
466 	__s32		avgidle;
467 	__s32		undertime;
468 };
469 
470 enum {
471 	TCA_CBQ_UNSPEC,
472 	TCA_CBQ_LSSOPT,
473 	TCA_CBQ_WRROPT,
474 	TCA_CBQ_FOPT,
475 	TCA_CBQ_OVL_STRATEGY,
476 	TCA_CBQ_RATE,
477 	TCA_CBQ_RTAB,
478 	TCA_CBQ_POLICE,
479 	__TCA_CBQ_MAX,
480 };
481 
482 #define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
483 
484 /* dsmark section */
485 
486 enum {
487 	TCA_DSMARK_UNSPEC,
488 	TCA_DSMARK_INDICES,
489 	TCA_DSMARK_DEFAULT_INDEX,
490 	TCA_DSMARK_SET_TC_INDEX,
491 	TCA_DSMARK_MASK,
492 	TCA_DSMARK_VALUE,
493 	__TCA_DSMARK_MAX,
494 };
495 
496 #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
497 
498 /* ATM  section */
499 
500 enum {
501 	TCA_ATM_UNSPEC,
502 	TCA_ATM_FD,		/* file/socket descriptor */
503 	TCA_ATM_PTR,		/* pointer to descriptor - later */
504 	TCA_ATM_HDR,		/* LL header */
505 	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
506 	TCA_ATM_ADDR,		/* PVC address (for output only) */
507 	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
508 	__TCA_ATM_MAX,
509 };
510 
511 #define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
512 
513 /* Network emulator */
514 
515 enum {
516 	TCA_NETEM_UNSPEC,
517 	TCA_NETEM_CORR,
518 	TCA_NETEM_DELAY_DIST,
519 	TCA_NETEM_REORDER,
520 	TCA_NETEM_CORRUPT,
521 	TCA_NETEM_LOSS,
522 	TCA_NETEM_RATE,
523 	TCA_NETEM_ECN,
524 	__TCA_NETEM_MAX,
525 };
526 
527 #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
528 
529 struct tc_netem_qopt {
530 	__u32	latency;	/* added delay (us) */
531 	__u32   limit;		/* fifo limit (packets) */
532 	__u32	loss;		/* random packet loss (0=none ~0=100%) */
533 	__u32	gap;		/* re-ordering gap (0 for none) */
534 	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
535 	__u32	jitter;		/* random jitter in latency (us) */
536 };
537 
538 struct tc_netem_corr {
539 	__u32	delay_corr;	/* delay correlation */
540 	__u32	loss_corr;	/* packet loss correlation */
541 	__u32	dup_corr;	/* duplicate correlation  */
542 };
543 
544 struct tc_netem_reorder {
545 	__u32	probability;
546 	__u32	correlation;
547 };
548 
549 struct tc_netem_corrupt {
550 	__u32	probability;
551 	__u32	correlation;
552 };
553 
554 struct tc_netem_rate {
555 	__u32	rate;	/* byte/s */
556 	__s32	packet_overhead;
557 	__u32	cell_size;
558 	__s32	cell_overhead;
559 };
560 
561 enum {
562 	NETEM_LOSS_UNSPEC,
563 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
564 	NETEM_LOSS_GE,		/* Gilbert Elliot models */
565 	__NETEM_LOSS_MAX
566 };
567 #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
568 
569 /* State transition probabilities for 4 state model */
570 struct tc_netem_gimodel {
571 	__u32	p13;
572 	__u32	p31;
573 	__u32	p32;
574 	__u32	p14;
575 	__u32	p23;
576 };
577 
578 /* Gilbert-Elliot models */
579 struct tc_netem_gemodel {
580 	__u32 p;
581 	__u32 r;
582 	__u32 h;
583 	__u32 k1;
584 };
585 
586 #define NETEM_DIST_SCALE	8192
587 #define NETEM_DIST_MAX		16384
588 
589 /* DRR */
590 
591 enum {
592 	TCA_DRR_UNSPEC,
593 	TCA_DRR_QUANTUM,
594 	__TCA_DRR_MAX
595 };
596 
597 #define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
598 
599 struct tc_drr_stats {
600 	__u32	deficit;
601 };
602 
603 /* MQPRIO */
604 #define TC_QOPT_BITMASK 15
605 #define TC_QOPT_MAX_QUEUE 16
606 
607 struct tc_mqprio_qopt {
608 	__u8	num_tc;
609 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
610 	__u8	hw;
611 	__u16	count[TC_QOPT_MAX_QUEUE];
612 	__u16	offset[TC_QOPT_MAX_QUEUE];
613 };
614 
615 /* SFB */
616 
617 enum {
618 	TCA_SFB_UNSPEC,
619 	TCA_SFB_PARMS,
620 	__TCA_SFB_MAX,
621 };
622 
623 #define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
624 
625 /*
626  * Note: increment, decrement are Q0.16 fixed-point values.
627  */
628 struct tc_sfb_qopt {
629 	__u32 rehash_interval;	/* delay between hash move, in ms */
630 	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
631 	__u32 max;		/* max len of qlen_min */
632 	__u32 bin_size;		/* maximum queue length per bin */
633 	__u32 increment;	/* probability increment, (d1 in Blue) */
634 	__u32 decrement;	/* probability decrement, (d2 in Blue) */
635 	__u32 limit;		/* max SFB queue length */
636 	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
637 	__u32 penalty_burst;
638 };
639 
640 struct tc_sfb_xstats {
641 	__u32 earlydrop;
642 	__u32 penaltydrop;
643 	__u32 bucketdrop;
644 	__u32 queuedrop;
645 	__u32 childdrop; /* drops in child qdisc */
646 	__u32 marked;
647 	__u32 maxqlen;
648 	__u32 maxprob;
649 	__u32 avgprob;
650 };
651 
652 #define SFB_MAX_PROB 0xFFFF
653 
654 /* QFQ */
655 enum {
656 	TCA_QFQ_UNSPEC,
657 	TCA_QFQ_WEIGHT,
658 	TCA_QFQ_LMAX,
659 	__TCA_QFQ_MAX
660 };
661 
662 #define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
663 
664 struct tc_qfq_stats {
665 	__u32 weight;
666 	__u32 lmax;
667 };
668 
669 /* CODEL */
670 
671 enum {
672 	TCA_CODEL_UNSPEC,
673 	TCA_CODEL_TARGET,
674 	TCA_CODEL_LIMIT,
675 	TCA_CODEL_INTERVAL,
676 	TCA_CODEL_ECN,
677 	__TCA_CODEL_MAX
678 };
679 
680 #define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
681 
682 struct tc_codel_xstats {
683 	__u32	maxpacket; /* largest packet we've seen so far */
684 	__u32	count;	   /* how many drops we've done since the last time we
685 			    * entered dropping state
686 			    */
687 	__u32	lastcount; /* count at entry to dropping state */
688 	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
689 	__s32	drop_next; /* time to drop next packet */
690 	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
691 	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
692 	__u32	dropping;  /* are we in dropping state ? */
693 };
694 
695 /* FQ_CODEL */
696 
697 enum {
698 	TCA_FQ_CODEL_UNSPEC,
699 	TCA_FQ_CODEL_TARGET,
700 	TCA_FQ_CODEL_LIMIT,
701 	TCA_FQ_CODEL_INTERVAL,
702 	TCA_FQ_CODEL_ECN,
703 	TCA_FQ_CODEL_FLOWS,
704 	TCA_FQ_CODEL_QUANTUM,
705 	__TCA_FQ_CODEL_MAX
706 };
707 
708 #define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
709 
710 enum {
711 	TCA_FQ_CODEL_XSTATS_QDISC,
712 	TCA_FQ_CODEL_XSTATS_CLASS,
713 };
714 
715 struct tc_fq_codel_qd_stats {
716 	__u32	maxpacket;	/* largest packet we've seen so far */
717 	__u32	drop_overlimit; /* number of time max qdisc
718 				 * packet limit was hit
719 				 */
720 	__u32	ecn_mark;	/* number of packets we ECN marked
721 				 * instead of being dropped
722 				 */
723 	__u32	new_flow_count; /* number of time packets
724 				 * created a 'new flow'
725 				 */
726 	__u32	new_flows_len;	/* count of flows in new list */
727 	__u32	old_flows_len;	/* count of flows in old list */
728 };
729 
730 struct tc_fq_codel_cl_stats {
731 	__s32	deficit;
732 	__u32	ldelay;		/* in-queue delay seen by most recently
733 				 * dequeued packet
734 				 */
735 	__u32	count;
736 	__u32	lastcount;
737 	__u32	dropping;
738 	__s32	drop_next;
739 };
740 
741 struct tc_fq_codel_xstats {
742 	__u32	type;
743 	union {
744 		struct tc_fq_codel_qd_stats qdisc_stats;
745 		struct tc_fq_codel_cl_stats class_stats;
746 	};
747 };
748 
749 /* FQ */
750 
751 enum {
752 	TCA_FQ_UNSPEC,
753 
754 	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
755 
756 	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
757 
758 	TCA_FQ_QUANTUM,		/* RR quantum */
759 
760 	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
761 
762 	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
763 
764 	TCA_FQ_FLOW_DEFAULT_RATE,/* for sockets with unspecified sk_rate,
765 				  * use the following rate
766 				  */
767 
768 	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
769 
770 	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
771 	__TCA_FQ_MAX
772 };
773 
774 #define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
775 
776 struct tc_fq_qd_stats {
777 	__u64	gc_flows;
778 	__u64	highprio_packets;
779 	__u64	tcp_retrans;
780 	__u64	throttled;
781 	__u64	flows_plimit;
782 	__u64	pkts_too_long;
783 	__u64	allocation_errors;
784 	__s64	time_next_delayed_flow;
785 	__u32	flows;
786 	__u32	inactive_flows;
787 	__u32	throttled_flows;
788 	__u32	pad;
789 };
790 #endif
791