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