xref: /illumos-gate/usr/src/uts/common/sys/aggr.h (revision d62bc4badc1c1f1549c961cfb8b420e650e1272b)
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  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_AGGR_H
27 #define	_SYS_AGGR_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #include <sys/types.h>
32 #include <sys/ethernet.h>
33 #include <sys/mac.h>
34 #include <sys/dls.h>
35 #include <sys/param.h>
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 /* control interface name */
42 #define	AGGR_DEVNAME_CTL	"ctl"
43 
44 /*
45  * Transmit load balancing policies.
46  */
47 
48 #define	AGGR_POLICY_L2		0x01
49 #define	AGGR_POLICY_L3		0x02
50 #define	AGGR_POLICY_L4		0x04
51 
52 /*
53  * LACP mode and timer.
54  */
55 
56 typedef enum {
57 	AGGR_LACP_OFF		= 0,
58 	AGGR_LACP_ACTIVE	= 1,
59 	AGGR_LACP_PASSIVE	= 2
60 } aggr_lacp_mode_t;
61 
62 typedef enum {
63 	AGGR_LACP_TIMER_LONG	= 0,
64 	AGGR_LACP_TIMER_SHORT	= 1
65 } aggr_lacp_timer_t;
66 
67 /*
68  * MAC port state.
69  */
70 typedef enum {
71 	AGGR_PORT_STATE_STANDBY = 1,
72 	AGGR_PORT_STATE_ATTACHED = 2
73 } aggr_port_state_t;
74 
75 /* Maximum number of ports per aggregation. */
76 #define	AGGR_MAX_PORTS	256
77 
78 /*
79  * The largest configurable aggregation key.  Because by default the key is
80  * used as the DLPI device PPA and default VLAN PPA's are calculated as
81  * ((1000 * vid) + PPA), the largest key can't be > 999.
82  */
83 #define	AGGR_MAX_KEY	999
84 
85 /*
86  * LACP port state.
87  */
88 typedef union {
89 	struct {
90 #if defined(_BIT_FIELDS_HTOL)
91 		uint8_t expired:	1;
92 		uint8_t defaulted:	1;
93 		uint8_t distributing:	1;
94 		uint8_t collecting:	1;
95 		uint8_t sync:	1;
96 		uint8_t aggregation:	1;
97 		uint8_t timeout:	1;
98 		uint8_t	activity:	1;
99 #elif defined(_BIT_FIELDS_LTOH)
100 		uint8_t	activity:	1;
101 		uint8_t timeout:	1;
102 		uint8_t aggregation:	1;
103 		uint8_t sync:	1;
104 		uint8_t collecting:	1;
105 		uint8_t distributing:	1;
106 		uint8_t defaulted:	1;
107 		uint8_t expired:	1;
108 #else
109 #error "unknown bit fields ordering"
110 #endif
111 	} bit;
112 	uint8_t state;
113 } aggr_lacp_state_t;
114 
115 #define	LAIOC(x)		(('l' << 24) | ('a' << 16) | ('m' << 8) | (x))
116 
117 /* one of the ports of a link aggregation group */
118 typedef struct laioc_port {
119 	datalink_id_t	lp_linkid;
120 } laioc_port_t;
121 
122 #define	LAIOC_CREATE		LAIOC(1)
123 
124 typedef struct laioc_create {
125 	datalink_id_t	lc_linkid;
126 	uint32_t	lc_key;
127 	uint32_t	lc_nports;
128 	uint32_t	lc_policy;
129 	uchar_t		lc_mac[ETHERADDRL];
130 	aggr_lacp_mode_t lc_lacp_mode;
131 	aggr_lacp_timer_t lc_lacp_timer;
132 	uint32_t	lc_mac_fixed : 1,
133 			lc_force : 1,
134 			lc_pad_bits : 30;
135 } laioc_create_t;
136 
137 #ifdef _SYSCALL32
138 
139 typedef struct laioc_create32 {
140 	datalink_id_t	lc_linkid;
141 	uint32_t	lc_key;
142 	uint32_t	lc_nports;
143 	uint32_t	lc_policy;
144 	uchar_t		lc_mac[ETHERADDRL];
145 	aggr_lacp_mode_t lc_lacp_mode;
146 	aggr_lacp_timer_t lc_lacp_timer;
147 	uint32_t	lc_mac_fixed : 1,
148 			lc_force : 1,
149 			lc_pad_bits : 30;
150 } laioc_create32_t;
151 
152 #endif /* _SYSCALL32 */
153 
154 #define	LAIOC_DELETE		LAIOC(2)
155 
156 typedef struct laioc_delete {
157 	datalink_id_t	ld_linkid;
158 } laioc_delete_t;
159 
160 #ifdef _SYSCALL32
161 
162 typedef struct laioc_delete32 {
163 	datalink_id_t	ld_linkid;
164 } laioc_delete32_t;
165 
166 #endif /* _SYSCALL32 */
167 
168 #define	LAIOC_INFO		LAIOC(3)
169 
170 typedef enum aggr_link_duplex {
171 	AGGR_LINK_DUPLEX_FULL = 1,
172 	AGGR_LINK_DUPLEX_HALF = 2,
173 	AGGR_LINK_DUPLEX_UNKNOWN = 3
174 } aggr_link_duplex_t;
175 
176 typedef enum aggr_link_state {
177 	AGGR_LINK_STATE_UP = 1,
178 	AGGR_LINK_STATE_DOWN = 2,
179 	AGGR_LINK_STATE_UNKNOWN = 3
180 } aggr_link_state_t;
181 
182 typedef struct laioc_info_port {
183 	datalink_id_t	lp_linkid;
184 	uchar_t		lp_mac[ETHERADDRL];
185 	aggr_port_state_t lp_state;
186 	aggr_lacp_state_t lp_lacp_state;
187 } laioc_info_port_t;
188 
189 typedef struct laioc_info_group {
190 	datalink_id_t	lg_linkid;
191 	uint32_t	lg_key;
192 	uchar_t		lg_mac[ETHERADDRL];
193 	boolean_t	lg_mac_fixed;
194 	boolean_t	lg_force;
195 	uint32_t	lg_policy;
196 	uint32_t	lg_nports;
197 	aggr_lacp_mode_t lg_lacp_mode;
198 	aggr_lacp_timer_t lg_lacp_timer;
199 } laioc_info_group_t;
200 
201 typedef struct laioc_info {
202 	/* Must not be DLADM_INVALID_LINKID */
203 	datalink_id_t	li_group_linkid;
204 } laioc_info_t;
205 
206 #define	LAIOC_ADD		LAIOC(4)
207 #define	LAIOC_REMOVE		LAIOC(5)
208 
209 typedef struct laioc_add_rem {
210 	datalink_id_t	la_linkid;
211 	uint32_t	la_nports;
212 	uint32_t	la_force;
213 } laioc_add_rem_t;
214 
215 #ifdef _SYSCALL32
216 
217 typedef struct laioc_add_rem32 {
218 	datalink_id_t	la_linkid;
219 	uint32_t	la_nports;
220 	uint32_t	la_force;
221 } laioc_add_rem32_t;
222 
223 #endif /* _SYSCALL32 */
224 
225 #define	LAIOC_MODIFY			LAIOC(6)
226 
227 #define	LAIOC_MODIFY_POLICY		0x01
228 #define	LAIOC_MODIFY_MAC		0x02
229 #define	LAIOC_MODIFY_LACP_MODE		0x04
230 #define	LAIOC_MODIFY_LACP_TIMER		0x08
231 
232 typedef struct laioc_modify {
233 	datalink_id_t	lu_linkid;
234 	uint8_t		lu_modify_mask;
235 	uint32_t	lu_policy;
236 	uchar_t		lu_mac[ETHERADDRL];
237 	boolean_t	lu_mac_fixed;
238 	aggr_lacp_mode_t lu_lacp_mode;
239 	aggr_lacp_timer_t lu_lacp_timer;
240 } laioc_modify_t;
241 
242 #ifdef _SYSCALL32
243 
244 typedef struct laioc_modify32 {
245 	datalink_id_t	lu_linkid;
246 	uint8_t		lu_modify_mask;
247 	uint32_t	lu_policy;
248 	uchar_t		lu_mac[ETHERADDRL];
249 	boolean_t	lu_mac_fixed;
250 	aggr_lacp_mode_t lu_lacp_mode;
251 	aggr_lacp_timer_t lu_lacp_timer;
252 } laioc_modify32_t;
253 
254 #endif /* _SYSCALL32 */
255 
256 #ifdef	__cplusplus
257 }
258 #endif
259 
260 #endif	/* _SYS_AGGR_H */
261