1 /* $NetBSD: altq_cdnr.h,v 1.4.12.1 2006/03/18 12:08:18 peter Exp $ */
2 /* $KAME: altq_cdnr.h,v 1.9 2003/07/10 12:07:48 kjc Exp $ */
5 * Copyright (C) 1999-2002
6 * Sony Computer Science Laboratories Inc. All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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.
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
30 #ifndef _ALTQ_ALTQ_CDNR_H_
31 #define _ALTQ_ALTQ_CDNR_H_
33 #include <altq/altq.h>
36 * traffic conditioner element types
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 */
46 * traffic conditioner action
51 int tca_code
; /* e.g., TCACODE_PASS */
52 /* tca_code dependent variable */
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 */
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
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 */
74 #define CDNR_NULL_HANDLE 0
76 struct cdnr_interface
{
77 char cdnr_ifname
[IFNAMSIZ
]; /* interface name (e.g., fxp0) */
80 /* simple element operations */
81 struct cdnr_add_element
{
82 struct cdnr_interface iface
;
83 struct tc_action action
;
85 u_long cdnr_handle
; /* return value */
88 struct cdnr_delete_element
{
89 struct cdnr_interface iface
;
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
;
100 u_long cdnr_handle
; /* return value */
103 struct cdnr_modify_tbmeter
{
104 struct cdnr_interface iface
;
106 struct tb_profile profile
;
109 struct cdnr_tbmeter_stats
{
110 struct cdnr_interface iface
;
112 struct pktcntr in_cnt
;
113 struct pktcntr out_cnt
;
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 */
126 u_long cdnr_handle
; /* return value */
129 struct cdnr_modify_trtcm
{
130 struct cdnr_interface iface
;
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 */
137 struct cdnr_tcm_stats
{
138 struct cdnr_interface iface
;
140 struct pktcntr green_cnt
;
141 struct pktcntr yellow_cnt
;
142 struct pktcntr red_cnt
;
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 */
155 u_long cdnr_handle
; /* return value */
158 struct cdnr_modify_tswtcm
{
159 struct cdnr_interface iface
;
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) */
166 struct cdnr_add_filter
{
167 struct cdnr_interface iface
;
169 #ifdef ALTQ3_CLFIER_COMPAT
170 struct flow_filter filter
;
172 u_long filter_handle
; /* return value */
175 struct cdnr_delete_filter
{
176 struct cdnr_interface iface
;
177 u_long filter_handle
;
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 */
186 struct cdnr_get_stats
{
187 struct cdnr_interface iface
;
188 struct pktcntr cnts
[TCACODE_MAX
+1];
191 int nskip
; /* skip # of elements */
192 int nelements
; /* # of element stats (WR) */
193 struct tce_stats
*tce_stats
; /* pointer to stats array */
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)
215 /* diffserve code points */
216 #define DSCP_MASK 0xfc
217 #define DSCP_CUMASK 0x03
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
238 * packet information passed to the input function of tc elements
240 struct cdnr_pktinfo
{
241 int pkt_len
; /* packet length */
242 u_int8_t pkt_dscp
; /* diffserv code point */
246 * traffic conditioner control block common to all types of tc elements
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
*);
261 * top level traffic conditioner structure for an interface
264 struct cdnr_block tc_block
;
266 LIST_ENTRY(top_cdnr
) tc_next
;
267 struct ifaltq
*tc_ifq
;
269 LIST_HEAD(, cdnr_block
) tc_elements
;
270 #ifdef ALTQ3_CLFIER_COMPAT
271 struct acc_classifier tc_classifier
;
273 struct pktcntr tc_cnts
[TCACODE_MAX
+1];
276 /* token bucket element */
282 u_int64_t filluptime
;
286 /* token bucket meter structure */
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 */
296 /* two-rate three-color marker structure */
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
;
306 u_int8_t yellow_dscp
;
308 struct pktcntr green_cnt
;
309 struct pktcntr yellow_cnt
;
310 struct pktcntr red_cnt
;
313 /* time sliding window three-color marker structure */
315 struct cdnr_block cdnrblk
; /* conditioner block */
317 u_int32_t avg_rate
; /* average rate (bytes/sec) */
318 u_int64_t t_front
; /* timestamp of last update */
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
;
327 u_int8_t yellow_dscp
;
329 struct pktcntr green_cnt
;
330 struct pktcntr yellow_cnt
;
331 struct pktcntr red_cnt
;
336 #endif /* _ALTQ_ALTQ_CDNR_H_ */