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