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