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 (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_NXGE_NXGE_FLOW_H
27 #define	_SYS_NXGE_NXGE_FLOW_H
28 
29 #ifdef	__cplusplus
30 extern "C" {
31 #endif
32 
33 #include <netinet/in.h>
34 #define	S6_addr32	_S6_un._S6_u32
35 
36 typedef struct tcpip4_spec_s {
37 	in_addr_t  ip4src;
38 	in_addr_t  ip4dst;
39 	in_port_t  psrc;
40 	in_port_t  pdst;
41 	uint8_t	   tos;
42 } tcpip4_spec_t;
43 
44 typedef struct tcpip6_spec_s {
45 	struct in6_addr ip6src;
46 	struct in6_addr ip6dst;
47 	in_port_t  psrc;
48 	in_port_t  pdst;
49 	uint8_t	   tos;
50 } tcpip6_spec_t;
51 
52 typedef struct udpip4_spec_s {
53 	in_addr_t  ip4src;
54 	in_addr_t  ip4dst;
55 	in_port_t  psrc;
56 	in_port_t  pdst;
57 	uint8_t	   tos;
58 } udpip4_spec_t;
59 
60 typedef struct udpip6_spec_s {
61 	struct in6_addr ip6src;
62 	struct in6_addr ip6dst;
63 	in_port_t  psrc;
64 	in_port_t  pdst;
65 	uint8_t	   tos;
66 } udpip6_spec_t;
67 
68 typedef struct ahip4_spec_s {
69 	in_addr_t  ip4src;
70 	in_addr_t  ip4dst;
71 	uint32_t   spi;
72 	uint8_t	   tos;
73 } ahip4_spec_t;
74 
75 typedef struct ahip6_spec_s {
76 	struct in6_addr ip6src;
77 	struct in6_addr ip6dst;
78 	uint32_t   spi;
79 	uint8_t	   tos;
80 } ahip6_spec_t;
81 
82 typedef ahip4_spec_t espip4_spec_t;
83 typedef ahip6_spec_t espip6_spec_t;
84 
85 typedef struct rawip4_spec_s {
86 	struct in6_addr ip4src;
87 	struct in6_addr ip4dst;
88 	uint8_t    hdata[64];
89 } rawip4_spec_t;
90 
91 typedef struct rawip6_spec_s {
92 	struct in6_addr ip6src;
93 	struct in6_addr ip6dst;
94 	uint8_t    hdata[64];
95 } rawip6_spec_t;
96 
97 
98 typedef struct ether_spec_s {
99 	uint16_t   ether_type;
100 	uint8_t    frame_size;
101 	uint8_t    eframe[16];
102 } ether_spec_t;
103 
104 
105 #define	FSPEC_IP4	1
106 #define	FSPEC_IP6	2
107 
108 typedef struct ip_user_spec_s {
109 	uint32_t	ip4src;
110 	uint32_t	ip4dst;
111 	uint32_t	l4_4_bytes;
112 	uint8_t    	tos;
113 	uint8_t    	ip_ver;
114 	uint8_t    	proto;
115 } ip_user_spec_t;
116 
117 typedef struct ip6_frag_spec_s {
118 	struct in6_addr ip6src;
119 	struct in6_addr ip6dst;
120 	uint32_t	l4_4_bytes;
121 	uint8_t    	tos;
122 	uint8_t    	proto;	/* should be 44 */
123 } ip6_frag_spec_t;
124 
125 
126 typedef ether_spec_t arpip_spec_t;
127 typedef ether_spec_t ether_user_spec_t;
128 
129 struct flow_spec_s {
130 	uint32_t  flow_type;
131 	union {
132 		tcpip4_spec_t tcpip4spec;
133 		tcpip6_spec_t tcpip6spec;
134 		udpip4_spec_t udpip4spec;
135 		udpip6_spec_t udpip6spec;
136 		arpip_spec_t  arpipspec;
137 		ahip4_spec_t  ahip4spec;
138 		ahip6_spec_t  ahip6spec;
139 		espip4_spec_t espip4spec;
140 		espip6_spec_t espip6spec;
141 		rawip4_spec_t rawip4spec;
142 		rawip6_spec_t rawip6spec;
143 		ether_spec_t  etherspec;
144 		ip_user_spec_t  ip_usr_spec;
145 		ip6_frag_spec_t  ip6_frag_spec;
146 		uint8_t		hdata[64];
147 	} uh, um; /* entry, mask */
148 } __attribute__((packed));
149 
150 typedef struct flow_spec_s flow_spec_t;
151 
152 #define	FSPEC_TCPIP4	0x1	/* TCP/IPv4 Flow */
153 #define	FSPEC_TCPIP6	0x2	/* TCP/IPv6 */
154 #define	FSPEC_UDPIP4	0x3	/* UDP/IPv4 */
155 #define	FSPEC_UDPIP6	0x4	/* UDP/IPv6 */
156 #define	FSPEC_ARPIP	0x5	/* ARP/IPv4 */
157 #define	FSPEC_AHIP4	0x6	/* AH/IP4   */
158 #define	FSPEC_AHIP6	0x7	/* AH/IP6   */
159 #define	FSPEC_ESPIP4	0x8	/* ESP/IP4  */
160 #define	FSPEC_ESPIP6	0x9	/* ESP/IP6  */
161 #define	FSPEC_SCTPIP4	0xA	/* SCTP/IP4  */
162 #define	FSPEC_SCTPIP6	0xB	/* SCTP/IP6  */
163 #define	FSPEC_IP6FRAG	0xC	/* IPv6 Fragments */
164 #define	FSPEC_RAW4	0xD	/* RAW/IP4  */
165 #define	FSPEC_RAW6	0xE	/* RAW/IP6  */
166 #define	FSPEC_ETHER	0xF	/* ETHER Programmable  */
167 #define	FSPEC_IP_USR	0x10	/* IP Programmable  */
168 #define	FSPEC_HDATA	0x11	/* Pkt Headers eth-da,sa,etype,ip,tcp(Bitmap) */
169 
170 #define	TCAM_IPV6_ADDR(m32, ip6addr) {		\
171 		m32[0] = ip6addr.S6_addr32[0]; \
172 		m32[1] = ip6addr.S6_addr32[1]; \
173 		m32[2] = ip6addr.S6_addr32[2]; \
174 		m32[3] = ip6addr.S6_addr32[3]; \
175 	}
176 
177 #define	FSPEC_IPV6_ADDR(ip6addr, m32) {		\
178 	ip6addr.S6_addr32[0] = m32[0];		\
179 	ip6addr.S6_addr32[1] = m32[1];		\
180 	ip6addr.S6_addr32[2] = m32[2];		\
181 	ip6addr.S6_addr32[3] = m32[3];		\
182 }
183 
184 #define	TCAM_IPV4_ADDR(m32, ip4addr) (m32 = ip4addr)
185 #define	FSPEC_IPV4_ADDR(ip4addr, m32) (ip4addr = m32)
186 
187 #define	TCAM_IP_PORTS(port32, dp, sp)	  (port32 = dp | (sp << 16))
188 #define	FSPEC_IP_PORTS(dp, sp, port32) {	\
189 	dp = port32 & 0xff;			\
190 	sp = port32 >> 16;			\
191 }
192 
193 #define	TCAM_IP_CLASS(key, mask, class)	  {		\
194 		key = class; \
195 		mask = 0x1f; \
196 	}
197 
198 #define	TCAM_IP_PROTO(key, mask, proto) {		\
199 		key = proto; \
200 		mask = 0xff; \
201 	}
202 
203 struct flow_resource_s {
204 	uint64_t channel_cookie;
205 	uint64_t flow_cookie;
206 	uint64_t location;
207 	flow_spec_t flow_spec;
208 } __attribute__((packed));
209 
210 typedef struct flow_resource_s flow_resource_t;
211 
212 /* ioctl data structure and cmd types for configuring rx classification */
213 
214 #define	NXGE_RX_CLASS_GCHAN	0x01
215 #define	NXGE_RX_CLASS_GRULE_CNT	0x02
216 #define	NXGE_RX_CLASS_GRULE	0x03
217 #define	NXGE_RX_CLASS_GRULE_ALL	0x04
218 #define	NXGE_RX_CLASS_RULE_DEL	0x05
219 #define	NXGE_RX_CLASS_RULE_INS	0x06
220 
221 #define	NXGE_PKT_DISCARD	0xffffffffffffffffULL
222 
223 struct rx_class_cfg_s {
224 	uint32_t cmd;
225 	uint32_t data; /* the rule DB size or the # rx rings */
226 	uint64_t rule_cnt;
227 	uint32_t rule_locs[256];
228 	flow_resource_t fs;
229 } __attribute__((packed));
230 
231 typedef struct rx_class_cfg_s rx_class_cfg_t;
232 
233 /*
234  * ioctl data structure and cmd types for configuring rx hash
235  * for IP tunneled traffic and symmetric mode.
236  */
237 
238 #define	NXGE_IPTUN_CFG_ADD_CLS	0x07
239 #define	NXGE_IPTUN_CFG_SET_HASH	0x08
240 #define	NXGE_IPTUN_CFG_DEL_CLS	0x09
241 #define	NXGE_IPTUN_CFG_GET_CLS	0x0a
242 #define	NXGE_CLS_CFG_SET_SYM	0x0b
243 #define	NXGE_CLS_CFG_GET_SYM	0x0c
244 
245 #define	IPTUN_PKT_IPV4		1
246 #define	IPTUN_PKT_IPV6		2
247 #define	IPTUN_PKT_GRE		3
248 #define	IPTUN_PKT_GTP		4
249 #define	OTHER_USR_PKT		5
250 
251 #define	SEL_L4B_0_3		0x0001
252 #define	SEL_L4B_4_7		0x0002
253 #define	SEL_L4B_8_11		0x0004
254 #define	SEL_L4B_12_15		0x0008
255 #define	SEL_L4B_16_19		0x0010
256 #define	SEL_L4B_20_23		0x0020
257 #define	SEL_L4B_24_27		0x0040
258 #define	SEL_L4B_28_31		0x0080
259 #define	SEL_L4B_32_35		0x0100
260 #define	SEL_L4B_36_39		0x0200
261 
262 #define	HASH_IFPORT		0x0001
263 #define	HASH_L2DA		0x0002
264 #define	HASH_VLAN		0x0004
265 #define	HASH_IPSA		0x0008
266 #define	HASH_IPDA		0x0010
267 #define	HASH_L3PROTO		0x0020
268 
269 #define	CLS_TCPV4		0x08
270 #define	CLS_UDPV4		0x09
271 #define	CLS_AHESPV4		0x0A
272 #define	CLS_SCTPV4		0x0B
273 #define	CLS_TCPV6		0x0C
274 #define	CLS_UDPV6		0x0D
275 #define	CLS_AHESPV6		0x0E
276 #define	CLS_SCTPV6		0x0F
277 #define	CLS_IPV6FRAG		0x1F
278 
279 struct _iptun_cfg {
280 	uint8_t		in_pkt_type;
281 	uint8_t		l4b0_val;
282 	uint8_t		l4b0_mask;
283 	uint8_t		l4b23_sel;
284 	uint16_t	l4b23_val;
285 	uint16_t	l4xor_sel;
286 	uint8_t		hash_flags;
287 } __attribute__((packed));
288 
289 typedef struct _iptun_cfg iptun_cfg_t;
290 
291 struct _cfg_cmd {
292 	uint16_t cmd;
293 	uint8_t sym;
294 	uint8_t	class_id;
295 	iptun_cfg_t	iptun_cfg;
296 } __attribute__((packed));
297 
298 typedef struct _cfg_cmd cfg_cmd_t;
299 
300 #ifdef	__cplusplus
301 }
302 #endif
303 
304 #endif	/* _SYS_NXGE_NXGE_FLOW_H */
305