xref: /illumos-gate/usr/src/uts/common/sys/mac_flow.h (revision 93a18d6d401e844455263f926578e9d2aa6b47ec)
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 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_MAC_FLOW_H
28 #define	_MAC_FLOW_H
29 
30 /*
31  * Main structure describing a flow of packets, for classification use
32  */
33 
34 #ifdef	__cplusplus
35 extern "C" {
36 #endif
37 
38 #include <sys/types.h>
39 #include <netinet/in.h>		/* for IPPROTO_* constants */
40 #include <sys/ethernet.h>
41 
42 /*
43  * MAXFLOWNAMELEN defines the longest possible permitted flow name,
44  * including the terminating NUL.
45  */
46 #define	MAXFLOWNAMELEN		128
47 
48 /* need to use MAXMACADDRLEN from dld.h instead of this one */
49 #define	MAXMACADDR		20
50 
51 /* Bit-mask for the selectors carried in the flow descriptor */
52 typedef	uint64_t		flow_mask_t;
53 
54 #define	FLOW_LINK_DST		0x00000001	/* Destination MAC addr */
55 #define	FLOW_LINK_SRC		0x00000002	/* Source MAC address */
56 #define	FLOW_LINK_VID		0x00000004	/* VLAN ID */
57 #define	FLOW_LINK_SAP		0x00000008	/* SAP value */
58 
59 #define	FLOW_IP_VERSION		0x00000010	/* V4 or V6 */
60 #define	FLOW_IP_PROTOCOL	0x00000020	/* Protocol type */
61 #define	FLOW_IP_LOCAL		0x00000040	/* Local address */
62 #define	FLOW_IP_REMOTE		0x00000080	/* Remote address */
63 #define	FLOW_IP_DSFIELD		0x00000100	/* DSfield value */
64 
65 #define	FLOW_ULP_PORT_LOCAL	0x00001000	/* ULP local port */
66 #define	FLOW_ULP_PORT_REMOTE	0x00002000	/* ULP remote port */
67 
68 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
69 #pragma pack(4)
70 #endif
71 
72 typedef struct flow_desc_s {
73 	flow_mask_t			fd_mask;
74 	uint32_t			fd_mac_len;
75 	uint8_t				fd_dst_mac[MAXMACADDR];
76 	uint8_t				fd_src_mac[MAXMACADDR];
77 	uint16_t			fd_vid;
78 	uint32_t			fd_sap;
79 	uint8_t				fd_ipversion;
80 	uint8_t				fd_protocol;
81 	in6_addr_t			fd_local_addr;
82 	in6_addr_t			fd_local_netmask;
83 	in6_addr_t			fd_remote_addr;
84 	in6_addr_t			fd_remote_netmask;
85 	in_port_t			fd_local_port;
86 	in_port_t			fd_remote_port;
87 	uint8_t				fd_dsfield;
88 	uint8_t				fd_dsfield_mask;
89 } flow_desc_t;
90 
91 #define	MRP_NCPUS	128
92 
93 /*
94  * In MCM_CPUS mode, cpu bindings is user specified. In MCM_FANOUT mode,
95  * user only specifies a fanout count.
96  * mc_fanout_cnt gives the number of CPUs used for fanout soft rings.
97  * mc_fanout_cpus[] array stores the CPUs used for fanout soft rings.
98  */
99 typedef enum {
100 	MCM_FANOUT = 1,
101 	MCM_CPUS
102 } mac_cpu_mode_t;
103 
104 typedef struct mac_cpus_props_s {
105 	uint32_t		mc_ncpus;		/* num of cpus */
106 	uint32_t		mc_cpus[MRP_NCPUS]; 	/* cpu list */
107 	uint32_t		mc_fanout_cnt;		/* soft ring cpu cnt */
108 	uint32_t		mc_fanout_cpus[MRP_NCPUS]; /* SR cpu list */
109 	uint32_t		mc_pollid;		/* poll thr binding */
110 	uint32_t		mc_workerid;		/* worker thr binding */
111 	/*
112 	 * interrupt cpu: mrp_intr_cpu less than 0 implies platform limitation
113 	 * in retargetting the interrupt assignment.
114 	 */
115 	int32_t			mc_intr_cpu;
116 	mac_cpu_mode_t		mc_fanout_mode;		/* fanout mode */
117 } mac_cpus_t;
118 
119 /* Priority values */
120 typedef enum {
121 	MPL_LOW,
122 	MPL_MEDIUM,
123 	MPL_HIGH,
124 	MPL_RESET
125 } mac_priority_level_t;
126 
127 /* Protection types */
128 #define	MPT_MACNOSPOOF		0x00000001
129 #define	MPT_IPNOSPOOF		0x00000002
130 #define	MPT_RESTRICTED		0x00000004
131 #define	MPT_ALL			(MPT_MACNOSPOOF|MPT_IPNOSPOOF|MPT_RESTRICTED)
132 #define	MPT_RESET		0xffffffff
133 #define	MPT_MAXIPADDR		32
134 
135 typedef struct mac_protect_s {
136 	uint32_t	mp_types;
137 	uint32_t	mp_ipaddrcnt;
138 	ipaddr_t	mp_ipaddrs[MPT_MAXIPADDR];
139 } mac_protect_t;
140 
141 
142 /* The default priority for links */
143 #define	MPL_LINK_DEFAULT		MPL_HIGH
144 
145 /* The default priority for flows */
146 #define	MPL_SUBFLOW_DEFAULT		MPL_MEDIUM
147 
148 #define	MRP_MAXBW		0x00000001 	/* Limit set */
149 #define	MRP_CPUS		0x00000002 	/* CPU/fanout set */
150 #define	MRP_CPUS_USERSPEC	0x00000004 	/* CPU/fanout from user */
151 #define	MRP_PRIORITY		0x00000008 	/* Priority set */
152 #define	MRP_PROTECT		0x00000010	/* Protection set */
153 
154 #define	MRP_THROTTLE		MRP_MAXBW
155 
156 /* 3 levels - low, medium, high */
157 #define	MRP_PRIORITY_LEVELS		3
158 
159 /* Special value denoting no bandwidth control */
160 #define	MRP_MAXBW_RESETVAL		-1ULL
161 
162 /*
163  * Until sub-megabit limit is implemented,
164  * reject values lower than 1 MTU per tick or 1.2Mbps
165  */
166 #define	MRP_MAXBW_MINVAL		1200000
167 
168 typedef	struct mac_resource_props_s {
169 	/*
170 	 * Bit-mask for the network resource control types types
171 	 */
172 	uint32_t		mrp_mask;
173 	uint64_t		mrp_maxbw;	/* bandwidth limit in bps */
174 	mac_priority_level_t	mrp_priority;	/* relative flow priority */
175 	mac_cpus_t		mrp_cpus;
176 	mac_protect_t		mrp_protect;
177 } mac_resource_props_t;
178 
179 #define	mrp_ncpus	mrp_cpus.mc_ncpus
180 #define	mrp_cpu		mrp_cpus.mc_cpus
181 #define	mrp_fanout_cnt	mrp_cpus.mc_fanout_cnt
182 #define	mrp_fanout_cpu	mrp_cpus.mc_fanout_cpus
183 #define	mrp_pollid	mrp_cpus.mc_pollid
184 #define	mrp_workerid	mrp_cpus.mc_workerid
185 #define	mrp_intr_cpu	mrp_cpus.mc_intr_cpu
186 #define	mrp_fanout_mode	mrp_cpus.mc_fanout_mode
187 
188 #define	MAC_COPY_CPUS(mrp, fmrp) {					\
189 	int	ncpus;							\
190 	(fmrp)->mrp_ncpus = (mrp)->mrp_ncpus;				\
191 	(fmrp)->mrp_intr_cpu = (mrp)->mrp_intr_cpu;			\
192 	(fmrp)->mrp_fanout_mode = (mrp)->mrp_fanout_mode;		\
193 	if ((mrp)->mrp_ncpus == 0) {					\
194 		(fmrp)->mrp_mask &= ~MRP_CPUS;				\
195 		(fmrp)->mrp_mask &= ~MRP_CPUS_USERSPEC;			\
196 	} else {							\
197 		for (ncpus = 0; ncpus < (fmrp)->mrp_ncpus; ncpus++)	\
198 			(fmrp)->mrp_cpu[ncpus] = (mrp)->mrp_cpu[ncpus];\
199 		(fmrp)->mrp_mask |= MRP_CPUS;				\
200 		if ((mrp)->mrp_mask & MRP_CPUS_USERSPEC)		\
201 			(fmrp)->mrp_mask |= MRP_CPUS_USERSPEC;		\
202 	}								\
203 }
204 
205 typedef struct flow_stats_s {
206 	uint64_t	fs_rbytes;
207 	uint64_t	fs_ipackets;
208 	uint64_t	fs_ierrors;
209 	uint64_t	fs_obytes;
210 	uint64_t	fs_opackets;
211 	uint64_t	fs_oerrors;
212 } flow_stats_t;
213 
214 typedef enum {
215 	FLOW_STAT_RBYTES,
216 	FLOW_STAT_IPACKETS,
217 	FLOW_STAT_IERRORS,
218 	FLOW_STAT_OBYTES,
219 	FLOW_STAT_OPACKETS,
220 	FLOW_STAT_OERRORS
221 } flow_stat_t;
222 
223 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
224 #pragma pack()
225 #endif
226 
227 #ifdef	__cplusplus
228 }
229 #endif
230 
231 #endif	/* _MAC_FLOW_H */
232