pkt_sched.h revision 5a67f8f9d3a7f80a49554fb1ca4e68a1effd5399
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/* TBF section */
127
128struct tc_tbf_qopt
129{
130	struct tc_ratespec rate;
131	struct tc_ratespec peakrate;
132	__u32		limit;
133	__u32		buffer;
134	__u32		mtu;
135};
136
137enum
138{
139	TCA_TBF_UNSPEC,
140	TCA_TBF_PARMS,
141	TCA_TBF_RTAB,
142	TCA_TBF_PTAB,
143	__TCA_TBF_MAX,
144};
145
146#define TCA_TBF_MAX (__TCA_TBF_MAX - 1)
147
148
149/* TEQL section */
150
151/* TEQL does not require any parameters */
152
153/* SFQ section */
154
155struct tc_sfq_qopt
156{
157	unsigned	quantum;	/* Bytes per round allocated to flow */
158	int		perturb_period;	/* Period of hash perturbation */
159	__u32		limit;		/* Maximal packets in queue */
160	unsigned	divisor;	/* Hash divisor  */
161	unsigned	flows;		/* Maximal number of flows  */
162};
163
164struct tc_sfq_xstats
165{
166	__s32		allot;
167};
168
169/*
170 *  NOTE: limit, divisor and flows are hardwired to code at the moment.
171 *
172 *	limit=flows=128, divisor=1024;
173 *
174 *	The only reason for this is efficiency, it is possible
175 *	to change these parameters in compile time.
176 */
177
178/* RED section */
179
180enum
181{
182	TCA_RED_UNSPEC,
183	TCA_RED_PARMS,
184	TCA_RED_STAB,
185	__TCA_RED_MAX,
186};
187
188#define TCA_RED_MAX (__TCA_RED_MAX - 1)
189
190struct tc_red_qopt
191{
192	__u32		limit;		/* HARD maximal queue length (bytes)	*/
193	__u32		qth_min;	/* Min average length threshold (bytes) */
194	__u32		qth_max;	/* Max average length threshold (bytes) */
195	unsigned char   Wlog;		/* log(W)		*/
196	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
197	unsigned char   Scell_log;	/* cell size for idle damping */
198	unsigned char	flags;
199#define TC_RED_ECN	1
200#define TC_RED_HARDDROP	2
201};
202
203struct tc_red_xstats
204{
205	__u32           early;          /* Early drops */
206	__u32           pdrop;          /* Drops due to queue limits */
207	__u32           other;          /* Drops due to drop() calls */
208	__u32           marked;         /* Marked packets */
209};
210
211/* GRED section */
212
213#define MAX_DPs 16
214
215enum
216{
217       TCA_GRED_UNSPEC,
218       TCA_GRED_PARMS,
219       TCA_GRED_STAB,
220       TCA_GRED_DPS,
221	   __TCA_GRED_MAX,
222};
223
224#define TCA_GRED_MAX (__TCA_GRED_MAX - 1)
225
226struct tc_gred_qopt
227{
228	__u32		limit;        /* HARD maximal queue length (bytes)    */
229	__u32		qth_min;      /* Min average length threshold (bytes) */
230	__u32		qth_max;      /* Max average length threshold (bytes) */
231	__u32		DP;           /* upto 2^32 DPs */
232	__u32		backlog;
233	__u32		qave;
234	__u32		forced;
235	__u32		early;
236	__u32		other;
237	__u32		pdrop;
238	__u8		Wlog;         /* log(W)               */
239	__u8		Plog;         /* log(P_max/(qth_max-qth_min)) */
240	__u8		Scell_log;    /* cell size for idle damping */
241	__u8		prio;         /* prio of this VQ */
242	__u32		packets;
243	__u32		bytesin;
244};
245
246/* gred setup */
247struct tc_gred_sopt
248{
249	__u32		DPs;
250	__u32		def_DP;
251	__u8		grio;
252	__u8		flags;
253	__u16		pad1;
254};
255
256/* HTB section */
257#define TC_HTB_NUMPRIO		8
258#define TC_HTB_MAXDEPTH		8
259#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
260
261struct tc_htb_opt
262{
263	struct tc_ratespec 	rate;
264	struct tc_ratespec 	ceil;
265	__u32	buffer;
266	__u32	cbuffer;
267	__u32	quantum;
268	__u32	level;		/* out only */
269	__u32	prio;
270};
271struct tc_htb_glob
272{
273	__u32 version;		/* to match HTB/TC */
274    	__u32 rate2quantum;	/* bps->quantum divisor */
275    	__u32 defcls;		/* default class number */
276	__u32 debug;		/* debug flags */
277
278	/* stats */
279	__u32 direct_pkts; /* count of non shapped packets */
280};
281enum
282{
283	TCA_HTB_UNSPEC,
284	TCA_HTB_PARMS,
285	TCA_HTB_INIT,
286	TCA_HTB_CTAB,
287	TCA_HTB_RTAB,
288	__TCA_HTB_MAX,
289};
290
291#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
292
293struct tc_htb_xstats
294{
295	__u32 lends;
296	__u32 borrows;
297	__u32 giants;	/* too big packets (rate will not be accurate) */
298	__u32 tokens;
299	__u32 ctokens;
300};
301
302/* HFSC section */
303
304struct tc_hfsc_qopt
305{
306	__u16	defcls;		/* default class */
307};
308
309struct tc_service_curve
310{
311	__u32	m1;		/* slope of the first segment in bps */
312	__u32	d;		/* x-projection of the first segment in us */
313	__u32	m2;		/* slope of the second segment in bps */
314};
315
316struct tc_hfsc_stats
317{
318	__u64	work;		/* total work done */
319	__u64	rtwork;		/* work done by real-time criteria */
320	__u32	period;		/* current period */
321	__u32	level;		/* class level in hierarchy */
322};
323
324enum
325{
326	TCA_HFSC_UNSPEC,
327	TCA_HFSC_RSC,
328	TCA_HFSC_FSC,
329	TCA_HFSC_USC,
330	__TCA_HFSC_MAX,
331};
332
333#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
334
335
336/* CBQ section */
337
338#define TC_CBQ_MAXPRIO		8
339#define TC_CBQ_MAXLEVEL		8
340#define TC_CBQ_DEF_EWMA		5
341
342struct tc_cbq_lssopt
343{
344	unsigned char	change;
345	unsigned char	flags;
346#define TCF_CBQ_LSS_BOUNDED	1
347#define TCF_CBQ_LSS_ISOLATED	2
348	unsigned char  	ewma_log;
349	unsigned char  	level;
350#define TCF_CBQ_LSS_FLAGS	1
351#define TCF_CBQ_LSS_EWMA	2
352#define TCF_CBQ_LSS_MAXIDLE	4
353#define TCF_CBQ_LSS_MINIDLE	8
354#define TCF_CBQ_LSS_OFFTIME	0x10
355#define TCF_CBQ_LSS_AVPKT	0x20
356	__u32		maxidle;
357	__u32		minidle;
358	__u32		offtime;
359	__u32		avpkt;
360};
361
362struct tc_cbq_wrropt
363{
364	unsigned char	flags;
365	unsigned char	priority;
366	unsigned char	cpriority;
367	unsigned char	__reserved;
368	__u32		allot;
369	__u32		weight;
370};
371
372struct tc_cbq_ovl
373{
374	unsigned char	strategy;
375#define	TC_CBQ_OVL_CLASSIC	0
376#define	TC_CBQ_OVL_DELAY	1
377#define	TC_CBQ_OVL_LOWPRIO	2
378#define	TC_CBQ_OVL_DROP		3
379#define	TC_CBQ_OVL_RCLASSIC	4
380	unsigned char	priority2;
381	__u16		pad;
382	__u32		penalty;
383};
384
385struct tc_cbq_police
386{
387	unsigned char	police;
388	unsigned char	__res1;
389	unsigned short	__res2;
390};
391
392struct tc_cbq_fopt
393{
394	__u32		split;
395	__u32		defmap;
396	__u32		defchange;
397};
398
399struct tc_cbq_xstats
400{
401	__u32		borrows;
402	__u32		overactions;
403	__s32		avgidle;
404	__s32		undertime;
405};
406
407enum
408{
409	TCA_CBQ_UNSPEC,
410	TCA_CBQ_LSSOPT,
411	TCA_CBQ_WRROPT,
412	TCA_CBQ_FOPT,
413	TCA_CBQ_OVL_STRATEGY,
414	TCA_CBQ_RATE,
415	TCA_CBQ_RTAB,
416	TCA_CBQ_POLICE,
417	__TCA_CBQ_MAX,
418};
419
420#define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
421
422/* dsmark section */
423
424enum {
425	TCA_DSMARK_UNSPEC,
426	TCA_DSMARK_INDICES,
427	TCA_DSMARK_DEFAULT_INDEX,
428	TCA_DSMARK_SET_TC_INDEX,
429	TCA_DSMARK_MASK,
430	TCA_DSMARK_VALUE,
431	__TCA_DSMARK_MAX,
432};
433
434#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
435
436/* ATM  section */
437
438enum {
439	TCA_ATM_UNSPEC,
440	TCA_ATM_FD,		/* file/socket descriptor */
441	TCA_ATM_PTR,		/* pointer to descriptor - later */
442	TCA_ATM_HDR,		/* LL header */
443	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
444	TCA_ATM_ADDR,		/* PVC address (for output only) */
445	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
446	__TCA_ATM_MAX,
447};
448
449#define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
450
451/* Network emulator */
452
453enum
454{
455	TCA_NETEM_UNSPEC,
456	TCA_NETEM_CORR,
457	TCA_NETEM_DELAY_DIST,
458	TCA_NETEM_REORDER,
459	TCA_NETEM_CORRUPT,
460	__TCA_NETEM_MAX,
461};
462
463#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
464
465struct tc_netem_qopt
466{
467	__u32	latency;	/* added delay (us) */
468	__u32   limit;		/* fifo limit (packets) */
469	__u32	loss;		/* random packet loss (0=none ~0=100%) */
470	__u32	gap;		/* re-ordering gap (0 for none) */
471	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
472	__u32	jitter;		/* random jitter in latency (us) */
473};
474
475struct tc_netem_corr
476{
477	__u32	delay_corr;	/* delay correlation */
478	__u32	loss_corr;	/* packet loss correlation */
479	__u32	dup_corr;	/* duplicate correlation  */
480};
481
482struct tc_netem_reorder
483{
484	__u32	probability;
485	__u32	correlation;
486};
487
488struct tc_netem_corrupt
489{
490	__u32	probability;
491	__u32	correlation;
492};
493
494#define NETEM_DIST_SCALE	8192
495
496#endif
497