pkt_sched.h revision c86f34942a0ce9f8203c0c38f9fe9604f96be706
1#ifndef __LINUX_PKT_SCHED_H
2#define __LINUX_PKT_SCHED_H
3
4/* Logical priority bands not depending on specific packet scheduler.
5   Every scheduler will map them to real traffic classes, if it has
6   no more precise mechanism to classify packets.
7
8   These numbers have no special meaning, though their coincidence
9   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
10   preferred full anarchy inspired by diffserv group.
11
12   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
13   class, actually, as rule it will be handled with more care than
14   filler or even bulk.
15 */
16
17#define TC_PRIO_BESTEFFORT		0
18#define TC_PRIO_FILLER			1
19#define TC_PRIO_BULK			2
20#define TC_PRIO_INTERACTIVE_BULK	4
21#define TC_PRIO_INTERACTIVE		6
22#define TC_PRIO_CONTROL			7
23
24#define TC_PRIO_MAX			15
25
26/* Generic queue statistics, available for all the elements.
27   Particular schedulers may have also their private records.
28 */
29
30struct tc_stats
31{
32	__u64	bytes;			/* NUmber of enqueues bytes */
33	__u32	packets;		/* Number of enqueued packets	*/
34	__u32	drops;			/* Packets dropped because of lack of resources */
35	__u32	overlimits;		/* Number of throttle events when this
36					 * flow goes out of allocated bandwidth */
37	__u32	bps;			/* Current flow byte rate */
38	__u32	pps;			/* Current flow packet rate */
39	__u32	qlen;
40	__u32	backlog;
41};
42
43struct tc_estimator
44{
45	signed char	interval;
46	unsigned char	ewma_log;
47};
48
49/* "Handles"
50   ---------
51
52    All the traffic control objects have 32bit identifiers, or "handles".
53
54    They can be considered as opaque numbers from user API viewpoint,
55    but actually they always consist of two fields: major and
56    minor numbers, which are interpreted by kernel specially,
57    that may be used by applications, though not recommended.
58
59    F.e. qdisc handles always have minor number equal to zero,
60    classes (or flows) have major equal to parent qdisc major, and
61    minor uniquely identifying class inside qdisc.
62
63    Macros to manipulate handles:
64 */
65
66#define TC_H_MAJ_MASK (0xFFFF0000U)
67#define TC_H_MIN_MASK (0x0000FFFFU)
68#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
69#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
70#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
71
72#define TC_H_UNSPEC	(0U)
73#define TC_H_ROOT	(0xFFFFFFFFU)
74#define TC_H_INGRESS    (0xFFFFFFF1U)
75
76struct tc_ratespec
77{
78	unsigned char	cell_log;
79	unsigned char	__reserved;
80	unsigned short	overhead;
81	short		cell_align;
82	unsigned short	mpu;
83	__u32		rate;
84};
85
86#define TC_RTAB_SIZE	1024
87
88struct tc_sizespec {
89	unsigned char	cell_log;
90	unsigned char	size_log;
91	short		cell_align;
92	int		overhead;
93	unsigned int	linklayer;
94	unsigned int	mpu;
95	unsigned int	mtu;
96	unsigned int	tsize;
97};
98
99enum {
100	TCA_STAB_UNSPEC,
101	TCA_STAB_BASE,
102	TCA_STAB_DATA,
103	__TCA_STAB_MAX
104};
105
106#define TCA_STAB_MAX (__TCA_STAB_MAX - 1)
107
108/* FIFO section */
109
110struct tc_fifo_qopt
111{
112	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
113};
114
115/* PRIO section */
116
117#define TCQ_PRIO_BANDS	16
118#define TCQ_MIN_PRIO_BANDS 2
119
120struct tc_prio_qopt
121{
122	int	bands;			/* Number of bands */
123	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
124};
125
126/* MULTIQ section */
127
128struct tc_multiq_qopt {
129	__u16	bands;			/* Number of bands */
130	__u16	max_bands;		/* Maximum number of queues */
131};
132
133/* TBF section */
134
135struct tc_tbf_qopt
136{
137	struct tc_ratespec rate;
138	struct tc_ratespec peakrate;
139	__u32		limit;
140	__u32		buffer;
141	__u32		mtu;
142};
143
144enum
145{
146	TCA_TBF_UNSPEC,
147	TCA_TBF_PARMS,
148	TCA_TBF_RTAB,
149	TCA_TBF_PTAB,
150	__TCA_TBF_MAX,
151};
152
153#define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
154
155
156/* TEQL section */
157
158/* TEQL does not require any parameters */
159
160/* SFQ section */
161
162struct tc_sfq_qopt
163{
164	unsigned	quantum;	/* Bytes per round allocated to flow */
165	int		perturb_period;	/* Period of hash perturbation */
166	__u32		limit;		/* Maximal packets in queue */
167	unsigned	divisor;	/* Hash divisor  */
168	unsigned	flows;		/* Maximal number of flows  */
169};
170
171struct tc_sfq_xstats
172{
173	__s32		allot;
174};
175
176/*
177 *  NOTE: limit, divisor and flows are hardwired to code at the moment.
178 *
179 *	limit=flows=128, divisor=1024;
180 *
181 *	The only reason for this is efficiency, it is possible
182 *	to change these parameters in compile time.
183 */
184
185/* RED section */
186
187enum
188{
189	TCA_RED_UNSPEC,
190	TCA_RED_PARMS,
191	TCA_RED_STAB,
192	__TCA_RED_MAX,
193};
194
195#define TCA_RED_MAX (__TCA_RED_MAX - 1)
196
197struct tc_red_qopt
198{
199	__u32		limit;		/* HARD maximal queue length (bytes)	*/
200	__u32		qth_min;	/* Min average length threshold (bytes) */
201	__u32		qth_max;	/* Max average length threshold (bytes) */
202	unsigned char   Wlog;		/* log(W)		*/
203	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
204	unsigned char   Scell_log;	/* cell size for idle damping */
205	unsigned char	flags;
206#define TC_RED_ECN	1
207#define TC_RED_HARDDROP	2
208};
209
210struct tc_red_xstats
211{
212	__u32           early;          /* Early drops */
213	__u32           pdrop;          /* Drops due to queue limits */
214	__u32           other;          /* Drops due to drop() calls */
215	__u32           marked;         /* Marked packets */
216};
217
218/* GRED section */
219
220#define MAX_DPs 16
221
222enum
223{
224       TCA_GRED_UNSPEC,
225       TCA_GRED_PARMS,
226       TCA_GRED_STAB,
227       TCA_GRED_DPS,
228	   __TCA_GRED_MAX,
229};
230
231#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
232
233struct tc_gred_qopt
234{
235	__u32		limit;        /* HARD maximal queue length (bytes)    */
236	__u32		qth_min;      /* Min average length threshold (bytes) */
237	__u32		qth_max;      /* Max average length threshold (bytes) */
238	__u32		DP;           /* upto 2^32 DPs */
239	__u32		backlog;
240	__u32		qave;
241	__u32		forced;
242	__u32		early;
243	__u32		other;
244	__u32		pdrop;
245	__u8		Wlog;         /* log(W)               */
246	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
247	__u8		Scell_log;    /* cell size for idle damping */
248	__u8		prio;         /* prio of this VQ */
249	__u32		packets;
250	__u32		bytesin;
251};
252
253/* gred setup */
254struct tc_gred_sopt
255{
256	__u32		DPs;
257	__u32		def_DP;
258	__u8		grio;
259	__u8		flags;
260	__u16		pad1;
261};
262
263/* HTB section */
264#define TC_HTB_NUMPRIO		8
265#define TC_HTB_MAXDEPTH		8
266#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
267
268struct tc_htb_opt
269{
270	struct tc_ratespec 	rate;
271	struct tc_ratespec 	ceil;
272	__u32	buffer;
273	__u32	cbuffer;
274	__u32	quantum;
275	__u32	level;		/* out only */
276	__u32	prio;
277};
278struct tc_htb_glob
279{
280	__u32 version;		/* to match HTB/TC */
281    	__u32 rate2quantum;	/* bps->quantum divisor */
282    	__u32 defcls;		/* default class number */
283	__u32 debug;		/* debug flags */
284
285	/* stats */
286	__u32 direct_pkts; /* count of non shapped packets */
287};
288enum
289{
290	TCA_HTB_UNSPEC,
291	TCA_HTB_PARMS,
292	TCA_HTB_INIT,
293	TCA_HTB_CTAB,
294	TCA_HTB_RTAB,
295	__TCA_HTB_MAX,
296};
297
298#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
299
300struct tc_htb_xstats
301{
302	__u32 lends;
303	__u32 borrows;
304	__u32 giants;	/* too big packets (rate will not be accurate) */
305	__u32 tokens;
306	__u32 ctokens;
307};
308
309/* HFSC section */
310
311struct tc_hfsc_qopt
312{
313	__u16	defcls;		/* default class */
314};
315
316struct tc_service_curve
317{
318	__u32	m1;		/* slope of the first segment in bps */
319	__u32	d;		/* x-projection of the first segment in us */
320	__u32	m2;		/* slope of the second segment in bps */
321};
322
323struct tc_hfsc_stats
324{
325	__u64	work;		/* total work done */
326	__u64	rtwork;		/* work done by real-time criteria */
327	__u32	period;		/* current period */
328	__u32	level;		/* class level in hierarchy */
329};
330
331enum
332{
333	TCA_HFSC_UNSPEC,
334	TCA_HFSC_RSC,
335	TCA_HFSC_FSC,
336	TCA_HFSC_USC,
337	__TCA_HFSC_MAX,
338};
339
340#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
341
342
343/* CBQ section */
344
345#define TC_CBQ_MAXPRIO		8
346#define TC_CBQ_MAXLEVEL		8
347#define TC_CBQ_DEF_EWMA		5
348
349struct tc_cbq_lssopt
350{
351	unsigned char	change;
352	unsigned char	flags;
353#define TCF_CBQ_LSS_BOUNDED	1
354#define TCF_CBQ_LSS_ISOLATED	2
355	unsigned char  	ewma_log;
356	unsigned char  	level;
357#define TCF_CBQ_LSS_FLAGS	1
358#define TCF_CBQ_LSS_EWMA	2
359#define TCF_CBQ_LSS_MAXIDLE	4
360#define TCF_CBQ_LSS_MINIDLE	8
361#define TCF_CBQ_LSS_OFFTIME	0x10
362#define TCF_CBQ_LSS_AVPKT	0x20
363	__u32		maxidle;
364	__u32		minidle;
365	__u32		offtime;
366	__u32		avpkt;
367};
368
369struct tc_cbq_wrropt
370{
371	unsigned char	flags;
372	unsigned char	priority;
373	unsigned char	cpriority;
374	unsigned char	__reserved;
375	__u32		allot;
376	__u32		weight;
377};
378
379struct tc_cbq_ovl
380{
381	unsigned char	strategy;
382#define	TC_CBQ_OVL_CLASSIC	0
383#define	TC_CBQ_OVL_DELAY	1
384#define	TC_CBQ_OVL_LOWPRIO	2
385#define	TC_CBQ_OVL_DROP		3
386#define	TC_CBQ_OVL_RCLASSIC	4
387	unsigned char	priority2;
388	__u16		pad;
389	__u32		penalty;
390};
391
392struct tc_cbq_police
393{
394	unsigned char	police;
395	unsigned char	__res1;
396	unsigned short	__res2;
397};
398
399struct tc_cbq_fopt
400{
401	__u32		split;
402	__u32		defmap;
403	__u32		defchange;
404};
405
406struct tc_cbq_xstats
407{
408	__u32		borrows;
409	__u32		overactions;
410	__s32		avgidle;
411	__s32		undertime;
412};
413
414enum
415{
416	TCA_CBQ_UNSPEC,
417	TCA_CBQ_LSSOPT,
418	TCA_CBQ_WRROPT,
419	TCA_CBQ_FOPT,
420	TCA_CBQ_OVL_STRATEGY,
421	TCA_CBQ_RATE,
422	TCA_CBQ_RTAB,
423	TCA_CBQ_POLICE,
424	__TCA_CBQ_MAX,
425};
426
427#define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
428
429/* dsmark section */
430
431enum {
432	TCA_DSMARK_UNSPEC,
433	TCA_DSMARK_INDICES,
434	TCA_DSMARK_DEFAULT_INDEX,
435	TCA_DSMARK_SET_TC_INDEX,
436	TCA_DSMARK_MASK,
437	TCA_DSMARK_VALUE,
438	__TCA_DSMARK_MAX,
439};
440
441#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
442
443/* ATM  section */
444
445enum {
446	TCA_ATM_UNSPEC,
447	TCA_ATM_FD,		/* file/socket descriptor */
448	TCA_ATM_PTR,		/* pointer to descriptor - later */
449	TCA_ATM_HDR,		/* LL header */
450	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
451	TCA_ATM_ADDR,		/* PVC address (for output only) */
452	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
453	__TCA_ATM_MAX,
454};
455
456#define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
457
458/* Network emulator */
459
460enum
461{
462	TCA_NETEM_UNSPEC,
463	TCA_NETEM_CORR,
464	TCA_NETEM_DELAY_DIST,
465	TCA_NETEM_REORDER,
466	TCA_NETEM_CORRUPT,
467	__TCA_NETEM_MAX,
468};
469
470#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
471
472struct tc_netem_qopt
473{
474	__u32	latency;	/* added delay (us) */
475	__u32   limit;		/* fifo limit (packets) */
476	__u32	loss;		/* random packet loss (0=none ~0=100%) */
477	__u32	gap;		/* re-ordering gap (0 for none) */
478	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
479	__u32	jitter;		/* random jitter in latency (us) */
480};
481
482struct tc_netem_corr
483{
484	__u32	delay_corr;	/* delay correlation */
485	__u32	loss_corr;	/* packet loss correlation */
486	__u32	dup_corr;	/* duplicate correlation  */
487};
488
489struct tc_netem_reorder
490{
491	__u32	probability;
492	__u32	correlation;
493};
494
495struct tc_netem_corrupt
496{
497	__u32	probability;
498	__u32	correlation;
499};
500
501#define NETEM_DIST_SCALE	8192
502
503/* DRR */
504
505enum
506{
507	TCA_DRR_UNSPEC,
508	TCA_DRR_QUANTUM,
509	__TCA_DRR_MAX
510};
511
512#define TCA_DRR_MAX	(__TCA_DRR_MAX - 1)
513
514struct tc_drr_stats
515{
516	__u32	deficit;
517};
518
519#endif
520