xref: /linux/include/uapi/linux/pkt_sched.h (revision fe33c0fbed75dd464747c0faaedf94c7d8eb4101)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2607ca46eSDavid Howells #ifndef __LINUX_PKT_SCHED_H
3607ca46eSDavid Howells #define __LINUX_PKT_SCHED_H
4607ca46eSDavid Howells 
5fbc69779SDavid Ahern #include <linux/const.h>
6607ca46eSDavid Howells #include <linux/types.h>
7607ca46eSDavid Howells 
8607ca46eSDavid Howells /* Logical priority bands not depending on specific packet scheduler.
9607ca46eSDavid Howells    Every scheduler will map them to real traffic classes, if it has
10607ca46eSDavid Howells    no more precise mechanism to classify packets.
11607ca46eSDavid Howells 
12607ca46eSDavid Howells    These numbers have no special meaning, though their coincidence
13607ca46eSDavid Howells    with obsolete IPv6 values is not occasional :-). New IPv6 drafts
14607ca46eSDavid Howells    preferred full anarchy inspired by diffserv group.
15607ca46eSDavid Howells 
16607ca46eSDavid Howells    Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
17607ca46eSDavid Howells    class, actually, as rule it will be handled with more care than
18607ca46eSDavid Howells    filler or even bulk.
19607ca46eSDavid Howells  */
20607ca46eSDavid Howells 
21607ca46eSDavid Howells #define TC_PRIO_BESTEFFORT		0
22607ca46eSDavid Howells #define TC_PRIO_FILLER			1
23607ca46eSDavid Howells #define TC_PRIO_BULK			2
24607ca46eSDavid Howells #define TC_PRIO_INTERACTIVE_BULK	4
25607ca46eSDavid Howells #define TC_PRIO_INTERACTIVE		6
26607ca46eSDavid Howells #define TC_PRIO_CONTROL			7
27607ca46eSDavid Howells 
28607ca46eSDavid Howells #define TC_PRIO_MAX			15
29607ca46eSDavid Howells 
30607ca46eSDavid Howells /* Generic queue statistics, available for all the elements.
31607ca46eSDavid Howells    Particular schedulers may have also their private records.
32607ca46eSDavid Howells  */
33607ca46eSDavid Howells 
34607ca46eSDavid Howells struct tc_stats {
35607ca46eSDavid Howells 	__u64	bytes;			/* Number of enqueued bytes */
36607ca46eSDavid Howells 	__u32	packets;		/* Number of enqueued packets	*/
37607ca46eSDavid Howells 	__u32	drops;			/* Packets dropped because of lack of resources */
38607ca46eSDavid Howells 	__u32	overlimits;		/* Number of throttle events when this
39607ca46eSDavid Howells 					 * flow goes out of allocated bandwidth */
40607ca46eSDavid Howells 	__u32	bps;			/* Current flow byte rate */
41607ca46eSDavid Howells 	__u32	pps;			/* Current flow packet rate */
42607ca46eSDavid Howells 	__u32	qlen;
43607ca46eSDavid Howells 	__u32	backlog;
44607ca46eSDavid Howells };
45607ca46eSDavid Howells 
46607ca46eSDavid Howells struct tc_estimator {
47607ca46eSDavid Howells 	signed char	interval;
48607ca46eSDavid Howells 	unsigned char	ewma_log;
49607ca46eSDavid Howells };
50607ca46eSDavid Howells 
51607ca46eSDavid Howells /* "Handles"
52607ca46eSDavid Howells    ---------
53607ca46eSDavid Howells 
54607ca46eSDavid Howells     All the traffic control objects have 32bit identifiers, or "handles".
55607ca46eSDavid Howells 
56607ca46eSDavid Howells     They can be considered as opaque numbers from user API viewpoint,
57607ca46eSDavid Howells     but actually they always consist of two fields: major and
58607ca46eSDavid Howells     minor numbers, which are interpreted by kernel specially,
59607ca46eSDavid Howells     that may be used by applications, though not recommended.
60607ca46eSDavid Howells 
61607ca46eSDavid Howells     F.e. qdisc handles always have minor number equal to zero,
62607ca46eSDavid Howells     classes (or flows) have major equal to parent qdisc major, and
63607ca46eSDavid Howells     minor uniquely identifying class inside qdisc.
64607ca46eSDavid Howells 
65607ca46eSDavid Howells     Macros to manipulate handles:
66607ca46eSDavid Howells  */
67607ca46eSDavid Howells 
68607ca46eSDavid Howells #define TC_H_MAJ_MASK (0xFFFF0000U)
69607ca46eSDavid Howells #define TC_H_MIN_MASK (0x0000FFFFU)
70607ca46eSDavid Howells #define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
71607ca46eSDavid Howells #define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
72607ca46eSDavid Howells #define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
73607ca46eSDavid Howells 
74607ca46eSDavid Howells #define TC_H_UNSPEC	(0U)
75607ca46eSDavid Howells #define TC_H_ROOT	(0xFFFFFFFFU)
76607ca46eSDavid Howells #define TC_H_INGRESS    (0xFFFFFFF1U)
771f211a1bSDaniel Borkmann #define TC_H_CLSACT	TC_H_INGRESS
781f211a1bSDaniel Borkmann 
7932302902SAlexander Duyck #define TC_H_MIN_PRIORITY	0xFFE0U
801f211a1bSDaniel Borkmann #define TC_H_MIN_INGRESS	0xFFF2U
811f211a1bSDaniel Borkmann #define TC_H_MIN_EGRESS		0xFFF3U
82607ca46eSDavid Howells 
838a8e3d84SJesper Dangaard Brouer /* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */
848a8e3d84SJesper Dangaard Brouer enum tc_link_layer {
858a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */
868a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_ETHERNET,
878a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_ATM,
888a8e3d84SJesper Dangaard Brouer };
898a8e3d84SJesper Dangaard Brouer #define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */
908a8e3d84SJesper Dangaard Brouer 
91607ca46eSDavid Howells struct tc_ratespec {
92607ca46eSDavid Howells 	unsigned char	cell_log;
938a8e3d84SJesper Dangaard Brouer 	__u8		linklayer; /* lower 4 bits */
94607ca46eSDavid Howells 	unsigned short	overhead;
95607ca46eSDavid Howells 	short		cell_align;
96607ca46eSDavid Howells 	unsigned short	mpu;
97607ca46eSDavid Howells 	__u32		rate;
98607ca46eSDavid Howells };
99607ca46eSDavid Howells 
100607ca46eSDavid Howells #define TC_RTAB_SIZE	1024
101607ca46eSDavid Howells 
102607ca46eSDavid Howells struct tc_sizespec {
103607ca46eSDavid Howells 	unsigned char	cell_log;
104607ca46eSDavid Howells 	unsigned char	size_log;
105607ca46eSDavid Howells 	short		cell_align;
106607ca46eSDavid Howells 	int		overhead;
107607ca46eSDavid Howells 	unsigned int	linklayer;
108607ca46eSDavid Howells 	unsigned int	mpu;
109607ca46eSDavid Howells 	unsigned int	mtu;
110607ca46eSDavid Howells 	unsigned int	tsize;
111607ca46eSDavid Howells };
112607ca46eSDavid Howells 
113607ca46eSDavid Howells enum {
114607ca46eSDavid Howells 	TCA_STAB_UNSPEC,
115607ca46eSDavid Howells 	TCA_STAB_BASE,
116607ca46eSDavid Howells 	TCA_STAB_DATA,
117607ca46eSDavid Howells 	__TCA_STAB_MAX
118607ca46eSDavid Howells };
119607ca46eSDavid Howells 
120607ca46eSDavid Howells #define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
121607ca46eSDavid Howells 
122607ca46eSDavid Howells /* FIFO section */
123607ca46eSDavid Howells 
124607ca46eSDavid Howells struct tc_fifo_qopt {
125607ca46eSDavid Howells 	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
126607ca46eSDavid Howells };
127607ca46eSDavid Howells 
128aea5f654SNishanth Devarajan /* SKBPRIO section */
129aea5f654SNishanth Devarajan 
130aea5f654SNishanth Devarajan /*
131aea5f654SNishanth Devarajan  * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1).
132aea5f654SNishanth Devarajan  * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able
133aea5f654SNishanth Devarajan  * to map one to one the DS field of IPV4 and IPV6 headers.
134aea5f654SNishanth Devarajan  * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY.
135aea5f654SNishanth Devarajan  */
136aea5f654SNishanth Devarajan 
137aea5f654SNishanth Devarajan #define SKBPRIO_MAX_PRIORITY 64
138aea5f654SNishanth Devarajan 
139aea5f654SNishanth Devarajan struct tc_skbprio_qopt {
140aea5f654SNishanth Devarajan 	__u32	limit;		/* Queue length in packets. */
141aea5f654SNishanth Devarajan };
142aea5f654SNishanth Devarajan 
143607ca46eSDavid Howells /* PRIO section */
144607ca46eSDavid Howells 
145607ca46eSDavid Howells #define TCQ_PRIO_BANDS	16
146607ca46eSDavid Howells #define TCQ_MIN_PRIO_BANDS 2
147607ca46eSDavid Howells 
148607ca46eSDavid Howells struct tc_prio_qopt {
149607ca46eSDavid Howells 	int	bands;			/* Number of bands */
150607ca46eSDavid Howells 	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
151607ca46eSDavid Howells };
152607ca46eSDavid Howells 
153607ca46eSDavid Howells /* MULTIQ section */
154607ca46eSDavid Howells 
155607ca46eSDavid Howells struct tc_multiq_qopt {
156607ca46eSDavid Howells 	__u16	bands;			/* Number of bands */
157607ca46eSDavid Howells 	__u16	max_bands;		/* Maximum number of queues */
158607ca46eSDavid Howells };
159607ca46eSDavid Howells 
160607ca46eSDavid Howells /* PLUG section */
161607ca46eSDavid Howells 
162607ca46eSDavid Howells #define TCQ_PLUG_BUFFER                0
163607ca46eSDavid Howells #define TCQ_PLUG_RELEASE_ONE           1
164607ca46eSDavid Howells #define TCQ_PLUG_RELEASE_INDEFINITE    2
165607ca46eSDavid Howells #define TCQ_PLUG_LIMIT                 3
166607ca46eSDavid Howells 
167607ca46eSDavid Howells struct tc_plug_qopt {
168607ca46eSDavid Howells 	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and
169607ca46eSDavid Howells 	 *  buffer any incoming packets
170607ca46eSDavid Howells 	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
171607ca46eSDavid Howells 	 *   to beginning of the next plug.
172607ca46eSDavid Howells 	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
173607ca46eSDavid Howells 	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER
174607ca46eSDavid Howells 	 *   command is received (just act as a pass-thru queue).
175607ca46eSDavid Howells 	 * TCQ_PLUG_LIMIT: Increase/decrease queue size
176607ca46eSDavid Howells 	 */
177607ca46eSDavid Howells 	int             action;
178607ca46eSDavid Howells 	__u32           limit;
179607ca46eSDavid Howells };
180607ca46eSDavid Howells 
181607ca46eSDavid Howells /* TBF section */
182607ca46eSDavid Howells 
183607ca46eSDavid Howells struct tc_tbf_qopt {
184607ca46eSDavid Howells 	struct tc_ratespec rate;
185607ca46eSDavid Howells 	struct tc_ratespec peakrate;
186607ca46eSDavid Howells 	__u32		limit;
187607ca46eSDavid Howells 	__u32		buffer;
188607ca46eSDavid Howells 	__u32		mtu;
189607ca46eSDavid Howells };
190607ca46eSDavid Howells 
191607ca46eSDavid Howells enum {
192607ca46eSDavid Howells 	TCA_TBF_UNSPEC,
193607ca46eSDavid Howells 	TCA_TBF_PARMS,
194607ca46eSDavid Howells 	TCA_TBF_RTAB,
195607ca46eSDavid Howells 	TCA_TBF_PTAB,
196a33c4a26SYang Yingliang 	TCA_TBF_RATE64,
197a33c4a26SYang Yingliang 	TCA_TBF_PRATE64,
1982e04ad42SYang Yingliang 	TCA_TBF_BURST,
1992e04ad42SYang Yingliang 	TCA_TBF_PBURST,
2002a51c1e8SNicolas Dichtel 	TCA_TBF_PAD,
201607ca46eSDavid Howells 	__TCA_TBF_MAX,
202607ca46eSDavid Howells };
203607ca46eSDavid Howells 
204607ca46eSDavid Howells #define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
205607ca46eSDavid Howells 
206607ca46eSDavid Howells 
207607ca46eSDavid Howells /* TEQL section */
208607ca46eSDavid Howells 
209607ca46eSDavid Howells /* TEQL does not require any parameters */
210607ca46eSDavid Howells 
211607ca46eSDavid Howells /* SFQ section */
212607ca46eSDavid Howells 
213607ca46eSDavid Howells struct tc_sfq_qopt {
214607ca46eSDavid Howells 	unsigned	quantum;	/* Bytes per round allocated to flow */
215607ca46eSDavid Howells 	int		perturb_period;	/* Period of hash perturbation */
216607ca46eSDavid Howells 	__u32		limit;		/* Maximal packets in queue */
217607ca46eSDavid Howells 	unsigned	divisor;	/* Hash divisor  */
218607ca46eSDavid Howells 	unsigned	flows;		/* Maximal number of flows  */
219607ca46eSDavid Howells };
220607ca46eSDavid Howells 
221607ca46eSDavid Howells struct tc_sfqred_stats {
222607ca46eSDavid Howells 	__u32           prob_drop;      /* Early drops, below max threshold */
223607ca46eSDavid Howells 	__u32           forced_drop;	/* Early drops, after max threshold */
224607ca46eSDavid Howells 	__u32           prob_mark;      /* Marked packets, below max threshold */
225607ca46eSDavid Howells 	__u32           forced_mark;    /* Marked packets, after max threshold */
226607ca46eSDavid Howells 	__u32           prob_mark_head; /* Marked packets, below max threshold */
227607ca46eSDavid Howells 	__u32           forced_mark_head;/* Marked packets, after max threshold */
228607ca46eSDavid Howells };
229607ca46eSDavid Howells 
230607ca46eSDavid Howells struct tc_sfq_qopt_v1 {
231607ca46eSDavid Howells 	struct tc_sfq_qopt v0;
232607ca46eSDavid Howells 	unsigned int	depth;		/* max number of packets per flow */
233607ca46eSDavid Howells 	unsigned int	headdrop;
234607ca46eSDavid Howells /* SFQRED parameters */
235607ca46eSDavid Howells 	__u32		limit;		/* HARD maximal flow queue length (bytes) */
236607ca46eSDavid Howells 	__u32		qth_min;	/* Min average length threshold (bytes) */
237607ca46eSDavid Howells 	__u32		qth_max;	/* Max average length threshold (bytes) */
238607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
239607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
240607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
241607ca46eSDavid Howells 	unsigned char	flags;
242607ca46eSDavid Howells 	__u32		max_P;		/* probability, high resolution */
243607ca46eSDavid Howells /* SFQRED stats */
244607ca46eSDavid Howells 	struct tc_sfqred_stats stats;
245607ca46eSDavid Howells };
246607ca46eSDavid Howells 
247607ca46eSDavid Howells 
248607ca46eSDavid Howells struct tc_sfq_xstats {
249607ca46eSDavid Howells 	__s32		allot;
250607ca46eSDavid Howells };
251607ca46eSDavid Howells 
252607ca46eSDavid Howells /* RED section */
253607ca46eSDavid Howells 
254607ca46eSDavid Howells enum {
255607ca46eSDavid Howells 	TCA_RED_UNSPEC,
256607ca46eSDavid Howells 	TCA_RED_PARMS,
257607ca46eSDavid Howells 	TCA_RED_STAB,
258607ca46eSDavid Howells 	TCA_RED_MAX_P,
25914bc175dSPetr Machata 	TCA_RED_FLAGS,		/* bitfield32 */
260aee9caa0SPetr Machata 	TCA_RED_EARLY_DROP_BLOCK, /* u32 */
261aee9caa0SPetr Machata 	TCA_RED_MARK_BLOCK,	/* u32 */
262607ca46eSDavid Howells 	__TCA_RED_MAX,
263607ca46eSDavid Howells };
264607ca46eSDavid Howells 
265607ca46eSDavid Howells #define TCA_RED_MAX (__TCA_RED_MAX - 1)
266607ca46eSDavid Howells 
267607ca46eSDavid Howells struct tc_red_qopt {
268607ca46eSDavid Howells 	__u32		limit;		/* HARD maximal queue length (bytes)	*/
269607ca46eSDavid Howells 	__u32		qth_min;	/* Min average length threshold (bytes) */
270607ca46eSDavid Howells 	__u32		qth_max;	/* Max average length threshold (bytes) */
271607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
272607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
273607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
27414bc175dSPetr Machata 
27514bc175dSPetr Machata 	/* This field can be used for flags that a RED-like qdisc has
27614bc175dSPetr Machata 	 * historically supported. E.g. when configuring RED, it can be used for
27714bc175dSPetr Machata 	 * ECN, HARDDROP and ADAPTATIVE. For SFQ it can be used for ECN,
27814bc175dSPetr Machata 	 * HARDDROP. Etc. Because this field has not been validated, and is
27914bc175dSPetr Machata 	 * copied back on dump, any bits besides those to which a given qdisc
28014bc175dSPetr Machata 	 * has assigned a historical meaning need to be considered for free use
28114bc175dSPetr Machata 	 * by userspace tools.
28214bc175dSPetr Machata 	 *
28314bc175dSPetr Machata 	 * Any further flags need to be passed differently, e.g. through an
28414bc175dSPetr Machata 	 * attribute (such as TCA_RED_FLAGS above). Such attribute should allow
28514bc175dSPetr Machata 	 * passing both recent and historic flags in one value.
28614bc175dSPetr Machata 	 */
287607ca46eSDavid Howells 	unsigned char	flags;
288607ca46eSDavid Howells #define TC_RED_ECN		1
289607ca46eSDavid Howells #define TC_RED_HARDDROP		2
290607ca46eSDavid Howells #define TC_RED_ADAPTATIVE	4
2910a7fad23SPetr Machata #define TC_RED_NODROP		8
292607ca46eSDavid Howells };
293607ca46eSDavid Howells 
29414bc175dSPetr Machata #define TC_RED_HISTORIC_FLAGS (TC_RED_ECN | TC_RED_HARDDROP | TC_RED_ADAPTATIVE)
29514bc175dSPetr Machata 
296607ca46eSDavid Howells struct tc_red_xstats {
297607ca46eSDavid Howells 	__u32           early;          /* Early drops */
298607ca46eSDavid Howells 	__u32           pdrop;          /* Drops due to queue limits */
299607ca46eSDavid Howells 	__u32           other;          /* Drops due to drop() calls */
300607ca46eSDavid Howells 	__u32           marked;         /* Marked packets */
301607ca46eSDavid Howells };
302607ca46eSDavid Howells 
303607ca46eSDavid Howells /* GRED section */
304607ca46eSDavid Howells 
305607ca46eSDavid Howells #define MAX_DPs 16
306607ca46eSDavid Howells 
307607ca46eSDavid Howells enum {
308607ca46eSDavid Howells        TCA_GRED_UNSPEC,
309607ca46eSDavid Howells        TCA_GRED_PARMS,
310607ca46eSDavid Howells        TCA_GRED_STAB,
311607ca46eSDavid Howells        TCA_GRED_DPS,
312607ca46eSDavid Howells        TCA_GRED_MAX_P,
313a3eb95f8SDavid Ward        TCA_GRED_LIMIT,
31480e22e96SJakub Kicinski        TCA_GRED_VQ_LIST,	/* nested TCA_GRED_VQ_ENTRY */
315607ca46eSDavid Howells        __TCA_GRED_MAX,
316607ca46eSDavid Howells };
317607ca46eSDavid Howells 
318607ca46eSDavid Howells #define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
319607ca46eSDavid Howells 
32080e22e96SJakub Kicinski enum {
32180e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY_UNSPEC,
32280e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY,	/* nested TCA_GRED_VQ_* */
32380e22e96SJakub Kicinski 	__TCA_GRED_VQ_ENTRY_MAX,
32480e22e96SJakub Kicinski };
32580e22e96SJakub Kicinski #define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1)
32680e22e96SJakub Kicinski 
32780e22e96SJakub Kicinski enum {
32880e22e96SJakub Kicinski 	TCA_GRED_VQ_UNSPEC,
32980e22e96SJakub Kicinski 	TCA_GRED_VQ_PAD,
33080e22e96SJakub Kicinski 	TCA_GRED_VQ_DP,			/* u32 */
33180e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BYTES,		/* u64 */
33280e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PACKETS,	/* u32 */
33380e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BACKLOG,	/* u32 */
33480e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_DROP,	/* u32 */
33580e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_MARK,	/* u32 */
33680e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_DROP,	/* u32 */
33780e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_MARK,	/* u32 */
33880e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PDROP,		/* u32 */
33980e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_OTHER,		/* u32 */
34072111015SJakub Kicinski 	TCA_GRED_VQ_FLAGS,		/* u32 */
34180e22e96SJakub Kicinski 	__TCA_GRED_VQ_MAX
34280e22e96SJakub Kicinski };
34380e22e96SJakub Kicinski 
34480e22e96SJakub Kicinski #define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1)
34580e22e96SJakub Kicinski 
346607ca46eSDavid Howells struct tc_gred_qopt {
347607ca46eSDavid Howells 	__u32		limit;        /* HARD maximal queue length (bytes)    */
348607ca46eSDavid Howells 	__u32		qth_min;      /* Min average length threshold (bytes) */
349607ca46eSDavid Howells 	__u32		qth_max;      /* Max average length threshold (bytes) */
350607ca46eSDavid Howells 	__u32		DP;           /* up to 2^32 DPs */
351607ca46eSDavid Howells 	__u32		backlog;
352607ca46eSDavid Howells 	__u32		qave;
353607ca46eSDavid Howells 	__u32		forced;
354607ca46eSDavid Howells 	__u32		early;
355607ca46eSDavid Howells 	__u32		other;
356607ca46eSDavid Howells 	__u32		pdrop;
357607ca46eSDavid Howells 	__u8		Wlog;         /* log(W)               */
358607ca46eSDavid Howells 	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
359607ca46eSDavid Howells 	__u8		Scell_log;    /* cell size for idle damping */
360607ca46eSDavid Howells 	__u8		prio;         /* prio of this VQ */
361607ca46eSDavid Howells 	__u32		packets;
362607ca46eSDavid Howells 	__u32		bytesin;
363607ca46eSDavid Howells };
364607ca46eSDavid Howells 
365607ca46eSDavid Howells /* gred setup */
366607ca46eSDavid Howells struct tc_gred_sopt {
367607ca46eSDavid Howells 	__u32		DPs;
368607ca46eSDavid Howells 	__u32		def_DP;
369607ca46eSDavid Howells 	__u8		grio;
370607ca46eSDavid Howells 	__u8		flags;
371607ca46eSDavid Howells 	__u16		pad1;
372607ca46eSDavid Howells };
373607ca46eSDavid Howells 
374607ca46eSDavid Howells /* CHOKe section */
375607ca46eSDavid Howells 
376607ca46eSDavid Howells enum {
377607ca46eSDavid Howells 	TCA_CHOKE_UNSPEC,
378607ca46eSDavid Howells 	TCA_CHOKE_PARMS,
379607ca46eSDavid Howells 	TCA_CHOKE_STAB,
380607ca46eSDavid Howells 	TCA_CHOKE_MAX_P,
381607ca46eSDavid Howells 	__TCA_CHOKE_MAX,
382607ca46eSDavid Howells };
383607ca46eSDavid Howells 
384607ca46eSDavid Howells #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
385607ca46eSDavid Howells 
386607ca46eSDavid Howells struct tc_choke_qopt {
387607ca46eSDavid Howells 	__u32		limit;		/* Hard queue length (packets)	*/
388607ca46eSDavid Howells 	__u32		qth_min;	/* Min average threshold (packets) */
389607ca46eSDavid Howells 	__u32		qth_max;	/* Max average threshold (packets) */
390607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
391607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
392607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
393607ca46eSDavid Howells 	unsigned char	flags;		/* see RED flags */
394607ca46eSDavid Howells };
395607ca46eSDavid Howells 
396607ca46eSDavid Howells struct tc_choke_xstats {
397607ca46eSDavid Howells 	__u32		early;          /* Early drops */
398607ca46eSDavid Howells 	__u32		pdrop;          /* Drops due to queue limits */
399607ca46eSDavid Howells 	__u32		other;          /* Drops due to drop() calls */
400607ca46eSDavid Howells 	__u32		marked;         /* Marked packets */
401607ca46eSDavid Howells 	__u32		matched;	/* Drops due to flow match */
402607ca46eSDavid Howells };
403607ca46eSDavid Howells 
404607ca46eSDavid Howells /* HTB section */
405607ca46eSDavid Howells #define TC_HTB_NUMPRIO		8
406607ca46eSDavid Howells #define TC_HTB_MAXDEPTH		8
407607ca46eSDavid Howells #define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
408607ca46eSDavid Howells 
409607ca46eSDavid Howells struct tc_htb_opt {
410607ca46eSDavid Howells 	struct tc_ratespec 	rate;
411607ca46eSDavid Howells 	struct tc_ratespec 	ceil;
412607ca46eSDavid Howells 	__u32	buffer;
413607ca46eSDavid Howells 	__u32	cbuffer;
414607ca46eSDavid Howells 	__u32	quantum;
415607ca46eSDavid Howells 	__u32	level;		/* out only */
416607ca46eSDavid Howells 	__u32	prio;
417607ca46eSDavid Howells };
418607ca46eSDavid Howells struct tc_htb_glob {
419607ca46eSDavid Howells 	__u32 version;		/* to match HTB/TC */
420607ca46eSDavid Howells     	__u32 rate2quantum;	/* bps->quantum divisor */
421607ca46eSDavid Howells     	__u32 defcls;		/* default class number */
422607ca46eSDavid Howells 	__u32 debug;		/* debug flags */
423607ca46eSDavid Howells 
424607ca46eSDavid Howells 	/* stats */
425607ca46eSDavid Howells 	__u32 direct_pkts; /* count of non shaped packets */
426607ca46eSDavid Howells };
427607ca46eSDavid Howells enum {
428607ca46eSDavid Howells 	TCA_HTB_UNSPEC,
429607ca46eSDavid Howells 	TCA_HTB_PARMS,
430607ca46eSDavid Howells 	TCA_HTB_INIT,
431607ca46eSDavid Howells 	TCA_HTB_CTAB,
432607ca46eSDavid Howells 	TCA_HTB_RTAB,
4336906f4edSEric Dumazet 	TCA_HTB_DIRECT_QLEN,
434df62cdf3SEric Dumazet 	TCA_HTB_RATE64,
435df62cdf3SEric Dumazet 	TCA_HTB_CEIL64,
4362a51c1e8SNicolas Dichtel 	TCA_HTB_PAD,
437d03b195bSMaxim Mikityanskiy 	TCA_HTB_OFFLOAD,
438607ca46eSDavid Howells 	__TCA_HTB_MAX,
439607ca46eSDavid Howells };
440607ca46eSDavid Howells 
441607ca46eSDavid Howells #define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
442607ca46eSDavid Howells 
443607ca46eSDavid Howells struct tc_htb_xstats {
444607ca46eSDavid Howells 	__u32 lends;
445607ca46eSDavid Howells 	__u32 borrows;
446b9de3963SFlorent Fourcot 	__u32 giants;	/* unused since 'Make HTB scheduler work with TSO.' */
447b9de3963SFlorent Fourcot 	__s32 tokens;
448b9de3963SFlorent Fourcot 	__s32 ctokens;
449607ca46eSDavid Howells };
450607ca46eSDavid Howells 
451607ca46eSDavid Howells /* HFSC section */
452607ca46eSDavid Howells 
453607ca46eSDavid Howells struct tc_hfsc_qopt {
454607ca46eSDavid Howells 	__u16	defcls;		/* default class */
455607ca46eSDavid Howells };
456607ca46eSDavid Howells 
457607ca46eSDavid Howells struct tc_service_curve {
458607ca46eSDavid Howells 	__u32	m1;		/* slope of the first segment in bps */
459607ca46eSDavid Howells 	__u32	d;		/* x-projection of the first segment in us */
460607ca46eSDavid Howells 	__u32	m2;		/* slope of the second segment in bps */
461607ca46eSDavid Howells };
462607ca46eSDavid Howells 
463607ca46eSDavid Howells struct tc_hfsc_stats {
464607ca46eSDavid Howells 	__u64	work;		/* total work done */
465607ca46eSDavid Howells 	__u64	rtwork;		/* work done by real-time criteria */
466607ca46eSDavid Howells 	__u32	period;		/* current period */
467607ca46eSDavid Howells 	__u32	level;		/* class level in hierarchy */
468607ca46eSDavid Howells };
469607ca46eSDavid Howells 
470607ca46eSDavid Howells enum {
471607ca46eSDavid Howells 	TCA_HFSC_UNSPEC,
472607ca46eSDavid Howells 	TCA_HFSC_RSC,
473607ca46eSDavid Howells 	TCA_HFSC_FSC,
474607ca46eSDavid Howells 	TCA_HFSC_USC,
475607ca46eSDavid Howells 	__TCA_HFSC_MAX,
476607ca46eSDavid Howells };
477607ca46eSDavid Howells 
478607ca46eSDavid Howells #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
479607ca46eSDavid Howells 
480607ca46eSDavid Howells /* Network emulator */
481607ca46eSDavid Howells 
482607ca46eSDavid Howells enum {
483607ca46eSDavid Howells 	TCA_NETEM_UNSPEC,
484607ca46eSDavid Howells 	TCA_NETEM_CORR,
485607ca46eSDavid Howells 	TCA_NETEM_DELAY_DIST,
486607ca46eSDavid Howells 	TCA_NETEM_REORDER,
487607ca46eSDavid Howells 	TCA_NETEM_CORRUPT,
488607ca46eSDavid Howells 	TCA_NETEM_LOSS,
489607ca46eSDavid Howells 	TCA_NETEM_RATE,
490607ca46eSDavid Howells 	TCA_NETEM_ECN,
4916a031f67SYang Yingliang 	TCA_NETEM_RATE64,
4922a51c1e8SNicolas Dichtel 	TCA_NETEM_PAD,
49399803171SDave Taht 	TCA_NETEM_LATENCY64,
49499803171SDave Taht 	TCA_NETEM_JITTER64,
495836af83bSDave Taht 	TCA_NETEM_SLOT,
4960a9fe5c3SYousuk Seung 	TCA_NETEM_SLOT_DIST,
4974072d97dSFrançois Michel 	TCA_NETEM_PRNG_SEED,
498607ca46eSDavid Howells 	__TCA_NETEM_MAX,
499607ca46eSDavid Howells };
500607ca46eSDavid Howells 
501607ca46eSDavid Howells #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
502607ca46eSDavid Howells 
503607ca46eSDavid Howells struct tc_netem_qopt {
504607ca46eSDavid Howells 	__u32	latency;	/* added delay (us) */
505607ca46eSDavid Howells 	__u32   limit;		/* fifo limit (packets) */
506607ca46eSDavid Howells 	__u32	loss;		/* random packet loss (0=none ~0=100%) */
507607ca46eSDavid Howells 	__u32	gap;		/* re-ordering gap (0 for none) */
508607ca46eSDavid Howells 	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
509607ca46eSDavid Howells 	__u32	jitter;		/* random jitter in latency (us) */
510607ca46eSDavid Howells };
511607ca46eSDavid Howells 
512607ca46eSDavid Howells struct tc_netem_corr {
513607ca46eSDavid Howells 	__u32	delay_corr;	/* delay correlation */
514607ca46eSDavid Howells 	__u32	loss_corr;	/* packet loss correlation */
515607ca46eSDavid Howells 	__u32	dup_corr;	/* duplicate correlation  */
516607ca46eSDavid Howells };
517607ca46eSDavid Howells 
518607ca46eSDavid Howells struct tc_netem_reorder {
519607ca46eSDavid Howells 	__u32	probability;
520607ca46eSDavid Howells 	__u32	correlation;
521607ca46eSDavid Howells };
522607ca46eSDavid Howells 
523607ca46eSDavid Howells struct tc_netem_corrupt {
524607ca46eSDavid Howells 	__u32	probability;
525607ca46eSDavid Howells 	__u32	correlation;
526607ca46eSDavid Howells };
527607ca46eSDavid Howells 
528607ca46eSDavid Howells struct tc_netem_rate {
529607ca46eSDavid Howells 	__u32	rate;	/* byte/s */
530607ca46eSDavid Howells 	__s32	packet_overhead;
531607ca46eSDavid Howells 	__u32	cell_size;
532607ca46eSDavid Howells 	__s32	cell_overhead;
533607ca46eSDavid Howells };
534607ca46eSDavid Howells 
535836af83bSDave Taht struct tc_netem_slot {
536836af83bSDave Taht 	__s64   min_delay; /* nsec */
537836af83bSDave Taht 	__s64   max_delay;
538836af83bSDave Taht 	__s32   max_packets;
539836af83bSDave Taht 	__s32   max_bytes;
5400a9fe5c3SYousuk Seung 	__s64	dist_delay; /* nsec */
5410a9fe5c3SYousuk Seung 	__s64	dist_jitter; /* nsec */
542836af83bSDave Taht };
543836af83bSDave Taht 
544607ca46eSDavid Howells enum {
545607ca46eSDavid Howells 	NETEM_LOSS_UNSPEC,
546607ca46eSDavid Howells 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
547607ca46eSDavid Howells 	NETEM_LOSS_GE,		/* Gilbert Elliot models */
548607ca46eSDavid Howells 	__NETEM_LOSS_MAX
549607ca46eSDavid Howells };
550607ca46eSDavid Howells #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
551607ca46eSDavid Howells 
552607ca46eSDavid Howells /* State transition probabilities for 4 state model */
553607ca46eSDavid Howells struct tc_netem_gimodel {
554607ca46eSDavid Howells 	__u32	p13;
555607ca46eSDavid Howells 	__u32	p31;
556607ca46eSDavid Howells 	__u32	p32;
557607ca46eSDavid Howells 	__u32	p14;
558607ca46eSDavid Howells 	__u32	p23;
559607ca46eSDavid Howells };
560607ca46eSDavid Howells 
561607ca46eSDavid Howells /* Gilbert-Elliot models */
562607ca46eSDavid Howells struct tc_netem_gemodel {
563607ca46eSDavid Howells 	__u32 p;
564607ca46eSDavid Howells 	__u32 r;
565607ca46eSDavid Howells 	__u32 h;
566607ca46eSDavid Howells 	__u32 k1;
567607ca46eSDavid Howells };
568607ca46eSDavid Howells 
569607ca46eSDavid Howells #define NETEM_DIST_SCALE	8192
570607ca46eSDavid Howells #define NETEM_DIST_MAX		16384
571607ca46eSDavid Howells 
572607ca46eSDavid Howells /* DRR */
573607ca46eSDavid Howells 
574607ca46eSDavid Howells enum {
575607ca46eSDavid Howells 	TCA_DRR_UNSPEC,
576607ca46eSDavid Howells 	TCA_DRR_QUANTUM,
577607ca46eSDavid Howells 	__TCA_DRR_MAX
578607ca46eSDavid Howells };
579607ca46eSDavid Howells 
580607ca46eSDavid Howells #define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
581607ca46eSDavid Howells 
582607ca46eSDavid Howells struct tc_drr_stats {
583607ca46eSDavid Howells 	__u32	deficit;
584607ca46eSDavid Howells };
585607ca46eSDavid Howells 
586607ca46eSDavid Howells /* MQPRIO */
587607ca46eSDavid Howells #define TC_QOPT_BITMASK 15
588607ca46eSDavid Howells #define TC_QOPT_MAX_QUEUE 16
589607ca46eSDavid Howells 
5902026fecfSAlexander Duyck enum {
5912026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
5922026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
5932026fecfSAlexander Duyck 	__TC_MQPRIO_HW_OFFLOAD_MAX
5942026fecfSAlexander Duyck };
5952026fecfSAlexander Duyck 
5962026fecfSAlexander Duyck #define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
5972026fecfSAlexander Duyck 
5984e8b86c0SAmritha Nambiar enum {
5994e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_DCB,
6004e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_CHANNEL,
6014e8b86c0SAmritha Nambiar 	__TC_MQPRIO_MODE_MAX
6024e8b86c0SAmritha Nambiar };
6034e8b86c0SAmritha Nambiar 
6044e8b86c0SAmritha Nambiar #define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1)
6054e8b86c0SAmritha Nambiar 
6064e8b86c0SAmritha Nambiar enum {
6074e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_DCB,
6084e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_BW_RATE,	/* Add new shapers below */
6094e8b86c0SAmritha Nambiar 	__TC_MQPRIO_SHAPER_MAX
6104e8b86c0SAmritha Nambiar };
6114e8b86c0SAmritha Nambiar 
6124e8b86c0SAmritha Nambiar #define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1)
6134e8b86c0SAmritha Nambiar 
614f62af20bSVladimir Oltean enum {
615f62af20bSVladimir Oltean 	TC_FP_EXPRESS = 1,
616f62af20bSVladimir Oltean 	TC_FP_PREEMPTIBLE = 2,
617f62af20bSVladimir Oltean };
618f62af20bSVladimir Oltean 
619607ca46eSDavid Howells struct tc_mqprio_qopt {
620607ca46eSDavid Howells 	__u8	num_tc;
621607ca46eSDavid Howells 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
622607ca46eSDavid Howells 	__u8	hw;
623607ca46eSDavid Howells 	__u16	count[TC_QOPT_MAX_QUEUE];
624607ca46eSDavid Howells 	__u16	offset[TC_QOPT_MAX_QUEUE];
625607ca46eSDavid Howells };
626607ca46eSDavid Howells 
6274e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MODE		0x1
6284e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_SHAPER		0x2
6294e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MIN_RATE		0x4
6304e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MAX_RATE		0x8
6314e8b86c0SAmritha Nambiar 
6324e8b86c0SAmritha Nambiar enum {
633f62af20bSVladimir Oltean 	TCA_MQPRIO_TC_ENTRY_UNSPEC,
634f62af20bSVladimir Oltean 	TCA_MQPRIO_TC_ENTRY_INDEX,		/* u32 */
635f62af20bSVladimir Oltean 	TCA_MQPRIO_TC_ENTRY_FP,			/* u32 */
636f62af20bSVladimir Oltean 
637f62af20bSVladimir Oltean 	/* add new constants above here */
638f62af20bSVladimir Oltean 	__TCA_MQPRIO_TC_ENTRY_CNT,
639f62af20bSVladimir Oltean 	TCA_MQPRIO_TC_ENTRY_MAX = (__TCA_MQPRIO_TC_ENTRY_CNT - 1)
640f62af20bSVladimir Oltean };
641f62af20bSVladimir Oltean 
642f62af20bSVladimir Oltean enum {
6434e8b86c0SAmritha Nambiar 	TCA_MQPRIO_UNSPEC,
6444e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MODE,
6454e8b86c0SAmritha Nambiar 	TCA_MQPRIO_SHAPER,
6464e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MIN_RATE64,
6474e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MAX_RATE64,
648f62af20bSVladimir Oltean 	TCA_MQPRIO_TC_ENTRY,
6494e8b86c0SAmritha Nambiar 	__TCA_MQPRIO_MAX,
6504e8b86c0SAmritha Nambiar };
6514e8b86c0SAmritha Nambiar 
6524e8b86c0SAmritha Nambiar #define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1)
6534e8b86c0SAmritha Nambiar 
654607ca46eSDavid Howells /* SFB */
655607ca46eSDavid Howells 
656607ca46eSDavid Howells enum {
657607ca46eSDavid Howells 	TCA_SFB_UNSPEC,
658607ca46eSDavid Howells 	TCA_SFB_PARMS,
659607ca46eSDavid Howells 	__TCA_SFB_MAX,
660607ca46eSDavid Howells };
661607ca46eSDavid Howells 
662607ca46eSDavid Howells #define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
663607ca46eSDavid Howells 
664607ca46eSDavid Howells /*
665607ca46eSDavid Howells  * Note: increment, decrement are Q0.16 fixed-point values.
666607ca46eSDavid Howells  */
667607ca46eSDavid Howells struct tc_sfb_qopt {
668607ca46eSDavid Howells 	__u32 rehash_interval;	/* delay between hash move, in ms */
669607ca46eSDavid Howells 	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
670607ca46eSDavid Howells 	__u32 max;		/* max len of qlen_min */
671607ca46eSDavid Howells 	__u32 bin_size;		/* maximum queue length per bin */
672607ca46eSDavid Howells 	__u32 increment;	/* probability increment, (d1 in Blue) */
673607ca46eSDavid Howells 	__u32 decrement;	/* probability decrement, (d2 in Blue) */
674607ca46eSDavid Howells 	__u32 limit;		/* max SFB queue length */
675607ca46eSDavid Howells 	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
676607ca46eSDavid Howells 	__u32 penalty_burst;
677607ca46eSDavid Howells };
678607ca46eSDavid Howells 
679607ca46eSDavid Howells struct tc_sfb_xstats {
680607ca46eSDavid Howells 	__u32 earlydrop;
681607ca46eSDavid Howells 	__u32 penaltydrop;
682607ca46eSDavid Howells 	__u32 bucketdrop;
683607ca46eSDavid Howells 	__u32 queuedrop;
684607ca46eSDavid Howells 	__u32 childdrop; /* drops in child qdisc */
685607ca46eSDavid Howells 	__u32 marked;
686607ca46eSDavid Howells 	__u32 maxqlen;
687607ca46eSDavid Howells 	__u32 maxprob;
688607ca46eSDavid Howells 	__u32 avgprob;
689607ca46eSDavid Howells };
690607ca46eSDavid Howells 
691607ca46eSDavid Howells #define SFB_MAX_PROB 0xFFFF
692607ca46eSDavid Howells 
693607ca46eSDavid Howells /* QFQ */
694607ca46eSDavid Howells enum {
695607ca46eSDavid Howells 	TCA_QFQ_UNSPEC,
696607ca46eSDavid Howells 	TCA_QFQ_WEIGHT,
697607ca46eSDavid Howells 	TCA_QFQ_LMAX,
698607ca46eSDavid Howells 	__TCA_QFQ_MAX
699607ca46eSDavid Howells };
700607ca46eSDavid Howells 
701607ca46eSDavid Howells #define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
702607ca46eSDavid Howells 
703607ca46eSDavid Howells struct tc_qfq_stats {
704607ca46eSDavid Howells 	__u32 weight;
705607ca46eSDavid Howells 	__u32 lmax;
706607ca46eSDavid Howells };
707607ca46eSDavid Howells 
708607ca46eSDavid Howells /* CODEL */
709607ca46eSDavid Howells 
710607ca46eSDavid Howells enum {
711607ca46eSDavid Howells 	TCA_CODEL_UNSPEC,
712607ca46eSDavid Howells 	TCA_CODEL_TARGET,
713607ca46eSDavid Howells 	TCA_CODEL_LIMIT,
714607ca46eSDavid Howells 	TCA_CODEL_INTERVAL,
715607ca46eSDavid Howells 	TCA_CODEL_ECN,
71680ba92faSEric Dumazet 	TCA_CODEL_CE_THRESHOLD,
717607ca46eSDavid Howells 	__TCA_CODEL_MAX
718607ca46eSDavid Howells };
719607ca46eSDavid Howells 
720607ca46eSDavid Howells #define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
721607ca46eSDavid Howells 
722607ca46eSDavid Howells struct tc_codel_xstats {
723607ca46eSDavid Howells 	__u32	maxpacket; /* largest packet we've seen so far */
724607ca46eSDavid Howells 	__u32	count;	   /* how many drops we've done since the last time we
725607ca46eSDavid Howells 			    * entered dropping state
726607ca46eSDavid Howells 			    */
727607ca46eSDavid Howells 	__u32	lastcount; /* count at entry to dropping state */
728607ca46eSDavid Howells 	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
729607ca46eSDavid Howells 	__s32	drop_next; /* time to drop next packet */
730607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
731607ca46eSDavid Howells 	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
732607ca46eSDavid Howells 	__u32	dropping;  /* are we in dropping state ? */
73380ba92faSEric Dumazet 	__u32	ce_mark;   /* number of CE marked packets because of ce_threshold */
734607ca46eSDavid Howells };
735607ca46eSDavid Howells 
736607ca46eSDavid Howells /* FQ_CODEL */
737607ca46eSDavid Howells 
738c7c5e6ffSEric Dumazet #define FQ_CODEL_QUANTUM_MAX (1 << 20)
739c7c5e6ffSEric Dumazet 
740607ca46eSDavid Howells enum {
741607ca46eSDavid Howells 	TCA_FQ_CODEL_UNSPEC,
742607ca46eSDavid Howells 	TCA_FQ_CODEL_TARGET,
743607ca46eSDavid Howells 	TCA_FQ_CODEL_LIMIT,
744607ca46eSDavid Howells 	TCA_FQ_CODEL_INTERVAL,
745607ca46eSDavid Howells 	TCA_FQ_CODEL_ECN,
746607ca46eSDavid Howells 	TCA_FQ_CODEL_FLOWS,
747607ca46eSDavid Howells 	TCA_FQ_CODEL_QUANTUM,
74880ba92faSEric Dumazet 	TCA_FQ_CODEL_CE_THRESHOLD,
7499d18562aSEric Dumazet 	TCA_FQ_CODEL_DROP_BATCH_SIZE,
75095b58430SEric Dumazet 	TCA_FQ_CODEL_MEMORY_LIMIT,
751dfcb63ceSToke Høiland-Jørgensen 	TCA_FQ_CODEL_CE_THRESHOLD_SELECTOR,
752dfcb63ceSToke Høiland-Jørgensen 	TCA_FQ_CODEL_CE_THRESHOLD_MASK,
753607ca46eSDavid Howells 	__TCA_FQ_CODEL_MAX
754607ca46eSDavid Howells };
755607ca46eSDavid Howells 
756607ca46eSDavid Howells #define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
757607ca46eSDavid Howells 
758607ca46eSDavid Howells enum {
759607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_QDISC,
760607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_CLASS,
761607ca46eSDavid Howells };
762607ca46eSDavid Howells 
763607ca46eSDavid Howells struct tc_fq_codel_qd_stats {
764607ca46eSDavid Howells 	__u32	maxpacket;	/* largest packet we've seen so far */
765607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc
766607ca46eSDavid Howells 				 * packet limit was hit
767607ca46eSDavid Howells 				 */
768607ca46eSDavid Howells 	__u32	ecn_mark;	/* number of packets we ECN marked
769607ca46eSDavid Howells 				 * instead of being dropped
770607ca46eSDavid Howells 				 */
771607ca46eSDavid Howells 	__u32	new_flow_count; /* number of time packets
772607ca46eSDavid Howells 				 * created a 'new flow'
773607ca46eSDavid Howells 				 */
774607ca46eSDavid Howells 	__u32	new_flows_len;	/* count of flows in new list */
775607ca46eSDavid Howells 	__u32	old_flows_len;	/* count of flows in old list */
77680ba92faSEric Dumazet 	__u32	ce_mark;	/* packets above ce_threshold */
77795b58430SEric Dumazet 	__u32	memory_usage;	/* in bytes */
77895b58430SEric Dumazet 	__u32	drop_overmemory;
779607ca46eSDavid Howells };
780607ca46eSDavid Howells 
781607ca46eSDavid Howells struct tc_fq_codel_cl_stats {
782607ca46eSDavid Howells 	__s32	deficit;
783607ca46eSDavid Howells 	__u32	ldelay;		/* in-queue delay seen by most recently
784607ca46eSDavid Howells 				 * dequeued packet
785607ca46eSDavid Howells 				 */
786607ca46eSDavid Howells 	__u32	count;
787607ca46eSDavid Howells 	__u32	lastcount;
788607ca46eSDavid Howells 	__u32	dropping;
789607ca46eSDavid Howells 	__s32	drop_next;
790607ca46eSDavid Howells };
791607ca46eSDavid Howells 
792607ca46eSDavid Howells struct tc_fq_codel_xstats {
793607ca46eSDavid Howells 	__u32	type;
794607ca46eSDavid Howells 	union {
795607ca46eSDavid Howells 		struct tc_fq_codel_qd_stats qdisc_stats;
796607ca46eSDavid Howells 		struct tc_fq_codel_cl_stats class_stats;
797607ca46eSDavid Howells 	};
798607ca46eSDavid Howells };
799607ca46eSDavid Howells 
800afe4fd06SEric Dumazet /* FQ */
801afe4fd06SEric Dumazet 
802afe4fd06SEric Dumazet enum {
803afe4fd06SEric Dumazet 	TCA_FQ_UNSPEC,
804afe4fd06SEric Dumazet 
805afe4fd06SEric Dumazet 	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
806afe4fd06SEric Dumazet 
807afe4fd06SEric Dumazet 	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
808afe4fd06SEric Dumazet 
809afe4fd06SEric Dumazet 	TCA_FQ_QUANTUM,		/* RR quantum */
810afe4fd06SEric Dumazet 
811afe4fd06SEric Dumazet 	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
812afe4fd06SEric Dumazet 
813afe4fd06SEric Dumazet 	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
814afe4fd06SEric Dumazet 
81565c5189aSEric Dumazet 	TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */
816afe4fd06SEric Dumazet 
817afe4fd06SEric Dumazet 	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
818afe4fd06SEric Dumazet 
819afe4fd06SEric Dumazet 	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
820f52ed899SEric Dumazet 
821f52ed899SEric Dumazet 	TCA_FQ_FLOW_REFILL_DELAY,	/* flow credit refill delay in usec */
822f52ed899SEric Dumazet 
82306eb395fSEric Dumazet 	TCA_FQ_ORPHAN_MASK,	/* mask applied to orphaned skb hashes */
82406eb395fSEric Dumazet 
82577879147SEric Dumazet 	TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */
82677879147SEric Dumazet 
82748872c11SEric Dumazet 	TCA_FQ_CE_THRESHOLD,	/* DCTCP-like CE-marking threshold */
82848872c11SEric Dumazet 
829583396f4SEric Dumazet 	TCA_FQ_TIMER_SLACK,	/* timer slack */
830583396f4SEric Dumazet 
83139d01050SEric Dumazet 	TCA_FQ_HORIZON,		/* time horizon in us */
83239d01050SEric Dumazet 
83339d01050SEric Dumazet 	TCA_FQ_HORIZON_DROP,	/* drop packets beyond horizon, or cap their EDT */
83439d01050SEric Dumazet 
83529f834aaSEric Dumazet 	TCA_FQ_PRIOMAP,		/* prio2band */
83629f834aaSEric Dumazet 
837*49e7265fSEric Dumazet 	TCA_FQ_WEIGHTS,		/* Weights for each band */
838*49e7265fSEric Dumazet 
839afe4fd06SEric Dumazet 	__TCA_FQ_MAX
840afe4fd06SEric Dumazet };
841afe4fd06SEric Dumazet 
842afe4fd06SEric Dumazet #define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
843afe4fd06SEric Dumazet 
84429f834aaSEric Dumazet #define FQ_BANDS 3
845*49e7265fSEric Dumazet #define FQ_MIN_WEIGHT 16384
84629f834aaSEric Dumazet 
847afe4fd06SEric Dumazet struct tc_fq_qd_stats {
848afe4fd06SEric Dumazet 	__u64	gc_flows;
84929f834aaSEric Dumazet 	__u64	highprio_packets;	/* obsolete */
85029f834aaSEric Dumazet 	__u64	tcp_retrans;		/* obsolete */
851afe4fd06SEric Dumazet 	__u64	throttled;
852afe4fd06SEric Dumazet 	__u64	flows_plimit;
853afe4fd06SEric Dumazet 	__u64	pkts_too_long;
854afe4fd06SEric Dumazet 	__u64	allocation_errors;
855afe4fd06SEric Dumazet 	__s64	time_next_delayed_flow;
856afe4fd06SEric Dumazet 	__u32	flows;
857afe4fd06SEric Dumazet 	__u32	inactive_flows;
858afe4fd06SEric Dumazet 	__u32	throttled_flows;
859fefa569aSEric Dumazet 	__u32	unthrottle_latency_ns;
86048872c11SEric Dumazet 	__u64	ce_mark;		/* packets above ce_threshold */
86139d01050SEric Dumazet 	__u64	horizon_drops;
86239d01050SEric Dumazet 	__u64	horizon_caps;
863076433bdSEric Dumazet 	__u64	fastpath_packets;
86429f834aaSEric Dumazet 	__u64	band_drops[FQ_BANDS];
86529f834aaSEric Dumazet 	__u32	band_pkt_count[FQ_BANDS];
86629f834aaSEric Dumazet 	__u32	pad;
867afe4fd06SEric Dumazet };
86810239edfSTerry Lam 
86910239edfSTerry Lam /* Heavy-Hitter Filter */
87010239edfSTerry Lam 
87110239edfSTerry Lam enum {
87210239edfSTerry Lam 	TCA_HHF_UNSPEC,
87310239edfSTerry Lam 	TCA_HHF_BACKLOG_LIMIT,
87410239edfSTerry Lam 	TCA_HHF_QUANTUM,
87510239edfSTerry Lam 	TCA_HHF_HH_FLOWS_LIMIT,
87610239edfSTerry Lam 	TCA_HHF_RESET_TIMEOUT,
87710239edfSTerry Lam 	TCA_HHF_ADMIT_BYTES,
87810239edfSTerry Lam 	TCA_HHF_EVICT_TIMEOUT,
87910239edfSTerry Lam 	TCA_HHF_NON_HH_WEIGHT,
88010239edfSTerry Lam 	__TCA_HHF_MAX
88110239edfSTerry Lam };
88210239edfSTerry Lam 
88310239edfSTerry Lam #define TCA_HHF_MAX	(__TCA_HHF_MAX - 1)
88410239edfSTerry Lam 
88510239edfSTerry Lam struct tc_hhf_xstats {
88610239edfSTerry Lam 	__u32	drop_overlimit; /* number of times max qdisc packet limit
88710239edfSTerry Lam 				 * was hit
88810239edfSTerry Lam 				 */
88910239edfSTerry Lam 	__u32	hh_overlimit;   /* number of times max heavy-hitters was hit */
89010239edfSTerry Lam 	__u32	hh_tot_count;   /* number of captured heavy-hitters so far */
89110239edfSTerry Lam 	__u32	hh_cur_count;   /* number of current heavy-hitters */
89210239edfSTerry Lam };
893d4b36210SVijay Subramanian 
894d4b36210SVijay Subramanian /* PIE */
895d4b36210SVijay Subramanian enum {
896d4b36210SVijay Subramanian 	TCA_PIE_UNSPEC,
897d4b36210SVijay Subramanian 	TCA_PIE_TARGET,
898d4b36210SVijay Subramanian 	TCA_PIE_LIMIT,
899d4b36210SVijay Subramanian 	TCA_PIE_TUPDATE,
900d4b36210SVijay Subramanian 	TCA_PIE_ALPHA,
901d4b36210SVijay Subramanian 	TCA_PIE_BETA,
902d4b36210SVijay Subramanian 	TCA_PIE_ECN,
903d4b36210SVijay Subramanian 	TCA_PIE_BYTEMODE,
904cec2975fSGautam Ramakrishnan 	TCA_PIE_DQ_RATE_ESTIMATOR,
905d4b36210SVijay Subramanian 	__TCA_PIE_MAX
906d4b36210SVijay Subramanian };
907d4b36210SVijay Subramanian #define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
908d4b36210SVijay Subramanian 
909d4b36210SVijay Subramanian struct tc_pie_xstats {
9103f7ae5f3SMohit P. Tahiliani 	__u64 prob;			/* current probability */
911d4b36210SVijay Subramanian 	__u32 delay;			/* current delay in ms */
912cec2975fSGautam Ramakrishnan 	__u32 avg_dq_rate;		/* current average dq_rate in
913cec2975fSGautam Ramakrishnan 					 * bits/pie_time
914cec2975fSGautam Ramakrishnan 					 */
915cec2975fSGautam Ramakrishnan 	__u32 dq_rate_estimating;	/* is avg_dq_rate being calculated? */
916d4b36210SVijay Subramanian 	__u32 packets_in;		/* total number of packets enqueued */
917d4b36210SVijay Subramanian 	__u32 dropped;			/* packets dropped due to pie_action */
918cec2975fSGautam Ramakrishnan 	__u32 overlimit;		/* dropped due to lack of space
919cec2975fSGautam Ramakrishnan 					 * in queue
920cec2975fSGautam Ramakrishnan 					 */
921d4b36210SVijay Subramanian 	__u32 maxq;			/* maximum queue size */
922d4b36210SVijay Subramanian 	__u32 ecn_mark;			/* packets marked with ecn*/
923d4b36210SVijay Subramanian };
924585d763aSVinicius Costa Gomes 
925ec97ecf1SMohit P. Tahiliani /* FQ PIE */
926ec97ecf1SMohit P. Tahiliani enum {
927ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_UNSPEC,
928ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_LIMIT,
929ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_FLOWS,
930ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_TARGET,
931ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_TUPDATE,
932ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_ALPHA,
933ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_BETA,
934ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_QUANTUM,
935ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_MEMORY_LIMIT,
936ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_ECN_PROB,
937ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_ECN,
938ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_BYTEMODE,
939ec97ecf1SMohit P. Tahiliani 	TCA_FQ_PIE_DQ_RATE_ESTIMATOR,
940ec97ecf1SMohit P. Tahiliani 	__TCA_FQ_PIE_MAX
941ec97ecf1SMohit P. Tahiliani };
942ec97ecf1SMohit P. Tahiliani #define TCA_FQ_PIE_MAX   (__TCA_FQ_PIE_MAX - 1)
943ec97ecf1SMohit P. Tahiliani 
944ec97ecf1SMohit P. Tahiliani struct tc_fq_pie_xstats {
945ec97ecf1SMohit P. Tahiliani 	__u32 packets_in;	/* total number of packets enqueued */
946ec97ecf1SMohit P. Tahiliani 	__u32 dropped;		/* packets dropped due to fq_pie_action */
947ec97ecf1SMohit P. Tahiliani 	__u32 overlimit;	/* dropped due to lack of space in queue */
948ec97ecf1SMohit P. Tahiliani 	__u32 overmemory;	/* dropped due to lack of memory in queue */
949ec97ecf1SMohit P. Tahiliani 	__u32 ecn_mark;		/* packets marked with ecn */
950ec97ecf1SMohit P. Tahiliani 	__u32 new_flow_count;	/* count of new flows created by packets */
951ec97ecf1SMohit P. Tahiliani 	__u32 new_flows_len;	/* count of flows in new list */
952ec97ecf1SMohit P. Tahiliani 	__u32 old_flows_len;	/* count of flows in old list */
953ec97ecf1SMohit P. Tahiliani 	__u32 memory_usage;	/* total memory across all queues */
954ec97ecf1SMohit P. Tahiliani };
955ec97ecf1SMohit P. Tahiliani 
956585d763aSVinicius Costa Gomes /* CBS */
957585d763aSVinicius Costa Gomes struct tc_cbs_qopt {
958585d763aSVinicius Costa Gomes 	__u8 offload;
959585d763aSVinicius Costa Gomes 	__u8 _pad[3];
960585d763aSVinicius Costa Gomes 	__s32 hicredit;
961585d763aSVinicius Costa Gomes 	__s32 locredit;
962585d763aSVinicius Costa Gomes 	__s32 idleslope;
963585d763aSVinicius Costa Gomes 	__s32 sendslope;
964585d763aSVinicius Costa Gomes };
965585d763aSVinicius Costa Gomes 
966585d763aSVinicius Costa Gomes enum {
967585d763aSVinicius Costa Gomes 	TCA_CBS_UNSPEC,
968585d763aSVinicius Costa Gomes 	TCA_CBS_PARMS,
969585d763aSVinicius Costa Gomes 	__TCA_CBS_MAX,
970585d763aSVinicius Costa Gomes };
971585d763aSVinicius Costa Gomes 
972585d763aSVinicius Costa Gomes #define TCA_CBS_MAX (__TCA_CBS_MAX - 1)
973585d763aSVinicius Costa Gomes 
97425db26a9SVinicius Costa Gomes 
97525db26a9SVinicius Costa Gomes /* ETF */
97625db26a9SVinicius Costa Gomes struct tc_etf_qopt {
97725db26a9SVinicius Costa Gomes 	__s32 delta;
97825db26a9SVinicius Costa Gomes 	__s32 clockid;
97925db26a9SVinicius Costa Gomes 	__u32 flags;
9809903c8dcSVedang Patel #define TC_ETF_DEADLINE_MODE_ON	_BITUL(0)
9819903c8dcSVedang Patel #define TC_ETF_OFFLOAD_ON	_BITUL(1)
982d14d2b20SVedang Patel #define TC_ETF_SKIP_SOCK_CHECK	_BITUL(2)
98325db26a9SVinicius Costa Gomes };
98425db26a9SVinicius Costa Gomes 
98525db26a9SVinicius Costa Gomes enum {
98625db26a9SVinicius Costa Gomes 	TCA_ETF_UNSPEC,
98725db26a9SVinicius Costa Gomes 	TCA_ETF_PARMS,
98825db26a9SVinicius Costa Gomes 	__TCA_ETF_MAX,
98925db26a9SVinicius Costa Gomes };
99025db26a9SVinicius Costa Gomes 
99125db26a9SVinicius Costa Gomes #define TCA_ETF_MAX (__TCA_ETF_MAX - 1)
99225db26a9SVinicius Costa Gomes 
993046f6fd5SToke Høiland-Jørgensen 
994046f6fd5SToke Høiland-Jørgensen /* CAKE */
995046f6fd5SToke Høiland-Jørgensen enum {
996046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_UNSPEC,
997046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_PAD,
998046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_BASE_RATE64,
999046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_DIFFSERV_MODE,
1000046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ATM,
1001046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_FLOW_MODE,
1002046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_OVERHEAD,
1003046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RTT,
1004046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TARGET,
1005046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_AUTORATE,
1006046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MEMORY,
1007046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_NAT,
1008046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RAW,
1009046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_WASH,
1010046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MPU,
1011046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_INGRESS,
1012046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ACK_FILTER,
1013046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_SPLIT_GSO,
10140b5c7efdSKevin Darbyshire-Bryant 	TCA_CAKE_FWMARK,
1015046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_MAX
1016046f6fd5SToke Høiland-Jørgensen };
1017046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_MAX	(__TCA_CAKE_MAX - 1)
1018046f6fd5SToke Høiland-Jørgensen 
1019046f6fd5SToke Høiland-Jørgensen enum {
1020046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_INVALID,
1021046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_PAD,
1022046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_CAPACITY_ESTIMATE64,
1023046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_LIMIT,
1024046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_USED,
1025046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_AVG_NETOFF,
1026046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_NETLEN,
1027046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_NETLEN,
1028046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_ADJLEN,
1029046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_ADJLEN,
1030046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_TIN_STATS,
1031046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DEFICIT,
1032046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_COBALT_COUNT,
1033046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROPPING,
1034046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROP_NEXT_US,
1035046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_P_DROP,
1036046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_BLUE_TIMER_US,
1037046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_MAX
1038046f6fd5SToke Høiland-Jørgensen };
1039046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
1040046f6fd5SToke Høiland-Jørgensen 
1041046f6fd5SToke Høiland-Jørgensen enum {
1042046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_INVALID,
1043046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PAD,
1044046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_PACKETS,
1045046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_BYTES64,
1046046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_PACKETS,
1047046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_BYTES64,
1048046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS,
1049046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64,
1050046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS,
1051046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64,
1052046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_PACKETS,
1053046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_BYTES,
1054046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_THRESHOLD_RATE64,
1055046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_TARGET_US,
1056046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_INTERVAL_US,
1057046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS,
1058046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_MISSES,
1059046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_COLLISIONS,
1060046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PEAK_DELAY_US,
1061046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_AVG_DELAY_US,
1062046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BASE_DELAY_US,
1063046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SPARSE_FLOWS,
1064046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BULK_FLOWS,
1065046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS,
1066046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_MAX_SKBLEN,
1067046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_FLOW_QUANTUM,
1068046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_MAX
1069046f6fd5SToke Høiland-Jørgensen };
1070046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1)
1071046f6fd5SToke Høiland-Jørgensen #define TC_CAKE_MAX_TINS (8)
1072046f6fd5SToke Høiland-Jørgensen 
1073046f6fd5SToke Høiland-Jørgensen enum {
1074046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_NONE = 0,
1075046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_SRC_IP,
1076046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DST_IP,
1077046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_HOSTS,    /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */
1078046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_FLOWS,
1079046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */
1080046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */
1081046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_TRIPLE,   /* = CAKE_FLOW_HOSTS  | CAKE_FLOW_FLOWS */
1082046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_MAX,
1083046f6fd5SToke Høiland-Jørgensen };
1084046f6fd5SToke Høiland-Jørgensen 
1085046f6fd5SToke Høiland-Jørgensen enum {
1086046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV3 = 0,
1087046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV4,
1088046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV8,
1089046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_BESTEFFORT,
1090046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_PRECEDENCE,
1091046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_MAX
1092046f6fd5SToke Høiland-Jørgensen };
1093046f6fd5SToke Høiland-Jørgensen 
1094046f6fd5SToke Høiland-Jørgensen enum {
1095046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_NONE = 0,
1096046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_FILTER,
1097046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_AGGRESSIVE,
1098046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_MAX
1099046f6fd5SToke Høiland-Jørgensen };
1100046f6fd5SToke Høiland-Jørgensen 
1101046f6fd5SToke Høiland-Jørgensen enum {
1102046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_NONE = 0,
1103046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_ATM,
1104046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_PTM,
1105046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_MAX
1106046f6fd5SToke Høiland-Jørgensen };
1107046f6fd5SToke Høiland-Jørgensen 
11085a781ccbSVinicius Costa Gomes 
11095a781ccbSVinicius Costa Gomes /* TAPRIO */
11105a781ccbSVinicius Costa Gomes enum {
11115a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_GATES = 0x00,
11125a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_HOLD = 0x01,
11135a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02,
11145a781ccbSVinicius Costa Gomes };
11155a781ccbSVinicius Costa Gomes 
11165a781ccbSVinicius Costa Gomes enum {
11175a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_UNSPEC,
11185a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */
11195a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */
11205a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */
11215a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */
11225a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_ENTRY_MAX,
11235a781ccbSVinicius Costa Gomes };
11245a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1)
11255a781ccbSVinicius Costa Gomes 
11265a781ccbSVinicius Costa Gomes /* The format for schedule entry list is:
11275a781ccbSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ENTRY_LIST]
11285a781ccbSVinicius Costa Gomes  *   [TCA_TAPRIO_SCHED_ENTRY]
11295a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_CMD]
11305a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_GATES]
11315a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_INTERVAL]
11325a781ccbSVinicius Costa Gomes  */
11335a781ccbSVinicius Costa Gomes enum {
11345a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_UNSPEC,
11355a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY,
11365a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_MAX,
11375a781ccbSVinicius Costa Gomes };
11385a781ccbSVinicius Costa Gomes 
11395a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1)
11405a781ccbSVinicius Costa Gomes 
1141a3d43c0dSVinicius Costa Gomes /* The format for the admin sched (dump only):
1142a3d43c0dSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ADMIN_SCHED]
1143a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_BASE_TIME]
1144a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]
1145a3d43c0dSVinicius Costa Gomes  *     [TCA_TAPRIO_ATTR_SCHED_ENTRY]
1146a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_CMD]
1147a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_GATES]
1148a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_INTERVAL]
1149a3d43c0dSVinicius Costa Gomes  */
1150a3d43c0dSVinicius Costa Gomes 
1151673040c3SEugene Syromiatnikov #define TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST	_BITUL(0)
1152673040c3SEugene Syromiatnikov #define TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD	_BITUL(1)
11534cfd5779SVedang Patel 
11545a781ccbSVinicius Costa Gomes enum {
1155a54fc09eSVladimir Oltean 	TCA_TAPRIO_TC_ENTRY_UNSPEC,
1156a54fc09eSVladimir Oltean 	TCA_TAPRIO_TC_ENTRY_INDEX,		/* u32 */
1157a54fc09eSVladimir Oltean 	TCA_TAPRIO_TC_ENTRY_MAX_SDU,		/* u32 */
1158a721c3e5SVladimir Oltean 	TCA_TAPRIO_TC_ENTRY_FP,			/* u32 */
1159a54fc09eSVladimir Oltean 
1160a54fc09eSVladimir Oltean 	/* add new constants above here */
1161a54fc09eSVladimir Oltean 	__TCA_TAPRIO_TC_ENTRY_CNT,
1162a54fc09eSVladimir Oltean 	TCA_TAPRIO_TC_ENTRY_MAX = (__TCA_TAPRIO_TC_ENTRY_CNT - 1)
1163a54fc09eSVladimir Oltean };
1164a54fc09eSVladimir Oltean 
1165a54fc09eSVladimir Oltean enum {
11666c1adb65SVladimir Oltean 	TCA_TAPRIO_OFFLOAD_STATS_PAD = 1,	/* u64 */
11676c1adb65SVladimir Oltean 	TCA_TAPRIO_OFFLOAD_STATS_WINDOW_DROPS,	/* u64 */
11686c1adb65SVladimir Oltean 	TCA_TAPRIO_OFFLOAD_STATS_TX_OVERRUNS,	/* u64 */
11696c1adb65SVladimir Oltean 
11706c1adb65SVladimir Oltean 	/* add new constants above here */
11716c1adb65SVladimir Oltean 	__TCA_TAPRIO_OFFLOAD_STATS_CNT,
11726c1adb65SVladimir Oltean 	TCA_TAPRIO_OFFLOAD_STATS_MAX = (__TCA_TAPRIO_OFFLOAD_STATS_CNT - 1)
11736c1adb65SVladimir Oltean };
11746c1adb65SVladimir Oltean 
11756c1adb65SVladimir Oltean enum {
11765a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_UNSPEC,
11775a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */
11785a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */
11795a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */
11805a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */
11815a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */
11825a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_PAD,
1183a3d43c0dSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_ADMIN_SCHED, /* The admin sched, only used in dump */
11846ca6a665SVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */
1185c25031e9SVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */
11864cfd5779SVedang Patel 	TCA_TAPRIO_ATTR_FLAGS, /* u32 */
1187a5b64700SVedang Patel 	TCA_TAPRIO_ATTR_TXTIME_DELAY, /* u32 */
1188a54fc09eSVladimir Oltean 	TCA_TAPRIO_ATTR_TC_ENTRY, /* nest */
11895a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_ATTR_MAX,
11905a781ccbSVinicius Costa Gomes };
11915a781ccbSVinicius Costa Gomes 
11925a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1)
11935a781ccbSVinicius Costa Gomes 
1194dcc68b4dSPetr Machata /* ETS */
1195dcc68b4dSPetr Machata 
1196dcc68b4dSPetr Machata #define TCQ_ETS_MAX_BANDS 16
1197dcc68b4dSPetr Machata 
1198dcc68b4dSPetr Machata enum {
1199dcc68b4dSPetr Machata 	TCA_ETS_UNSPEC,
1200dcc68b4dSPetr Machata 	TCA_ETS_NBANDS,		/* u8 */
1201dcc68b4dSPetr Machata 	TCA_ETS_NSTRICT,	/* u8 */
1202dcc68b4dSPetr Machata 	TCA_ETS_QUANTA,		/* nested TCA_ETS_QUANTA_BAND */
1203dcc68b4dSPetr Machata 	TCA_ETS_QUANTA_BAND,	/* u32 */
1204dcc68b4dSPetr Machata 	TCA_ETS_PRIOMAP,	/* nested TCA_ETS_PRIOMAP_BAND */
1205dcc68b4dSPetr Machata 	TCA_ETS_PRIOMAP_BAND,	/* u8 */
1206dcc68b4dSPetr Machata 	__TCA_ETS_MAX,
1207dcc68b4dSPetr Machata };
1208dcc68b4dSPetr Machata 
1209dcc68b4dSPetr Machata #define TCA_ETS_MAX (__TCA_ETS_MAX - 1)
1210dcc68b4dSPetr Machata 
1211607ca46eSDavid Howells #endif
1212