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#ifdef __KERNEL__
42	spinlock_t *lock;
43#endif
44};
45
46struct tc_estimator
47{
48	char		interval;
49	unsigned char	ewma_log;
50};
51
52/* "Handles"
53   ---------
54
55    All the traffic control objects have 32bit identifiers, or "handles".
56
57    They can be considered as opaque numbers from user API viewpoint,
58    but actually they always consist of two fields: major and
59    minor numbers, which are interpreted by kernel specially,
60    that may be used by applications, though not recommended.
61
62    F.e. qdisc handles always have minor number equal to zero,
63    classes (or flows) have major equal to parent qdisc major, and
64    minor uniquely identifying class inside qdisc.
65
66    Macros to manipulate handles:
67 */
68
69#define TC_H_MAJ_MASK (0xFFFF0000U)
70#define TC_H_MIN_MASK (0x0000FFFFU)
71#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
72#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
73#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
74
75#define TC_H_UNSPEC	(0U)
76#define TC_H_ROOT	(0xFFFFFFFFU)
77#define TC_H_INGRESS    (0xFFFFFFF1U)
78
79struct tc_ratespec
80{
81	unsigned char	cell_log;
82	unsigned char	__reserved;
83	unsigned short	feature;
84	short		addend;
85	unsigned short	mpu;
86	__u32		rate;
87};
88
89/* FIFO section */
90
91struct tc_fifo_qopt
92{
93	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
94};
95
96/* PRIO section */
97
98#define TCQ_PRIO_BANDS	16
99
100struct tc_prio_qopt
101{
102	int	bands;			/* Number of bands */
103	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
104};
105
106/* CSZ section */
107
108struct tc_csz_qopt
109{
110	int		flows;		/* Maximal number of guaranteed flows */
111	unsigned char	R_log;		/* Fixed point position for round number */
112	unsigned char	delta_log;	/* Log of maximal managed time interval */
113	__u8		priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> CSZ band */
114};
115
116struct tc_csz_copt
117{
118	struct tc_ratespec slice;
119	struct tc_ratespec rate;
120	struct tc_ratespec peakrate;
121	__u32		limit;
122	__u32		buffer;
123	__u32		mtu;
124};
125
126enum
127{
128	TCA_CSZ_UNSPEC,
129	TCA_CSZ_PARMS,
130	TCA_CSZ_RTAB,
131	TCA_CSZ_PTAB,
132};
133
134/* TBF section */
135
136struct tc_tbf_qopt
137{
138	struct tc_ratespec rate;
139	struct tc_ratespec peakrate;
140	__u32		limit;
141	__u32		buffer;
142	__u32		mtu;
143};
144
145enum
146{
147	TCA_TBF_UNSPEC,
148	TCA_TBF_PARMS,
149	TCA_TBF_RTAB,
150	TCA_TBF_PTAB,
151};
152
153
154/* TEQL section */
155
156/* TEQL does not require any parameters */
157
158/* SFQ section */
159
160struct tc_sfq_qopt
161{
162	unsigned	quantum;	/* Bytes per round allocated to flow */
163	int		perturb_period;	/* Period of hash perturbation */
164	__u32		limit;		/* Maximal packets in queue */
165	unsigned	divisor;	/* Hash divisor  */
166	unsigned	flows;		/* Maximal number of flows  */
167};
168
169/*
170 *  NOTE: limit, divisor and flows are hardwired to code at the moment.
171 *
172 *	limit=flows=128, divisor=1024;
173 *
174 *	The only reason for this is efficiency, it is possible
175 *	to change these parameters in compile time.
176 */
177
178/* RED section */
179
180enum
181{
182	TCA_RED_UNSPEC,
183	TCA_RED_PARMS,
184	TCA_RED_STAB,
185};
186
187struct tc_red_qopt
188{
189	__u32		limit;		/* HARD maximal queue length (bytes)	*/
190	__u32		qth_min;	/* Min average length threshold (bytes) */
191	__u32		qth_max;	/* Max average length threshold (bytes) */
192	unsigned char   Wlog;		/* log(W)		*/
193	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
194	unsigned char   Scell_log;	/* cell size for idle damping */
195	unsigned char	flags;
196#define TC_RED_ECN	1
197};
198
199struct tc_red_xstats
200{
201	__u32           early;          /* Early drops */
202	__u32           pdrop;          /* Drops due to queue limits */
203	__u32           other;          /* Drops due to drop() calls */
204	__u32           marked;         /* Marked packets */
205};
206
207/* GRED section */
208
209#define MAX_DPs 16
210
211enum
212{
213       TCA_GRED_UNSPEC,
214       TCA_GRED_PARMS,
215       TCA_GRED_STAB,
216       TCA_GRED_DPS,
217};
218
219#define TCA_SET_OFF TCA_GRED_PARMS
220struct tc_gred_qopt
221{
222       __u32           limit;          /* HARD maximal queue length (bytes)
223*/
224       __u32           qth_min;        /* Min average length threshold (bytes)
225*/
226       __u32           qth_max;        /* Max average length threshold (bytes)
227*/
228       __u32           DP;             /* upto 2^32 DPs */
229       __u32           backlog;
230       __u32           qave;
231       __u32           forced;
232       __u32           early;
233       __u32           other;
234       __u32           pdrop;
235
236       unsigned char   Wlog;           /* log(W)               */
237       unsigned char   Plog;           /* log(P_max/(qth_max-qth_min)) */
238       unsigned char   Scell_log;      /* cell size for idle damping */
239       __u8            prio;		/* prio of this VQ */
240       __u32	packets;
241       __u32	bytesin;
242};
243/* gred setup */
244struct tc_gred_sopt
245{
246       __u32           DPs;
247       __u32           def_DP;
248       __u8            grio;
249};
250
251/* HTB section */
252#define TC_HTB_NUMPRIO		8
253#define TC_HTB_MAXDEPTH		8
254#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
255
256struct tc_htb_opt
257{
258	struct tc_ratespec 	rate;
259	struct tc_ratespec 	ceil;
260	__u32	buffer;
261	__u32	cbuffer;
262	__u32	quantum;
263	__u32	level;		/* out only */
264	__u32	prio;
265};
266struct tc_htb_glob
267{
268	__u32 version;		/* to match HTB/TC */
269    	__u32 rate2quantum;	/* bps->quantum divisor */
270    	__u32 defcls;		/* default class number */
271	__u32 debug;		/* debug flags */
272
273	/* stats */
274	__u32 direct_pkts; /* count of non shapped packets */
275};
276enum
277{
278	TCA_HTB_UNSPEC,
279	TCA_HTB_PARMS,
280	TCA_HTB_INIT,
281	TCA_HTB_CTAB,
282	TCA_HTB_RTAB,
283};
284struct tc_htb_xstats
285{
286	__u32 lends;
287	__u32 borrows;
288	__u32 giants;	/* too big packets (rate will not be accurate) */
289	__u32 tokens;
290	__u32 ctokens;
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#endif
405