1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _IPP_METERS_METER_IMPL_H
28 #define	_IPP_METERS_METER_IMPL_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/types.h>
33 #include <sys/cmn_err.h>
34 #include <sys/debug.h>
35 #include <sys/spl.h>
36 #include <ipp/ipp.h>
37 #include <inet/ipp_common.h>
38 #include <ipp/meters/meter.h>
39 
40 #ifdef	__cplusplus
41 extern "C" {
42 #endif
43 
44 /* Header file for implementation of all the metering modules */
45 
46 #ifdef	_KERNEL
47 
48 /* for a colour aware meter */
49 enum meter_colour {
50 	TOKENMT_GREEN = 0x01,
51 	TOKENMT_YELLOW = 0x02,
52 	TOKENMT_RED = 0x04
53 };
54 
55 /* If yellow action is not provided, set it to infinity */
56 #define	TOKENMT_NO_ACTION	0x7fffffff
57 
58 #define	METER_SEC_TO_NSEC	1000000000
59 #define	METER_MSEC_TO_NSEC	1000000
60 
61 #define	_TOKENMT_DEBUG
62 #define	_TSWTCL_DEBUG
63 
64 #ifdef _TOKENMT_DEBUG
65 #define	tokenmt0dbg(a)		printf a
66 #define	tokenmt1dbg(a)		if (tokenmt_debug > 2) printf a
67 #define	tokenmt2dbg(a)		if (tokenmt_debug > 3) printf a
68 #else
69 #define	tokenmt0dbg(a)		/*  */
70 #define	tokenmt1dbg(a)		/*  */
71 #define	tokenmt2dbg(a)		/*  */
72 #endif /* _TOKENMT_DEBUG */
73 
74 #ifdef _TSWTCL_DEBUG
75 #define	tswtcl0dbg(a)		printf a
76 #define	tswtcl1dbg(a)		if (tswtcl_debug > 2) printf a
77 #define	tswtcl2dbg(a)		if (tswtcl_debug > 3) printf a
78 #else
79 #define	tswtcl0dbg(a)		/*  */
80 #define	tswtcl1dbg(a)		/*  */
81 #define	tswtcl2dbg(a)		/*  */
82 #endif /* _TSWTCL_DEBUG */
83 
84 #define	SRTCL_TOKENMT		0x01
85 #define	TRTCL_TOKENMT		0x02
86 
87 #define	DROP_PRECD_MASK		0x07
88 
89 /* Stat structure for the tokenmts */
90 typedef struct meter_stat_t {
91 	ipp_named_t red_bits;
92 	ipp_named_t yellow_bits;
93 	ipp_named_t green_bits;
94 	ipp_named_t red_packets;
95 	ipp_named_t yellow_packets;
96 	ipp_named_t green_packets;
97 	ipp_named_t epackets;
98 } meter_stat_t;
99 
100 #define	TOKENMT_STATS_STRING	"tokenmt statistics"
101 #define	TSWTCL_STATS_STRING	"tswtclmtr statistics"
102 #define	METER_STATS_COUNT	7
103 
104 /* Configuration paratokenmts for tokenmt */
105 typedef struct tokenmt_cfg_s {
106 
107 	/* Next action for Green, Yellow and Red packets */
108 	ipp_action_id_t red_action;
109 	ipp_action_id_t yellow_action;
110 	ipp_action_id_t green_action;
111 
112 	/* Meter type  - SRTCL_TOKENMT or TRTCL_TOKENMT */
113 	uint_t tokenmt_type;
114 
115 	/* Committed rate in Kb/sec */
116 	uint32_t committed_rate;
117 	uint32_t peak_rate;
118 
119 	/* Committed and Peak burst sizes in bits */
120 	uint32_t committed_burst;
121 	uint32_t peak_burst;
122 
123 	/* Needs stats or not */
124 	boolean_t stats;
125 
126 	/* Meter Colour aware or not */
127 	boolean_t colour_aware;
128 
129 	/* Meter dscp to colour mapping, if colour aware */
130 	enum meter_colour dscp_to_colour[64];
131 
132 	/* timer */
133 	timeout_id_t timer;
134 }tokenmt_cfg_t;
135 
136 typedef struct tokenmt_data_s {
137 
138 	/* stats for this instance */
139 	ipp_stat_t *stats;
140 
141 	/* # packets classified as Red, Yellow and Green for this instance */
142 	uint64_t red_packets;
143 	uint64_t yellow_packets;
144 	uint64_t green_packets;
145 	uint64_t red_bits;
146 	uint64_t yellow_bits;
147 	uint64_t green_bits;
148 	uint64_t epackets;
149 
150 	/* configured paratokenmts */
151 	tokenmt_cfg_t *cfg_parms;
152 
153 	/* No. of tokens at the committed and peak burst */
154 	uint64_t committed_tokens;
155 	uint64_t peak_tokens;
156 
157 	/* For replenishing the token buckets */
158 	uint64_t last_seen;
159 
160 	/* Lock to protect data structures */
161 	kmutex_t tokenmt_lock;
162 } tokenmt_data_t;
163 
164 typedef struct tswtcl_cfg_s {
165 
166 	/* Next action for Green, Yellow and Red packets */
167 	ipp_action_id_t red_action;
168 	ipp_action_id_t yellow_action;
169 	ipp_action_id_t green_action;
170 
171 	/* Committed and Peak rates in KB/sec */
172 	uint32_t committed_rate;
173 	uint32_t peak_rate;
174 
175 	/* Window size in ms */
176 	uint32_t window;
177 
178 	/* Need stats or not */
179 	boolean_t stats;
180 
181 	/* For aiding computations */
182 	uint64_t nsecwindow;
183 	uint32_t pminusc;
184 }tswtcl_cfg_t;
185 
186 typedef struct tswtcl_data_s {
187 
188 	/* stats for this instance */
189 	ipp_stat_t *stats;
190 
191 	/* Computed average rate */
192 	uint32_t avg_rate;
193 
194 	/* Front of the sliding window */
195 	hrtime_t win_front;
196 
197 	/* # packets classified as Red, Yellow and Green for this instance */
198 	uint64_t red_packets;
199 	uint64_t yellow_packets;
200 	uint64_t green_packets;
201 	uint64_t red_bits;
202 	uint64_t yellow_bits;
203 	uint64_t green_bits;
204 	uint64_t epackets;
205 
206 	/* Configured paramters */
207 	tswtcl_cfg_t *cfg_parms;
208 
209 	/* Lock to protect data structures */
210 	kmutex_t tswtcl_lock;
211 } tswtcl_data_t;
212 
213 #define	TOKENMT_DATA_SZ		sizeof (tokenmt_data_t)
214 #define	TOKENMT_CFG_SZ		sizeof (tokenmt_cfg_t)
215 #define	TSWTCL_DATA_SZ		sizeof (tswtcl_data_t)
216 #define	TSWTCL_CFG_SZ		sizeof (tswtcl_cfg_t)
217 
218 extern int tokenmt_process(mblk_t **, tokenmt_data_t *, ipp_action_id_t *);
219 extern int tswtcl_process(mblk_t **, tswtcl_data_t *, ipp_action_id_t *);
220 
221 #endif /* _KERNEL */
222 
223 #ifdef	__cplusplus
224 }
225 #endif
226 
227 #endif /* _IPP_METERS_METER_IMPL_H */
228