docs/how-to-build.md: use proper markup for directory names
[unleashed/tickless.git] / include / sys / nxge / nxge_flow.h
blob637f1aad8d2be59db29d6604ed4402bbe7c1c535
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_NXGE_NXGE_FLOW_H
27 #define _SYS_NXGE_NXGE_FLOW_H
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
33 #include <netinet/in.h>
34 #define S6_addr32 _S6_un._S6_u32
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;
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;
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;
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;
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;
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;
82 typedef ahip4_spec_t espip4_spec_t;
83 typedef ahip6_spec_t espip6_spec_t;
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;
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;
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;
105 #define FSPEC_IP4 1
106 #define FSPEC_IP6 2
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;
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;
126 typedef ether_spec_t arpip_spec_t;
127 typedef ether_spec_t ether_user_spec_t;
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));
150 typedef struct flow_spec_s flow_spec_t;
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) */
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]; \
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]; \
184 #define TCAM_IPV4_ADDR(m32, ip4addr) (m32 = ip4addr)
185 #define FSPEC_IPV4_ADDR(ip4addr, m32) (ip4addr = m32)
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; \
193 #define TCAM_IP_CLASS(key, mask, class) { \
194 key = class; \
195 mask = 0x1f; \
198 #define TCAM_IP_PROTO(key, mask, proto) { \
199 key = proto; \
200 mask = 0xff; \
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));
210 typedef struct flow_resource_s flow_resource_t;
212 /* ioctl data structure and cmd types for configuring rx classification */
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
221 #define NXGE_PKT_DISCARD 0xffffffffffffffffULL
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));
231 typedef struct rx_class_cfg_s rx_class_cfg_t;
234 * ioctl data structure and cmd types for configuring rx hash
235 * for IP tunneled traffic and symmetric mode.
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
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
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
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
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
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));
289 typedef struct _iptun_cfg iptun_cfg_t;
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));
298 typedef struct _cfg_cmd cfg_cmd_t;
300 #ifdef __cplusplus
302 #endif
304 #endif /* _SYS_NXGE_NXGE_FLOW_H */