xref: /titanic_51/usr/src/uts/common/sys/aggr.h (revision da14cebe459d3275048785f25bd869cb09b5307f)
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>
317c478bd9Sstevel@tonic-gate #include <sys/param.h>
32*da14cebeSEric Cheng #include <sys/mac.h>
33eae72b5bSSebastien Roy #include <sys/dld_ioc.h>
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
367c478bd9Sstevel@tonic-gate extern "C" {
377c478bd9Sstevel@tonic-gate #endif
387c478bd9Sstevel@tonic-gate 
39eae72b5bSSebastien Roy /*
40eae72b5bSSebastien Roy  * Note that the data structures defined here define an ioctl interface
41eae72b5bSSebastien Roy  * that is shared betwen user and kernel space.  The aggr driver thus
42eae72b5bSSebastien Roy  * assumes that the structures have identical layout and size when
43eae72b5bSSebastien Roy  * compiled in either IPL32 or LP64.
44eae72b5bSSebastien Roy  */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate /*
477c478bd9Sstevel@tonic-gate  * Transmit load balancing policies.
487c478bd9Sstevel@tonic-gate  */
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L2		0x01
517c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L3		0x02
527c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L4		0x04
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate /*
557c478bd9Sstevel@tonic-gate  * LACP mode and timer.
567c478bd9Sstevel@tonic-gate  */
577c478bd9Sstevel@tonic-gate 
587c478bd9Sstevel@tonic-gate typedef enum {
597c478bd9Sstevel@tonic-gate 	AGGR_LACP_OFF		= 0,
607c478bd9Sstevel@tonic-gate 	AGGR_LACP_ACTIVE	= 1,
617c478bd9Sstevel@tonic-gate 	AGGR_LACP_PASSIVE	= 2
627c478bd9Sstevel@tonic-gate } aggr_lacp_mode_t;
637c478bd9Sstevel@tonic-gate 
647c478bd9Sstevel@tonic-gate typedef enum {
657c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_LONG	= 0,
667c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_SHORT	= 1
677c478bd9Sstevel@tonic-gate } aggr_lacp_timer_t;
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate /*
707c478bd9Sstevel@tonic-gate  * MAC port state.
717c478bd9Sstevel@tonic-gate  */
727c478bd9Sstevel@tonic-gate typedef enum {
737c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_STANDBY = 1,
747c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_ATTACHED = 2
757c478bd9Sstevel@tonic-gate } aggr_port_state_t;
767c478bd9Sstevel@tonic-gate 
777c478bd9Sstevel@tonic-gate /* Maximum number of ports per aggregation. */
787c478bd9Sstevel@tonic-gate #define	AGGR_MAX_PORTS	256
797c478bd9Sstevel@tonic-gate 
807c478bd9Sstevel@tonic-gate /*
81d62bc4baSyz147064  * The largest configurable aggregation key.  Because by default the key is
82d62bc4baSyz147064  * used as the DLPI device PPA and default VLAN PPA's are calculated as
83d62bc4baSyz147064  * ((1000 * vid) + PPA), the largest key can't be > 999.
84d62bc4baSyz147064  */
85d62bc4baSyz147064 #define	AGGR_MAX_KEY	999
86d62bc4baSyz147064 
87d62bc4baSyz147064 /*
887c478bd9Sstevel@tonic-gate  * LACP port state.
897c478bd9Sstevel@tonic-gate  */
907c478bd9Sstevel@tonic-gate typedef union {
917c478bd9Sstevel@tonic-gate 	struct {
927c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_HTOL)
937c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
947c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
957c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
967c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
977c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
987c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
997c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
1007c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
1017c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_LTOH)
1027c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
1037c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
1047c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
1057c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
1067c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
1077c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
1087c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
1097c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
1107c478bd9Sstevel@tonic-gate #else
1117c478bd9Sstevel@tonic-gate #error "unknown bit fields ordering"
1127c478bd9Sstevel@tonic-gate #endif
1137c478bd9Sstevel@tonic-gate 	} bit;
1147c478bd9Sstevel@tonic-gate 	uint8_t state;
1157c478bd9Sstevel@tonic-gate } aggr_lacp_state_t;
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate /* one of the ports of a link aggregation group */
1187c478bd9Sstevel@tonic-gate typedef struct laioc_port {
119d62bc4baSyz147064 	datalink_id_t	lp_linkid;
1207c478bd9Sstevel@tonic-gate } laioc_port_t;
1217c478bd9Sstevel@tonic-gate 
122eae72b5bSSebastien Roy #define	LAIOC_CREATE		AGGRIOC(1)
1237c478bd9Sstevel@tonic-gate 
1247c478bd9Sstevel@tonic-gate typedef struct laioc_create {
125d62bc4baSyz147064 	datalink_id_t	lc_linkid;
1267c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1277c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1287c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1297c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1307c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1317c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
132d62bc4baSyz147064 	uint32_t	lc_mac_fixed : 1,
133d62bc4baSyz147064 			lc_force : 1,
134d62bc4baSyz147064 			lc_pad_bits : 30;
1357c478bd9Sstevel@tonic-gate } laioc_create_t;
1367c478bd9Sstevel@tonic-gate 
137eae72b5bSSebastien Roy #define	LAIOC_DELETE		AGGRIOC(2)
1387c478bd9Sstevel@tonic-gate 
1397c478bd9Sstevel@tonic-gate typedef struct laioc_delete {
140d62bc4baSyz147064 	datalink_id_t	ld_linkid;
1417c478bd9Sstevel@tonic-gate } laioc_delete_t;
1427c478bd9Sstevel@tonic-gate 
143eae72b5bSSebastien Roy #define	LAIOC_INFO		AGGRIOC(3)
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate typedef enum aggr_link_duplex {
1467c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_FULL = 1,
1477c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_HALF = 2,
1487c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_UNKNOWN = 3
1497c478bd9Sstevel@tonic-gate } aggr_link_duplex_t;
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate typedef enum aggr_link_state {
1527c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UP = 1,
1537c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_DOWN = 2,
1547c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UNKNOWN = 3
1557c478bd9Sstevel@tonic-gate } aggr_link_state_t;
1567c478bd9Sstevel@tonic-gate 
1577c478bd9Sstevel@tonic-gate typedef struct laioc_info_port {
158d62bc4baSyz147064 	datalink_id_t	lp_linkid;
1597c478bd9Sstevel@tonic-gate 	uchar_t		lp_mac[ETHERADDRL];
1607c478bd9Sstevel@tonic-gate 	aggr_port_state_t lp_state;
1617c478bd9Sstevel@tonic-gate 	aggr_lacp_state_t lp_lacp_state;
1627c478bd9Sstevel@tonic-gate } laioc_info_port_t;
1637c478bd9Sstevel@tonic-gate 
1647c478bd9Sstevel@tonic-gate typedef struct laioc_info_group {
165d62bc4baSyz147064 	datalink_id_t	lg_linkid;
1667c478bd9Sstevel@tonic-gate 	uint32_t	lg_key;
1677c478bd9Sstevel@tonic-gate 	uchar_t		lg_mac[ETHERADDRL];
1687c478bd9Sstevel@tonic-gate 	boolean_t	lg_mac_fixed;
169d62bc4baSyz147064 	boolean_t	lg_force;
1707c478bd9Sstevel@tonic-gate 	uint32_t	lg_policy;
1717c478bd9Sstevel@tonic-gate 	uint32_t	lg_nports;
1727c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lg_lacp_mode;
1737c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lg_lacp_timer;
1747c478bd9Sstevel@tonic-gate } laioc_info_group_t;
1757c478bd9Sstevel@tonic-gate 
1767c478bd9Sstevel@tonic-gate typedef struct laioc_info {
177d62bc4baSyz147064 	/* Must not be DLADM_INVALID_LINKID */
178d62bc4baSyz147064 	datalink_id_t	li_group_linkid;
179eae72b5bSSebastien Roy 	uint32_t	li_bufsize;
1807c478bd9Sstevel@tonic-gate } laioc_info_t;
1817c478bd9Sstevel@tonic-gate 
182eae72b5bSSebastien Roy #define	LAIOC_ADD		AGGRIOC(4)
183eae72b5bSSebastien Roy #define	LAIOC_REMOVE		AGGRIOC(5)
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem {
186d62bc4baSyz147064 	datalink_id_t	la_linkid;
1877c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
188d62bc4baSyz147064 	uint32_t	la_force;
189210db224Sericheng } laioc_add_rem_t;
1907c478bd9Sstevel@tonic-gate 
191eae72b5bSSebastien Roy #define	LAIOC_MODIFY			AGGRIOC(6)
1927c478bd9Sstevel@tonic-gate 
1937c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_POLICY		0x01
1947c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_MAC		0x02
1957c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_MODE		0x04
1967c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_TIMER		0x08
1977c478bd9Sstevel@tonic-gate 
1987c478bd9Sstevel@tonic-gate typedef struct laioc_modify {
199d62bc4baSyz147064 	datalink_id_t	lu_linkid;
2007c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2017c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2027c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2037c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2047c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2057c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2067c478bd9Sstevel@tonic-gate } laioc_modify_t;
2077c478bd9Sstevel@tonic-gate 
2087c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2097c478bd9Sstevel@tonic-gate }
2107c478bd9Sstevel@tonic-gate #endif
2117c478bd9Sstevel@tonic-gate 
2127c478bd9Sstevel@tonic-gate #endif	/* _SYS_AGGR_H */
213