Annotation of sys/altq/altq_cdnr.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: altq_cdnr.h,v 1.4 2002/12/16 17:27:20 henning Exp $ */
2: /* $KAME: altq_cdnr.h,v 1.6 2000/12/14 08:12:45 thorpej Exp $ */
3:
4: /*
5: * Copyright (C) 1999-2000
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 tce_stats {
167: u_long tce_handle; /* tc element handle */
168: int tce_type; /* e.g., TCETYPE_ELEMENT */
169: struct pktcntr tce_cnts[3]; /* tcm returns 3 counters */
170: };
171:
172: struct cdnr_get_stats {
173: struct cdnr_interface iface;
174: struct pktcntr cnts[TCACODE_MAX+1];
175:
176: /* element stats */
177: int nskip; /* skip # of elements */
178: int nelements; /* # of element stats (WR) */
179: struct tce_stats *tce_stats; /* pointer to stats array */
180: };
181:
182: #ifndef DSCP_EF
183: /* diffserve code points */
184: #define DSCP_MASK 0xfc
185: #define DSCP_CUMASK 0x03
186: #define DSCP_EF 0xb8
187: #define DSCP_AF11 0x28
188: #define DSCP_AF12 0x30
189: #define DSCP_AF13 0x38
190: #define DSCP_AF21 0x48
191: #define DSCP_AF22 0x50
192: #define DSCP_AF23 0x58
193: #define DSCP_AF31 0x68
194: #define DSCP_AF32 0x70
195: #define DSCP_AF33 0x78
196: #define DSCP_AF41 0x88
197: #define DSCP_AF42 0x90
198: #define DSCP_AF43 0x98
199: #define AF_CLASSMASK 0xe0
200: #define AF_DROPPRECMASK 0x18
201: #endif
202:
203: #ifdef _KERNEL
204:
205: /*
206: * packet information passed to the input function of tc elements
207: */
208: struct cdnr_pktinfo {
209: int pkt_len; /* packet length */
210: u_int8_t pkt_dscp; /* diffserv code point */
211: };
212:
213: /*
214: * traffic conditioner control block common to all types of tc elements
215: */
216: struct cdnr_block {
217: LIST_ENTRY(cdnr_block) cb_next;
218: int cb_len; /* size of this tc element */
219: int cb_type; /* cdnr block type */
220: int cb_ref; /* reference count of this element */
221: u_long cb_handle; /* handle of this tc element */
222: struct top_cdnr *cb_top; /* back pointer to top */
223: struct tc_action cb_action; /* top level action for this tcb */
224: struct tc_action *(*cb_input)(struct cdnr_block *,
225: struct cdnr_pktinfo *);
226: };
227:
228: /*
229: * top level traffic conditioner structure for an interface
230: */
231: struct top_cdnr {
232: struct cdnr_block tc_block;
233:
234: LIST_ENTRY(top_cdnr) tc_next;
235: struct ifaltq *tc_ifq;
236:
237: LIST_HEAD(, cdnr_block) tc_elements;
238:
239: struct pktcntr tc_cnts[TCACODE_MAX+1];
240: };
241:
242: /* token bucket element */
243: struct tbe {
244: u_int64_t rate;
245: u_int64_t depth;
246:
247: u_int64_t token;
248: u_int64_t filluptime;
249: u_int64_t last;
250: };
251:
252: /* token bucket meter structure */
253: struct tbmeter {
254: struct cdnr_block cdnrblk; /* conditioner block */
255: struct tbe tb; /* token bucket */
256: struct tc_action in_action; /* actions for IN/OUT */
257: struct tc_action out_action; /* actions for IN/OUT */
258: struct pktcntr in_cnt; /* statistics for IN/OUT */
259: struct pktcntr out_cnt; /* statistics for IN/OUT */
260: };
261:
262: /* two-rate three-color marker structure */
263: struct trtcm {
264: struct cdnr_block cdnrblk; /* conditioner block */
265: struct tbe cmtd_tb; /* committed tb profile */
266: struct tbe peak_tb; /* peak tb profile */
267: struct tc_action green_action;
268: struct tc_action yellow_action;
269: struct tc_action red_action;
270: int coloraware;
271: u_int8_t green_dscp;
272: u_int8_t yellow_dscp;
273: u_int8_t red_dscp;
274: struct pktcntr green_cnt;
275: struct pktcntr yellow_cnt;
276: struct pktcntr red_cnt;
277: };
278:
279: /* time sliding window three-color marker structure */
280: struct tswtcm {
281: struct cdnr_block cdnrblk; /* conditioner block */
282:
283: u_int32_t avg_rate; /* average rate (bytes/sec) */
284: u_int64_t t_front; /* timestamp of last update */
285:
286: u_int64_t timewin; /* average interval */
287: u_int32_t cmtd_rate; /* committed target rate */
288: u_int32_t peak_rate; /* peak target rate */
289: struct tc_action green_action;
290: struct tc_action yellow_action;
291: struct tc_action red_action;
292: u_int8_t green_dscp;
293: u_int8_t yellow_dscp;
294: u_int8_t red_dscp;
295: struct pktcntr green_cnt;
296: struct pktcntr yellow_cnt;
297: struct pktcntr red_cnt;
298: };
299:
300: #endif /* _KERNEL */
301:
302: #endif /* _ALTQ_ALTQ_CDNR_H_ */
CVSweb