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