]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/altq/altq/altq_cdnr.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / altq / altq / altq_cdnr.h
1 /*      $KAME: altq_cdnr.h,v 1.9 2003/07/10 12:07:48 kjc Exp $  */
2
3 /*
4  * Copyright (C) 1999-2002
5  *      Sony Computer Science Laboratories Inc.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28
29 #ifndef _ALTQ_ALTQ_CDNR_H_
30 #define _ALTQ_ALTQ_CDNR_H_
31
32 #include <altq/altq.h>
33
34 /*
35  * traffic conditioner element types
36  */
37 #define TCETYPE_NONE            0
38 #define TCETYPE_TOP             1       /* top level conditioner */
39 #define TCETYPE_ELEMENT         2       /* a simple tc element */
40 #define TCETYPE_TBMETER         3       /* token bucket meter */
41 #define TCETYPE_TRTCM           4       /* (two-rate) three color marker */
42 #define TCETYPE_TSWTCM          5       /* time sliding window 3-color maker */
43
44 /*
45  * traffic conditioner action
46  */
47 struct cdnr_block;
48
49 struct tc_action {
50         int     tca_code;       /* e.g., TCACODE_PASS */
51         /* tca_code dependent variable */
52         union {
53                 u_long          un_value;       /* template */
54                 u_int8_t        un_dscp;        /* diffserv code point */
55                 u_long          un_handle;      /* tc action handle */
56                 struct cdnr_block *un_next;     /* next tc element block */
57         } tca_un;
58 };
59 #define tca_value       tca_un.un_value
60 #define tca_dscp        tca_un.un_dscp
61 #define tca_handle      tca_un.un_handle
62 #define tca_next        tca_un.un_next
63
64 #define TCACODE_NONE    0       /* action is not set */
65 #define TCACODE_PASS    1       /* pass this packet */
66 #define TCACODE_DROP    2       /* discard this packet */
67 #define TCACODE_RETURN  3       /* do not process this packet */
68 #define TCACODE_MARK    4       /* mark dscp */
69 #define TCACODE_HANDLE  5       /* take action specified by handle */
70 #define TCACODE_NEXT    6       /* take action in the next tc element */
71 #define TCACODE_MAX     6
72
73 #define CDNR_NULL_HANDLE        0
74
75 struct cdnr_interface {
76         char    cdnr_ifname[IFNAMSIZ];  /* interface name (e.g., fxp0) */
77 };
78
79 /* simple element operations */
80 struct cdnr_add_element {
81         struct cdnr_interface   iface;
82         struct tc_action        action;
83
84         u_long                  cdnr_handle;    /* return value */
85 };
86
87 struct cdnr_delete_element {
88         struct cdnr_interface   iface;
89         u_long                  cdnr_handle;
90 };
91
92 /* token-bucket meter operations */
93 struct cdnr_add_tbmeter {
94         struct cdnr_interface   iface;
95         struct tb_profile       profile;
96         struct tc_action        in_action;
97         struct tc_action        out_action;
98
99         u_long                  cdnr_handle;    /* return value */
100 };
101
102 struct cdnr_modify_tbmeter {
103         struct cdnr_interface   iface;
104         u_long                  cdnr_handle;
105         struct tb_profile       profile;
106 };
107
108 struct cdnr_tbmeter_stats {
109         struct cdnr_interface   iface;
110         u_long                  cdnr_handle;
111         struct pktcntr          in_cnt;
112         struct pktcntr          out_cnt;
113 };
114
115 /* two-rate three-color marker operations */
116 struct cdnr_add_trtcm {
117         struct cdnr_interface   iface;
118         struct tb_profile       cmtd_profile;   /* profile for committed tb */
119         struct tb_profile       peak_profile;   /* profile for peak tb */
120         struct tc_action        green_action;   /* action for green packets */
121         struct tc_action        yellow_action;  /* action for yellow packets */
122         struct tc_action        red_action;     /* action for red packets */
123         int                     coloraware;     /* color-aware/color-blind */
124
125         u_long                  cdnr_handle;    /* return value */
126 };
127
128 struct cdnr_modify_trtcm {
129         struct cdnr_interface   iface;
130         u_long                  cdnr_handle;
131         struct tb_profile       cmtd_profile;   /* profile for committed tb */
132         struct tb_profile       peak_profile;   /* profile for peak tb */
133         int                     coloraware;     /* color-aware/color-blind */
134 };
135
136 struct cdnr_tcm_stats {
137         struct cdnr_interface   iface;
138         u_long                  cdnr_handle;
139         struct pktcntr          green_cnt;
140         struct pktcntr          yellow_cnt;
141         struct pktcntr          red_cnt;
142 };
143
144 /* time sliding window three-color marker operations */
145 struct cdnr_add_tswtcm {
146         struct cdnr_interface   iface;
147         u_int32_t               cmtd_rate;      /* committed rate (bits/sec) */
148         u_int32_t               peak_rate;      /* peak rate (bits/sec) */
149         u_int32_t               avg_interval;   /* averaging interval (msec) */
150         struct tc_action        green_action;   /* action for green packets */
151         struct tc_action        yellow_action;  /* action for yellow packets */
152         struct tc_action        red_action;     /* action for red packets */
153
154         u_long                  cdnr_handle;    /* return value */
155 };
156
157 struct cdnr_modify_tswtcm {
158         struct cdnr_interface   iface;
159         u_long                  cdnr_handle;
160         u_int32_t               cmtd_rate;      /* committed rate (bits/sec) */
161         u_int32_t               peak_rate;      /* peak rate (bits/sec) */
162         u_int32_t               avg_interval;   /* averaging interval (msec) */
163 };
164
165 struct cdnr_add_filter {
166         struct cdnr_interface   iface;
167         u_long                  cdnr_handle;
168 #ifdef ALTQ3_CLFIER_COMPAT
169         struct flow_filter      filter;
170 #endif
171         u_long                  filter_handle;  /* return value */
172 };
173
174 struct cdnr_delete_filter {
175         struct cdnr_interface   iface;
176         u_long                  filter_handle;
177 };
178
179 struct tce_stats {
180         u_long                  tce_handle;     /* tc element handle */
181         int                     tce_type;       /* e.g., TCETYPE_ELEMENT */
182         struct pktcntr          tce_cnts[3];    /* tcm returns 3 counters */
183 };
184
185 struct cdnr_get_stats {
186         struct cdnr_interface   iface;
187         struct pktcntr          cnts[TCACODE_MAX+1];
188
189         /* element stats */
190         int                     nskip;          /* skip # of elements */
191         int                     nelements;      /* # of element stats (WR) */
192         struct tce_stats        *tce_stats;     /* pointer to stats array */
193 };
194
195 #define CDNR_IF_ATTACH          _IOW('Q', 1, struct cdnr_interface)
196 #define CDNR_IF_DETACH          _IOW('Q', 2, struct cdnr_interface)
197 #define CDNR_ENABLE             _IOW('Q', 3, struct cdnr_interface)
198 #define CDNR_DISABLE            _IOW('Q', 4, struct cdnr_interface)
199 #define CDNR_ADD_FILTER         _IOWR('Q', 10, struct cdnr_add_filter)
200 #define CDNR_DEL_FILTER         _IOW('Q', 11, struct cdnr_delete_filter)
201 #define CDNR_GETSTATS           _IOWR('Q', 12, struct cdnr_get_stats)
202 #define CDNR_ADD_ELEM           _IOWR('Q', 30, struct cdnr_add_element)
203 #define CDNR_DEL_ELEM           _IOW('Q', 31, struct cdnr_delete_element)
204 #define CDNR_ADD_TBM            _IOWR('Q', 32, struct cdnr_add_tbmeter)
205 #define CDNR_MOD_TBM            _IOW('Q', 33, struct cdnr_modify_tbmeter)
206 #define CDNR_TBM_STATS          _IOWR('Q', 34, struct cdnr_tbmeter_stats)
207 #define CDNR_ADD_TCM            _IOWR('Q', 35, struct cdnr_add_trtcm)
208 #define CDNR_MOD_TCM            _IOWR('Q', 36, struct cdnr_modify_trtcm)
209 #define CDNR_TCM_STATS          _IOWR('Q', 37, struct cdnr_tcm_stats)
210 #define CDNR_ADD_TSW            _IOWR('Q', 38, struct cdnr_add_tswtcm)
211 #define CDNR_MOD_TSW            _IOWR('Q', 39, struct cdnr_modify_tswtcm)
212
213 #ifndef DSCP_EF
214 /* diffserve code points */
215 #define DSCP_MASK       0xfc
216 #define DSCP_CUMASK     0x03
217 #define DSCP_EF         0xb8
218 #define DSCP_AF11       0x28
219 #define DSCP_AF12       0x30
220 #define DSCP_AF13       0x38
221 #define DSCP_AF21       0x48
222 #define DSCP_AF22       0x50
223 #define DSCP_AF23       0x58
224 #define DSCP_AF31       0x68
225 #define DSCP_AF32       0x70
226 #define DSCP_AF33       0x78
227 #define DSCP_AF41       0x88
228 #define DSCP_AF42       0x90
229 #define DSCP_AF43       0x98
230 #define AF_CLASSMASK            0xe0
231 #define AF_DROPPRECMASK         0x18
232 #endif
233
234 #ifdef _KERNEL
235
236 /*
237  * packet information passed to the input function of tc elements
238  */
239 struct cdnr_pktinfo {
240         int             pkt_len;        /* packet length */
241         u_int8_t        pkt_dscp;       /* diffserv code point */
242 };
243
244 /*
245  * traffic conditioner control block common to all types of tc elements
246  */
247 struct cdnr_block {
248         LIST_ENTRY(cdnr_block)  cb_next;
249         int             cb_len;         /* size of this tc element */
250         int             cb_type;        /* cdnr block type */
251         int             cb_ref;         /* reference count of this element */
252         u_long          cb_handle;      /* handle of this tc element */
253         struct top_cdnr *cb_top;        /* back pointer to top */
254         struct tc_action cb_action;     /* top level action for this tcb */
255         struct tc_action *(*cb_input)(struct cdnr_block *,
256                                       struct cdnr_pktinfo *);
257 };
258
259 /*
260  * top level traffic conditioner structure for an interface
261  */
262 struct top_cdnr {
263         struct cdnr_block       tc_block;
264
265         LIST_ENTRY(top_cdnr)    tc_next;
266         struct ifaltq           *tc_ifq;
267
268         LIST_HEAD(, cdnr_block) tc_elements;
269 #ifdef ALTQ3_CLFIER_COMPAT
270         struct acc_classifier   tc_classifier;
271 #endif
272         struct pktcntr          tc_cnts[TCACODE_MAX+1];
273 };
274
275 /* token bucket element */
276 struct tbe {
277         u_int64_t       rate;
278         u_int64_t       depth;
279
280         u_int64_t       token;
281         u_int64_t       filluptime;
282         u_int64_t       last;
283 };
284
285 /* token bucket meter structure */
286 struct tbmeter {
287         struct cdnr_block       cdnrblk;        /* conditioner block */
288         struct tbe              tb;             /* token bucket */
289         struct tc_action        in_action;      /* actions for IN/OUT */
290         struct tc_action        out_action;     /* actions for IN/OUT */
291         struct pktcntr          in_cnt;         /* statistics for IN/OUT */
292         struct pktcntr          out_cnt;        /* statistics for IN/OUT */
293 };
294
295 /* two-rate three-color marker structure */
296 struct trtcm {
297         struct cdnr_block       cdnrblk;        /* conditioner block */
298         struct tbe              cmtd_tb;        /* committed tb profile */
299         struct tbe              peak_tb;        /* peak tb profile */
300         struct tc_action        green_action;
301         struct tc_action        yellow_action;
302         struct tc_action        red_action;
303         int                     coloraware;
304         u_int8_t                green_dscp;
305         u_int8_t                yellow_dscp;
306         u_int8_t                red_dscp;
307         struct pktcntr          green_cnt;
308         struct pktcntr          yellow_cnt;
309         struct pktcntr          red_cnt;
310 };
311
312 /* time sliding window three-color marker structure */
313 struct tswtcm {
314         struct cdnr_block       cdnrblk;        /* conditioner block */
315
316         u_int32_t               avg_rate;       /* average rate (bytes/sec) */
317         u_int64_t               t_front;        /* timestamp of last update */
318
319         u_int64_t               timewin;        /* average interval */
320         u_int32_t               cmtd_rate;      /* committed target rate */
321         u_int32_t               peak_rate;      /* peak target rate */
322         struct tc_action        green_action;
323         struct tc_action        yellow_action;
324         struct tc_action        red_action;
325         u_int8_t                green_dscp;
326         u_int8_t                yellow_dscp;
327         u_int8_t                red_dscp;
328         struct pktcntr          green_cnt;
329         struct pktcntr          yellow_cnt;
330         struct pktcntr          red_cnt;
331 };
332
333 #endif /* _KERNEL */
334
335 #endif /* _ALTQ_ALTQ_CDNR_H_ */