|
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 }; |
|
42 |
|
43 struct 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 |
|
76 struct tc_ratespec |
|
77 { |
|
78 unsigned char cell_log; |
|
79 unsigned char __reserved; |
|
80 unsigned short overhead; |
|
81 short cell_align; |
|
82 unsigned short mpu; |
|
83 __u32 rate; |
|
84 }; |
|
85 |
|
86 #define TC_RTAB_SIZE 1024 |
|
87 |
|
88 struct tc_sizespec { |
|
89 unsigned char cell_log; |
|
90 unsigned char size_log; |
|
91 short cell_align; |
|
92 int overhead; |
|
93 unsigned int linklayer; |
|
94 unsigned int mpu; |
|
95 unsigned int mtu; |
|
96 unsigned int tsize; |
|
97 }; |
|
98 |
|
99 enum { |
|
100 TCA_STAB_UNSPEC, |
|
101 TCA_STAB_BASE, |
|
102 TCA_STAB_DATA, |
|
103 __TCA_STAB_MAX |
|
104 }; |
|
105 |
|
106 #define TCA_STAB_MAX (__TCA_STAB_MAX - 1) |
|
107 |
|
108 /* FIFO section */ |
|
109 |
|
110 struct tc_fifo_qopt |
|
111 { |
|
112 __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ |
|
113 }; |
|
114 |
|
115 /* PRIO section */ |
|
116 |
|
117 #define TCQ_PRIO_BANDS 16 |
|
118 #define TCQ_MIN_PRIO_BANDS 2 |
|
119 |
|
120 struct tc_prio_qopt |
|
121 { |
|
122 int bands; /* Number of bands */ |
|
123 __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ |
|
124 }; |
|
125 |
|
126 /* MULTIQ section */ |
|
127 |
|
128 struct tc_multiq_qopt { |
|
129 __u16 bands; /* Number of bands */ |
|
130 __u16 max_bands; /* Maximum number of queues */ |
|
131 }; |
|
132 |
|
133 /* TBF section */ |
|
134 |
|
135 struct tc_tbf_qopt |
|
136 { |
|
137 struct tc_ratespec rate; |
|
138 struct tc_ratespec peakrate; |
|
139 __u32 limit; |
|
140 __u32 buffer; |
|
141 __u32 mtu; |
|
142 }; |
|
143 |
|
144 enum |
|
145 { |
|
146 TCA_TBF_UNSPEC, |
|
147 TCA_TBF_PARMS, |
|
148 TCA_TBF_RTAB, |
|
149 TCA_TBF_PTAB, |
|
150 __TCA_TBF_MAX, |
|
151 }; |
|
152 |
|
153 #define TCA_TBF_MAX (__TCA_TBF_MAX - 1) |
|
154 |
|
155 |
|
156 /* TEQL section */ |
|
157 |
|
158 /* TEQL does not require any parameters */ |
|
159 |
|
160 /* SFQ section */ |
|
161 |
|
162 struct tc_sfq_qopt |
|
163 { |
|
164 unsigned quantum; /* Bytes per round allocated to flow */ |
|
165 int perturb_period; /* Period of hash perturbation */ |
|
166 __u32 limit; /* Maximal packets in queue */ |
|
167 unsigned divisor; /* Hash divisor */ |
|
168 unsigned flows; /* Maximal number of flows */ |
|
169 }; |
|
170 |
|
171 struct tc_sfq_xstats |
|
172 { |
|
173 __s32 allot; |
|
174 }; |
|
175 |
|
176 /* |
|
177 * NOTE: limit, divisor and flows are hardwired to code at the moment. |
|
178 * |
|
179 * limit=flows=128, divisor=1024; |
|
180 * |
|
181 * The only reason for this is efficiency, it is possible |
|
182 * to change these parameters in compile time. |
|
183 */ |
|
184 |
|
185 /* RED section */ |
|
186 |
|
187 enum |
|
188 { |
|
189 TCA_RED_UNSPEC, |
|
190 TCA_RED_PARMS, |
|
191 TCA_RED_STAB, |
|
192 __TCA_RED_MAX, |
|
193 }; |
|
194 |
|
195 #define TCA_RED_MAX (__TCA_RED_MAX - 1) |
|
196 |
|
197 struct tc_red_qopt |
|
198 { |
|
199 __u32 limit; /* HARD maximal queue length (bytes) */ |
|
200 __u32 qth_min; /* Min average length threshold (bytes) */ |
|
201 __u32 qth_max; /* Max average length threshold (bytes) */ |
|
202 unsigned char Wlog; /* log(W) */ |
|
203 unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ |
|
204 unsigned char Scell_log; /* cell size for idle damping */ |
|
205 unsigned char flags; |
|
206 #define TC_RED_ECN 1 |
|
207 #define TC_RED_HARDDROP 2 |
|
208 }; |
|
209 |
|
210 struct tc_red_xstats |
|
211 { |
|
212 __u32 early; /* Early drops */ |
|
213 __u32 pdrop; /* Drops due to queue limits */ |
|
214 __u32 other; /* Drops due to drop() calls */ |
|
215 __u32 marked; /* Marked packets */ |
|
216 }; |
|
217 |
|
218 /* GRED section */ |
|
219 |
|
220 #define MAX_DPs 16 |
|
221 |
|
222 enum |
|
223 { |
|
224 TCA_GRED_UNSPEC, |
|
225 TCA_GRED_PARMS, |
|
226 TCA_GRED_STAB, |
|
227 TCA_GRED_DPS, |
|
228 __TCA_GRED_MAX, |
|
229 }; |
|
230 |
|
231 #define TCA_GRED_MAX (__TCA_GRED_MAX - 1) |
|
232 |
|
233 struct tc_gred_qopt |
|
234 { |
|
235 __u32 limit; /* HARD maximal queue length (bytes) */ |
|
236 __u32 qth_min; /* Min average length threshold (bytes) */ |
|
237 __u32 qth_max; /* Max average length threshold (bytes) */ |
|
238 __u32 DP; /* upto 2^32 DPs */ |
|
239 __u32 backlog; |
|
240 __u32 qave; |
|
241 __u32 forced; |
|
242 __u32 early; |
|
243 __u32 other; |
|
244 __u32 pdrop; |
|
245 __u8 Wlog; /* log(W) */ |
|
246 __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ |
|
247 __u8 Scell_log; /* cell size for idle damping */ |
|
248 __u8 prio; /* prio of this VQ */ |
|
249 __u32 packets; |
|
250 __u32 bytesin; |
|
251 }; |
|
252 |
|
253 /* gred setup */ |
|
254 struct tc_gred_sopt |
|
255 { |
|
256 __u32 DPs; |
|
257 __u32 def_DP; |
|
258 __u8 grio; |
|
259 __u8 flags; |
|
260 __u16 pad1; |
|
261 }; |
|
262 |
|
263 /* HTB section */ |
|
264 #define TC_HTB_NUMPRIO 8 |
|
265 #define TC_HTB_MAXDEPTH 8 |
|
266 #define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ |
|
267 |
|
268 struct tc_htb_opt |
|
269 { |
|
270 struct tc_ratespec rate; |
|
271 struct tc_ratespec ceil; |
|
272 __u32 buffer; |
|
273 __u32 cbuffer; |
|
274 __u32 quantum; |
|
275 __u32 level; /* out only */ |
|
276 __u32 prio; |
|
277 }; |
|
278 struct tc_htb_glob |
|
279 { |
|
280 __u32 version; /* to match HTB/TC */ |
|
281 __u32 rate2quantum; /* bps->quantum divisor */ |
|
282 __u32 defcls; /* default class number */ |
|
283 __u32 debug; /* debug flags */ |
|
284 |
|
285 /* stats */ |
|
286 __u32 direct_pkts; /* count of non shapped packets */ |
|
287 }; |
|
288 enum |
|
289 { |
|
290 TCA_HTB_UNSPEC, |
|
291 TCA_HTB_PARMS, |
|
292 TCA_HTB_INIT, |
|
293 TCA_HTB_CTAB, |
|
294 TCA_HTB_RTAB, |
|
295 __TCA_HTB_MAX, |
|
296 }; |
|
297 |
|
298 #define TCA_HTB_MAX (__TCA_HTB_MAX - 1) |
|
299 |
|
300 struct tc_htb_xstats |
|
301 { |
|
302 __u32 lends; |
|
303 __u32 borrows; |
|
304 __u32 giants; /* too big packets (rate will not be accurate) */ |
|
305 __u32 tokens; |
|
306 __u32 ctokens; |
|
307 }; |
|
308 |
|
309 /* HFSC section */ |
|
310 |
|
311 struct tc_hfsc_qopt |
|
312 { |
|
313 __u16 defcls; /* default class */ |
|
314 }; |
|
315 |
|
316 struct tc_service_curve |
|
317 { |
|
318 __u32 m1; /* slope of the first segment in bps */ |
|
319 __u32 d; /* x-projection of the first segment in us */ |
|
320 __u32 m2; /* slope of the second segment in bps */ |
|
321 }; |
|
322 |
|
323 struct tc_hfsc_stats |
|
324 { |
|
325 __u64 work; /* total work done */ |
|
326 __u64 rtwork; /* work done by real-time criteria */ |
|
327 __u32 period; /* current period */ |
|
328 __u32 level; /* class level in hierarchy */ |
|
329 }; |
|
330 |
|
331 enum |
|
332 { |
|
333 TCA_HFSC_UNSPEC, |
|
334 TCA_HFSC_RSC, |
|
335 TCA_HFSC_FSC, |
|
336 TCA_HFSC_USC, |
|
337 __TCA_HFSC_MAX, |
|
338 }; |
|
339 |
|
340 #define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) |
|
341 |
|
342 |
|
343 /* CBQ section */ |
|
344 |
|
345 #define TC_CBQ_MAXPRIO 8 |
|
346 #define TC_CBQ_MAXLEVEL 8 |
|
347 #define TC_CBQ_DEF_EWMA 5 |
|
348 |
|
349 struct tc_cbq_lssopt |
|
350 { |
|
351 unsigned char change; |
|
352 unsigned char flags; |
|
353 #define TCF_CBQ_LSS_BOUNDED 1 |
|
354 #define TCF_CBQ_LSS_ISOLATED 2 |
|
355 unsigned char ewma_log; |
|
356 unsigned char level; |
|
357 #define TCF_CBQ_LSS_FLAGS 1 |
|
358 #define TCF_CBQ_LSS_EWMA 2 |
|
359 #define TCF_CBQ_LSS_MAXIDLE 4 |
|
360 #define TCF_CBQ_LSS_MINIDLE 8 |
|
361 #define TCF_CBQ_LSS_OFFTIME 0x10 |
|
362 #define TCF_CBQ_LSS_AVPKT 0x20 |
|
363 __u32 maxidle; |
|
364 __u32 minidle; |
|
365 __u32 offtime; |
|
366 __u32 avpkt; |
|
367 }; |
|
368 |
|
369 struct tc_cbq_wrropt |
|
370 { |
|
371 unsigned char flags; |
|
372 unsigned char priority; |
|
373 unsigned char cpriority; |
|
374 unsigned char __reserved; |
|
375 __u32 allot; |
|
376 __u32 weight; |
|
377 }; |
|
378 |
|
379 struct tc_cbq_ovl |
|
380 { |
|
381 unsigned char strategy; |
|
382 #define TC_CBQ_OVL_CLASSIC 0 |
|
383 #define TC_CBQ_OVL_DELAY 1 |
|
384 #define TC_CBQ_OVL_LOWPRIO 2 |
|
385 #define TC_CBQ_OVL_DROP 3 |
|
386 #define TC_CBQ_OVL_RCLASSIC 4 |
|
387 unsigned char priority2; |
|
388 __u16 pad; |
|
389 __u32 penalty; |
|
390 }; |
|
391 |
|
392 struct tc_cbq_police |
|
393 { |
|
394 unsigned char police; |
|
395 unsigned char __res1; |
|
396 unsigned short __res2; |
|
397 }; |
|
398 |
|
399 struct tc_cbq_fopt |
|
400 { |
|
401 __u32 split; |
|
402 __u32 defmap; |
|
403 __u32 defchange; |
|
404 }; |
|
405 |
|
406 struct tc_cbq_xstats |
|
407 { |
|
408 __u32 borrows; |
|
409 __u32 overactions; |
|
410 __s32 avgidle; |
|
411 __s32 undertime; |
|
412 }; |
|
413 |
|
414 enum |
|
415 { |
|
416 TCA_CBQ_UNSPEC, |
|
417 TCA_CBQ_LSSOPT, |
|
418 TCA_CBQ_WRROPT, |
|
419 TCA_CBQ_FOPT, |
|
420 TCA_CBQ_OVL_STRATEGY, |
|
421 TCA_CBQ_RATE, |
|
422 TCA_CBQ_RTAB, |
|
423 TCA_CBQ_POLICE, |
|
424 __TCA_CBQ_MAX, |
|
425 }; |
|
426 |
|
427 #define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) |
|
428 |
|
429 /* dsmark section */ |
|
430 |
|
431 enum { |
|
432 TCA_DSMARK_UNSPEC, |
|
433 TCA_DSMARK_INDICES, |
|
434 TCA_DSMARK_DEFAULT_INDEX, |
|
435 TCA_DSMARK_SET_TC_INDEX, |
|
436 TCA_DSMARK_MASK, |
|
437 TCA_DSMARK_VALUE, |
|
438 __TCA_DSMARK_MAX, |
|
439 }; |
|
440 |
|
441 #define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) |
|
442 |
|
443 /* ATM section */ |
|
444 |
|
445 enum { |
|
446 TCA_ATM_UNSPEC, |
|
447 TCA_ATM_FD, /* file/socket descriptor */ |
|
448 TCA_ATM_PTR, /* pointer to descriptor - later */ |
|
449 TCA_ATM_HDR, /* LL header */ |
|
450 TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ |
|
451 TCA_ATM_ADDR, /* PVC address (for output only) */ |
|
452 TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ |
|
453 __TCA_ATM_MAX, |
|
454 }; |
|
455 |
|
456 #define TCA_ATM_MAX (__TCA_ATM_MAX - 1) |
|
457 |
|
458 /* Network emulator */ |
|
459 |
|
460 enum |
|
461 { |
|
462 TCA_NETEM_UNSPEC, |
|
463 TCA_NETEM_CORR, |
|
464 TCA_NETEM_DELAY_DIST, |
|
465 TCA_NETEM_REORDER, |
|
466 TCA_NETEM_CORRUPT, |
|
467 __TCA_NETEM_MAX, |
|
468 }; |
|
469 |
|
470 #define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) |
|
471 |
|
472 struct tc_netem_qopt |
|
473 { |
|
474 __u32 latency; /* added delay (us) */ |
|
475 __u32 limit; /* fifo limit (packets) */ |
|
476 __u32 loss; /* random packet loss (0=none ~0=100%) */ |
|
477 __u32 gap; /* re-ordering gap (0 for none) */ |
|
478 __u32 duplicate; /* random packet dup (0=none ~0=100%) */ |
|
479 __u32 jitter; /* random jitter in latency (us) */ |
|
480 }; |
|
481 |
|
482 struct tc_netem_corr |
|
483 { |
|
484 __u32 delay_corr; /* delay correlation */ |
|
485 __u32 loss_corr; /* packet loss correlation */ |
|
486 __u32 dup_corr; /* duplicate correlation */ |
|
487 }; |
|
488 |
|
489 struct tc_netem_reorder |
|
490 { |
|
491 __u32 probability; |
|
492 __u32 correlation; |
|
493 }; |
|
494 |
|
495 struct tc_netem_corrupt |
|
496 { |
|
497 __u32 probability; |
|
498 __u32 correlation; |
|
499 }; |
|
500 |
|
501 #define NETEM_DIST_SCALE 8192 |
|
502 |
|
503 #endif |