VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / include / linux / pkt_sched.h
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  feature;
81         short           addend;
82         unsigned short  mpu;
83         __u32           rate;
84 };
85
86 /* FIFO section */
87
88 struct 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
97 struct 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
105 struct 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
114 enum
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
129 struct 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
149 enum
150 {
151         TCA_RED_UNSPEC,
152         TCA_RED_PARMS,
153         TCA_RED_STAB,
154 };
155
156 struct 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
168 struct 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
180 enum
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
189 struct 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 */
213 struct 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
225 struct 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 };
235 struct 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 };
245 enum
246 {
247         TCA_HTB_UNSPEC,
248         TCA_HTB_PARMS,
249         TCA_HTB_INIT,
250         TCA_HTB_CTAB,
251         TCA_HTB_RTAB,
252 };
253 struct 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
264 struct tc_hfsc_qopt
265 {
266         __u16   defcls;         /* default class */
267 };
268
269 struct 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
276 struct 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
284 enum
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
299 struct 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
319 struct 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
329 struct 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
341 struct tc_cbq_police
342 {
343         unsigned char   police;
344         unsigned char   __res1;
345         unsigned short  __res2;
346 };
347
348 struct tc_cbq_fopt
349 {
350         __u32           split;
351         __u32           defmap;
352         __u32           defchange;
353 };
354
355 struct tc_cbq_xstats
356 {
357         __u32           borrows;
358         __u32           overactions;
359         __s32           avgidle;
360         __s32           undertime;
361 };
362
363 enum
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
379 enum {
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
392 enum {
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 struct tc_netem_qopt
406 {
407         __u32   latency;        /* added delay (us) */
408         __u32   limit;          /* fifo limit (packets) */
409         __u32   loss;           /* random packet loss (0=none ~0=100%) */
410         __u32   gap;            /* re-ordering gap (0 for delay all) */
411         __u32   duplicate;      /* random packet dup  (0=none ~0=100%) */
412         __u32   jitter;         /* random jitter in latency (us) */
413 };
414 #endif