source: rtems-libbsd/contrib/altq/rtems/freebsd/altq/altq_cdnr.h @ 9a8e3e0

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since 9a8e3e0 was 9a8e3e0, checked in by Joel Sherrill <joel.sherrill@…>, on 03/08/12 at 14:17:55

Revert move of contrib until more sorted out

  • Property mode set to 100644
File size: 10.0 KB
Line 
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_HH_
30#define _ALTQ_ALTQ_CDNR_HH_
31
32#include <rtems/freebsd/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 */
47struct cdnr_block;
48
49struct 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
75struct cdnr_interface {
76        char    cdnr_ifname[IFNAMSIZ];  /* interface name (e.g., fxp0) */
77};
78
79/* simple element operations */
80struct cdnr_add_element {
81        struct cdnr_interface   iface;
82        struct tc_action        action;
83
84        u_long                  cdnr_handle;    /* return value */
85};
86
87struct cdnr_delete_element {
88        struct cdnr_interface   iface;
89        u_long                  cdnr_handle;
90};
91
92/* token-bucket meter operations */
93struct 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
102struct cdnr_modify_tbmeter {
103        struct cdnr_interface   iface;
104        u_long                  cdnr_handle;
105        struct tb_profile       profile;
106};
107
108struct 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 */
116struct 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
128struct 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
136struct 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 */
145struct 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
157struct 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
165struct 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
174struct cdnr_delete_filter {
175        struct cdnr_interface   iface;
176        u_long                  filter_handle;
177};
178
179struct 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
185struct 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 */
239struct 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 */
247struct 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 */
262struct 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 */
276struct 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 */
286struct 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 */
296struct 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 */
313struct 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_HH_ */
Note: See TracBrowser for help on using the repository browser.