pkt_sched.h revision ea8fc1047d2b88ae1d123e3f79dbffbc2a3fa70c
1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef __LINUX_PKT_SCHED_H
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define __LINUX_PKT_SCHED_H
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* Logical priority bands not depending on specific packet scheduler.
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   Every scheduler will map them to real traffic classes, if it has
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   no more precise mechanism to classify packets.
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   These numbers have no special meaning, though their coincidence
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   preferred full anarchy inspired by diffserv group.
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   class, actually, as rule it will be handled with more care than
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   filler or even bulk.
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define TC_PRIO_BESTEFFORT		0
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_PRIO_FILLER			1
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define TC_PRIO_BULK			2
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define TC_PRIO_INTERACTIVE_BULK	4
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_PRIO_INTERACTIVE		6
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_PRIO_CONTROL			7
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define TC_PRIO_MAX			15
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* Generic queue statistics, available for all the elements.
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   Particular schedulers may have also their private records.
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)struct tc_stats
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)	__u64	bytes;			/* NUmber of enqueues bytes */
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)	__u32	packets;		/* Number of enqueued packets	*/
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)	__u32	drops;			/* Packets dropped because of lack of resources */
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)	__u32	overlimits;		/* Number of throttle events when this
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)					 * flow goes out of allocated bandwidth */
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)	__u32	bps;			/* Current flow byte rate */
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)	__u32	pps;			/* Current flow packet rate */
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	__u32	qlen;
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	__u32	backlog;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstruct tc_estimator
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch{
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch	signed char	interval;
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch	unsigned char	ewma_log;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/* "Handles"
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   ---------
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    All the traffic control objects have 32bit identifiers, or "handles".
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    They can be considered as opaque numbers from user API viewpoint,
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    but actually they always consist of two fields: major and
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    minor numbers, which are interpreted by kernel specially,
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    that may be used by applications, though not recommended.
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    F.e. qdisc handles always have minor number equal to zero,
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    classes (or flows) have major equal to parent qdisc major, and
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    minor uniquely identifying class inside qdisc.
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    Macros to manipulate handles:
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */
65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_MAJ_MASK (0xFFFF0000U)
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_MIN_MASK (0x0000FFFFU)
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_UNSPEC	(0U)
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_ROOT	(0xFFFFFFFFU)
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define TC_H_INGRESS    (0xFFFFFFF1U)
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct tc_ratespec
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	unsigned char	cell_log;
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	unsigned char	__reserved;
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	unsigned short	feature;
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	short		addend;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	unsigned short	mpu;
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch	__u32		rate;
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch};
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/* FIFO section */
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct tc_fifo_qopt
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* PRIO section */
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define TCQ_PRIO_BANDS	16
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstruct tc_prio_qopt
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	int	bands;			/* Number of bands */
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch};
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
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_REORDER,
431	__TCA_NETEM_MAX,
432};
433
434#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
435
436struct tc_netem_qopt
437{
438	__u32	latency;	/* added delay (us) */
439	__u32   limit;		/* fifo limit (packets) */
440	__u32	loss;		/* random packet loss (0=none ~0=100%) */
441	__u32	gap;		/* re-ordering gap (0 for none) */
442	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
443	__u32	jitter;		/* random jitter in latency (us) */
444};
445
446struct tc_netem_corr
447{
448	__u32	delay_corr;	/* delay correlation */
449	__u32	loss_corr;	/* packet loss correlation */
450	__u32	dup_corr;	/* duplicate correlation  */
451};
452
453struct tc_netem_reorder
454{
455	__u32	probability;
456	__u32	correlation;
457};
458
459#define NETEM_DIST_SCALE	8192
460
461#endif
462