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       __u8		pad1;
228       __u16		pad2;
229};
230
231/* HTB section */
232#define TC_HTB_NUMPRIO		8
233#define TC_HTB_MAXDEPTH		8
234#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
235
236struct tc_htb_opt
237{
238	struct tc_ratespec 	rate;
239	struct tc_ratespec 	ceil;
240	__u32	buffer;
241	__u32	cbuffer;
242	__u32	quantum;
243	__u32	level;		/* out only */
244	__u32	prio;
245};
246struct tc_htb_glob
247{
248	__u32 version;		/* to match HTB/TC */
249    	__u32 rate2quantum;	/* bps->quantum divisor */
250    	__u32 defcls;		/* default class number */
251	__u32 debug;		/* debug flags */
252
253	/* stats */
254	__u32 direct_pkts; /* count of non shapped packets */
255};
256enum
257{
258	TCA_HTB_UNSPEC,
259	TCA_HTB_PARMS,
260	TCA_HTB_INIT,
261	TCA_HTB_CTAB,
262	TCA_HTB_RTAB,
263	__TCA_HTB_MAX,
264};
265
266#define TCA_HTB_MAX (__TCA_HTB_MAX - 1)
267
268struct tc_htb_xstats
269{
270	__u32 lends;
271	__u32 borrows;
272	__u32 giants;	/* too big packets (rate will not be accurate) */
273	__u32 tokens;
274	__u32 ctokens;
275};
276
277/* HFSC section */
278
279struct tc_hfsc_qopt
280{
281	__u16	defcls;		/* default class */
282};
283
284struct tc_service_curve
285{
286	__u32	m1;		/* slope of the first segment in bps */
287	__u32	d;		/* x-projection of the first segment in us */
288	__u32	m2;		/* slope of the second segment in bps */
289};
290
291struct tc_hfsc_stats
292{
293	__u64	work;		/* total work done */
294	__u64	rtwork;		/* work done by real-time criteria */
295	__u32	period;		/* current period */
296	__u32	level;		/* class level in hierarchy */
297};
298
299enum
300{
301	TCA_HFSC_UNSPEC,
302	TCA_HFSC_RSC,
303	TCA_HFSC_FSC,
304	TCA_HFSC_USC,
305	__TCA_HFSC_MAX,
306};
307
308#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1)
309
310
311/* CBQ section */
312
313#define TC_CBQ_MAXPRIO		8
314#define TC_CBQ_MAXLEVEL		8
315#define TC_CBQ_DEF_EWMA		5
316
317struct tc_cbq_lssopt
318{
319	unsigned char	change;
320	unsigned char	flags;
321#define TCF_CBQ_LSS_BOUNDED	1
322#define TCF_CBQ_LSS_ISOLATED	2
323	unsigned char  	ewma_log;
324	unsigned char  	level;
325#define TCF_CBQ_LSS_FLAGS	1
326#define TCF_CBQ_LSS_EWMA	2
327#define TCF_CBQ_LSS_MAXIDLE	4
328#define TCF_CBQ_LSS_MINIDLE	8
329#define TCF_CBQ_LSS_OFFTIME	0x10
330#define TCF_CBQ_LSS_AVPKT	0x20
331	__u32		maxidle;
332	__u32		minidle;
333	__u32		offtime;
334	__u32		avpkt;
335};
336
337struct tc_cbq_wrropt
338{
339	unsigned char	flags;
340	unsigned char	priority;
341	unsigned char	cpriority;
342	unsigned char	__reserved;
343	__u32		allot;
344	__u32		weight;
345};
346
347struct tc_cbq_ovl
348{
349	unsigned char	strategy;
350#define	TC_CBQ_OVL_CLASSIC	0
351#define	TC_CBQ_OVL_DELAY	1
352#define	TC_CBQ_OVL_LOWPRIO	2
353#define	TC_CBQ_OVL_DROP		3
354#define	TC_CBQ_OVL_RCLASSIC	4
355	unsigned char	priority2;
356	__u16		pad;
357	__u32		penalty;
358};
359
360struct tc_cbq_police
361{
362	unsigned char	police;
363	unsigned char	__res1;
364	unsigned short	__res2;
365};
366
367struct tc_cbq_fopt
368{
369	__u32		split;
370	__u32		defmap;
371	__u32		defchange;
372};
373
374struct tc_cbq_xstats
375{
376	__u32		borrows;
377	__u32		overactions;
378	__s32		avgidle;
379	__s32		undertime;
380};
381
382enum
383{
384	TCA_CBQ_UNSPEC,
385	TCA_CBQ_LSSOPT,
386	TCA_CBQ_WRROPT,
387	TCA_CBQ_FOPT,
388	TCA_CBQ_OVL_STRATEGY,
389	TCA_CBQ_RATE,
390	TCA_CBQ_RTAB,
391	TCA_CBQ_POLICE,
392	__TCA_CBQ_MAX,
393};
394
395#define TCA_CBQ_MAX	(__TCA_CBQ_MAX - 1)
396
397/* dsmark section */
398
399enum {
400	TCA_DSMARK_UNSPEC,
401	TCA_DSMARK_INDICES,
402	TCA_DSMARK_DEFAULT_INDEX,
403	TCA_DSMARK_SET_TC_INDEX,
404	TCA_DSMARK_MASK,
405	TCA_DSMARK_VALUE,
406	__TCA_DSMARK_MAX,
407};
408
409#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1)
410
411/* ATM  section */
412
413enum {
414	TCA_ATM_UNSPEC,
415	TCA_ATM_FD,		/* file/socket descriptor */
416	TCA_ATM_PTR,		/* pointer to descriptor - later */
417	TCA_ATM_HDR,		/* LL header */
418	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
419	TCA_ATM_ADDR,		/* PVC address (for output only) */
420	TCA_ATM_STATE,		/* VC state (ATM_VS_*; for output only) */
421	__TCA_ATM_MAX,
422};
423
424#define TCA_ATM_MAX	(__TCA_ATM_MAX - 1)
425
426/* Network emulator */
427
428enum
429{
430	TCA_NETEM_UNSPEC,
431	TCA_NETEM_CORR,
432	TCA_NETEM_DELAY_DIST,
433	TCA_NETEM_REORDER,
434	__TCA_NETEM_MAX,
435};
436
437#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1)
438
439struct tc_netem_qopt
440{
441	__u32	latency;	/* added delay (us) */
442	__u32   limit;		/* fifo limit (packets) */
443	__u32	loss;		/* random packet loss (0=none ~0=100%) */
444	__u32	gap;		/* re-ordering gap (0 for none) */
445	__u32   duplicate;	/* random packet dup  (0=none ~0=100%) */
446	__u32	jitter;		/* random jitter in latency (us) */
447};
448
449struct tc_netem_corr
450{
451	__u32	delay_corr;	/* delay correlation */
452	__u32	loss_corr;	/* packet loss correlation */
453	__u32	dup_corr;	/* duplicate correlation  */
454};
455
456struct tc_netem_reorder
457{
458	__u32	probability;
459	__u32	correlation;
460};
461
462#define NETEM_DIST_SCALE	8192
463
464#endif
465