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]
23 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 * Copyright 2013 Joyent, Inc. All rights reserved.
32 * Main structure describing a flow of packets, for classification use
39 #include <sys/types.h>
40 #include <sys/param.h> /* for MAXPATHLEN */
41 #include <netinet/in.h> /* for IPPROTO_* constants */
42 #include <sys/ethernet.h>
43 #include <sys/param.h>
45 #define MAX_RINGS_PER_GROUP 128
48 * MAXFLOWNAMELEN defines the longest possible permitted flow name,
49 * including the terminating NUL.
51 #define MAXFLOWNAMELEN 128
53 /* need to use MAXMACADDRLEN from dld.h instead of this one */
56 /* Bit-mask for the selectors carried in the flow descriptor */
57 typedef uint64_t flow_mask_t
;
59 #define FLOW_LINK_DST 0x00000001 /* Destination MAC addr */
60 #define FLOW_LINK_SRC 0x00000002 /* Source MAC address */
61 #define FLOW_LINK_VID 0x00000004 /* VLAN ID */
62 #define FLOW_LINK_SAP 0x00000008 /* SAP value */
64 #define FLOW_IP_VERSION 0x00000010 /* V4 or V6 */
65 #define FLOW_IP_PROTOCOL 0x00000020 /* Protocol type */
66 #define FLOW_IP_LOCAL 0x00000040 /* Local address */
67 #define FLOW_IP_REMOTE 0x00000080 /* Remote address */
68 #define FLOW_IP_DSFIELD 0x00000100 /* DSfield value */
70 #define FLOW_ULP_PORT_LOCAL 0x00001000 /* ULP local port */
71 #define FLOW_ULP_PORT_REMOTE 0x00002000 /* ULP remote port */
73 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
77 typedef struct flow_desc_s
{
80 uint8_t fd_dst_mac
[MAXMACADDR
];
81 uint8_t fd_src_mac
[MAXMACADDR
];
86 in6_addr_t fd_local_addr
;
87 in6_addr_t fd_local_netmask
;
88 in6_addr_t fd_remote_addr
;
89 in6_addr_t fd_remote_netmask
;
90 in_port_t fd_local_port
;
91 in_port_t fd_remote_port
;
93 uint8_t fd_dsfield_mask
;
99 * In MCM_CPUS mode, cpu bindings is user specified. In MCM_FANOUT mode,
100 * user only specifies a fanout count.
101 * mc_rx_fanout_cnt gives the number of CPUs used for fanout soft rings.
102 * mc_rx_fanout_cpus[] array stores the CPUs used for fanout soft rings.
110 * Structure to store the value of the CPUs to be used to re-target
113 typedef struct mac_tx_intr_cpus_s
{
114 /* cpu value to re-target intr to */
115 int32_t mtc_intr_cpu
[MRP_NCPUS
];
116 /* re-targeted CPU or -1 if failed */
117 int32_t mtc_retargeted_cpu
[MRP_NCPUS
];
120 typedef struct mac_cpus_props_s
{
121 uint32_t mc_ncpus
; /* num of cpus */
122 uint32_t mc_cpus
[MRP_NCPUS
]; /* cpu list */
123 uint32_t mc_rx_fanout_cnt
; /* soft ring cpu cnt */
124 uint32_t mc_rx_fanout_cpus
[MRP_NCPUS
]; /* SR cpu list */
125 uint32_t mc_rx_pollid
; /* poll thr binding */
126 uint32_t mc_rx_workerid
; /* worker thr binding */
128 * interrupt cpu: mrp_intr_cpu less than 0 implies platform limitation
129 * in retargetting the interrupt assignment.
131 int32_t mc_rx_intr_cpu
;
132 int32_t mc_tx_fanout_cpus
[MRP_NCPUS
];
133 mac_tx_intr_cpu_t mc_tx_intr_cpus
;
134 mac_cpu_mode_t mc_fanout_mode
; /* fanout mode */
137 #define mc_tx_intr_cpu mc_tx_intr_cpus.mtc_intr_cpu
138 #define mc_tx_retargeted_cpu mc_tx_intr_cpus.mtc_retargeted_cpu
140 /* Priority values */
146 } mac_priority_level_t
;
148 /* Protection types */
149 #define MPT_MACNOSPOOF 0x00000001
150 #define MPT_RESTRICTED 0x00000002
151 #define MPT_IPNOSPOOF 0x00000004
152 #define MPT_DHCPNOSPOOF 0x00000008
153 #define MPT_ALL 0x0000000f
154 #define MPT_RESET 0xffffffff
155 #define MPT_MAXCNT 32
156 #define MPT_MAXIPADDR MPT_MAXCNT
157 #define MPT_MAXCID MPT_MAXCNT
158 #define MPT_MAXCIDLEN 256
160 typedef struct mac_ipaddr_s
{
170 } mac_dhcpcid_form_t
;
172 typedef struct mac_dhcpcid_s
{
173 uchar_t dc_id
[MPT_MAXCIDLEN
];
175 mac_dhcpcid_form_t dc_form
;
178 typedef struct mac_protect_s
{
180 uint32_t mp_ipaddrcnt
;
181 mac_ipaddr_t mp_ipaddrs
[MPT_MAXIPADDR
];
183 mac_dhcpcid_t mp_cids
[MPT_MAXCID
];
186 /* The default priority for links */
187 #define MPL_LINK_DEFAULT MPL_HIGH
189 /* The default priority for flows */
190 #define MPL_SUBFLOW_DEFAULT MPL_MEDIUM
192 #define MRP_MAXBW 0x00000001 /* Limit set */
193 #define MRP_CPUS 0x00000002 /* CPU/fanout set */
194 #define MRP_CPUS_USERSPEC 0x00000004 /* CPU/fanout from user */
195 #define MRP_PRIORITY 0x00000008 /* Priority set */
196 #define MRP_PROTECT 0x00000010 /* Protection set */
197 #define MRP_RX_RINGS 0x00000020 /* Rx rings */
198 #define MRP_TX_RINGS 0x00000040 /* Tx rings */
199 #define MRP_RXRINGS_UNSPEC 0x00000080 /* unspecified rings */
200 #define MRP_TXRINGS_UNSPEC 0x00000100 /* unspecified rings */
201 #define MRP_RINGS_RESET 0x00000200 /* resetting rings */
202 #define MRP_POOL 0x00000400 /* CPU pool */
204 #define MRP_THROTTLE MRP_MAXBW
206 /* 3 levels - low, medium, high */
207 #define MRP_PRIORITY_LEVELS 3
209 /* Special value denoting no bandwidth control */
210 #define MRP_MAXBW_RESETVAL -1ULL
213 * Until sub-megabit limit is implemented,
214 * reject values lower than 1 MTU per tick or 1.2Mbps
216 #define MRP_MAXBW_MINVAL 1200000
218 typedef struct mac_resource_props_s
{
220 * Bit-mask for the network resource control types types
223 uint64_t mrp_maxbw
; /* bandwidth limit in bps */
224 mac_priority_level_t mrp_priority
; /* relative flow priority */
226 mac_protect_t mrp_protect
;
227 uint32_t mrp_nrxrings
;
228 uint32_t mrp_ntxrings
;
229 char mrp_pool
[MAXPATHLEN
]; /* CPU pool */
230 } mac_resource_props_t
;
232 #define mrp_ncpus mrp_cpus.mc_ncpus
233 #define mrp_cpu mrp_cpus.mc_cpus
234 #define mrp_rx_fanout_cnt mrp_cpus.mc_rx_fanout_cnt
235 #define mrp_rx_pollid mrp_cpus.mc_rx_pollid
236 #define mrp_rx_workerid mrp_cpus.mc_rx_workerid
237 #define mrp_rx_intr_cpu mrp_cpus.mc_rx_intr_cpu
238 #define mrp_fanout_mode mrp_cpus.mc_fanout_mode
240 #define MAC_COPY_CPUS(mrp, fmrp) { \
242 (fmrp)->mrp_ncpus = (mrp)->mrp_ncpus; \
243 (fmrp)->mrp_rx_fanout_cnt = (mrp)->mrp_rx_fanout_cnt; \
244 (fmrp)->mrp_rx_intr_cpu = (mrp)->mrp_rx_intr_cpu; \
245 (fmrp)->mrp_fanout_mode = (mrp)->mrp_fanout_mode; \
246 if ((mrp)->mrp_ncpus == 0) { \
247 (fmrp)->mrp_mask &= ~MRP_CPUS; \
248 (fmrp)->mrp_mask &= ~MRP_CPUS_USERSPEC; \
250 for (ncpus = 0; ncpus < (fmrp)->mrp_ncpus; ncpus++) \
251 (fmrp)->mrp_cpu[ncpus] = (mrp)->mrp_cpu[ncpus];\
252 (fmrp)->mrp_mask |= MRP_CPUS; \
253 if ((mrp)->mrp_mask & MRP_CPUS_USERSPEC) \
254 (fmrp)->mrp_mask |= MRP_CPUS_USERSPEC; \
258 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
266 #endif /* _MAC_FLOW_H */