xref: /titanic_51/usr/src/uts/common/sys/aggr.h (revision eae72b5b807baa9116e64502cbb278edf15f3146)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5ba2e4443Sseb  * Common Development and Distribution License (the "License").
6ba2e4443Sseb  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22d62bc4baSyz147064  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_SYS_AGGR_H
277c478bd9Sstevel@tonic-gate #define	_SYS_AGGR_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <sys/types.h>
307c478bd9Sstevel@tonic-gate #include <sys/ethernet.h>
31d62bc4baSyz147064 #include <sys/mac.h>
32d62bc4baSyz147064 #include <sys/dls.h>
337c478bd9Sstevel@tonic-gate #include <sys/param.h>
34*eae72b5bSSebastien Roy #include <sys/dld_ioc.h>
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
377c478bd9Sstevel@tonic-gate extern "C" {
387c478bd9Sstevel@tonic-gate #endif
397c478bd9Sstevel@tonic-gate 
40*eae72b5bSSebastien Roy /*
41*eae72b5bSSebastien Roy  * Note that the datastructures defined here define an ioctl interface
42*eae72b5bSSebastien Roy  * that is shared betwen user and kernel space.  The aggr driver thus
43*eae72b5bSSebastien Roy  * assumes that the structures have identical layout and size when
44*eae72b5bSSebastien Roy  * compiled in either IPL32 or LP64.
45*eae72b5bSSebastien Roy  */
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate /*
487c478bd9Sstevel@tonic-gate  * Transmit load balancing policies.
497c478bd9Sstevel@tonic-gate  */
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L2		0x01
527c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L3		0x02
537c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L4		0x04
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate /*
567c478bd9Sstevel@tonic-gate  * LACP mode and timer.
577c478bd9Sstevel@tonic-gate  */
587c478bd9Sstevel@tonic-gate 
597c478bd9Sstevel@tonic-gate typedef enum {
607c478bd9Sstevel@tonic-gate 	AGGR_LACP_OFF		= 0,
617c478bd9Sstevel@tonic-gate 	AGGR_LACP_ACTIVE	= 1,
627c478bd9Sstevel@tonic-gate 	AGGR_LACP_PASSIVE	= 2
637c478bd9Sstevel@tonic-gate } aggr_lacp_mode_t;
647c478bd9Sstevel@tonic-gate 
657c478bd9Sstevel@tonic-gate typedef enum {
667c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_LONG	= 0,
677c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_SHORT	= 1
687c478bd9Sstevel@tonic-gate } aggr_lacp_timer_t;
697c478bd9Sstevel@tonic-gate 
707c478bd9Sstevel@tonic-gate /*
717c478bd9Sstevel@tonic-gate  * MAC port state.
727c478bd9Sstevel@tonic-gate  */
737c478bd9Sstevel@tonic-gate typedef enum {
747c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_STANDBY = 1,
757c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_ATTACHED = 2
767c478bd9Sstevel@tonic-gate } aggr_port_state_t;
777c478bd9Sstevel@tonic-gate 
787c478bd9Sstevel@tonic-gate /* Maximum number of ports per aggregation. */
797c478bd9Sstevel@tonic-gate #define	AGGR_MAX_PORTS	256
807c478bd9Sstevel@tonic-gate 
817c478bd9Sstevel@tonic-gate /*
82d62bc4baSyz147064  * The largest configurable aggregation key.  Because by default the key is
83d62bc4baSyz147064  * used as the DLPI device PPA and default VLAN PPA's are calculated as
84d62bc4baSyz147064  * ((1000 * vid) + PPA), the largest key can't be > 999.
85d62bc4baSyz147064  */
86d62bc4baSyz147064 #define	AGGR_MAX_KEY	999
87d62bc4baSyz147064 
88d62bc4baSyz147064 /*
897c478bd9Sstevel@tonic-gate  * LACP port state.
907c478bd9Sstevel@tonic-gate  */
917c478bd9Sstevel@tonic-gate typedef union {
927c478bd9Sstevel@tonic-gate 	struct {
937c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_HTOL)
947c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
957c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
967c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
977c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
987c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
997c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
1007c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
1017c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
1027c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_LTOH)
1037c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
1047c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
1057c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
1067c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
1077c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
1087c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
1097c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
1107c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
1117c478bd9Sstevel@tonic-gate #else
1127c478bd9Sstevel@tonic-gate #error "unknown bit fields ordering"
1137c478bd9Sstevel@tonic-gate #endif
1147c478bd9Sstevel@tonic-gate 	} bit;
1157c478bd9Sstevel@tonic-gate 	uint8_t state;
1167c478bd9Sstevel@tonic-gate } aggr_lacp_state_t;
1177c478bd9Sstevel@tonic-gate 
1187c478bd9Sstevel@tonic-gate /* one of the ports of a link aggregation group */
1197c478bd9Sstevel@tonic-gate typedef struct laioc_port {
120d62bc4baSyz147064 	datalink_id_t	lp_linkid;
1217c478bd9Sstevel@tonic-gate } laioc_port_t;
1227c478bd9Sstevel@tonic-gate 
123*eae72b5bSSebastien Roy #define	LAIOC_CREATE		AGGRIOC(1)
1247c478bd9Sstevel@tonic-gate 
1257c478bd9Sstevel@tonic-gate typedef struct laioc_create {
126d62bc4baSyz147064 	datalink_id_t	lc_linkid;
1277c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1287c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1297c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1307c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1317c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1327c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
133d62bc4baSyz147064 	uint32_t	lc_mac_fixed : 1,
134d62bc4baSyz147064 			lc_force : 1,
135d62bc4baSyz147064 			lc_pad_bits : 30;
1367c478bd9Sstevel@tonic-gate } laioc_create_t;
1377c478bd9Sstevel@tonic-gate 
138*eae72b5bSSebastien Roy #define	LAIOC_DELETE		AGGRIOC(2)
1397c478bd9Sstevel@tonic-gate 
1407c478bd9Sstevel@tonic-gate typedef struct laioc_delete {
141d62bc4baSyz147064 	datalink_id_t	ld_linkid;
1427c478bd9Sstevel@tonic-gate } laioc_delete_t;
1437c478bd9Sstevel@tonic-gate 
144*eae72b5bSSebastien Roy #define	LAIOC_INFO		AGGRIOC(3)
1457c478bd9Sstevel@tonic-gate 
1467c478bd9Sstevel@tonic-gate typedef enum aggr_link_duplex {
1477c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_FULL = 1,
1487c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_HALF = 2,
1497c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_UNKNOWN = 3
1507c478bd9Sstevel@tonic-gate } aggr_link_duplex_t;
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate typedef enum aggr_link_state {
1537c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UP = 1,
1547c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_DOWN = 2,
1557c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UNKNOWN = 3
1567c478bd9Sstevel@tonic-gate } aggr_link_state_t;
1577c478bd9Sstevel@tonic-gate 
1587c478bd9Sstevel@tonic-gate typedef struct laioc_info_port {
159d62bc4baSyz147064 	datalink_id_t	lp_linkid;
1607c478bd9Sstevel@tonic-gate 	uchar_t		lp_mac[ETHERADDRL];
1617c478bd9Sstevel@tonic-gate 	aggr_port_state_t lp_state;
1627c478bd9Sstevel@tonic-gate 	aggr_lacp_state_t lp_lacp_state;
1637c478bd9Sstevel@tonic-gate } laioc_info_port_t;
1647c478bd9Sstevel@tonic-gate 
1657c478bd9Sstevel@tonic-gate typedef struct laioc_info_group {
166d62bc4baSyz147064 	datalink_id_t	lg_linkid;
1677c478bd9Sstevel@tonic-gate 	uint32_t	lg_key;
1687c478bd9Sstevel@tonic-gate 	uchar_t		lg_mac[ETHERADDRL];
1697c478bd9Sstevel@tonic-gate 	boolean_t	lg_mac_fixed;
170d62bc4baSyz147064 	boolean_t	lg_force;
1717c478bd9Sstevel@tonic-gate 	uint32_t	lg_policy;
1727c478bd9Sstevel@tonic-gate 	uint32_t	lg_nports;
1737c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lg_lacp_mode;
1747c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lg_lacp_timer;
1757c478bd9Sstevel@tonic-gate } laioc_info_group_t;
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate typedef struct laioc_info {
178d62bc4baSyz147064 	/* Must not be DLADM_INVALID_LINKID */
179d62bc4baSyz147064 	datalink_id_t	li_group_linkid;
180*eae72b5bSSebastien Roy 	uint32_t	li_bufsize;
1817c478bd9Sstevel@tonic-gate } laioc_info_t;
1827c478bd9Sstevel@tonic-gate 
183*eae72b5bSSebastien Roy #define	LAIOC_ADD		AGGRIOC(4)
184*eae72b5bSSebastien Roy #define	LAIOC_REMOVE		AGGRIOC(5)
1857c478bd9Sstevel@tonic-gate 
1867c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem {
187d62bc4baSyz147064 	datalink_id_t	la_linkid;
1887c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
189d62bc4baSyz147064 	uint32_t	la_force;
190210db224Sericheng } laioc_add_rem_t;
1917c478bd9Sstevel@tonic-gate 
192*eae72b5bSSebastien Roy #define	LAIOC_MODIFY			AGGRIOC(6)
1937c478bd9Sstevel@tonic-gate 
1947c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_POLICY		0x01
1957c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_MAC		0x02
1967c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_MODE		0x04
1977c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_TIMER		0x08
1987c478bd9Sstevel@tonic-gate 
1997c478bd9Sstevel@tonic-gate typedef struct laioc_modify {
200d62bc4baSyz147064 	datalink_id_t	lu_linkid;
2017c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2027c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2037c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2047c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2057c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2067c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2077c478bd9Sstevel@tonic-gate } laioc_modify_t;
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2107c478bd9Sstevel@tonic-gate }
2117c478bd9Sstevel@tonic-gate #endif
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate #endif	/* _SYS_AGGR_H */
214