1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MAC_FLOW_H
#define _MAC_FLOW_H
/*
* Main structure describing a flow of packets, for classification use
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <netinet/in.h> /* for IPPROTO_* constants */
#include <sys/ethernet.h>
#define MAX_RINGS_PER_GROUP 128
/*
* MAXFLOWNAMELEN defines the longest possible permitted flow name,
* including the terminating NUL.
*/
#define MAXFLOWNAMELEN 128
/* need to use MAXMACADDRLEN from dld.h instead of this one */
#define MAXMACADDR 20
/* Bit-mask for the selectors carried in the flow descriptor */
typedef uint64_t flow_mask_t;
#define FLOW_LINK_DST 0x00000001 /* Destination MAC addr */
#define FLOW_LINK_SRC 0x00000002 /* Source MAC address */
#define FLOW_LINK_VID 0x00000004 /* VLAN ID */
#define FLOW_LINK_SAP 0x00000008 /* SAP value */
#define FLOW_IP_VERSION 0x00000010 /* V4 or V6 */
#define FLOW_IP_PROTOCOL 0x00000020 /* Protocol type */
#define FLOW_IP_LOCAL 0x00000040 /* Local address */
#define FLOW_IP_REMOTE 0x00000080 /* Remote address */
#define FLOW_IP_DSFIELD 0x00000100 /* DSfield value */
#define FLOW_ULP_PORT_LOCAL 0x00001000 /* ULP local port */
#define FLOW_ULP_PORT_REMOTE 0x00002000 /* ULP remote port */
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif
typedef struct flow_desc_s {
flow_mask_t fd_mask;
uint32_t fd_mac_len;
uint8_t fd_dst_mac[MAXMACADDR];
uint8_t fd_src_mac[MAXMACADDR];
uint16_t fd_vid;
uint32_t fd_sap;
uint8_t fd_ipversion;
uint8_t fd_protocol;
in6_addr_t fd_local_addr;
in6_addr_t fd_local_netmask;
in6_addr_t fd_remote_addr;
in6_addr_t fd_remote_netmask;
in_port_t fd_local_port;
in_port_t fd_remote_port;
uint8_t fd_dsfield;
uint8_t fd_dsfield_mask;
} flow_desc_t;
#define MRP_NCPUS 128
/*
* In MCM_CPUS mode, cpu bindings is user specified. In MCM_FANOUT mode,
* user only specifies a fanout count.
* mc_rx_fanout_cnt gives the number of CPUs used for fanout soft rings.
* mc_rx_fanout_cpus[] array stores the CPUs used for fanout soft rings.
*/
typedef enum {
MCM_FANOUT = 1,
MCM_CPUS
} mac_cpu_mode_t;
/*
* Structure to store the value of the CPUs to be used to re-target
* Tx interrupt.
*/
typedef struct mac_tx_intr_cpus_s {
/* cpu value to re-target intr to */
int32_t mtc_intr_cpu[MRP_NCPUS];
/* re-targeted CPU or -1 if failed */
int32_t mtc_retargeted_cpu[MRP_NCPUS];
} mac_tx_intr_cpu_t;
typedef struct mac_cpus_props_s {
uint32_t mc_ncpus; /* num of cpus */
uint32_t mc_cpus[MRP_NCPUS]; /* cpu list */
uint32_t mc_rx_fanout_cnt; /* soft ring cpu cnt */
uint32_t mc_rx_fanout_cpus[MRP_NCPUS]; /* SR cpu list */
uint32_t mc_rx_pollid; /* poll thr binding */
uint32_t mc_rx_workerid; /* worker thr binding */
/*
* interrupt cpu: mrp_intr_cpu less than 0 implies platform limitation
* in retargetting the interrupt assignment.
*/
int32_t mc_rx_intr_cpu;
int32_t mc_tx_fanout_cpus[MRP_NCPUS];
mac_tx_intr_cpu_t mc_tx_intr_cpus;
mac_cpu_mode_t mc_fanout_mode; /* fanout mode */
} mac_cpus_t;
#define mc_tx_intr_cpu mc_tx_intr_cpus.mtc_intr_cpu
#define mc_tx_retargeted_cpu mc_tx_intr_cpus.mtc_retargeted_cpu
/* Priority values */
typedef enum {
MPL_LOW,
MPL_MEDIUM,
MPL_HIGH,
MPL_RESET
} mac_priority_level_t;
/* Protection types */
#define MPT_MACNOSPOOF 0x00000001
#define MPT_RESTRICTED 0x00000002
#define MPT_IPNOSPOOF 0x00000004
#define MPT_DHCPNOSPOOF 0x00000008
#define MPT_ALL 0x0000000f
#define MPT_RESET 0xffffffff
#define MPT_MAXCNT 32
#define MPT_MAXIPADDR MPT_MAXCNT
#define MPT_MAXCID MPT_MAXCNT
#define MPT_MAXCIDLEN 256
typedef struct mac_ipaddr_s {
uint32_t ip_version;
in6_addr_t ip_addr;
} mac_ipaddr_t;
typedef enum {
CIDFORM_TYPED = 1,
CIDFORM_HEX,
CIDFORM_STR
} mac_dhcpcid_form_t;
typedef struct mac_dhcpcid_s {
uchar_t dc_id[MPT_MAXCIDLEN];
uint32_t dc_len;
mac_dhcpcid_form_t dc_form;
} mac_dhcpcid_t;
typedef struct mac_protect_s {
uint32_t mp_types;
uint32_t mp_ipaddrcnt;
mac_ipaddr_t mp_ipaddrs[MPT_MAXIPADDR];
uint32_t mp_cidcnt;
mac_dhcpcid_t mp_cids[MPT_MAXCID];
} mac_protect_t;
/* The default priority for links */
#define MPL_LINK_DEFAULT MPL_HIGH
/* The default priority for flows */
#define MPL_SUBFLOW_DEFAULT MPL_MEDIUM
#define MRP_MAXBW 0x00000001 /* Limit set */
#define MRP_CPUS 0x00000002 /* CPU/fanout set */
#define MRP_CPUS_USERSPEC 0x00000004 /* CPU/fanout from user */
#define MRP_PRIORITY 0x00000008 /* Priority set */
#define MRP_PROTECT 0x00000010 /* Protection set */
#define MRP_RX_RINGS 0x00000020 /* Rx rings */
#define MRP_TX_RINGS 0x00000040 /* Tx rings */
#define MRP_RXRINGS_UNSPEC 0x00000080 /* unspecified rings */
#define MRP_TXRINGS_UNSPEC 0x00000100 /* unspecified rings */
#define MRP_RINGS_RESET 0x00000200 /* resetting rings */
#define MRP_POOL 0x00000400 /* CPU pool */
#define MRP_THROTTLE MRP_MAXBW
/* 3 levels - low, medium, high */
#define MRP_PRIORITY_LEVELS 3
/* Special value denoting no bandwidth control */
#define MRP_MAXBW_RESETVAL -1ULL
/*
* Until sub-megabit limit is implemented,
* reject values lower than 1 MTU per tick or 1.2Mbps
*/
#define MRP_MAXBW_MINVAL 1200000
typedef struct mac_resource_props_s {
/*
* Bit-mask for the network resource control types types
*/
uint32_t mrp_mask;
uint64_t mrp_maxbw; /* bandwidth limit in bps */
mac_priority_level_t mrp_priority; /* relative flow priority */
mac_cpus_t mrp_cpus;
mac_protect_t mrp_protect;
uint32_t mrp_nrxrings;
uint32_t mrp_ntxrings;
char mrp_pool[MAXPATHLEN]; /* CPU pool */
} mac_resource_props_t;
#define mrp_ncpus mrp_cpus.mc_ncpus
#define mrp_cpu mrp_cpus.mc_cpus
#define mrp_rx_fanout_cnt mrp_cpus.mc_rx_fanout_cnt
#define mrp_rx_pollid mrp_cpus.mc_rx_pollid
#define mrp_rx_workerid mrp_cpus.mc_rx_workerid
#define mrp_rx_intr_cpu mrp_cpus.mc_rx_intr_cpu
#define mrp_fanout_mode mrp_cpus.mc_fanout_mode
#define MAC_COPY_CPUS(mrp, fmrp) { \
int ncpus; \
(fmrp)->mrp_ncpus = (mrp)->mrp_ncpus; \
(fmrp)->mrp_rx_fanout_cnt = (mrp)->mrp_rx_fanout_cnt; \
(fmrp)->mrp_rx_intr_cpu = (mrp)->mrp_rx_intr_cpu; \
(fmrp)->mrp_fanout_mode = (mrp)->mrp_fanout_mode; \
if ((mrp)->mrp_ncpus == 0) { \
(fmrp)->mrp_mask &= ~MRP_CPUS; \
(fmrp)->mrp_mask &= ~MRP_CPUS_USERSPEC; \
} else { \
for (ncpus = 0; ncpus < (fmrp)->mrp_ncpus; ncpus++) \
(fmrp)->mrp_cpu[ncpus] = (mrp)->mrp_cpu[ncpus];\
(fmrp)->mrp_mask |= MRP_CPUS; \
if ((mrp)->mrp_mask & MRP_CPUS_USERSPEC) \
(fmrp)->mrp_mask |= MRP_CPUS_USERSPEC; \
} \
}
#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif
#ifdef __cplusplus
}
#endif
#endif /* _MAC_FLOW_H */
|