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