xref: /linux/include/uapi/linux/pkt_sched.h (revision 6ca6a6654225f3cd001304d33429c817e0c0b85f)
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 
5607ca46eSDavid Howells #include <linux/types.h>
6607ca46eSDavid Howells 
7607ca46eSDavid Howells /* Logical priority bands not depending on specific packet scheduler.
8607ca46eSDavid Howells    Every scheduler will map them to real traffic classes, if it has
9607ca46eSDavid Howells    no more precise mechanism to classify packets.
10607ca46eSDavid Howells 
11607ca46eSDavid Howells    These numbers have no special meaning, though their coincidence
12607ca46eSDavid Howells    with obsolete IPv6 values is not occasional :-). New IPv6 drafts
13607ca46eSDavid Howells    preferred full anarchy inspired by diffserv group.
14607ca46eSDavid Howells 
15607ca46eSDavid Howells    Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
16607ca46eSDavid Howells    class, actually, as rule it will be handled with more care than
17607ca46eSDavid Howells    filler or even bulk.
18607ca46eSDavid Howells  */
19607ca46eSDavid Howells 
20607ca46eSDavid Howells #define TC_PRIO_BESTEFFORT		0
21607ca46eSDavid Howells #define TC_PRIO_FILLER			1
22607ca46eSDavid Howells #define TC_PRIO_BULK			2
23607ca46eSDavid Howells #define TC_PRIO_INTERACTIVE_BULK	4
24607ca46eSDavid Howells #define TC_PRIO_INTERACTIVE		6
25607ca46eSDavid Howells #define TC_PRIO_CONTROL			7
26607ca46eSDavid Howells 
27607ca46eSDavid Howells #define TC_PRIO_MAX			15
28607ca46eSDavid Howells 
29607ca46eSDavid Howells /* Generic queue statistics, available for all the elements.
30607ca46eSDavid Howells    Particular schedulers may have also their private records.
31607ca46eSDavid Howells  */
32607ca46eSDavid Howells 
33607ca46eSDavid Howells struct tc_stats {
34607ca46eSDavid Howells 	__u64	bytes;			/* Number of enqueued bytes */
35607ca46eSDavid Howells 	__u32	packets;		/* Number of enqueued packets	*/
36607ca46eSDavid Howells 	__u32	drops;			/* Packets dropped because of lack of resources */
37607ca46eSDavid Howells 	__u32	overlimits;		/* Number of throttle events when this
38607ca46eSDavid Howells 					 * flow goes out of allocated bandwidth */
39607ca46eSDavid Howells 	__u32	bps;			/* Current flow byte rate */
40607ca46eSDavid Howells 	__u32	pps;			/* Current flow packet rate */
41607ca46eSDavid Howells 	__u32	qlen;
42607ca46eSDavid Howells 	__u32	backlog;
43607ca46eSDavid Howells };
44607ca46eSDavid Howells 
45607ca46eSDavid Howells struct tc_estimator {
46607ca46eSDavid Howells 	signed char	interval;
47607ca46eSDavid Howells 	unsigned char	ewma_log;
48607ca46eSDavid Howells };
49607ca46eSDavid Howells 
50607ca46eSDavid Howells /* "Handles"
51607ca46eSDavid Howells    ---------
52607ca46eSDavid Howells 
53607ca46eSDavid Howells     All the traffic control objects have 32bit identifiers, or "handles".
54607ca46eSDavid Howells 
55607ca46eSDavid Howells     They can be considered as opaque numbers from user API viewpoint,
56607ca46eSDavid Howells     but actually they always consist of two fields: major and
57607ca46eSDavid Howells     minor numbers, which are interpreted by kernel specially,
58607ca46eSDavid Howells     that may be used by applications, though not recommended.
59607ca46eSDavid Howells 
60607ca46eSDavid Howells     F.e. qdisc handles always have minor number equal to zero,
61607ca46eSDavid Howells     classes (or flows) have major equal to parent qdisc major, and
62607ca46eSDavid Howells     minor uniquely identifying class inside qdisc.
63607ca46eSDavid Howells 
64607ca46eSDavid Howells     Macros to manipulate handles:
65607ca46eSDavid Howells  */
66607ca46eSDavid Howells 
67607ca46eSDavid Howells #define TC_H_MAJ_MASK (0xFFFF0000U)
68607ca46eSDavid Howells #define TC_H_MIN_MASK (0x0000FFFFU)
69607ca46eSDavid Howells #define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
70607ca46eSDavid Howells #define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
71607ca46eSDavid Howells #define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
72607ca46eSDavid Howells 
73607ca46eSDavid Howells #define TC_H_UNSPEC	(0U)
74607ca46eSDavid Howells #define TC_H_ROOT	(0xFFFFFFFFU)
75607ca46eSDavid Howells #define TC_H_INGRESS    (0xFFFFFFF1U)
761f211a1bSDaniel Borkmann #define TC_H_CLSACT	TC_H_INGRESS
771f211a1bSDaniel Borkmann 
7832302902SAlexander Duyck #define TC_H_MIN_PRIORITY	0xFFE0U
791f211a1bSDaniel Borkmann #define TC_H_MIN_INGRESS	0xFFF2U
801f211a1bSDaniel Borkmann #define TC_H_MIN_EGRESS		0xFFF3U
81607ca46eSDavid Howells 
828a8e3d84SJesper Dangaard Brouer /* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */
838a8e3d84SJesper Dangaard Brouer enum tc_link_layer {
848a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */
858a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_ETHERNET,
868a8e3d84SJesper Dangaard Brouer 	TC_LINKLAYER_ATM,
878a8e3d84SJesper Dangaard Brouer };
888a8e3d84SJesper Dangaard Brouer #define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */
898a8e3d84SJesper Dangaard Brouer 
90607ca46eSDavid Howells struct tc_ratespec {
91607ca46eSDavid Howells 	unsigned char	cell_log;
928a8e3d84SJesper Dangaard Brouer 	__u8		linklayer; /* lower 4 bits */
93607ca46eSDavid Howells 	unsigned short	overhead;
94607ca46eSDavid Howells 	short		cell_align;
95607ca46eSDavid Howells 	unsigned short	mpu;
96607ca46eSDavid Howells 	__u32		rate;
97607ca46eSDavid Howells };
98607ca46eSDavid Howells 
99607ca46eSDavid Howells #define TC_RTAB_SIZE	1024
100607ca46eSDavid Howells 
101607ca46eSDavid Howells struct tc_sizespec {
102607ca46eSDavid Howells 	unsigned char	cell_log;
103607ca46eSDavid Howells 	unsigned char	size_log;
104607ca46eSDavid Howells 	short		cell_align;
105607ca46eSDavid Howells 	int		overhead;
106607ca46eSDavid Howells 	unsigned int	linklayer;
107607ca46eSDavid Howells 	unsigned int	mpu;
108607ca46eSDavid Howells 	unsigned int	mtu;
109607ca46eSDavid Howells 	unsigned int	tsize;
110607ca46eSDavid Howells };
111607ca46eSDavid Howells 
112607ca46eSDavid Howells enum {
113607ca46eSDavid Howells 	TCA_STAB_UNSPEC,
114607ca46eSDavid Howells 	TCA_STAB_BASE,
115607ca46eSDavid Howells 	TCA_STAB_DATA,
116607ca46eSDavid Howells 	__TCA_STAB_MAX
117607ca46eSDavid Howells };
118607ca46eSDavid Howells 
119607ca46eSDavid Howells #define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
120607ca46eSDavid Howells 
121607ca46eSDavid Howells /* FIFO section */
122607ca46eSDavid Howells 
123607ca46eSDavid Howells struct tc_fifo_qopt {
124607ca46eSDavid Howells 	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
125607ca46eSDavid Howells };
126607ca46eSDavid Howells 
127aea5f654SNishanth Devarajan /* SKBPRIO section */
128aea5f654SNishanth Devarajan 
129aea5f654SNishanth Devarajan /*
130aea5f654SNishanth Devarajan  * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1).
131aea5f654SNishanth Devarajan  * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able
132aea5f654SNishanth Devarajan  * to map one to one the DS field of IPV4 and IPV6 headers.
133aea5f654SNishanth Devarajan  * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY.
134aea5f654SNishanth Devarajan  */
135aea5f654SNishanth Devarajan 
136aea5f654SNishanth Devarajan #define SKBPRIO_MAX_PRIORITY 64
137aea5f654SNishanth Devarajan 
138aea5f654SNishanth Devarajan struct tc_skbprio_qopt {
139aea5f654SNishanth Devarajan 	__u32	limit;		/* Queue length in packets. */
140aea5f654SNishanth Devarajan };
141aea5f654SNishanth Devarajan 
142607ca46eSDavid Howells /* PRIO section */
143607ca46eSDavid Howells 
144607ca46eSDavid Howells #define TCQ_PRIO_BANDS	16
145607ca46eSDavid Howells #define TCQ_MIN_PRIO_BANDS 2
146607ca46eSDavid Howells 
147607ca46eSDavid Howells struct tc_prio_qopt {
148607ca46eSDavid Howells 	int	bands;			/* Number of bands */
149607ca46eSDavid Howells 	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
150607ca46eSDavid Howells };
151607ca46eSDavid Howells 
152607ca46eSDavid Howells /* MULTIQ section */
153607ca46eSDavid Howells 
154607ca46eSDavid Howells struct tc_multiq_qopt {
155607ca46eSDavid Howells 	__u16	bands;			/* Number of bands */
156607ca46eSDavid Howells 	__u16	max_bands;		/* Maximum number of queues */
157607ca46eSDavid Howells };
158607ca46eSDavid Howells 
159607ca46eSDavid Howells /* PLUG section */
160607ca46eSDavid Howells 
161607ca46eSDavid Howells #define TCQ_PLUG_BUFFER                0
162607ca46eSDavid Howells #define TCQ_PLUG_RELEASE_ONE           1
163607ca46eSDavid Howells #define TCQ_PLUG_RELEASE_INDEFINITE    2
164607ca46eSDavid Howells #define TCQ_PLUG_LIMIT                 3
165607ca46eSDavid Howells 
166607ca46eSDavid Howells struct tc_plug_qopt {
167607ca46eSDavid Howells 	/* TCQ_PLUG_BUFFER: Inset a plug into the queue and
168607ca46eSDavid Howells 	 *  buffer any incoming packets
169607ca46eSDavid Howells 	 * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head
170607ca46eSDavid Howells 	 *   to beginning of the next plug.
171607ca46eSDavid Howells 	 * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue.
172607ca46eSDavid Howells 	 *   Stop buffering packets until the next TCQ_PLUG_BUFFER
173607ca46eSDavid Howells 	 *   command is received (just act as a pass-thru queue).
174607ca46eSDavid Howells 	 * TCQ_PLUG_LIMIT: Increase/decrease queue size
175607ca46eSDavid Howells 	 */
176607ca46eSDavid Howells 	int             action;
177607ca46eSDavid Howells 	__u32           limit;
178607ca46eSDavid Howells };
179607ca46eSDavid Howells 
180607ca46eSDavid Howells /* TBF section */
181607ca46eSDavid Howells 
182607ca46eSDavid Howells struct tc_tbf_qopt {
183607ca46eSDavid Howells 	struct tc_ratespec rate;
184607ca46eSDavid Howells 	struct tc_ratespec peakrate;
185607ca46eSDavid Howells 	__u32		limit;
186607ca46eSDavid Howells 	__u32		buffer;
187607ca46eSDavid Howells 	__u32		mtu;
188607ca46eSDavid Howells };
189607ca46eSDavid Howells 
190607ca46eSDavid Howells enum {
191607ca46eSDavid Howells 	TCA_TBF_UNSPEC,
192607ca46eSDavid Howells 	TCA_TBF_PARMS,
193607ca46eSDavid Howells 	TCA_TBF_RTAB,
194607ca46eSDavid Howells 	TCA_TBF_PTAB,
195a33c4a26SYang Yingliang 	TCA_TBF_RATE64,
196a33c4a26SYang Yingliang 	TCA_TBF_PRATE64,
1972e04ad42SYang Yingliang 	TCA_TBF_BURST,
1982e04ad42SYang Yingliang 	TCA_TBF_PBURST,
1992a51c1e8SNicolas Dichtel 	TCA_TBF_PAD,
200607ca46eSDavid Howells 	__TCA_TBF_MAX,
201607ca46eSDavid Howells };
202607ca46eSDavid Howells 
203607ca46eSDavid Howells #define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
204607ca46eSDavid Howells 
205607ca46eSDavid Howells 
206607ca46eSDavid Howells /* TEQL section */
207607ca46eSDavid Howells 
208607ca46eSDavid Howells /* TEQL does not require any parameters */
209607ca46eSDavid Howells 
210607ca46eSDavid Howells /* SFQ section */
211607ca46eSDavid Howells 
212607ca46eSDavid Howells struct tc_sfq_qopt {
213607ca46eSDavid Howells 	unsigned	quantum;	/* Bytes per round allocated to flow */
214607ca46eSDavid Howells 	int		perturb_period;	/* Period of hash perturbation */
215607ca46eSDavid Howells 	__u32		limit;		/* Maximal packets in queue */
216607ca46eSDavid Howells 	unsigned	divisor;	/* Hash divisor  */
217607ca46eSDavid Howells 	unsigned	flows;		/* Maximal number of flows  */
218607ca46eSDavid Howells };
219607ca46eSDavid Howells 
220607ca46eSDavid Howells struct tc_sfqred_stats {
221607ca46eSDavid Howells 	__u32           prob_drop;      /* Early drops, below max threshold */
222607ca46eSDavid Howells 	__u32           forced_drop;	/* Early drops, after max threshold */
223607ca46eSDavid Howells 	__u32           prob_mark;      /* Marked packets, below max threshold */
224607ca46eSDavid Howells 	__u32           forced_mark;    /* Marked packets, after max threshold */
225607ca46eSDavid Howells 	__u32           prob_mark_head; /* Marked packets, below max threshold */
226607ca46eSDavid Howells 	__u32           forced_mark_head;/* Marked packets, after max threshold */
227607ca46eSDavid Howells };
228607ca46eSDavid Howells 
229607ca46eSDavid Howells struct tc_sfq_qopt_v1 {
230607ca46eSDavid Howells 	struct tc_sfq_qopt v0;
231607ca46eSDavid Howells 	unsigned int	depth;		/* max number of packets per flow */
232607ca46eSDavid Howells 	unsigned int	headdrop;
233607ca46eSDavid Howells /* SFQRED parameters */
234607ca46eSDavid Howells 	__u32		limit;		/* HARD maximal flow queue length (bytes) */
235607ca46eSDavid Howells 	__u32		qth_min;	/* Min average length threshold (bytes) */
236607ca46eSDavid Howells 	__u32		qth_max;	/* Max average length threshold (bytes) */
237607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
238607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
239607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
240607ca46eSDavid Howells 	unsigned char	flags;
241607ca46eSDavid Howells 	__u32		max_P;		/* probability, high resolution */
242607ca46eSDavid Howells /* SFQRED stats */
243607ca46eSDavid Howells 	struct tc_sfqred_stats stats;
244607ca46eSDavid Howells };
245607ca46eSDavid Howells 
246607ca46eSDavid Howells 
247607ca46eSDavid Howells struct tc_sfq_xstats {
248607ca46eSDavid Howells 	__s32		allot;
249607ca46eSDavid Howells };
250607ca46eSDavid Howells 
251607ca46eSDavid Howells /* RED section */
252607ca46eSDavid Howells 
253607ca46eSDavid Howells enum {
254607ca46eSDavid Howells 	TCA_RED_UNSPEC,
255607ca46eSDavid Howells 	TCA_RED_PARMS,
256607ca46eSDavid Howells 	TCA_RED_STAB,
257607ca46eSDavid Howells 	TCA_RED_MAX_P,
258607ca46eSDavid Howells 	__TCA_RED_MAX,
259607ca46eSDavid Howells };
260607ca46eSDavid Howells 
261607ca46eSDavid Howells #define TCA_RED_MAX (__TCA_RED_MAX - 1)
262607ca46eSDavid Howells 
263607ca46eSDavid Howells struct tc_red_qopt {
264607ca46eSDavid Howells 	__u32		limit;		/* HARD maximal queue length (bytes)	*/
265607ca46eSDavid Howells 	__u32		qth_min;	/* Min average length threshold (bytes) */
266607ca46eSDavid Howells 	__u32		qth_max;	/* Max average length threshold (bytes) */
267607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
268607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
269607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
270607ca46eSDavid Howells 	unsigned char	flags;
271607ca46eSDavid Howells #define TC_RED_ECN		1
272607ca46eSDavid Howells #define TC_RED_HARDDROP		2
273607ca46eSDavid Howells #define TC_RED_ADAPTATIVE	4
274607ca46eSDavid Howells };
275607ca46eSDavid Howells 
276607ca46eSDavid Howells struct tc_red_xstats {
277607ca46eSDavid Howells 	__u32           early;          /* Early drops */
278607ca46eSDavid Howells 	__u32           pdrop;          /* Drops due to queue limits */
279607ca46eSDavid Howells 	__u32           other;          /* Drops due to drop() calls */
280607ca46eSDavid Howells 	__u32           marked;         /* Marked packets */
281607ca46eSDavid Howells };
282607ca46eSDavid Howells 
283607ca46eSDavid Howells /* GRED section */
284607ca46eSDavid Howells 
285607ca46eSDavid Howells #define MAX_DPs 16
286607ca46eSDavid Howells 
287607ca46eSDavid Howells enum {
288607ca46eSDavid Howells        TCA_GRED_UNSPEC,
289607ca46eSDavid Howells        TCA_GRED_PARMS,
290607ca46eSDavid Howells        TCA_GRED_STAB,
291607ca46eSDavid Howells        TCA_GRED_DPS,
292607ca46eSDavid Howells        TCA_GRED_MAX_P,
293a3eb95f8SDavid Ward        TCA_GRED_LIMIT,
29480e22e96SJakub Kicinski        TCA_GRED_VQ_LIST,	/* nested TCA_GRED_VQ_ENTRY */
295607ca46eSDavid Howells        __TCA_GRED_MAX,
296607ca46eSDavid Howells };
297607ca46eSDavid Howells 
298607ca46eSDavid Howells #define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
299607ca46eSDavid Howells 
30080e22e96SJakub Kicinski enum {
30180e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY_UNSPEC,
30280e22e96SJakub Kicinski 	TCA_GRED_VQ_ENTRY,	/* nested TCA_GRED_VQ_* */
30380e22e96SJakub Kicinski 	__TCA_GRED_VQ_ENTRY_MAX,
30480e22e96SJakub Kicinski };
30580e22e96SJakub Kicinski #define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1)
30680e22e96SJakub Kicinski 
30780e22e96SJakub Kicinski enum {
30880e22e96SJakub Kicinski 	TCA_GRED_VQ_UNSPEC,
30980e22e96SJakub Kicinski 	TCA_GRED_VQ_PAD,
31080e22e96SJakub Kicinski 	TCA_GRED_VQ_DP,			/* u32 */
31180e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BYTES,		/* u64 */
31280e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PACKETS,	/* u32 */
31380e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_BACKLOG,	/* u32 */
31480e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_DROP,	/* u32 */
31580e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PROB_MARK,	/* u32 */
31680e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_DROP,	/* u32 */
31780e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_FORCED_MARK,	/* u32 */
31880e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_PDROP,		/* u32 */
31980e22e96SJakub Kicinski 	TCA_GRED_VQ_STAT_OTHER,		/* u32 */
32072111015SJakub Kicinski 	TCA_GRED_VQ_FLAGS,		/* u32 */
32180e22e96SJakub Kicinski 	__TCA_GRED_VQ_MAX
32280e22e96SJakub Kicinski };
32380e22e96SJakub Kicinski 
32480e22e96SJakub Kicinski #define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1)
32580e22e96SJakub Kicinski 
326607ca46eSDavid Howells struct tc_gred_qopt {
327607ca46eSDavid Howells 	__u32		limit;        /* HARD maximal queue length (bytes)    */
328607ca46eSDavid Howells 	__u32		qth_min;      /* Min average length threshold (bytes) */
329607ca46eSDavid Howells 	__u32		qth_max;      /* Max average length threshold (bytes) */
330607ca46eSDavid Howells 	__u32		DP;           /* up to 2^32 DPs */
331607ca46eSDavid Howells 	__u32		backlog;
332607ca46eSDavid Howells 	__u32		qave;
333607ca46eSDavid Howells 	__u32		forced;
334607ca46eSDavid Howells 	__u32		early;
335607ca46eSDavid Howells 	__u32		other;
336607ca46eSDavid Howells 	__u32		pdrop;
337607ca46eSDavid Howells 	__u8		Wlog;         /* log(W)               */
338607ca46eSDavid Howells 	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
339607ca46eSDavid Howells 	__u8		Scell_log;    /* cell size for idle damping */
340607ca46eSDavid Howells 	__u8		prio;         /* prio of this VQ */
341607ca46eSDavid Howells 	__u32		packets;
342607ca46eSDavid Howells 	__u32		bytesin;
343607ca46eSDavid Howells };
344607ca46eSDavid Howells 
345607ca46eSDavid Howells /* gred setup */
346607ca46eSDavid Howells struct tc_gred_sopt {
347607ca46eSDavid Howells 	__u32		DPs;
348607ca46eSDavid Howells 	__u32		def_DP;
349607ca46eSDavid Howells 	__u8		grio;
350607ca46eSDavid Howells 	__u8		flags;
351607ca46eSDavid Howells 	__u16		pad1;
352607ca46eSDavid Howells };
353607ca46eSDavid Howells 
354607ca46eSDavid Howells /* CHOKe section */
355607ca46eSDavid Howells 
356607ca46eSDavid Howells enum {
357607ca46eSDavid Howells 	TCA_CHOKE_UNSPEC,
358607ca46eSDavid Howells 	TCA_CHOKE_PARMS,
359607ca46eSDavid Howells 	TCA_CHOKE_STAB,
360607ca46eSDavid Howells 	TCA_CHOKE_MAX_P,
361607ca46eSDavid Howells 	__TCA_CHOKE_MAX,
362607ca46eSDavid Howells };
363607ca46eSDavid Howells 
364607ca46eSDavid Howells #define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1)
365607ca46eSDavid Howells 
366607ca46eSDavid Howells struct tc_choke_qopt {
367607ca46eSDavid Howells 	__u32		limit;		/* Hard queue length (packets)	*/
368607ca46eSDavid Howells 	__u32		qth_min;	/* Min average threshold (packets) */
369607ca46eSDavid Howells 	__u32		qth_max;	/* Max average threshold (packets) */
370607ca46eSDavid Howells 	unsigned char   Wlog;		/* log(W)		*/
371607ca46eSDavid Howells 	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
372607ca46eSDavid Howells 	unsigned char   Scell_log;	/* cell size for idle damping */
373607ca46eSDavid Howells 	unsigned char	flags;		/* see RED flags */
374607ca46eSDavid Howells };
375607ca46eSDavid Howells 
376607ca46eSDavid Howells struct tc_choke_xstats {
377607ca46eSDavid Howells 	__u32		early;          /* Early drops */
378607ca46eSDavid Howells 	__u32		pdrop;          /* Drops due to queue limits */
379607ca46eSDavid Howells 	__u32		other;          /* Drops due to drop() calls */
380607ca46eSDavid Howells 	__u32		marked;         /* Marked packets */
381607ca46eSDavid Howells 	__u32		matched;	/* Drops due to flow match */
382607ca46eSDavid Howells };
383607ca46eSDavid Howells 
384607ca46eSDavid Howells /* HTB section */
385607ca46eSDavid Howells #define TC_HTB_NUMPRIO		8
386607ca46eSDavid Howells #define TC_HTB_MAXDEPTH		8
387607ca46eSDavid Howells #define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
388607ca46eSDavid Howells 
389607ca46eSDavid Howells struct tc_htb_opt {
390607ca46eSDavid Howells 	struct tc_ratespec 	rate;
391607ca46eSDavid Howells 	struct tc_ratespec 	ceil;
392607ca46eSDavid Howells 	__u32	buffer;
393607ca46eSDavid Howells 	__u32	cbuffer;
394607ca46eSDavid Howells 	__u32	quantum;
395607ca46eSDavid Howells 	__u32	level;		/* out only */
396607ca46eSDavid Howells 	__u32	prio;
397607ca46eSDavid Howells };
398607ca46eSDavid Howells struct tc_htb_glob {
399607ca46eSDavid Howells 	__u32 version;		/* to match HTB/TC */
400607ca46eSDavid Howells     	__u32 rate2quantum;	/* bps->quantum divisor */
401607ca46eSDavid Howells     	__u32 defcls;		/* default class number */
402607ca46eSDavid Howells 	__u32 debug;		/* debug flags */
403607ca46eSDavid Howells 
404607ca46eSDavid Howells 	/* stats */
405607ca46eSDavid Howells 	__u32 direct_pkts; /* count of non shaped packets */
406607ca46eSDavid Howells };
407607ca46eSDavid Howells enum {
408607ca46eSDavid Howells 	TCA_HTB_UNSPEC,
409607ca46eSDavid Howells 	TCA_HTB_PARMS,
410607ca46eSDavid Howells 	TCA_HTB_INIT,
411607ca46eSDavid Howells 	TCA_HTB_CTAB,
412607ca46eSDavid Howells 	TCA_HTB_RTAB,
4136906f4edSEric Dumazet 	TCA_HTB_DIRECT_QLEN,
414df62cdf3SEric Dumazet 	TCA_HTB_RATE64,
415df62cdf3SEric Dumazet 	TCA_HTB_CEIL64,
4162a51c1e8SNicolas Dichtel 	TCA_HTB_PAD,
417607ca46eSDavid Howells 	__TCA_HTB_MAX,
418607ca46eSDavid Howells };
419607ca46eSDavid Howells 
420607ca46eSDavid Howells #define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
421607ca46eSDavid Howells 
422607ca46eSDavid Howells struct tc_htb_xstats {
423607ca46eSDavid Howells 	__u32 lends;
424607ca46eSDavid Howells 	__u32 borrows;
425b9de3963SFlorent Fourcot 	__u32 giants;	/* unused since 'Make HTB scheduler work with TSO.' */
426b9de3963SFlorent Fourcot 	__s32 tokens;
427b9de3963SFlorent Fourcot 	__s32 ctokens;
428607ca46eSDavid Howells };
429607ca46eSDavid Howells 
430607ca46eSDavid Howells /* HFSC section */
431607ca46eSDavid Howells 
432607ca46eSDavid Howells struct tc_hfsc_qopt {
433607ca46eSDavid Howells 	__u16	defcls;		/* default class */
434607ca46eSDavid Howells };
435607ca46eSDavid Howells 
436607ca46eSDavid Howells struct tc_service_curve {
437607ca46eSDavid Howells 	__u32	m1;		/* slope of the first segment in bps */
438607ca46eSDavid Howells 	__u32	d;		/* x-projection of the first segment in us */
439607ca46eSDavid Howells 	__u32	m2;		/* slope of the second segment in bps */
440607ca46eSDavid Howells };
441607ca46eSDavid Howells 
442607ca46eSDavid Howells struct tc_hfsc_stats {
443607ca46eSDavid Howells 	__u64	work;		/* total work done */
444607ca46eSDavid Howells 	__u64	rtwork;		/* work done by real-time criteria */
445607ca46eSDavid Howells 	__u32	period;		/* current period */
446607ca46eSDavid Howells 	__u32	level;		/* class level in hierarchy */
447607ca46eSDavid Howells };
448607ca46eSDavid Howells 
449607ca46eSDavid Howells enum {
450607ca46eSDavid Howells 	TCA_HFSC_UNSPEC,
451607ca46eSDavid Howells 	TCA_HFSC_RSC,
452607ca46eSDavid Howells 	TCA_HFSC_FSC,
453607ca46eSDavid Howells 	TCA_HFSC_USC,
454607ca46eSDavid Howells 	__TCA_HFSC_MAX,
455607ca46eSDavid Howells };
456607ca46eSDavid Howells 
457607ca46eSDavid Howells #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
458607ca46eSDavid Howells 
459607ca46eSDavid Howells 
460607ca46eSDavid Howells /* CBQ section */
461607ca46eSDavid Howells 
462607ca46eSDavid Howells #define TC_CBQ_MAXPRIO		8
463607ca46eSDavid Howells #define TC_CBQ_MAXLEVEL		8
464607ca46eSDavid Howells #define TC_CBQ_DEF_EWMA		5
465607ca46eSDavid Howells 
466607ca46eSDavid Howells struct tc_cbq_lssopt {
467607ca46eSDavid Howells 	unsigned char	change;
468607ca46eSDavid Howells 	unsigned char	flags;
469607ca46eSDavid Howells #define TCF_CBQ_LSS_BOUNDED	1
470607ca46eSDavid Howells #define TCF_CBQ_LSS_ISOLATED	2
471607ca46eSDavid Howells 	unsigned char  	ewma_log;
472607ca46eSDavid Howells 	unsigned char  	level;
473607ca46eSDavid Howells #define TCF_CBQ_LSS_FLAGS	1
474607ca46eSDavid Howells #define TCF_CBQ_LSS_EWMA	2
475607ca46eSDavid Howells #define TCF_CBQ_LSS_MAXIDLE	4
476607ca46eSDavid Howells #define TCF_CBQ_LSS_MINIDLE	8
477607ca46eSDavid Howells #define TCF_CBQ_LSS_OFFTIME	0x10
478607ca46eSDavid Howells #define TCF_CBQ_LSS_AVPKT	0x20
479607ca46eSDavid Howells 	__u32		maxidle;
480607ca46eSDavid Howells 	__u32		minidle;
481607ca46eSDavid Howells 	__u32		offtime;
482607ca46eSDavid Howells 	__u32		avpkt;
483607ca46eSDavid Howells };
484607ca46eSDavid Howells 
485607ca46eSDavid Howells struct tc_cbq_wrropt {
486607ca46eSDavid Howells 	unsigned char	flags;
487607ca46eSDavid Howells 	unsigned char	priority;
488607ca46eSDavid Howells 	unsigned char	cpriority;
489607ca46eSDavid Howells 	unsigned char	__reserved;
490607ca46eSDavid Howells 	__u32		allot;
491607ca46eSDavid Howells 	__u32		weight;
492607ca46eSDavid Howells };
493607ca46eSDavid Howells 
494607ca46eSDavid Howells struct tc_cbq_ovl {
495607ca46eSDavid Howells 	unsigned char	strategy;
496607ca46eSDavid Howells #define	TC_CBQ_OVL_CLASSIC	0
497607ca46eSDavid Howells #define	TC_CBQ_OVL_DELAY	1
498607ca46eSDavid Howells #define	TC_CBQ_OVL_LOWPRIO	2
499607ca46eSDavid Howells #define	TC_CBQ_OVL_DROP		3
500607ca46eSDavid Howells #define	TC_CBQ_OVL_RCLASSIC	4
501607ca46eSDavid Howells 	unsigned char	priority2;
502607ca46eSDavid Howells 	__u16		pad;
503607ca46eSDavid Howells 	__u32		penalty;
504607ca46eSDavid Howells };
505607ca46eSDavid Howells 
506607ca46eSDavid Howells struct tc_cbq_police {
507607ca46eSDavid Howells 	unsigned char	police;
508607ca46eSDavid Howells 	unsigned char	__res1;
509607ca46eSDavid Howells 	unsigned short	__res2;
510607ca46eSDavid Howells };
511607ca46eSDavid Howells 
512607ca46eSDavid Howells struct tc_cbq_fopt {
513607ca46eSDavid Howells 	__u32		split;
514607ca46eSDavid Howells 	__u32		defmap;
515607ca46eSDavid Howells 	__u32		defchange;
516607ca46eSDavid Howells };
517607ca46eSDavid Howells 
518607ca46eSDavid Howells struct tc_cbq_xstats {
519607ca46eSDavid Howells 	__u32		borrows;
520607ca46eSDavid Howells 	__u32		overactions;
521607ca46eSDavid Howells 	__s32		avgidle;
522607ca46eSDavid Howells 	__s32		undertime;
523607ca46eSDavid Howells };
524607ca46eSDavid Howells 
525607ca46eSDavid Howells enum {
526607ca46eSDavid Howells 	TCA_CBQ_UNSPEC,
527607ca46eSDavid Howells 	TCA_CBQ_LSSOPT,
528607ca46eSDavid Howells 	TCA_CBQ_WRROPT,
529607ca46eSDavid Howells 	TCA_CBQ_FOPT,
530607ca46eSDavid Howells 	TCA_CBQ_OVL_STRATEGY,
531607ca46eSDavid Howells 	TCA_CBQ_RATE,
532607ca46eSDavid Howells 	TCA_CBQ_RTAB,
533607ca46eSDavid Howells 	TCA_CBQ_POLICE,
534607ca46eSDavid Howells 	__TCA_CBQ_MAX,
535607ca46eSDavid Howells };
536607ca46eSDavid Howells 
537607ca46eSDavid Howells #define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
538607ca46eSDavid Howells 
539607ca46eSDavid Howells /* dsmark section */
540607ca46eSDavid Howells 
541607ca46eSDavid Howells enum {
542607ca46eSDavid Howells 	TCA_DSMARK_UNSPEC,
543607ca46eSDavid Howells 	TCA_DSMARK_INDICES,
544607ca46eSDavid Howells 	TCA_DSMARK_DEFAULT_INDEX,
545607ca46eSDavid Howells 	TCA_DSMARK_SET_TC_INDEX,
546607ca46eSDavid Howells 	TCA_DSMARK_MASK,
547607ca46eSDavid Howells 	TCA_DSMARK_VALUE,
548607ca46eSDavid Howells 	__TCA_DSMARK_MAX,
549607ca46eSDavid Howells };
550607ca46eSDavid Howells 
551607ca46eSDavid Howells #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
552607ca46eSDavid Howells 
553607ca46eSDavid Howells /* ATM  section */
554607ca46eSDavid Howells 
555607ca46eSDavid Howells enum {
556607ca46eSDavid Howells 	TCA_ATM_UNSPEC,
557607ca46eSDavid Howells 	TCA_ATM_FD,		/* file/socket descriptor */
558607ca46eSDavid Howells 	TCA_ATM_PTR,		/* pointer to descriptor - later */
559607ca46eSDavid Howells 	TCA_ATM_HDR,		/* LL header */
560607ca46eSDavid Howells 	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
561607ca46eSDavid Howells 	TCA_ATM_ADDR,		/* PVC address (for output only) */
562607ca46eSDavid Howells 	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
563607ca46eSDavid Howells 	__TCA_ATM_MAX,
564607ca46eSDavid Howells };
565607ca46eSDavid Howells 
566607ca46eSDavid Howells #define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
567607ca46eSDavid Howells 
568607ca46eSDavid Howells /* Network emulator */
569607ca46eSDavid Howells 
570607ca46eSDavid Howells enum {
571607ca46eSDavid Howells 	TCA_NETEM_UNSPEC,
572607ca46eSDavid Howells 	TCA_NETEM_CORR,
573607ca46eSDavid Howells 	TCA_NETEM_DELAY_DIST,
574607ca46eSDavid Howells 	TCA_NETEM_REORDER,
575607ca46eSDavid Howells 	TCA_NETEM_CORRUPT,
576607ca46eSDavid Howells 	TCA_NETEM_LOSS,
577607ca46eSDavid Howells 	TCA_NETEM_RATE,
578607ca46eSDavid Howells 	TCA_NETEM_ECN,
5796a031f67SYang Yingliang 	TCA_NETEM_RATE64,
5802a51c1e8SNicolas Dichtel 	TCA_NETEM_PAD,
58199803171SDave Taht 	TCA_NETEM_LATENCY64,
58299803171SDave Taht 	TCA_NETEM_JITTER64,
583836af83bSDave Taht 	TCA_NETEM_SLOT,
5840a9fe5c3SYousuk Seung 	TCA_NETEM_SLOT_DIST,
585607ca46eSDavid Howells 	__TCA_NETEM_MAX,
586607ca46eSDavid Howells };
587607ca46eSDavid Howells 
588607ca46eSDavid Howells #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
589607ca46eSDavid Howells 
590607ca46eSDavid Howells struct tc_netem_qopt {
591607ca46eSDavid Howells 	__u32	latency;	/* added delay (us) */
592607ca46eSDavid Howells 	__u32   limit;		/* fifo limit (packets) */
593607ca46eSDavid Howells 	__u32	loss;		/* random packet loss (0=none ~0=100%) */
594607ca46eSDavid Howells 	__u32	gap;		/* re-ordering gap (0 for none) */
595607ca46eSDavid Howells 	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
596607ca46eSDavid Howells 	__u32	jitter;		/* random jitter in latency (us) */
597607ca46eSDavid Howells };
598607ca46eSDavid Howells 
599607ca46eSDavid Howells struct tc_netem_corr {
600607ca46eSDavid Howells 	__u32	delay_corr;	/* delay correlation */
601607ca46eSDavid Howells 	__u32	loss_corr;	/* packet loss correlation */
602607ca46eSDavid Howells 	__u32	dup_corr;	/* duplicate correlation  */
603607ca46eSDavid Howells };
604607ca46eSDavid Howells 
605607ca46eSDavid Howells struct tc_netem_reorder {
606607ca46eSDavid Howells 	__u32	probability;
607607ca46eSDavid Howells 	__u32	correlation;
608607ca46eSDavid Howells };
609607ca46eSDavid Howells 
610607ca46eSDavid Howells struct tc_netem_corrupt {
611607ca46eSDavid Howells 	__u32	probability;
612607ca46eSDavid Howells 	__u32	correlation;
613607ca46eSDavid Howells };
614607ca46eSDavid Howells 
615607ca46eSDavid Howells struct tc_netem_rate {
616607ca46eSDavid Howells 	__u32	rate;	/* byte/s */
617607ca46eSDavid Howells 	__s32	packet_overhead;
618607ca46eSDavid Howells 	__u32	cell_size;
619607ca46eSDavid Howells 	__s32	cell_overhead;
620607ca46eSDavid Howells };
621607ca46eSDavid Howells 
622836af83bSDave Taht struct tc_netem_slot {
623836af83bSDave Taht 	__s64   min_delay; /* nsec */
624836af83bSDave Taht 	__s64   max_delay;
625836af83bSDave Taht 	__s32   max_packets;
626836af83bSDave Taht 	__s32   max_bytes;
6270a9fe5c3SYousuk Seung 	__s64	dist_delay; /* nsec */
6280a9fe5c3SYousuk Seung 	__s64	dist_jitter; /* nsec */
629836af83bSDave Taht };
630836af83bSDave Taht 
631607ca46eSDavid Howells enum {
632607ca46eSDavid Howells 	NETEM_LOSS_UNSPEC,
633607ca46eSDavid Howells 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
634607ca46eSDavid Howells 	NETEM_LOSS_GE,		/* Gilbert Elliot models */
635607ca46eSDavid Howells 	__NETEM_LOSS_MAX
636607ca46eSDavid Howells };
637607ca46eSDavid Howells #define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1)
638607ca46eSDavid Howells 
639607ca46eSDavid Howells /* State transition probabilities for 4 state model */
640607ca46eSDavid Howells struct tc_netem_gimodel {
641607ca46eSDavid Howells 	__u32	p13;
642607ca46eSDavid Howells 	__u32	p31;
643607ca46eSDavid Howells 	__u32	p32;
644607ca46eSDavid Howells 	__u32	p14;
645607ca46eSDavid Howells 	__u32	p23;
646607ca46eSDavid Howells };
647607ca46eSDavid Howells 
648607ca46eSDavid Howells /* Gilbert-Elliot models */
649607ca46eSDavid Howells struct tc_netem_gemodel {
650607ca46eSDavid Howells 	__u32 p;
651607ca46eSDavid Howells 	__u32 r;
652607ca46eSDavid Howells 	__u32 h;
653607ca46eSDavid Howells 	__u32 k1;
654607ca46eSDavid Howells };
655607ca46eSDavid Howells 
656607ca46eSDavid Howells #define NETEM_DIST_SCALE	8192
657607ca46eSDavid Howells #define NETEM_DIST_MAX		16384
658607ca46eSDavid Howells 
659607ca46eSDavid Howells /* DRR */
660607ca46eSDavid Howells 
661607ca46eSDavid Howells enum {
662607ca46eSDavid Howells 	TCA_DRR_UNSPEC,
663607ca46eSDavid Howells 	TCA_DRR_QUANTUM,
664607ca46eSDavid Howells 	__TCA_DRR_MAX
665607ca46eSDavid Howells };
666607ca46eSDavid Howells 
667607ca46eSDavid Howells #define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
668607ca46eSDavid Howells 
669607ca46eSDavid Howells struct tc_drr_stats {
670607ca46eSDavid Howells 	__u32	deficit;
671607ca46eSDavid Howells };
672607ca46eSDavid Howells 
673607ca46eSDavid Howells /* MQPRIO */
674607ca46eSDavid Howells #define TC_QOPT_BITMASK 15
675607ca46eSDavid Howells #define TC_QOPT_MAX_QUEUE 16
676607ca46eSDavid Howells 
6772026fecfSAlexander Duyck enum {
6782026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_NONE,	/* no offload requested */
6792026fecfSAlexander Duyck 	TC_MQPRIO_HW_OFFLOAD_TCS,	/* offload TCs, no queue counts */
6802026fecfSAlexander Duyck 	__TC_MQPRIO_HW_OFFLOAD_MAX
6812026fecfSAlexander Duyck };
6822026fecfSAlexander Duyck 
6832026fecfSAlexander Duyck #define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1)
6842026fecfSAlexander Duyck 
6854e8b86c0SAmritha Nambiar enum {
6864e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_DCB,
6874e8b86c0SAmritha Nambiar 	TC_MQPRIO_MODE_CHANNEL,
6884e8b86c0SAmritha Nambiar 	__TC_MQPRIO_MODE_MAX
6894e8b86c0SAmritha Nambiar };
6904e8b86c0SAmritha Nambiar 
6914e8b86c0SAmritha Nambiar #define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1)
6924e8b86c0SAmritha Nambiar 
6934e8b86c0SAmritha Nambiar enum {
6944e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_DCB,
6954e8b86c0SAmritha Nambiar 	TC_MQPRIO_SHAPER_BW_RATE,	/* Add new shapers below */
6964e8b86c0SAmritha Nambiar 	__TC_MQPRIO_SHAPER_MAX
6974e8b86c0SAmritha Nambiar };
6984e8b86c0SAmritha Nambiar 
6994e8b86c0SAmritha Nambiar #define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1)
7004e8b86c0SAmritha Nambiar 
701607ca46eSDavid Howells struct tc_mqprio_qopt {
702607ca46eSDavid Howells 	__u8	num_tc;
703607ca46eSDavid Howells 	__u8	prio_tc_map[TC_QOPT_BITMASK + 1];
704607ca46eSDavid Howells 	__u8	hw;
705607ca46eSDavid Howells 	__u16	count[TC_QOPT_MAX_QUEUE];
706607ca46eSDavid Howells 	__u16	offset[TC_QOPT_MAX_QUEUE];
707607ca46eSDavid Howells };
708607ca46eSDavid Howells 
7094e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MODE		0x1
7104e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_SHAPER		0x2
7114e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MIN_RATE		0x4
7124e8b86c0SAmritha Nambiar #define TC_MQPRIO_F_MAX_RATE		0x8
7134e8b86c0SAmritha Nambiar 
7144e8b86c0SAmritha Nambiar enum {
7154e8b86c0SAmritha Nambiar 	TCA_MQPRIO_UNSPEC,
7164e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MODE,
7174e8b86c0SAmritha Nambiar 	TCA_MQPRIO_SHAPER,
7184e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MIN_RATE64,
7194e8b86c0SAmritha Nambiar 	TCA_MQPRIO_MAX_RATE64,
7204e8b86c0SAmritha Nambiar 	__TCA_MQPRIO_MAX,
7214e8b86c0SAmritha Nambiar };
7224e8b86c0SAmritha Nambiar 
7234e8b86c0SAmritha Nambiar #define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1)
7244e8b86c0SAmritha Nambiar 
725607ca46eSDavid Howells /* SFB */
726607ca46eSDavid Howells 
727607ca46eSDavid Howells enum {
728607ca46eSDavid Howells 	TCA_SFB_UNSPEC,
729607ca46eSDavid Howells 	TCA_SFB_PARMS,
730607ca46eSDavid Howells 	__TCA_SFB_MAX,
731607ca46eSDavid Howells };
732607ca46eSDavid Howells 
733607ca46eSDavid Howells #define TCA_SFB_MAX (__TCA_SFB_MAX - 1)
734607ca46eSDavid Howells 
735607ca46eSDavid Howells /*
736607ca46eSDavid Howells  * Note: increment, decrement are Q0.16 fixed-point values.
737607ca46eSDavid Howells  */
738607ca46eSDavid Howells struct tc_sfb_qopt {
739607ca46eSDavid Howells 	__u32 rehash_interval;	/* delay between hash move, in ms */
740607ca46eSDavid Howells 	__u32 warmup_time;	/* double buffering warmup time in ms (warmup_time < rehash_interval) */
741607ca46eSDavid Howells 	__u32 max;		/* max len of qlen_min */
742607ca46eSDavid Howells 	__u32 bin_size;		/* maximum queue length per bin */
743607ca46eSDavid Howells 	__u32 increment;	/* probability increment, (d1 in Blue) */
744607ca46eSDavid Howells 	__u32 decrement;	/* probability decrement, (d2 in Blue) */
745607ca46eSDavid Howells 	__u32 limit;		/* max SFB queue length */
746607ca46eSDavid Howells 	__u32 penalty_rate;	/* inelastic flows are rate limited to 'rate' pps */
747607ca46eSDavid Howells 	__u32 penalty_burst;
748607ca46eSDavid Howells };
749607ca46eSDavid Howells 
750607ca46eSDavid Howells struct tc_sfb_xstats {
751607ca46eSDavid Howells 	__u32 earlydrop;
752607ca46eSDavid Howells 	__u32 penaltydrop;
753607ca46eSDavid Howells 	__u32 bucketdrop;
754607ca46eSDavid Howells 	__u32 queuedrop;
755607ca46eSDavid Howells 	__u32 childdrop; /* drops in child qdisc */
756607ca46eSDavid Howells 	__u32 marked;
757607ca46eSDavid Howells 	__u32 maxqlen;
758607ca46eSDavid Howells 	__u32 maxprob;
759607ca46eSDavid Howells 	__u32 avgprob;
760607ca46eSDavid Howells };
761607ca46eSDavid Howells 
762607ca46eSDavid Howells #define SFB_MAX_PROB 0xFFFF
763607ca46eSDavid Howells 
764607ca46eSDavid Howells /* QFQ */
765607ca46eSDavid Howells enum {
766607ca46eSDavid Howells 	TCA_QFQ_UNSPEC,
767607ca46eSDavid Howells 	TCA_QFQ_WEIGHT,
768607ca46eSDavid Howells 	TCA_QFQ_LMAX,
769607ca46eSDavid Howells 	__TCA_QFQ_MAX
770607ca46eSDavid Howells };
771607ca46eSDavid Howells 
772607ca46eSDavid Howells #define TCA_QFQ_MAX	(__TCA_QFQ_MAX - 1)
773607ca46eSDavid Howells 
774607ca46eSDavid Howells struct tc_qfq_stats {
775607ca46eSDavid Howells 	__u32 weight;
776607ca46eSDavid Howells 	__u32 lmax;
777607ca46eSDavid Howells };
778607ca46eSDavid Howells 
779607ca46eSDavid Howells /* CODEL */
780607ca46eSDavid Howells 
781607ca46eSDavid Howells enum {
782607ca46eSDavid Howells 	TCA_CODEL_UNSPEC,
783607ca46eSDavid Howells 	TCA_CODEL_TARGET,
784607ca46eSDavid Howells 	TCA_CODEL_LIMIT,
785607ca46eSDavid Howells 	TCA_CODEL_INTERVAL,
786607ca46eSDavid Howells 	TCA_CODEL_ECN,
78780ba92faSEric Dumazet 	TCA_CODEL_CE_THRESHOLD,
788607ca46eSDavid Howells 	__TCA_CODEL_MAX
789607ca46eSDavid Howells };
790607ca46eSDavid Howells 
791607ca46eSDavid Howells #define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
792607ca46eSDavid Howells 
793607ca46eSDavid Howells struct tc_codel_xstats {
794607ca46eSDavid Howells 	__u32	maxpacket; /* largest packet we've seen so far */
795607ca46eSDavid Howells 	__u32	count;	   /* how many drops we've done since the last time we
796607ca46eSDavid Howells 			    * entered dropping state
797607ca46eSDavid Howells 			    */
798607ca46eSDavid Howells 	__u32	lastcount; /* count at entry to dropping state */
799607ca46eSDavid Howells 	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
800607ca46eSDavid Howells 	__s32	drop_next; /* time to drop next packet */
801607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
802607ca46eSDavid Howells 	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
803607ca46eSDavid Howells 	__u32	dropping;  /* are we in dropping state ? */
80480ba92faSEric Dumazet 	__u32	ce_mark;   /* number of CE marked packets because of ce_threshold */
805607ca46eSDavid Howells };
806607ca46eSDavid Howells 
807607ca46eSDavid Howells /* FQ_CODEL */
808607ca46eSDavid Howells 
809607ca46eSDavid Howells enum {
810607ca46eSDavid Howells 	TCA_FQ_CODEL_UNSPEC,
811607ca46eSDavid Howells 	TCA_FQ_CODEL_TARGET,
812607ca46eSDavid Howells 	TCA_FQ_CODEL_LIMIT,
813607ca46eSDavid Howells 	TCA_FQ_CODEL_INTERVAL,
814607ca46eSDavid Howells 	TCA_FQ_CODEL_ECN,
815607ca46eSDavid Howells 	TCA_FQ_CODEL_FLOWS,
816607ca46eSDavid Howells 	TCA_FQ_CODEL_QUANTUM,
81780ba92faSEric Dumazet 	TCA_FQ_CODEL_CE_THRESHOLD,
8189d18562aSEric Dumazet 	TCA_FQ_CODEL_DROP_BATCH_SIZE,
81995b58430SEric Dumazet 	TCA_FQ_CODEL_MEMORY_LIMIT,
820607ca46eSDavid Howells 	__TCA_FQ_CODEL_MAX
821607ca46eSDavid Howells };
822607ca46eSDavid Howells 
823607ca46eSDavid Howells #define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
824607ca46eSDavid Howells 
825607ca46eSDavid Howells enum {
826607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_QDISC,
827607ca46eSDavid Howells 	TCA_FQ_CODEL_XSTATS_CLASS,
828607ca46eSDavid Howells };
829607ca46eSDavid Howells 
830607ca46eSDavid Howells struct tc_fq_codel_qd_stats {
831607ca46eSDavid Howells 	__u32	maxpacket;	/* largest packet we've seen so far */
832607ca46eSDavid Howells 	__u32	drop_overlimit; /* number of time max qdisc
833607ca46eSDavid Howells 				 * packet limit was hit
834607ca46eSDavid Howells 				 */
835607ca46eSDavid Howells 	__u32	ecn_mark;	/* number of packets we ECN marked
836607ca46eSDavid Howells 				 * instead of being dropped
837607ca46eSDavid Howells 				 */
838607ca46eSDavid Howells 	__u32	new_flow_count; /* number of time packets
839607ca46eSDavid Howells 				 * created a 'new flow'
840607ca46eSDavid Howells 				 */
841607ca46eSDavid Howells 	__u32	new_flows_len;	/* count of flows in new list */
842607ca46eSDavid Howells 	__u32	old_flows_len;	/* count of flows in old list */
84380ba92faSEric Dumazet 	__u32	ce_mark;	/* packets above ce_threshold */
84495b58430SEric Dumazet 	__u32	memory_usage;	/* in bytes */
84595b58430SEric Dumazet 	__u32	drop_overmemory;
846607ca46eSDavid Howells };
847607ca46eSDavid Howells 
848607ca46eSDavid Howells struct tc_fq_codel_cl_stats {
849607ca46eSDavid Howells 	__s32	deficit;
850607ca46eSDavid Howells 	__u32	ldelay;		/* in-queue delay seen by most recently
851607ca46eSDavid Howells 				 * dequeued packet
852607ca46eSDavid Howells 				 */
853607ca46eSDavid Howells 	__u32	count;
854607ca46eSDavid Howells 	__u32	lastcount;
855607ca46eSDavid Howells 	__u32	dropping;
856607ca46eSDavid Howells 	__s32	drop_next;
857607ca46eSDavid Howells };
858607ca46eSDavid Howells 
859607ca46eSDavid Howells struct tc_fq_codel_xstats {
860607ca46eSDavid Howells 	__u32	type;
861607ca46eSDavid Howells 	union {
862607ca46eSDavid Howells 		struct tc_fq_codel_qd_stats qdisc_stats;
863607ca46eSDavid Howells 		struct tc_fq_codel_cl_stats class_stats;
864607ca46eSDavid Howells 	};
865607ca46eSDavid Howells };
866607ca46eSDavid Howells 
867afe4fd06SEric Dumazet /* FQ */
868afe4fd06SEric Dumazet 
869afe4fd06SEric Dumazet enum {
870afe4fd06SEric Dumazet 	TCA_FQ_UNSPEC,
871afe4fd06SEric Dumazet 
872afe4fd06SEric Dumazet 	TCA_FQ_PLIMIT,		/* limit of total number of packets in queue */
873afe4fd06SEric Dumazet 
874afe4fd06SEric Dumazet 	TCA_FQ_FLOW_PLIMIT,	/* limit of packets per flow */
875afe4fd06SEric Dumazet 
876afe4fd06SEric Dumazet 	TCA_FQ_QUANTUM,		/* RR quantum */
877afe4fd06SEric Dumazet 
878afe4fd06SEric Dumazet 	TCA_FQ_INITIAL_QUANTUM,		/* RR quantum for new flow */
879afe4fd06SEric Dumazet 
880afe4fd06SEric Dumazet 	TCA_FQ_RATE_ENABLE,	/* enable/disable rate limiting */
881afe4fd06SEric Dumazet 
88265c5189aSEric Dumazet 	TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */
883afe4fd06SEric Dumazet 
884afe4fd06SEric Dumazet 	TCA_FQ_FLOW_MAX_RATE,	/* per flow max rate */
885afe4fd06SEric Dumazet 
886afe4fd06SEric Dumazet 	TCA_FQ_BUCKETS_LOG,	/* log2(number of buckets) */
887f52ed899SEric Dumazet 
888f52ed899SEric Dumazet 	TCA_FQ_FLOW_REFILL_DELAY,	/* flow credit refill delay in usec */
889f52ed899SEric Dumazet 
89006eb395fSEric Dumazet 	TCA_FQ_ORPHAN_MASK,	/* mask applied to orphaned skb hashes */
89106eb395fSEric Dumazet 
89277879147SEric Dumazet 	TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */
89377879147SEric Dumazet 
89448872c11SEric Dumazet 	TCA_FQ_CE_THRESHOLD,	/* DCTCP-like CE-marking threshold */
89548872c11SEric Dumazet 
896afe4fd06SEric Dumazet 	__TCA_FQ_MAX
897afe4fd06SEric Dumazet };
898afe4fd06SEric Dumazet 
899afe4fd06SEric Dumazet #define TCA_FQ_MAX	(__TCA_FQ_MAX - 1)
900afe4fd06SEric Dumazet 
901afe4fd06SEric Dumazet struct tc_fq_qd_stats {
902afe4fd06SEric Dumazet 	__u64	gc_flows;
903afe4fd06SEric Dumazet 	__u64	highprio_packets;
904afe4fd06SEric Dumazet 	__u64	tcp_retrans;
905afe4fd06SEric Dumazet 	__u64	throttled;
906afe4fd06SEric Dumazet 	__u64	flows_plimit;
907afe4fd06SEric Dumazet 	__u64	pkts_too_long;
908afe4fd06SEric Dumazet 	__u64	allocation_errors;
909afe4fd06SEric Dumazet 	__s64	time_next_delayed_flow;
910afe4fd06SEric Dumazet 	__u32	flows;
911afe4fd06SEric Dumazet 	__u32	inactive_flows;
912afe4fd06SEric Dumazet 	__u32	throttled_flows;
913fefa569aSEric Dumazet 	__u32	unthrottle_latency_ns;
91448872c11SEric Dumazet 	__u64	ce_mark;		/* packets above ce_threshold */
915afe4fd06SEric Dumazet };
91610239edfSTerry Lam 
91710239edfSTerry Lam /* Heavy-Hitter Filter */
91810239edfSTerry Lam 
91910239edfSTerry Lam enum {
92010239edfSTerry Lam 	TCA_HHF_UNSPEC,
92110239edfSTerry Lam 	TCA_HHF_BACKLOG_LIMIT,
92210239edfSTerry Lam 	TCA_HHF_QUANTUM,
92310239edfSTerry Lam 	TCA_HHF_HH_FLOWS_LIMIT,
92410239edfSTerry Lam 	TCA_HHF_RESET_TIMEOUT,
92510239edfSTerry Lam 	TCA_HHF_ADMIT_BYTES,
92610239edfSTerry Lam 	TCA_HHF_EVICT_TIMEOUT,
92710239edfSTerry Lam 	TCA_HHF_NON_HH_WEIGHT,
92810239edfSTerry Lam 	__TCA_HHF_MAX
92910239edfSTerry Lam };
93010239edfSTerry Lam 
93110239edfSTerry Lam #define TCA_HHF_MAX	(__TCA_HHF_MAX - 1)
93210239edfSTerry Lam 
93310239edfSTerry Lam struct tc_hhf_xstats {
93410239edfSTerry Lam 	__u32	drop_overlimit; /* number of times max qdisc packet limit
93510239edfSTerry Lam 				 * was hit
93610239edfSTerry Lam 				 */
93710239edfSTerry Lam 	__u32	hh_overlimit;   /* number of times max heavy-hitters was hit */
93810239edfSTerry Lam 	__u32	hh_tot_count;   /* number of captured heavy-hitters so far */
93910239edfSTerry Lam 	__u32	hh_cur_count;   /* number of current heavy-hitters */
94010239edfSTerry Lam };
941d4b36210SVijay Subramanian 
942d4b36210SVijay Subramanian /* PIE */
943d4b36210SVijay Subramanian enum {
944d4b36210SVijay Subramanian 	TCA_PIE_UNSPEC,
945d4b36210SVijay Subramanian 	TCA_PIE_TARGET,
946d4b36210SVijay Subramanian 	TCA_PIE_LIMIT,
947d4b36210SVijay Subramanian 	TCA_PIE_TUPDATE,
948d4b36210SVijay Subramanian 	TCA_PIE_ALPHA,
949d4b36210SVijay Subramanian 	TCA_PIE_BETA,
950d4b36210SVijay Subramanian 	TCA_PIE_ECN,
951d4b36210SVijay Subramanian 	TCA_PIE_BYTEMODE,
952d4b36210SVijay Subramanian 	__TCA_PIE_MAX
953d4b36210SVijay Subramanian };
954d4b36210SVijay Subramanian #define TCA_PIE_MAX   (__TCA_PIE_MAX - 1)
955d4b36210SVijay Subramanian 
956d4b36210SVijay Subramanian struct tc_pie_xstats {
9573f7ae5f3SMohit P. Tahiliani 	__u64 prob;             /* current probability */
958d4b36210SVijay Subramanian 	__u32 delay;            /* current delay in ms */
959d4b36210SVijay Subramanian 	__u32 avg_dq_rate;      /* current average dq_rate in bits/pie_time */
960d4b36210SVijay Subramanian 	__u32 packets_in;       /* total number of packets enqueued */
961d4b36210SVijay Subramanian 	__u32 dropped;          /* packets dropped due to pie_action */
962d4b36210SVijay Subramanian 	__u32 overlimit;        /* dropped due to lack of space in queue */
963d4b36210SVijay Subramanian 	__u32 maxq;             /* maximum queue size */
964d4b36210SVijay Subramanian 	__u32 ecn_mark;         /* packets marked with ecn*/
965d4b36210SVijay Subramanian };
966585d763aSVinicius Costa Gomes 
967585d763aSVinicius Costa Gomes /* CBS */
968585d763aSVinicius Costa Gomes struct tc_cbs_qopt {
969585d763aSVinicius Costa Gomes 	__u8 offload;
970585d763aSVinicius Costa Gomes 	__u8 _pad[3];
971585d763aSVinicius Costa Gomes 	__s32 hicredit;
972585d763aSVinicius Costa Gomes 	__s32 locredit;
973585d763aSVinicius Costa Gomes 	__s32 idleslope;
974585d763aSVinicius Costa Gomes 	__s32 sendslope;
975585d763aSVinicius Costa Gomes };
976585d763aSVinicius Costa Gomes 
977585d763aSVinicius Costa Gomes enum {
978585d763aSVinicius Costa Gomes 	TCA_CBS_UNSPEC,
979585d763aSVinicius Costa Gomes 	TCA_CBS_PARMS,
980585d763aSVinicius Costa Gomes 	__TCA_CBS_MAX,
981585d763aSVinicius Costa Gomes };
982585d763aSVinicius Costa Gomes 
983585d763aSVinicius Costa Gomes #define TCA_CBS_MAX (__TCA_CBS_MAX - 1)
984585d763aSVinicius Costa Gomes 
98525db26a9SVinicius Costa Gomes 
98625db26a9SVinicius Costa Gomes /* ETF */
98725db26a9SVinicius Costa Gomes struct tc_etf_qopt {
98825db26a9SVinicius Costa Gomes 	__s32 delta;
98925db26a9SVinicius Costa Gomes 	__s32 clockid;
99025db26a9SVinicius Costa Gomes 	__u32 flags;
99125db26a9SVinicius Costa Gomes #define TC_ETF_DEADLINE_MODE_ON	BIT(0)
99288cab771SJesus Sanchez-Palencia #define TC_ETF_OFFLOAD_ON	BIT(1)
99325db26a9SVinicius Costa Gomes };
99425db26a9SVinicius Costa Gomes 
99525db26a9SVinicius Costa Gomes enum {
99625db26a9SVinicius Costa Gomes 	TCA_ETF_UNSPEC,
99725db26a9SVinicius Costa Gomes 	TCA_ETF_PARMS,
99825db26a9SVinicius Costa Gomes 	__TCA_ETF_MAX,
99925db26a9SVinicius Costa Gomes };
100025db26a9SVinicius Costa Gomes 
100125db26a9SVinicius Costa Gomes #define TCA_ETF_MAX (__TCA_ETF_MAX - 1)
100225db26a9SVinicius Costa Gomes 
1003046f6fd5SToke Høiland-Jørgensen 
1004046f6fd5SToke Høiland-Jørgensen /* CAKE */
1005046f6fd5SToke Høiland-Jørgensen enum {
1006046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_UNSPEC,
1007046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_PAD,
1008046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_BASE_RATE64,
1009046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_DIFFSERV_MODE,
1010046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ATM,
1011046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_FLOW_MODE,
1012046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_OVERHEAD,
1013046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RTT,
1014046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TARGET,
1015046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_AUTORATE,
1016046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MEMORY,
1017046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_NAT,
1018046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_RAW,
1019046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_WASH,
1020046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_MPU,
1021046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_INGRESS,
1022046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_ACK_FILTER,
1023046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_SPLIT_GSO,
10240b5c7efdSKevin Darbyshire-Bryant 	TCA_CAKE_FWMARK,
1025046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_MAX
1026046f6fd5SToke Høiland-Jørgensen };
1027046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_MAX	(__TCA_CAKE_MAX - 1)
1028046f6fd5SToke Høiland-Jørgensen 
1029046f6fd5SToke Høiland-Jørgensen enum {
1030046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_INVALID,
1031046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_PAD,
1032046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_CAPACITY_ESTIMATE64,
1033046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_LIMIT,
1034046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MEMORY_USED,
1035046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_AVG_NETOFF,
1036046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_NETLEN,
1037046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_NETLEN,
1038046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MIN_ADJLEN,
1039046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_MAX_ADJLEN,
1040046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_TIN_STATS,
1041046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DEFICIT,
1042046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_COBALT_COUNT,
1043046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROPPING,
1044046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_DROP_NEXT_US,
1045046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_P_DROP,
1046046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_STATS_BLUE_TIMER_US,
1047046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_STATS_MAX
1048046f6fd5SToke Høiland-Jørgensen };
1049046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
1050046f6fd5SToke Høiland-Jørgensen 
1051046f6fd5SToke Høiland-Jørgensen enum {
1052046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_INVALID,
1053046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PAD,
1054046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_PACKETS,
1055046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SENT_BYTES64,
1056046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_PACKETS,
1057046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_DROPPED_BYTES64,
1058046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS,
1059046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64,
1060046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS,
1061046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64,
1062046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_PACKETS,
1063046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BACKLOG_BYTES,
1064046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_THRESHOLD_RATE64,
1065046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_TARGET_US,
1066046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_INTERVAL_US,
1067046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS,
1068046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_MISSES,
1069046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_WAY_COLLISIONS,
1070046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_PEAK_DELAY_US,
1071046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_AVG_DELAY_US,
1072046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BASE_DELAY_US,
1073046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_SPARSE_FLOWS,
1074046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_BULK_FLOWS,
1075046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS,
1076046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_MAX_SKBLEN,
1077046f6fd5SToke Høiland-Jørgensen 	TCA_CAKE_TIN_STATS_FLOW_QUANTUM,
1078046f6fd5SToke Høiland-Jørgensen 	__TCA_CAKE_TIN_STATS_MAX
1079046f6fd5SToke Høiland-Jørgensen };
1080046f6fd5SToke Høiland-Jørgensen #define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1)
1081046f6fd5SToke Høiland-Jørgensen #define TC_CAKE_MAX_TINS (8)
1082046f6fd5SToke Høiland-Jørgensen 
1083046f6fd5SToke Høiland-Jørgensen enum {
1084046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_NONE = 0,
1085046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_SRC_IP,
1086046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DST_IP,
1087046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_HOSTS,    /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */
1088046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_FLOWS,
1089046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */
1090046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */
1091046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_TRIPLE,   /* = CAKE_FLOW_HOSTS  | CAKE_FLOW_FLOWS */
1092046f6fd5SToke Høiland-Jørgensen 	CAKE_FLOW_MAX,
1093046f6fd5SToke Høiland-Jørgensen };
1094046f6fd5SToke Høiland-Jørgensen 
1095046f6fd5SToke Høiland-Jørgensen enum {
1096046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV3 = 0,
1097046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV4,
1098046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_DIFFSERV8,
1099046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_BESTEFFORT,
1100046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_PRECEDENCE,
1101046f6fd5SToke Høiland-Jørgensen 	CAKE_DIFFSERV_MAX
1102046f6fd5SToke Høiland-Jørgensen };
1103046f6fd5SToke Høiland-Jørgensen 
1104046f6fd5SToke Høiland-Jørgensen enum {
1105046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_NONE = 0,
1106046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_FILTER,
1107046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_AGGRESSIVE,
1108046f6fd5SToke Høiland-Jørgensen 	CAKE_ACK_MAX
1109046f6fd5SToke Høiland-Jørgensen };
1110046f6fd5SToke Høiland-Jørgensen 
1111046f6fd5SToke Høiland-Jørgensen enum {
1112046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_NONE = 0,
1113046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_ATM,
1114046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_PTM,
1115046f6fd5SToke Høiland-Jørgensen 	CAKE_ATM_MAX
1116046f6fd5SToke Høiland-Jørgensen };
1117046f6fd5SToke Høiland-Jørgensen 
11185a781ccbSVinicius Costa Gomes 
11195a781ccbSVinicius Costa Gomes /* TAPRIO */
11205a781ccbSVinicius Costa Gomes enum {
11215a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_GATES = 0x00,
11225a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_HOLD = 0x01,
11235a781ccbSVinicius Costa Gomes 	TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02,
11245a781ccbSVinicius Costa Gomes };
11255a781ccbSVinicius Costa Gomes 
11265a781ccbSVinicius Costa Gomes enum {
11275a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_UNSPEC,
11285a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */
11295a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */
11305a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */
11315a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */
11325a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_ENTRY_MAX,
11335a781ccbSVinicius Costa Gomes };
11345a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1)
11355a781ccbSVinicius Costa Gomes 
11365a781ccbSVinicius Costa Gomes /* The format for schedule entry list is:
11375a781ccbSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ENTRY_LIST]
11385a781ccbSVinicius Costa Gomes  *   [TCA_TAPRIO_SCHED_ENTRY]
11395a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_CMD]
11405a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_GATES]
11415a781ccbSVinicius Costa Gomes  *     [TCA_TAPRIO_SCHED_ENTRY_INTERVAL]
11425a781ccbSVinicius Costa Gomes  */
11435a781ccbSVinicius Costa Gomes enum {
11445a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_UNSPEC,
11455a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_SCHED_ENTRY,
11465a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_SCHED_MAX,
11475a781ccbSVinicius Costa Gomes };
11485a781ccbSVinicius Costa Gomes 
11495a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1)
11505a781ccbSVinicius Costa Gomes 
1151a3d43c0dSVinicius Costa Gomes /* The format for the admin sched (dump only):
1152a3d43c0dSVinicius Costa Gomes  * [TCA_TAPRIO_SCHED_ADMIN_SCHED]
1153a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_BASE_TIME]
1154a3d43c0dSVinicius Costa Gomes  *   [TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]
1155a3d43c0dSVinicius Costa Gomes  *     [TCA_TAPRIO_ATTR_SCHED_ENTRY]
1156a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_CMD]
1157a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_GATES]
1158a3d43c0dSVinicius Costa Gomes  *       [TCA_TAPRIO_ATTR_SCHED_ENTRY_INTERVAL]
1159a3d43c0dSVinicius Costa Gomes  */
1160a3d43c0dSVinicius Costa Gomes 
11615a781ccbSVinicius Costa Gomes enum {
11625a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_UNSPEC,
11635a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */
11645a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */
11655a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */
11665a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */
11675a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */
11685a781ccbSVinicius Costa Gomes 	TCA_TAPRIO_PAD,
1169a3d43c0dSVinicius Costa Gomes 	TCA_TAPRIO_ATTR_ADMIN_SCHED, /* The admin sched, only used in dump */
1170*6ca6a665SVinicius Costa Gomes 	TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */
11715a781ccbSVinicius Costa Gomes 	__TCA_TAPRIO_ATTR_MAX,
11725a781ccbSVinicius Costa Gomes };
11735a781ccbSVinicius Costa Gomes 
11745a781ccbSVinicius Costa Gomes #define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1)
11755a781ccbSVinicius Costa Gomes 
1176607ca46eSDavid Howells #endif
1177