xref: /illumos-gate/usr/src/uts/common/io/hxge/hxge_flow.h (revision 2d6eb4a5)
1*3dec9fcdSqs /*
2*3dec9fcdSqs  * CDDL HEADER START
3*3dec9fcdSqs  *
4*3dec9fcdSqs  * The contents of this file are subject to the terms of the
5*3dec9fcdSqs  * Common Development and Distribution License (the "License").
6*3dec9fcdSqs  * You may not use this file except in compliance with the License.
7*3dec9fcdSqs  *
8*3dec9fcdSqs  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*3dec9fcdSqs  * or http://www.opensolaris.org/os/licensing.
10*3dec9fcdSqs  * See the License for the specific language governing permissions
11*3dec9fcdSqs  * and limitations under the License.
12*3dec9fcdSqs  *
13*3dec9fcdSqs  * When distributing Covered Code, include this CDDL HEADER in each
14*3dec9fcdSqs  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*3dec9fcdSqs  * If applicable, add the following below this CDDL HEADER, with the
16*3dec9fcdSqs  * fields enclosed by brackets "[]" replaced with your own identifying
17*3dec9fcdSqs  * information: Portions Copyright [yyyy] [name of copyright owner]
18*3dec9fcdSqs  *
19*3dec9fcdSqs  * CDDL HEADER END
20*3dec9fcdSqs  */
21*3dec9fcdSqs /*
22*3dec9fcdSqs  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*3dec9fcdSqs  * Use is subject to license terms.
24*3dec9fcdSqs  */
25*3dec9fcdSqs 
26*3dec9fcdSqs #ifndef	_SYS_HXGE_HXGE_FLOW_H
27*3dec9fcdSqs #define	_SYS_HXGE_HXGE_FLOW_H
28*3dec9fcdSqs 
29*3dec9fcdSqs #ifdef	__cplusplus
30*3dec9fcdSqs extern "C" {
31*3dec9fcdSqs #endif
32*3dec9fcdSqs 
33*3dec9fcdSqs #include <netinet/in.h>
34*3dec9fcdSqs #define	 S6_addr32		_S6_un._S6_u32
35*3dec9fcdSqs 
36*3dec9fcdSqs typedef struct tcpip4_spec_s {
37*3dec9fcdSqs 	in_addr_t  ip4src;
38*3dec9fcdSqs 	in_addr_t  ip4dst;
39*3dec9fcdSqs 	in_port_t  psrc;
40*3dec9fcdSqs 	in_port_t  pdst;
41*3dec9fcdSqs } tcpip4_spec_t;
42*3dec9fcdSqs 
43*3dec9fcdSqs typedef struct tcpip6_spec_s {
44*3dec9fcdSqs 	struct in6_addr ip6src;
45*3dec9fcdSqs 	struct in6_addr ip6dst;
46*3dec9fcdSqs 	in_port_t  psrc;
47*3dec9fcdSqs 	in_port_t  pdst;
48*3dec9fcdSqs } tcpip6_spec_t;
49*3dec9fcdSqs 
50*3dec9fcdSqs typedef struct udpip4_spec_s {
51*3dec9fcdSqs 	in_addr_t  ip4src;
52*3dec9fcdSqs 	in_addr_t  ip4dst;
53*3dec9fcdSqs 	in_port_t  psrc;
54*3dec9fcdSqs 	in_port_t  pdst;
55*3dec9fcdSqs } udpip4_spec_t;
56*3dec9fcdSqs 
57*3dec9fcdSqs typedef struct udpip6_spec_s {
58*3dec9fcdSqs 	struct in6_addr ip6src;
59*3dec9fcdSqs 	struct in6_addr ip6dst;
60*3dec9fcdSqs 	in_port_t  psrc;
61*3dec9fcdSqs 	in_port_t  pdst;
62*3dec9fcdSqs } udpip6_spec_t;
63*3dec9fcdSqs 
64*3dec9fcdSqs typedef struct ahip4_spec_s {
65*3dec9fcdSqs 	in_addr_t  ip4src;
66*3dec9fcdSqs 	in_addr_t  ip4dst;
67*3dec9fcdSqs 	uint32_t   spi;
68*3dec9fcdSqs } ahip4_spec_t;
69*3dec9fcdSqs 
70*3dec9fcdSqs typedef struct ahip6_spec_s {
71*3dec9fcdSqs 	struct in6_addr ip6src;
72*3dec9fcdSqs 	struct in6_addr ip6dst;
73*3dec9fcdSqs 	uint32_t   spi;
74*3dec9fcdSqs } ahip6_spec_t;
75*3dec9fcdSqs 
76*3dec9fcdSqs typedef ahip4_spec_t espip4_spec_t;
77*3dec9fcdSqs typedef ahip6_spec_t espip6_spec_t;
78*3dec9fcdSqs 
79*3dec9fcdSqs typedef struct rawip4_spec_s {
80*3dec9fcdSqs 	struct in6_addr ip4src;
81*3dec9fcdSqs 	struct in6_addr ip4dst;
82*3dec9fcdSqs 	uint8_t    hdata[64];
83*3dec9fcdSqs } rawip4_spec_t;
84*3dec9fcdSqs 
85*3dec9fcdSqs typedef struct rawip6_spec_s {
86*3dec9fcdSqs 	struct in6_addr ip6src;
87*3dec9fcdSqs 	struct in6_addr ip6dst;
88*3dec9fcdSqs 	uint8_t    hdata[64];
89*3dec9fcdSqs } rawip6_spec_t;
90*3dec9fcdSqs 
91*3dec9fcdSqs 
92*3dec9fcdSqs typedef struct ether_spec_s {
93*3dec9fcdSqs 	uint16_t   ether_type;
94*3dec9fcdSqs 	uint8_t    frame_size;
95*3dec9fcdSqs 	uint8_t    eframe[16];
96*3dec9fcdSqs } ether_spec_t;
97*3dec9fcdSqs 
98*3dec9fcdSqs 
99*3dec9fcdSqs typedef struct ip_user_spec_s {
100*3dec9fcdSqs 	uint8_t    id;
101*3dec9fcdSqs 	uint8_t    ip_ver;
102*3dec9fcdSqs 	uint8_t    proto;
103*3dec9fcdSqs 	uint8_t    tos_mask;
104*3dec9fcdSqs 	uint8_t    tos;
105*3dec9fcdSqs } ip_user_spec_t;
106*3dec9fcdSqs 
107*3dec9fcdSqs typedef ether_spec_t arpip_spec_t;
108*3dec9fcdSqs typedef ether_spec_t ether_user_spec_t;
109*3dec9fcdSqs 
110*3dec9fcdSqs typedef struct flow_spec_s {
111*3dec9fcdSqs 	uint32_t  flow_type;
112*3dec9fcdSqs 	union {
113*3dec9fcdSqs 		tcpip4_spec_t tcpip4spec;
114*3dec9fcdSqs 		tcpip6_spec_t tcpip6spec;
115*3dec9fcdSqs 		udpip4_spec_t udpip4spec;
116*3dec9fcdSqs 		udpip6_spec_t udpip6spec;
117*3dec9fcdSqs 		arpip_spec_t  arpipspec;
118*3dec9fcdSqs 		ahip4_spec_t  ahip4spec;
119*3dec9fcdSqs 		ahip6_spec_t  ahip6spec;
120*3dec9fcdSqs 		espip4_spec_t espip4spec;
121*3dec9fcdSqs 		espip6_spec_t espip6spec;
122*3dec9fcdSqs 		rawip4_spec_t rawip4spec;
123*3dec9fcdSqs 		rawip6_spec_t rawip6spec;
124*3dec9fcdSqs 		ether_spec_t  etherspec;
125*3dec9fcdSqs 		ip_user_spec_t  ip_usr_spec;
126*3dec9fcdSqs 		uint8_t		hdata[64];
127*3dec9fcdSqs 	} uh, um; /* entry, mask */
128*3dec9fcdSqs } flow_spec_t;
129*3dec9fcdSqs 
130*3dec9fcdSqs #define	FSPEC_TCPIP4	0x1	/* TCP/IPv4 Flow */
131*3dec9fcdSqs #define	FSPEC_TCPIP6	0x2	/* TCP/IPv6 */
132*3dec9fcdSqs #define	FSPEC_UDPIP4	0x3	/* UDP/IPv4 */
133*3dec9fcdSqs #define	FSPEC_UDPIP6	0x4	/* UDP/IPv6 */
134*3dec9fcdSqs #define	FSPEC_ARPIP	0x5	/* ARP/IPv4 */
135*3dec9fcdSqs #define	FSPEC_AHIP4	0x6	/* AH/IP4   */
136*3dec9fcdSqs #define	FSPEC_AHIP6	0x7	/* AH/IP6   */
137*3dec9fcdSqs #define	FSPEC_ESPIP4	0x8	/* ESP/IP4  */
138*3dec9fcdSqs #define	FSPEC_ESPIP6	0x9	/* ESP/IP6  */
139*3dec9fcdSqs #define	FSPEC_SCTPIP4	0xA	/* ESP/IP4  */
140*3dec9fcdSqs #define	FSPEC_SCTPIP6	0xB	/* ESP/IP6  */
141*3dec9fcdSqs #define	FSPEC_RAW4	0xC	/* RAW/IP4  */
142*3dec9fcdSqs #define	FSPEC_RAW6	0xD	/* RAW/IP6  */
143*3dec9fcdSqs #define	FSPEC_ETHER	0xE	/* ETHER Programmable  */
144*3dec9fcdSqs #define	FSPEC_IP_USR	0xF	/* IP Programmable  */
145*3dec9fcdSqs #define	FSPEC_HDATA	0x10	/* Pkt Headers eth-da,sa,etype,ip,tcp(Bitmap) */
146*3dec9fcdSqs 
147*3dec9fcdSqs 
148*3dec9fcdSqs #define	TCAM_IPV6_ADDR(m32, ip6addr) {		\
149*3dec9fcdSqs 		m32[0] = ip6addr.S6_addr32[0]; \
150*3dec9fcdSqs 		m32[1] = ip6addr.S6_addr32[1]; \
151*3dec9fcdSqs 		m32[2] = ip6addr.S6_addr32[2]; \
152*3dec9fcdSqs 		m32[3] = ip6addr.S6_addr32[3]; \
153*3dec9fcdSqs 	}
154*3dec9fcdSqs 
155*3dec9fcdSqs 
156*3dec9fcdSqs #define	TCAM_IPV4_ADDR(m32, ip4addr) (m32 = ip4addr)
157*3dec9fcdSqs #define	TCAM_IP_PORTS(port32, dp, sp)	  (port32 = dp | (sp << 16))
158*3dec9fcdSqs #define	TCAM_IP_CLASS(key, mask, class)	  {		\
159*3dec9fcdSqs 		key = class; \
160*3dec9fcdSqs 		mask = 0x1f; \
161*3dec9fcdSqs 	}
162*3dec9fcdSqs 
163*3dec9fcdSqs #define	TCAM_IP_PROTO(key, mask, proto) {		\
164*3dec9fcdSqs 		key = proto; \
165*3dec9fcdSqs 		mask = 0xff; \
166*3dec9fcdSqs 	}
167*3dec9fcdSqs 
168*3dec9fcdSqs 
169*3dec9fcdSqs typedef struct flow_resource_s {
170*3dec9fcdSqs 	uint64_t	channel_cookie;
171*3dec9fcdSqs 	uint64_t	flow_cookie;
172*3dec9fcdSqs 	uint8_t		tcam_location;
173*3dec9fcdSqs 	flow_spec_t	flow_spec;
174*3dec9fcdSqs } flow_resource_t;
175*3dec9fcdSqs 
176*3dec9fcdSqs #ifdef	__cplusplus
177*3dec9fcdSqs }
178*3dec9fcdSqs #endif
179*3dec9fcdSqs 
180*3dec9fcdSqs #endif	/* _SYS_HXGE_HXGE_FLOW_H */
181