xref: /linux/include/uapi/linux/pkt_sched.h (revision dcc68b4d8084e1ac9af0d4022d6b1aff6a139a33)
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,
259607ca46eSDavid Howells 	__TCA_RED_MAX,
260607ca46eSDavid Howells };
261607ca46eSDavid Howells 
262607ca46eSDavid Howells #define TCA_RED_MAX (__TCA_RED_MAX - 1)
263607ca46eSDavid Howells 
264607ca46eSDavid Howells struct tc_red_qopt {
265607ca46eSDavid Howells 	__u32		limit;		/* HARD maximal queue length (bytes)	*/
266607ca46eSDavid Howells 	__u32		qth_min;	/* Min average length threshold (bytes) */
267607ca46eSDavid Howells 	__u32		qth_max;	/* Max average length threshold (bytes) */
268607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
269607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
270607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
271607ca46eSDavid Howells 	unsigned char	flags;
272607ca46eSDavid Howells #define TC_RED_ECN		1
273607ca46eSDavid Howells #define TC_RED_HARDDROP		2
274607ca46eSDavid Howells #define TC_RED_ADAPTATIVE	4
275607ca46eSDavid Howells };
276607ca46eSDavid Howells 
277607ca46eSDavid Howells struct tc_red_xstats {
278607ca46eSDavid Howells 	__u32           early;          /* Early drops */
279607ca46eSDavid Howells 	__u32           pdrop;          /* Drops due to queue limits */
280607ca46eSDavid Howells 	__u32           other;          /* Drops due to drop() calls */
281607ca46eSDavid Howells 	__u32           marked;         /* Marked packets */
282607ca46eSDavid Howells };
283607ca46eSDavid Howells 
284607ca46eSDavid Howells /* GRED section */
285607ca46eSDavid Howells 
286607ca46eSDavid Howells #define MAX_DPs 16
287607ca46eSDavid Howells 
288607ca46eSDavid Howells enum {
289607ca46eSDavid Howells        TCA_GRED_UNSPEC,
290607ca46eSDavid Howells        TCA_GRED_PARMS,
291607ca46eSDavid Howells        TCA_GRED_STAB,
292607ca46eSDavid Howells        TCA_GRED_DPS,
293607ca46eSDavid Howells        TCA_GRED_MAX_P,
294a3eb95f8SDavid Ward        TCA_GRED_LIMIT,
29580e22e96SJakub Kicinski        TCA_GRED_VQ_LIST,	/* nested TCA_GRED_VQ_ENTRY */
296607ca46eSDavid Howells        __TCA_GRED_MAX,
297607ca46eSDavid Howells };
298607ca46eSDavid Howells 
299607ca46eSDavid Howells #define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
300607ca46eSDavid Howells 
30180e22e96SJakub Kicinski enum {
30280e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY_UNSPEC,
30380e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY,	/* nested TCA_GRED_VQ_* */
30480e22e96SJakub Kicinski 	__TCA_GRED_VQ_ENTRY_MAX,
30580e22e96SJakub Kicinski };
30680e22e96SJakub Kicinski #define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1)
30780e22e96SJakub Kicinski 
30880e22e96SJakub Kicinski enum {
30980e22e96SJakub Kicinski 	TCA_GRED_VQ_UNSPEC,
31080e22e96SJakub Kicinski 	TCA_GRED_VQ_PAD,
31180e22e96SJakub Kicinski 	TCA_GRED_VQ_DP,			/* u32 */
31280e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BYTES,		/* u64 */
31380e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PACKETS,	/* u32 */
31480e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BACKLOG,	/* u32 */
31580e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_DROP,	/* u32 */
31680e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_MARK,	/* u32 */
31780e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_DROP,	/* u32 */
31880e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_MARK,	/* u32 */
31980e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PDROP,		/* u32 */
32080e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_OTHER,		/* u32 */
32172111015SJakub Kicinski 	TCA_GRED_VQ_FLAGS,		/* u32 */
32280e22e96SJakub Kicinski 	__TCA_GRED_VQ_MAX
32380e22e96SJakub Kicinski };
32480e22e96SJakub Kicinski 
32580e22e96SJakub Kicinski #define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1)
32680e22e96SJakub Kicinski 
327607ca46eSDavid Howells struct tc_gred_qopt {
328607ca46eSDavid Howells 	__u32		limit;        /* HARD maximal queue length (bytes)    */
329607ca46eSDavid Howells 	__u32		qth_min;      /* Min average length threshold (bytes) */
330607ca46eSDavid Howells 	__u32		qth_max;      /* Max average length threshold (bytes) */
331607ca46eSDavid Howells 	__u32		DP;           /* up to 2^32 DPs */
332607ca46eSDavid Howells 	__u32		backlog;
333607ca46eSDavid Howells 	__u32		qave;
334607ca46eSDavid Howells 	__u32		forced;
335607ca46eSDavid Howells 	__u32		early;
336607ca46eSDavid Howells 	__u32		other;
337607ca46eSDavid Howells 	__u32		pdrop;
338607ca46eSDavid Howells 	__u8		Wlog;         /* log(W)               */
339607ca46eSDavid Howells 	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
340607ca46eSDavid Howells 	__u8		Scell_log;    /* cell size for idle damping */
341607ca46eSDavid Howells 	__u8		prio;         /* prio of this VQ */
342607ca46eSDavid Howells 	__u32		packets;
343607ca46eSDavid Howells 	__u32		bytesin;
344607ca46eSDavid Howells };
345607ca46eSDavid Howells 
346607ca46eSDavid Howells /* gred setup */
347607ca46eSDavid Howells struct tc_gred_sopt {
348607ca46eSDavid Howells 	__u32		DPs;
349607ca46eSDavid Howells 	__u32		def_DP;
350607ca46eSDavid Howells 	__u8		grio;
351607ca46eSDavid Howells 	__u8		flags;
352607ca46eSDavid Howells 	__u16		pad1;
353607ca46eSDavid Howells };
354607ca46eSDavid Howells 
355607ca46eSDavid Howells /* CHOKe section */
356607ca46eSDavid Howells 
357607ca46eSDavid Howells enum {
358607ca46eSDavid Howells 	TCA_CHOKE_UNSPEC,
359607ca46eSDavid Howells 	TCA_CHOKE_PARMS,
360607ca46eSDavid Howells 	TCA_CHOKE_STAB,
361607ca46eSDavid Howells 	TCA_CHOKE_MAX_P,
362607ca46eSDavid Howells 	__TCA_CHOKE_MAX,
363607ca46eSDavid Howells };
364607ca46eSDavid Howells 
365607ca46eSDavid Howells #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
366607ca46eSDavid Howells 
367607ca46eSDavid Howells struct tc_choke_qopt {
368607ca46eSDavid Howells 	__u32		limit;		/* Hard queue length (packets)	*/
369607ca46eSDavid Howells 	__u32		qth_min;	/* Min average threshold (packets) */
370607ca46eSDavid Howells 	__u32		qth_max;	/* Max average threshold (packets) */
371607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
372607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
373607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
374607ca46eSDavid Howells 	unsigned char	flags;		/* see RED flags */
375607ca46eSDavid Howells };
376607ca46eSDavid Howells 
377607ca46eSDavid Howells struct tc_choke_xstats {
378607ca46eSDavid Howells 	__u32		early;          /* Early drops */
379607ca46eSDavid Howells 	__u32		pdrop;          /* Drops due to queue limits */
380607ca46eSDavid Howells 	__u32		other;          /* Drops due to drop() calls */
381607ca46eSDavid Howells 	__u32		marked;         /* Marked packets */
382607ca46eSDavid Howells 	__u32		matched;	/* Drops due to flow match */
383607ca46eSDavid Howells };
384607ca46eSDavid Howells 
385607ca46eSDavid Howells /* HTB section */
386607ca46eSDavid Howells #define TC_HTB_NUMPRIO		8
387607ca46eSDavid Howells #define TC_HTB_MAXDEPTH		8
388607ca46eSDavid Howells #define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
389607ca46eSDavid Howells 
390607ca46eSDavid Howells struct tc_htb_opt {
391607ca46eSDavid Howells 	struct tc_ratespec 	rate;
392607ca46eSDavid Howells 	struct tc_ratespec 	ceil;
393607ca46eSDavid Howells 	__u32	buffer;
394607ca46eSDavid Howells 	__u32	cbuffer;
395607ca46eSDavid Howells 	__u32	quantum;
396607ca46eSDavid Howells 	__u32	level;		/* out only */
397607ca46eSDavid Howells 	__u32	prio;
398607ca46eSDavid Howells };
399607ca46eSDavid Howells struct tc_htb_glob {
400607ca46eSDavid Howells 	__u32 version;		/* to match HTB/TC */
401607ca46eSDavid Howells     	__u32 rate2quantum;	/* bps->quantum divisor */
402607ca46eSDavid Howells     	__u32 defcls;		/* default class number */
403607ca46eSDavid Howells 	__u32 debug;		/* debug flags */
404607ca46eSDavid Howells 
405607ca46eSDavid Howells 	/* stats */
406607ca46eSDavid Howells 	__u32 direct_pkts; /* count of non shaped packets */
407607ca46eSDavid Howells };
408607ca46eSDavid Howells enum {
409607ca46eSDavid Howells 	TCA_HTB_UNSPEC,
410607ca46eSDavid Howells 	TCA_HTB_PARMS,
411607ca46eSDavid Howells 	TCA_HTB_INIT,
412607ca46eSDavid Howells 	TCA_HTB_CTAB,
413607ca46eSDavid Howells 	TCA_HTB_RTAB,
4146906f4edSEric Dumazet 	TCA_HTB_DIRECT_QLEN,
415df62cdf3SEric Dumazet 	TCA_HTB_RATE64,
416df62cdf3SEric Dumazet 	TCA_HTB_CEIL64,
4172a51c1e8SNicolas Dichtel 	TCA_HTB_PAD,
418607ca46eSDavid Howells 	__TCA_HTB_MAX,
419607ca46eSDavid Howells };
420607ca46eSDavid Howells 
421607ca46eSDavid Howells #define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
422607ca46eSDavid Howells 
423607ca46eSDavid Howells struct tc_htb_xstats {
424607ca46eSDavid Howells 	__u32 lends;
425607ca46eSDavid Howells 	__u32 borrows;
426b9de3963SFlorent Fourcot 	__u32 giants;	/* unused since 'Make HTB scheduler work with TSO.' */
427b9de3963SFlorent Fourcot 	__s32 tokens;
428b9de3963SFlorent Fourcot 	__s32 ctokens;
429607ca46eSDavid Howells };
430607ca46eSDavid Howells 
431607ca46eSDavid Howells /* HFSC section */
432607ca46eSDavid Howells 
433607ca46eSDavid Howells struct tc_hfsc_qopt {
434607ca46eSDavid Howells 	__u16	defcls;		/* default class */
435607ca46eSDavid Howells };
436607ca46eSDavid Howells 
437607ca46eSDavid Howells struct tc_service_curve {
438607ca46eSDavid Howells 	__u32	m1;		/* slope of the first segment in bps */
439607ca46eSDavid Howells 	__u32	d;		/* x-projection of the first segment in us */
440607ca46eSDavid Howells 	__u32	m2;		/* slope of the second segment in bps */
441607ca46eSDavid Howells };
442607ca46eSDavid Howells 
443607ca46eSDavid Howells struct tc_hfsc_stats {
444607ca46eSDavid Howells 	__u64	work;		/* total work done */
445607ca46eSDavid Howells 	__u64	rtwork;		/* work done by real-time criteria */
446607ca46eSDavid Howells 	__u32	period;		/* current period */
447607ca46eSDavid Howells 	__u32	level;		/* class level in hierarchy */
448607ca46eSDavid Howells };
449607ca46eSDavid Howells 
450607ca46eSDavid Howells enum {
451607ca46eSDavid Howells 	TCA_HFSC_UNSPEC,
452607ca46eSDavid Howells 	TCA_HFSC_RSC,
453607ca46eSDavid Howells 	TCA_HFSC_FSC,
454607ca46eSDavid Howells 	TCA_HFSC_USC,
455607ca46eSDavid Howells 	__TCA_HFSC_MAX,
456607ca46eSDavid Howells };
457607ca46eSDavid Howells 
458607ca46eSDavid Howells #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
459607ca46eSDavid Howells 
460607ca46eSDavid Howells 
461607ca46eSDavid Howells /* CBQ section */
462607ca46eSDavid Howells 
463607ca46eSDavid Howells #define TC_CBQ_MAXPRIO		8
464607ca46eSDavid Howells #define TC_CBQ_MAXLEVEL		8
465607ca46eSDavid Howells #define TC_CBQ_DEF_EWMA		5
466607ca46eSDavid Howells 
467607ca46eSDavid Howells struct tc_cbq_lssopt {
468607ca46eSDavid Howells 	unsigned char	change;
469607ca46eSDavid Howells 	unsigned char	flags;
470607ca46eSDavid Howells #define TCF_CBQ_LSS_BOUNDED	1
471607ca46eSDavid Howells #define TCF_CBQ_LSS_ISOLATED	2
472607ca46eSDavid Howells 	unsigned char  	ewma_log;
473607ca46eSDavid Howells 	unsigned char  	level;
474607ca46eSDavid Howells #define TCF_CBQ_LSS_FLAGS	1
475607ca46eSDavid Howells #define TCF_CBQ_LSS_EWMA	2
476607ca46eSDavid Howells #define TCF_CBQ_LSS_MAXIDLE	4
477607ca46eSDavid Howells #define TCF_CBQ_LSS_MINIDLE	8
478607ca46eSDavid Howells #define TCF_CBQ_LSS_OFFTIME	0x10
479607ca46eSDavid Howells #define TCF_CBQ_LSS_AVPKT	0x20
480607ca46eSDavid Howells 	__u32		maxidle;
481607ca46eSDavid Howells 	__u32		minidle;
482607ca46eSDavid Howells 	__u32		offtime;
483607ca46eSDavid Howells 	__u32		avpkt;
484607ca46eSDavid Howells };
485607ca46eSDavid Howells 
486607ca46eSDavid Howells struct tc_cbq_wrropt {
487607ca46eSDavid Howells 	unsigned char	flags;
488607ca46eSDavid Howells 	unsigned char	priority;
489607ca46eSDavid Howells 	unsigned char	cpriority;
490607ca46eSDavid Howells 	unsigned char	__reserved;
491607ca46eSDavid Howells 	__u32		allot;
492607ca46eSDavid Howells 	__u32		weight;
493607ca46eSDavid Howells };
494607ca46eSDavid Howells 
495607ca46eSDavid Howells struct tc_cbq_ovl {
496607ca46eSDavid Howells 	unsigned char	strategy;
497607ca46eSDavid Howells #define	TC_CBQ_OVL_CLASSIC	0
498607ca46eSDavid Howells #define	TC_CBQ_OVL_DELAY	1
499607ca46eSDavid Howells #define	TC_CBQ_OVL_LOWPRIO	2
500607ca46eSDavid Howells #define	TC_CBQ_OVL_DROP		3
501607ca46eSDavid Howells #define	TC_CBQ_OVL_RCLASSIC	4
502607ca46eSDavid Howells 	unsigned char	priority2;
503607ca46eSDavid Howells 	__u16		pad;
504607ca46eSDavid Howells 	__u32		penalty;
505607ca46eSDavid Howells };
506607ca46eSDavid Howells 
507607ca46eSDavid Howells struct tc_cbq_police {
508607ca46eSDavid Howells 	unsigned char	police;
509607ca46eSDavid Howells 	unsigned char	__res1;
510607ca46eSDavid Howells 	unsigned short	__res2;
511607ca46eSDavid Howells };
512607ca46eSDavid Howells 
513607ca46eSDavid Howells struct tc_cbq_fopt {
514607ca46eSDavid Howells 	__u32		split;
515607ca46eSDavid Howells 	__u32		defmap;
516607ca46eSDavid Howells 	__u32		defchange;
517607ca46eSDavid Howells };
518607ca46eSDavid Howells 
519607ca46eSDavid Howells struct tc_cbq_xstats {
520607ca46eSDavid Howells 	__u32		borrows;
521607ca46eSDavid Howells 	__u32		overactions;
522607ca46eSDavid Howells 	__s32		avgidle;
523607ca46eSDavid Howells 	__s32		undertime;
524607ca46eSDavid Howells };
525607ca46eSDavid Howells 
526607ca46eSDavid Howells enum {
527607ca46eSDavid Howells 	TCA_CBQ_UNSPEC,
528607ca46eSDavid Howells 	TCA_CBQ_LSSOPT,
529607ca46eSDavid Howells 	TCA_CBQ_WRROPT,
530607ca46eSDavid Howells 	TCA_CBQ_FOPT,
531607ca46eSDavid Howells 	TCA_CBQ_OVL_STRATEGY,
532607ca46eSDavid Howells 	TCA_CBQ_RATE,
533607ca46eSDavid Howells 	TCA_CBQ_RTAB,
534607ca46eSDavid Howells 	TCA_CBQ_POLICE,
535607ca46eSDavid Howells 	__TCA_CBQ_MAX,
536607ca46eSDavid Howells };
537607ca46eSDavid Howells 
538607ca46eSDavid Howells #define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
539607ca46eSDavid Howells 
540607ca46eSDavid Howells /* dsmark section */
541607ca46eSDavid Howells 
542607ca46eSDavid Howells enum {
543607ca46eSDavid Howells 	TCA_DSMARK_UNSPEC,
544607ca46eSDavid Howells 	TCA_DSMARK_INDICES,
545607ca46eSDavid Howells 	TCA_DSMARK_DEFAULT_INDEX,
546607ca46eSDavid Howells 	TCA_DSMARK_SET_TC_INDEX,
547607ca46eSDavid Howells 	TCA_DSMARK_MASK,
548607ca46eSDavid Howells 	TCA_DSMARK_VALUE,
549607ca46eSDavid Howells 	__TCA_DSMARK_MAX,
550607ca46eSDavid Howells };
551607ca46eSDavid Howells 
552607ca46eSDavid Howells #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
553607ca46eSDavid Howells 
554607ca46eSDavid Howells /* ATM  section */
555607ca46eSDavid Howells 
556607ca46eSDavid Howells enum {
557607ca46eSDavid Howells 	TCA_ATM_UNSPEC,
558607ca46eSDavid Howells 	TCA_ATM_FD,		/* file/socket descriptor */
559607ca46eSDavid Howells 	TCA_ATM_PTR,		/* pointer to descriptor - later */
560607ca46eSDavid Howells 	TCA_ATM_HDR,		/* LL header */
561607ca46eSDavid Howells 	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
562607ca46eSDavid Howells 	TCA_ATM_ADDR,		/* PVC address (for output only) */
563607ca46eSDavid Howells 	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
564607ca46eSDavid Howells 	__TCA_ATM_MAX,
565607ca46eSDavid Howells };
566607ca46eSDavid Howells 
567607ca46eSDavid Howells #define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
568607ca46eSDavid Howells 
569607ca46eSDavid Howells /* Network emulator */
570607ca46eSDavid Howells 
571607ca46eSDavid Howells enum {
572607ca46eSDavid Howells 	TCA_NETEM_UNSPEC,
573607ca46eSDavid Howells 	TCA_NETEM_CORR,
574607ca46eSDavid Howells 	TCA_NETEM_DELAY_DIST,
575607ca46eSDavid Howells 	TCA_NETEM_REORDER,
576607ca46eSDavid Howells 	TCA_NETEM_CORRUPT,
577607ca46eSDavid Howells 	TCA_NETEM_LOSS,
578607ca46eSDavid Howells 	TCA_NETEM_RATE,
579607ca46eSDavid Howells 	TCA_NETEM_ECN,
5806a031f67SYang Yingliang 	TCA_NETEM_RATE64,
5812a51c1e8SNicolas Dichtel 	TCA_NETEM_PAD,
58299803171SDave Taht 	TCA_NETEM_LATENCY64,
58399803171SDave Taht 	TCA_NETEM_JITTER64,
584836af83bSDave Taht 	TCA_NETEM_SLOT,
5850a9fe5c3SYousuk Seung 	TCA_NETEM_SLOT_DIST,
586607ca46eSDavid Howells 	__TCA_NETEM_MAX,
587607ca46eSDavid Howells };
588607ca46eSDavid Howells 
589607ca46eSDavid Howells #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
590607ca46eSDavid Howells 
591607ca46eSDavid Howells struct tc_netem_qopt {
592607ca46eSDavid Howells 	__u32	latency;	/* added delay (us) */
593607ca46eSDavid Howells 	__u32   limit;		/* fifo limit (packets) */
594607ca46eSDavid Howells 	__u32	loss;		/* random packet loss (0=none ~0=100%) */
595607ca46eSDavid Howells 	__u32	gap;		/* re-ordering gap (0 for none) */
596607ca46eSDavid Howells 	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
597607ca46eSDavid Howells 	__u32	jitter;		/* random jitter in latency (us) */
598607ca46eSDavid Howells };
599607ca46eSDavid Howells 
600607ca46eSDavid Howells struct tc_netem_corr {
601607ca46eSDavid Howells 	__u32	delay_corr;	/* delay correlation */
602607ca46eSDavid Howells 	__u32	loss_corr;	/* packet loss correlation */
603607ca46eSDavid Howells 	__u32	dup_corr;	/* duplicate correlation  */
604607ca46eSDavid Howells };
605607ca46eSDavid Howells 
606607ca46eSDavid Howells struct tc_netem_reorder {
607607ca46eSDavid Howells 	__u32	probability;
608607ca46eSDavid Howells 	__u32	correlation;
609607ca46eSDavid Howells };
610607ca46eSDavid Howells 
611607ca46eSDavid Howells struct tc_netem_corrupt {
612607ca46eSDavid Howells 	__u32	probability;
613607ca46eSDavid Howells 	__u32	correlation;
614607ca46eSDavid Howells };
615607ca46eSDavid Howells 
616607ca46eSDavid Howells struct tc_netem_rate {
617607ca46eSDavid Howells 	__u32	rate;	/* byte/s */
618607ca46eSDavid Howells 	__s32	packet_overhead;
619607ca46eSDavid Howells 	__u32	cell_size;
620607ca46eSDavid Howells 	__s32	cell_overhead;
621607ca46eSDavid Howells };
622607ca46eSDavid Howells 
623836af83bSDave Taht struct tc_netem_slot {
624836af83bSDave Taht 	__s64   min_delay; /* nsec */
625836af83bSDave Taht 	__s64   max_delay;
626836af83bSDave Taht 	__s32   max_packets;
627836af83bSDave Taht 	__s32   max_bytes;
6280a9fe5c3SYousuk Seung 	__s64	dist_delay; /* nsec */
6290a9fe5c3SYousuk Seung 	__s64	dist_jitter; /* nsec */
630836af83bSDave Taht };
631836af83bSDave Taht 
632607ca46eSDavid Howells enum {
633607ca46eSDavid Howells 	NETEM_LOSS_UNSPEC,
634607ca46eSDavid Howells 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
635607ca46eSDavid Howells 	NETEM_LOSS_GE,		/* Gilbert Elliot models */
636607ca46eSDavid Howells 	__NETEM_LOSS_MAX
637607ca46eSDavid Howells };
638607ca46eSDavid Howells #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
639607ca46eSDavid Howells 
640607ca46eSDavid Howells /* State transition probabilities for 4 state model */
641607ca46eSDavid Howells struct tc_netem_gimodel {
642607ca46eSDavid Howells 	__u32	p13;
643607ca46eSDavid Howells 	__u32	p31;
644607ca46eSDavid Howells 	__u32	p32;
645607ca46eSDavid Howells 	__u32	p14;
646607ca46eSDavid Howells 	__u32	p23;
647607ca46eSDavid Howells };
648607ca46eSDavid Howells 
649607ca46eSDavid Howells /* Gilbert-Elliot models */
650607ca46eSDavid Howells struct tc_netem_gemodel {
651607ca46eSDavid Howells 	__u32 p;
652607ca46eSDavid Howells 	__u32 r;
653607ca46eSDavid Howells 	__u32 h;
654607ca46eSDavid Howells 	__u32 k1;
655607ca46eSDavid Howells };
656607ca46eSDavid Howells 
657607ca46eSDavid Howells #define NETEM_DIST_SCALE	8192
658607ca46eSDavid Howells #define NETEM_DIST_MAX		16384
659607ca46eSDavid Howells 
660607ca46eSDavid Howells /* DRR */
661607ca46eSDavid Howells 
662607ca46eSDavid Howells enum {
663607ca46eSDavid Howells 	TCA_DRR_UNSPEC,
664607ca46eSDavid Howells 	TCA_DRR_QUANTUM,
665607ca46eSDavid Howells 	__TCA_DRR_MAX
666607ca46eSDavid Howells };
667607ca46eSDavid Howells 
668607ca46eSDavid Howells #define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
669607ca46eSDavid Howells 
670607ca46eSDavid Howells struct tc_drr_stats {
671607ca46eSDavid Howells 	__u32	deficit;
672607ca46eSDavid Howells };
673607ca46eSDavid Howells 
674607ca46eSDavid Howells /* MQPRIO */
675607ca46eSDavid Howells #define TC_QOPT_BITMASK 15
676607ca46eSDavid Howells #define TC_QOPT_MAX_QUEUE 16
677607ca46eSDavid Howells 
6782026fecfSAlexander Duyck enum {
6792026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
6802026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
6812026fecfSAlexander Duyck 	__TC_MQPRIO_HW_OFFLOAD_MAX
6822026fecfSAlexander Duyck };
6832026fecfSAlexander Duyck 
6842026fecfSAlexander Duyck #define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
6852026fecfSAlexander Duyck 
6864e8b86c0SAmritha Nambiar enum {
6874e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_DCB,
6884e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_CHANNEL,
6894e8b86c0SAmritha Nambiar 	__TC_MQPRIO_MODE_MAX
6904e8b86c0SAmritha Nambiar };
6914e8b86c0SAmritha Nambiar 
6924e8b86c0SAmritha Nambiar #define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1)
6934e8b86c0SAmritha Nambiar 
6944e8b86c0SAmritha Nambiar enum {
6954e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_DCB,
6964e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_BW_RATE,	/* Add new shapers below */
6974e8b86c0SAmritha Nambiar 	__TC_MQPRIO_SHAPER_MAX
6984e8b86c0SAmritha Nambiar };
6994e8b86c0SAmritha Nambiar 
7004e8b86c0SAmritha Nambiar #define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1)
7014e8b86c0SAmritha Nambiar 
702607ca46eSDavid Howells struct tc_mqprio_qopt {
703607ca46eSDavid Howells 	__u8	num_tc;
704607ca46eSDavid Howells 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
705607ca46eSDavid Howells 	__u8	hw;
706607ca46eSDavid Howells 	__u16	count[TC_QOPT_MAX_QUEUE];
707607ca46eSDavid Howells 	__u16	offset[TC_QOPT_MAX_QUEUE];
708607ca46eSDavid Howells };
709607ca46eSDavid Howells 
7104e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MODE		0x1
7114e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_SHAPER		0x2
7124e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MIN_RATE		0x4
7134e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MAX_RATE		0x8
7144e8b86c0SAmritha Nambiar 
7154e8b86c0SAmritha Nambiar enum {
7164e8b86c0SAmritha Nambiar 	TCA_MQPRIO_UNSPEC,
7174e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MODE,
7184e8b86c0SAmritha Nambiar 	TCA_MQPRIO_SHAPER,
7194e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MIN_RATE64,
7204e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MAX_RATE64,
7214e8b86c0SAmritha Nambiar 	__TCA_MQPRIO_MAX,
7224e8b86c0SAmritha Nambiar };
7234e8b86c0SAmritha Nambiar 
7244e8b86c0SAmritha Nambiar #define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1)
7254e8b86c0SAmritha Nambiar 
726607ca46eSDavid Howells /* SFB */
727607ca46eSDavid Howells 
728607ca46eSDavid Howells enum {
729607ca46eSDavid Howells 	TCA_SFB_UNSPEC,
730607ca46eSDavid Howells 	TCA_SFB_PARMS,
731607ca46eSDavid Howells 	__TCA_SFB_MAX,
732607ca46eSDavid Howells };
733607ca46eSDavid Howells 
734607ca46eSDavid Howells #define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
735607ca46eSDavid Howells 
736607ca46eSDavid Howells /*
737607ca46eSDavid Howells  * Note: increment, decrement are Q0.16 fixed-point values.
738607ca46eSDavid Howells  */
739607ca46eSDavid Howells struct tc_sfb_qopt {
740607ca46eSDavid Howells 	__u32 rehash_interval;	/* delay between hash move, in ms */
741607ca46eSDavid Howells 	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
742607ca46eSDavid Howells 	__u32 max;		/* max len of qlen_min */
743607ca46eSDavid Howells 	__u32 bin_size;		/* maximum queue length per bin */
744607ca46eSDavid Howells 	__u32 increment;	/* probability increment, (d1 in Blue) */
745607ca46eSDavid Howells 	__u32 decrement;	/* probability decrement, (d2 in Blue) */
746607ca46eSDavid Howells 	__u32 limit;		/* max SFB queue length */
747607ca46eSDavid Howells 	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
748607ca46eSDavid Howells 	__u32 penalty_burst;
749607ca46eSDavid Howells };
750607ca46eSDavid Howells 
751607ca46eSDavid Howells struct tc_sfb_xstats {
752607ca46eSDavid Howells 	__u32 earlydrop;
753607ca46eSDavid Howells 	__u32 penaltydrop;
754607ca46eSDavid Howells 	__u32 bucketdrop;
755607ca46eSDavid Howells 	__u32 queuedrop;
756607ca46eSDavid Howells 	__u32 childdrop; /* drops in child qdisc */
757607ca46eSDavid Howells 	__u32 marked;
758607ca46eSDavid Howells 	__u32 maxqlen;
759607ca46eSDavid Howells 	__u32 maxprob;
760607ca46eSDavid Howells 	__u32 avgprob;
761607ca46eSDavid Howells };
762607ca46eSDavid Howells 
763607ca46eSDavid Howells #define SFB_MAX_PROB 0xFFFF
764607ca46eSDavid Howells 
765607ca46eSDavid Howells /* QFQ */
766607ca46eSDavid Howells enum {
767607ca46eSDavid Howells 	TCA_QFQ_UNSPEC,
768607ca46eSDavid Howells 	TCA_QFQ_WEIGHT,
769607ca46eSDavid Howells 	TCA_QFQ_LMAX,
770607ca46eSDavid Howells 	__TCA_QFQ_MAX
771607ca46eSDavid Howells };
772607ca46eSDavid Howells 
773607ca46eSDavid Howells #define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
774607ca46eSDavid Howells 
775607ca46eSDavid Howells struct tc_qfq_stats {
776607ca46eSDavid Howells 	__u32 weight;
777607ca46eSDavid Howells 	__u32 lmax;
778607ca46eSDavid Howells };
779607ca46eSDavid Howells 
780607ca46eSDavid Howells /* CODEL */
781607ca46eSDavid Howells 
782607ca46eSDavid Howells enum {
783607ca46eSDavid Howells 	TCA_CODEL_UNSPEC,
784607ca46eSDavid Howells 	TCA_CODEL_TARGET,
785607ca46eSDavid Howells 	TCA_CODEL_LIMIT,
786607ca46eSDavid Howells 	TCA_CODEL_INTERVAL,
787607ca46eSDavid Howells 	TCA_CODEL_ECN,
78880ba92faSEric Dumazet 	TCA_CODEL_CE_THRESHOLD,
789607ca46eSDavid Howells 	__TCA_CODEL_MAX
790607ca46eSDavid Howells };
791607ca46eSDavid Howells 
792607ca46eSDavid Howells #define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
793607ca46eSDavid Howells 
794607ca46eSDavid Howells struct tc_codel_xstats {
795607ca46eSDavid Howells 	__u32	maxpacket; /* largest packet we've seen so far */
796607ca46eSDavid Howells 	__u32	count;	   /* how many drops we've done since the last time we
797607ca46eSDavid Howells 			    * entered dropping state
798607ca46eSDavid Howells 			    */
799607ca46eSDavid Howells 	__u32	lastcount; /* count at entry to dropping state */
800607ca46eSDavid Howells 	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
801607ca46eSDavid Howells 	__s32	drop_next; /* time to drop next packet */
802607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
803607ca46eSDavid Howells 	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
804607ca46eSDavid Howells 	__u32	dropping;  /* are we in dropping state ? */
80580ba92faSEric Dumazet 	__u32	ce_mark;   /* number of CE marked packets because of ce_threshold */
806607ca46eSDavid Howells };
807607ca46eSDavid Howells 
808607ca46eSDavid Howells /* FQ_CODEL */
809607ca46eSDavid Howells 
810607ca46eSDavid Howells enum {
811607ca46eSDavid Howells 	TCA_FQ_CODEL_UNSPEC,
812607ca46eSDavid Howells 	TCA_FQ_CODEL_TARGET,
813607ca46eSDavid Howells 	TCA_FQ_CODEL_LIMIT,
814607ca46eSDavid Howells 	TCA_FQ_CODEL_INTERVAL,
815607ca46eSDavid Howells 	TCA_FQ_CODEL_ECN,
816607ca46eSDavid Howells 	TCA_FQ_CODEL_FLOWS,
817607ca46eSDavid Howells 	TCA_FQ_CODEL_QUANTUM,
81880ba92faSEric Dumazet 	TCA_FQ_CODEL_CE_THRESHOLD,
8199d18562aSEric Dumazet 	TCA_FQ_CODEL_DROP_BATCH_SIZE,
82095b58430SEric Dumazet 	TCA_FQ_CODEL_MEMORY_LIMIT,
821607ca46eSDavid Howells 	__TCA_FQ_CODEL_MAX
822607ca46eSDavid Howells };
823607ca46eSDavid Howells 
824607ca46eSDavid Howells #define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
825607ca46eSDavid Howells 
826607ca46eSDavid Howells enum {
827607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_QDISC,
828607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_CLASS,
829607ca46eSDavid Howells };
830607ca46eSDavid Howells 
831607ca46eSDavid Howells struct tc_fq_codel_qd_stats {
832607ca46eSDavid Howells 	__u32	maxpacket;	/* largest packet we've seen so far */
833607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc
834607ca46eSDavid Howells 				 * packet limit was hit
835607ca46eSDavid Howells 				 */
836607ca46eSDavid Howells 	__u32	ecn_mark;	/* number of packets we ECN marked
837607ca46eSDavid Howells 				 * instead of being dropped
838607ca46eSDavid Howells 				 */
839607ca46eSDavid Howells 	__u32	new_flow_count; /* number of time packets
840607ca46eSDavid Howells 				 * created a 'new flow'
841607ca46eSDavid Howells 				 */
842607ca46eSDavid Howells 	__u32	new_flows_len;	/* count of flows in new list */
843607ca46eSDavid Howells 	__u32	old_flows_len;	/* count of flows in old list */
84480ba92faSEric Dumazet 	__u32	ce_mark;	/* packets above ce_threshold */
84595b58430SEric Dumazet 	__u32	memory_usage;	/* in bytes */
84695b58430SEric Dumazet 	__u32	drop_overmemory;
847607ca46eSDavid Howells };
848607ca46eSDavid Howells 
849607ca46eSDavid Howells struct tc_fq_codel_cl_stats {
850607ca46eSDavid Howells 	__s32	deficit;
851607ca46eSDavid Howells 	__u32	ldelay;		/* in-queue delay seen by most recently
852607ca46eSDavid Howells 				 * dequeued packet
853607ca46eSDavid Howells 				 */
854607ca46eSDavid Howells 	__u32	count;
855607ca46eSDavid Howells 	__u32	lastcount;
856607ca46eSDavid Howells 	__u32	dropping;
857607ca46eSDavid Howells 	__s32	drop_next;
858607ca46eSDavid Howells };
859607ca46eSDavid Howells 
860607ca46eSDavid Howells struct tc_fq_codel_xstats {
861607ca46eSDavid Howells 	__u32	type;
862607ca46eSDavid Howells 	union {
863607ca46eSDavid Howells 		struct tc_fq_codel_qd_stats qdisc_stats;
864607ca46eSDavid Howells 		struct tc_fq_codel_cl_stats class_stats;
865607ca46eSDavid Howells 	};
866607ca46eSDavid Howells };
867607ca46eSDavid Howells 
868afe4fd06SEric Dumazet /* FQ */
869afe4fd06SEric Dumazet 
870afe4fd06SEric Dumazet enum {
871afe4fd06SEric Dumazet 	TCA_FQ_UNSPEC,
872afe4fd06SEric Dumazet 
873afe4fd06SEric Dumazet 	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
874afe4fd06SEric Dumazet 
875afe4fd06SEric Dumazet 	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
876afe4fd06SEric Dumazet 
877afe4fd06SEric Dumazet 	TCA_FQ_QUANTUM,		/* RR quantum */
878afe4fd06SEric Dumazet 
879afe4fd06SEric Dumazet 	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
880afe4fd06SEric Dumazet 
881afe4fd06SEric Dumazet 	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
882afe4fd06SEric Dumazet 
88365c5189aSEric Dumazet 	TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */
884afe4fd06SEric Dumazet 
885afe4fd06SEric Dumazet 	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
886afe4fd06SEric Dumazet 
887afe4fd06SEric Dumazet 	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
888f52ed899SEric Dumazet 
889f52ed899SEric Dumazet 	TCA_FQ_FLOW_REFILL_DELAY,	/* flow credit refill delay in usec */
890f52ed899SEric Dumazet 
89106eb395fSEric Dumazet 	TCA_FQ_ORPHAN_MASK,	/* mask applied to orphaned skb hashes */
89206eb395fSEric Dumazet 
89377879147SEric Dumazet 	TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */
89477879147SEric Dumazet 
89548872c11SEric Dumazet 	TCA_FQ_CE_THRESHOLD,	/* DCTCP-like CE-marking threshold */
89648872c11SEric Dumazet 
897afe4fd06SEric Dumazet 	__TCA_FQ_MAX
898afe4fd06SEric Dumazet };
899afe4fd06SEric Dumazet 
900afe4fd06SEric Dumazet #define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
901afe4fd06SEric Dumazet 
902afe4fd06SEric Dumazet struct tc_fq_qd_stats {
903afe4fd06SEric Dumazet 	__u64	gc_flows;
904afe4fd06SEric Dumazet 	__u64	highprio_packets;
905afe4fd06SEric Dumazet 	__u64	tcp_retrans;
906afe4fd06SEric Dumazet 	__u64	throttled;
907afe4fd06SEric Dumazet 	__u64	flows_plimit;
908afe4fd06SEric Dumazet 	__u64	pkts_too_long;
909afe4fd06SEric Dumazet 	__u64	allocation_errors;
910afe4fd06SEric Dumazet 	__s64	time_next_delayed_flow;
911afe4fd06SEric Dumazet 	__u32	flows;
912afe4fd06SEric Dumazet 	__u32	inactive_flows;
913afe4fd06SEric Dumazet 	__u32	throttled_flows;
914fefa569aSEric Dumazet 	__u32	unthrottle_latency_ns;
91548872c11SEric Dumazet 	__u64	ce_mark;		/* packets above ce_threshold */
916afe4fd06SEric Dumazet };
91710239edfSTerry Lam 
91810239edfSTerry Lam /* Heavy-Hitter Filter */
91910239edfSTerry Lam 
92010239edfSTerry Lam enum {
92110239edfSTerry Lam 	TCA_HHF_UNSPEC,
92210239edfSTerry Lam 	TCA_HHF_BACKLOG_LIMIT,
92310239edfSTerry Lam 	TCA_HHF_QUANTUM,
92410239edfSTerry Lam 	TCA_HHF_HH_FLOWS_LIMIT,
92510239edfSTerry Lam 	TCA_HHF_RESET_TIMEOUT,
92610239edfSTerry Lam 	TCA_HHF_ADMIT_BYTES,
92710239edfSTerry Lam 	TCA_HHF_EVICT_TIMEOUT,
92810239edfSTerry Lam 	TCA_HHF_NON_HH_WEIGHT,
92910239edfSTerry Lam 	__TCA_HHF_MAX
93010239edfSTerry Lam };
93110239edfSTerry Lam 
93210239edfSTerry Lam #define TCA_HHF_MAX	(__TCA_HHF_MAX - 1)
93310239edfSTerry Lam 
93410239edfSTerry Lam struct tc_hhf_xstats {
93510239edfSTerry Lam 	__u32	drop_overlimit; /* number of times max qdisc packet limit
93610239edfSTerry Lam 				 * was hit
93710239edfSTerry Lam 				 */
93810239edfSTerry Lam 	__u32	hh_overlimit;   /* number of times max heavy-hitters was hit */
93910239edfSTerry Lam 	__u32	hh_tot_count;   /* number of captured heavy-hitters so far */
94010239edfSTerry Lam 	__u32	hh_cur_count;   /* number of current heavy-hitters */
94110239edfSTerry Lam };
942d4b36210SVijay Subramanian 
943d4b36210SVijay Subramanian /* PIE */
944d4b36210SVijay Subramanian enum {
945d4b36210SVijay Subramanian 	TCA_PIE_UNSPEC,
946d4b36210SVijay Subramanian 	TCA_PIE_TARGET,
947d4b36210SVijay Subramanian 	TCA_PIE_LIMIT,
948d4b36210SVijay Subramanian 	TCA_PIE_TUPDATE,
949d4b36210SVijay Subramanian 	TCA_PIE_ALPHA,
950d4b36210SVijay Subramanian 	TCA_PIE_BETA,
951d4b36210SVijay Subramanian 	TCA_PIE_ECN,
952d4b36210SVijay Subramanian 	TCA_PIE_BYTEMODE,
953cec2975fSGautam Ramakrishnan 	TCA_PIE_DQ_RATE_ESTIMATOR,
954d4b36210SVijay Subramanian 	__TCA_PIE_MAX
955d4b36210SVijay Subramanian };
956d4b36210SVijay Subramanian #define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
957d4b36210SVijay Subramanian 
958d4b36210SVijay Subramanian struct tc_pie_xstats {
9593f7ae5f3SMohit P. Tahiliani 	__u64 prob;			/* current probability */
960d4b36210SVijay Subramanian 	__u32 delay;			/* current delay in ms */
961cec2975fSGautam Ramakrishnan 	__u32 avg_dq_rate;		/* current average dq_rate in
962cec2975fSGautam Ramakrishnan 					 * bits/pie_time
963cec2975fSGautam Ramakrishnan 					 */
964cec2975fSGautam Ramakrishnan 	__u32 dq_rate_estimating;	/* is avg_dq_rate being calculated? */
965d4b36210SVijay Subramanian 	__u32 packets_in;		/* total number of packets enqueued */
966d4b36210SVijay Subramanian 	__u32 dropped;			/* packets dropped due to pie_action */
967cec2975fSGautam Ramakrishnan 	__u32 overlimit;		/* dropped due to lack of space
968cec2975fSGautam Ramakrishnan 					 * in queue
969cec2975fSGautam Ramakrishnan 					 */
970d4b36210SVijay Subramanian 	__u32 maxq;			/* maximum queue size */
971d4b36210SVijay Subramanian 	__u32 ecn_mark;			/* packets marked with ecn*/
972d4b36210SVijay Subramanian };
973585d763aSVinicius Costa Gomes 
974585d763aSVinicius Costa Gomes /* CBS */
975585d763aSVinicius Costa Gomes struct tc_cbs_qopt {
976585d763aSVinicius Costa Gomes 	__u8 offload;
977585d763aSVinicius Costa Gomes 	__u8 _pad[3];
978585d763aSVinicius Costa Gomes 	__s32 hicredit;
979585d763aSVinicius Costa Gomes 	__s32 locredit;
980585d763aSVinicius Costa Gomes 	__s32 idleslope;
981585d763aSVinicius Costa Gomes 	__s32 sendslope;
982585d763aSVinicius Costa Gomes };
983585d763aSVinicius Costa Gomes 
984585d763aSVinicius Costa Gomes enum {
985585d763aSVinicius Costa Gomes 	TCA_CBS_UNSPEC,
986585d763aSVinicius Costa Gomes 	TCA_CBS_PARMS,
987585d763aSVinicius Costa Gomes 	__TCA_CBS_MAX,
988585d763aSVinicius Costa Gomes };
989585d763aSVinicius Costa Gomes 
990585d763aSVinicius Costa Gomes #define TCA_CBS_MAX (__TCA_CBS_MAX - 1)
991585d763aSVinicius Costa Gomes 
99225db26a9SVinicius Costa Gomes 
99325db26a9SVinicius Costa Gomes /* ETF */
99425db26a9SVinicius Costa Gomes struct tc_etf_qopt {
99525db26a9SVinicius Costa Gomes 	__s32 delta;
99625db26a9SVinicius Costa Gomes 	__s32 clockid;
99725db26a9SVinicius Costa Gomes 	__u32 flags;
9989903c8dcSVedang Patel #define TC_ETF_DEADLINE_MODE_ON	_BITUL(0)
9999903c8dcSVedang Patel #define TC_ETF_OFFLOAD_ON	_BITUL(1)
1000d14d2b20SVedang Patel #define TC_ETF_SKIP_SOCK_CHECK	_BITUL(2)
100125db26a9SVinicius Costa Gomes };
100225db26a9SVinicius Costa Gomes 
100325db26a9SVinicius Costa Gomes enum {
100425db26a9SVinicius Costa Gomes 	TCA_ETF_UNSPEC,
100525db26a9SVinicius Costa Gomes 	TCA_ETF_PARMS,
100625db26a9SVinicius Costa Gomes 	__TCA_ETF_MAX,
100725db26a9SVinicius Costa Gomes };
100825db26a9SVinicius Costa Gomes 
100925db26a9SVinicius Costa Gomes #define TCA_ETF_MAX (__TCA_ETF_MAX - 1)
101025db26a9SVinicius Costa Gomes 
1011046f6fd5SToke Høiland-Jørgensen 
1012046f6fd5SToke Høiland-Jørgensen /* CAKE */
1013046f6fd5SToke Høiland-Jørgensen enum {
1014046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_UNSPEC,
1015046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_PAD,
1016046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_BASE_RATE64,
1017046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_DIFFSERV_MODE,
1018046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ATM,
1019046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_FLOW_MODE,
1020046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_OVERHEAD,
1021046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RTT,
1022046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TARGET,
1023046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_AUTORATE,
1024046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MEMORY,
1025046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_NAT,
1026046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RAW,
1027046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_WASH,
1028046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MPU,
1029046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_INGRESS,
1030046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ACK_FILTER,
1031046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_SPLIT_GSO,
10320b5c7efdSKevin Darbyshire-Bryant 	TCA_CAKE_FWMARK,
1033046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_MAX
1034046f6fd5SToke Høiland-Jørgensen };
1035046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_MAX	(__TCA_CAKE_MAX - 1)
1036046f6fd5SToke Høiland-Jørgensen 
1037046f6fd5SToke Høiland-Jørgensen enum {
1038046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_INVALID,
1039046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_PAD,
1040046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_CAPACITY_ESTIMATE64,
1041046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_LIMIT,
1042046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_USED,
1043046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_AVG_NETOFF,
1044046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_NETLEN,
1045046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_NETLEN,
1046046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_ADJLEN,
1047046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_ADJLEN,
1048046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_TIN_STATS,
1049046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DEFICIT,
1050046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_COBALT_COUNT,
1051046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROPPING,
1052046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROP_NEXT_US,
1053046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_P_DROP,
1054046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_BLUE_TIMER_US,
1055046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_MAX
1056046f6fd5SToke Høiland-Jørgensen };
1057046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
1058046f6fd5SToke Høiland-Jørgensen 
1059046f6fd5SToke Høiland-Jørgensen enum {
1060046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_INVALID,
1061046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PAD,
1062046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_PACKETS,
1063046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_BYTES64,
1064046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_PACKETS,
1065046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_BYTES64,
1066046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS,
1067046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64,
1068046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS,
1069046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64,
1070046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_PACKETS,
1071046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_BYTES,
1072046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_THRESHOLD_RATE64,
1073046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_TARGET_US,
1074046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_INTERVAL_US,
1075046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS,
1076046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_MISSES,
1077046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_COLLISIONS,
1078046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PEAK_DELAY_US,
1079046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_AVG_DELAY_US,
1080046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BASE_DELAY_US,
1081046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SPARSE_FLOWS,
1082046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BULK_FLOWS,
1083046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS,
1084046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_MAX_SKBLEN,
1085046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_FLOW_QUANTUM,
1086046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_MAX
1087046f6fd5SToke Høiland-Jørgensen };
1088046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1)
1089046f6fd5SToke Høiland-Jørgensen #define TC_CAKE_MAX_TINS (8)
1090046f6fd5SToke Høiland-Jørgensen 
1091046f6fd5SToke Høiland-Jørgensen enum {
1092046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_NONE = 0,
1093046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_SRC_IP,
1094046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DST_IP,
1095046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_HOSTS,    /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */
1096046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_FLOWS,
1097046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */
1098046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */
1099046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_TRIPLE,   /* = CAKE_FLOW_HOSTS  | CAKE_FLOW_FLOWS */
1100046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_MAX,
1101046f6fd5SToke Høiland-Jørgensen };
1102046f6fd5SToke Høiland-Jørgensen 
1103046f6fd5SToke Høiland-Jørgensen enum {
1104046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV3 = 0,
1105046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV4,
1106046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV8,
1107046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_BESTEFFORT,
1108046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_PRECEDENCE,
1109046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_MAX
1110046f6fd5SToke Høiland-Jørgensen };
1111046f6fd5SToke Høiland-Jørgensen 
1112046f6fd5SToke Høiland-Jørgensen enum {
1113046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_NONE = 0,
1114046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_FILTER,
1115046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_AGGRESSIVE,
1116046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_MAX
1117046f6fd5SToke Høiland-Jørgensen };
1118046f6fd5SToke Høiland-Jørgensen 
1119046f6fd5SToke Høiland-Jørgensen enum {
1120046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_NONE = 0,
1121046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_ATM,
1122046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_PTM,
1123046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_MAX
1124046f6fd5SToke Høiland-Jørgensen };
1125046f6fd5SToke Høiland-Jørgensen 
11265a781ccbSVinicius Costa Gomes 
11275a781ccbSVinicius Costa Gomes /* TAPRIO */
11285a781ccbSVinicius Costa Gomes enum {
11295a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_GATES = 0x00,
11305a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_HOLD = 0x01,
11315a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02,
11325a781ccbSVinicius Costa Gomes };
11335a781ccbSVinicius Costa Gomes 
11345a781ccbSVinicius Costa Gomes enum {
11355a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_UNSPEC,
11365a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */
11375a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */
11385a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */
11395a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */
11405a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_ENTRY_MAX,
11415a781ccbSVinicius Costa Gomes };
11425a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1)
11435a781ccbSVinicius Costa Gomes 
11445a781ccbSVinicius Costa Gomes /* The format for schedule entry list is:
11455a781ccbSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ENTRY_LIST]
11465a781ccbSVinicius Costa Gomes  *   [TCA_TAPRIO_SCHED_ENTRY]
11475a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_CMD]
11485a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_GATES]
11495a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_INTERVAL]
11505a781ccbSVinicius Costa Gomes  */
11515a781ccbSVinicius Costa Gomes enum {
11525a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_UNSPEC,
11535a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY,
11545a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_MAX,
11555a781ccbSVinicius Costa Gomes };
11565a781ccbSVinicius Costa Gomes 
11575a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1)
11585a781ccbSVinicius Costa Gomes 
1159a3d43c0dSVinicius Costa Gomes /* The format for the admin sched (dump only):
1160a3d43c0dSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ADMIN_SCHED]
1161a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_BASE_TIME]
1162a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]
1163a3d43c0dSVinicius Costa Gomes  *     [TCA_TAPRIO_ATTR_SCHED_ENTRY]
1164a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_CMD]
1165a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_GATES]
1166a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_INTERVAL]
1167a3d43c0dSVinicius Costa Gomes  */
1168a3d43c0dSVinicius Costa Gomes 
11699c66d156SVinicius Costa Gomes #define TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST	BIT(0)
11709c66d156SVinicius Costa Gomes #define TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD	BIT(1)
11714cfd5779SVedang Patel 
11725a781ccbSVinicius Costa Gomes enum {
11735a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_UNSPEC,
11745a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */
11755a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */
11765a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */
11775a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */
11785a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */
11795a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_PAD,
1180a3d43c0dSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_ADMIN_SCHED, /* The admin sched, only used in dump */
11816ca6a665SVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */
1182c25031e9SVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */
11834cfd5779SVedang Patel 	TCA_TAPRIO_ATTR_FLAGS, /* u32 */
1184a5b64700SVedang Patel 	TCA_TAPRIO_ATTR_TXTIME_DELAY, /* u32 */
11855a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_ATTR_MAX,
11865a781ccbSVinicius Costa Gomes };
11875a781ccbSVinicius Costa Gomes 
11885a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1)
11895a781ccbSVinicius Costa Gomes 
1190*dcc68b4dSPetr Machata /* ETS */
1191*dcc68b4dSPetr Machata 
1192*dcc68b4dSPetr Machata #define TCQ_ETS_MAX_BANDS 16
1193*dcc68b4dSPetr Machata 
1194*dcc68b4dSPetr Machata enum {
1195*dcc68b4dSPetr Machata 	TCA_ETS_UNSPEC,
1196*dcc68b4dSPetr Machata 	TCA_ETS_NBANDS,		/* u8 */
1197*dcc68b4dSPetr Machata 	TCA_ETS_NSTRICT,	/* u8 */
1198*dcc68b4dSPetr Machata 	TCA_ETS_QUANTA,		/* nested TCA_ETS_QUANTA_BAND */
1199*dcc68b4dSPetr Machata 	TCA_ETS_QUANTA_BAND,	/* u32 */
1200*dcc68b4dSPetr Machata 	TCA_ETS_PRIOMAP,	/* nested TCA_ETS_PRIOMAP_BAND */
1201*dcc68b4dSPetr Machata 	TCA_ETS_PRIOMAP_BAND,	/* u8 */
1202*dcc68b4dSPetr Machata 	__TCA_ETS_MAX,
1203*dcc68b4dSPetr Machata };
1204*dcc68b4dSPetr Machata 
1205*dcc68b4dSPetr Machata #define TCA_ETS_MAX (__TCA_ETS_MAX - 1)
1206*dcc68b4dSPetr Machata 
1207607ca46eSDavid Howells #endif
1208