xref: /illumos-gate/usr/src/uts/common/sys/aggr.h (revision ba2e4443695ee6a6f420a35cd4fc3d3346d22932)
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
5*ba2e4443Sseb  * Common Development and Distribution License (the "License").
6*ba2e4443Sseb  * 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 /*
22*ba2e4443Sseb  * Copyright 2006 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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate #include <sys/types.h>
327c478bd9Sstevel@tonic-gate #include <sys/ethernet.h>
337c478bd9Sstevel@tonic-gate #include <sys/param.h>
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
367c478bd9Sstevel@tonic-gate extern "C" {
377c478bd9Sstevel@tonic-gate #endif
387c478bd9Sstevel@tonic-gate 
397c478bd9Sstevel@tonic-gate /* control interface name */
407c478bd9Sstevel@tonic-gate #define	AGGR_DEVNAME_CTL	"ctl"
417c478bd9Sstevel@tonic-gate 
427c478bd9Sstevel@tonic-gate /*
437c478bd9Sstevel@tonic-gate  * Transmit load balancing policies.
447c478bd9Sstevel@tonic-gate  */
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L2		0x01
477c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L3		0x02
487c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L4		0x04
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate /*
517c478bd9Sstevel@tonic-gate  * LACP mode and timer.
527c478bd9Sstevel@tonic-gate  */
537c478bd9Sstevel@tonic-gate 
547c478bd9Sstevel@tonic-gate typedef enum {
557c478bd9Sstevel@tonic-gate 	AGGR_LACP_OFF		= 0,
567c478bd9Sstevel@tonic-gate 	AGGR_LACP_ACTIVE	= 1,
577c478bd9Sstevel@tonic-gate 	AGGR_LACP_PASSIVE	= 2
587c478bd9Sstevel@tonic-gate } aggr_lacp_mode_t;
597c478bd9Sstevel@tonic-gate 
607c478bd9Sstevel@tonic-gate typedef enum {
617c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_LONG	= 0,
627c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_SHORT	= 1
637c478bd9Sstevel@tonic-gate } aggr_lacp_timer_t;
647c478bd9Sstevel@tonic-gate 
657c478bd9Sstevel@tonic-gate /*
667c478bd9Sstevel@tonic-gate  * MAC port state.
677c478bd9Sstevel@tonic-gate  */
687c478bd9Sstevel@tonic-gate typedef enum {
697c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_STANDBY = 1,
707c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_ATTACHED = 2
717c478bd9Sstevel@tonic-gate } aggr_port_state_t;
727c478bd9Sstevel@tonic-gate 
737c478bd9Sstevel@tonic-gate /* Maximum number of ports per aggregation. */
747c478bd9Sstevel@tonic-gate #define	AGGR_MAX_PORTS	256
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate /*
777c478bd9Sstevel@tonic-gate  * LACP port state.
787c478bd9Sstevel@tonic-gate  */
797c478bd9Sstevel@tonic-gate typedef union {
807c478bd9Sstevel@tonic-gate 	struct {
817c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_HTOL)
827c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
837c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
847c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
857c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
867c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
877c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
887c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
897c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
907c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_LTOH)
917c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
927c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
937c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
947c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
957c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
967c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
977c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
987c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
997c478bd9Sstevel@tonic-gate #else
1007c478bd9Sstevel@tonic-gate #error "unknown bit fields ordering"
1017c478bd9Sstevel@tonic-gate #endif
1027c478bd9Sstevel@tonic-gate 	} bit;
1037c478bd9Sstevel@tonic-gate 	uint8_t state;
1047c478bd9Sstevel@tonic-gate } aggr_lacp_state_t;
1057c478bd9Sstevel@tonic-gate 
1067c478bd9Sstevel@tonic-gate #define	LAIOC(x)		(('l' << 24) | ('a' << 16) | ('m' << 8) | (x))
1077c478bd9Sstevel@tonic-gate 
1087c478bd9Sstevel@tonic-gate /* one of the ports of a link aggregation group */
1097c478bd9Sstevel@tonic-gate typedef struct laioc_port {
1107c478bd9Sstevel@tonic-gate 	char		lp_devname[MAXNAMELEN + 1];
1117c478bd9Sstevel@tonic-gate } laioc_port_t;
1127c478bd9Sstevel@tonic-gate 
1137c478bd9Sstevel@tonic-gate #define	LAIOC_CREATE		LAIOC(1)
1147c478bd9Sstevel@tonic-gate 
1157c478bd9Sstevel@tonic-gate typedef struct laioc_create {
1167c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1177c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1187c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1197c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1207c478bd9Sstevel@tonic-gate 	boolean_t	lc_mac_fixed;
1217c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1227c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
1237c478bd9Sstevel@tonic-gate } laioc_create_t;
1247c478bd9Sstevel@tonic-gate 
1257c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate typedef struct laioc_create32 {
1287c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1297c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1307c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1317c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1327c478bd9Sstevel@tonic-gate 	boolean_t	lc_mac_fixed;
1337c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1347c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
1357c478bd9Sstevel@tonic-gate } laioc_create32_t;
1367c478bd9Sstevel@tonic-gate 
1377c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1387c478bd9Sstevel@tonic-gate 
1397c478bd9Sstevel@tonic-gate #define	LAIOC_DELETE		LAIOC(2)
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate typedef struct laioc_delete {
1427c478bd9Sstevel@tonic-gate 	uint32_t	ld_key;
1437c478bd9Sstevel@tonic-gate } laioc_delete_t;
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate typedef struct laioc_delete32 {
1487c478bd9Sstevel@tonic-gate 	uint32_t	ld_key;
1497c478bd9Sstevel@tonic-gate } laioc_delete32_t;
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate #define	LAIOC_INFO		LAIOC(3)
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate typedef enum aggr_link_duplex {
1567c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_FULL = 1,
1577c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_HALF = 2,
1587c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_UNKNOWN = 3
1597c478bd9Sstevel@tonic-gate } aggr_link_duplex_t;
1607c478bd9Sstevel@tonic-gate 
1617c478bd9Sstevel@tonic-gate typedef enum aggr_link_state {
1627c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UP = 1,
1637c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_DOWN = 2,
1647c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UNKNOWN = 3
1657c478bd9Sstevel@tonic-gate } aggr_link_state_t;
1667c478bd9Sstevel@tonic-gate 
1677c478bd9Sstevel@tonic-gate typedef struct laioc_info_port {
1687c478bd9Sstevel@tonic-gate 	char		lp_devname[MAXNAMELEN + 1];
1697c478bd9Sstevel@tonic-gate 	uchar_t		lp_mac[ETHERADDRL];
1707c478bd9Sstevel@tonic-gate 	aggr_port_state_t lp_state;
1717c478bd9Sstevel@tonic-gate 	aggr_lacp_state_t lp_lacp_state;
1727c478bd9Sstevel@tonic-gate } laioc_info_port_t;
1737c478bd9Sstevel@tonic-gate 
1747c478bd9Sstevel@tonic-gate typedef struct laioc_info_group {
1757c478bd9Sstevel@tonic-gate 	uint32_t	lg_key;
1767c478bd9Sstevel@tonic-gate 	uchar_t		lg_mac[ETHERADDRL];
1777c478bd9Sstevel@tonic-gate 	boolean_t	lg_mac_fixed;
1787c478bd9Sstevel@tonic-gate 	uint32_t	lg_policy;
1797c478bd9Sstevel@tonic-gate 	uint32_t	lg_nports;
1807c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lg_lacp_mode;
1817c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lg_lacp_timer;
1827c478bd9Sstevel@tonic-gate } laioc_info_group_t;
1837c478bd9Sstevel@tonic-gate 
1847c478bd9Sstevel@tonic-gate typedef struct laioc_info {
1857c478bd9Sstevel@tonic-gate 	uint32_t	li_ngroups;
1867c478bd9Sstevel@tonic-gate 	uint32_t	li_group_key;	/* 0 returns all */
1877c478bd9Sstevel@tonic-gate } laioc_info_t;
1887c478bd9Sstevel@tonic-gate 
1897c478bd9Sstevel@tonic-gate #define	LAIOC_ADD		LAIOC(4)
1907c478bd9Sstevel@tonic-gate #define	LAIOC_REMOVE		LAIOC(5)
1917c478bd9Sstevel@tonic-gate 
1927c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem {
1937c478bd9Sstevel@tonic-gate 	uint32_t	la_key;
1947c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
195210db224Sericheng } laioc_add_rem_t;
1967c478bd9Sstevel@tonic-gate 
1977c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
1987c478bd9Sstevel@tonic-gate 
1997c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem32 {
2007c478bd9Sstevel@tonic-gate 	uint32_t	la_key;
2017c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
2027c478bd9Sstevel@tonic-gate } laioc_add_rem32_t;
2037c478bd9Sstevel@tonic-gate 
2047c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
2057c478bd9Sstevel@tonic-gate 
2067c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY			LAIOC(6)
2077c478bd9Sstevel@tonic-gate 
2087c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_POLICY		0x01
2097c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_MAC		0x02
2107c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_MODE		0x04
2117c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_TIMER		0x08
2127c478bd9Sstevel@tonic-gate 
2137c478bd9Sstevel@tonic-gate typedef struct laioc_modify {
2147c478bd9Sstevel@tonic-gate 	uint32_t	lu_key;
2157c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2167c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2177c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2187c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2197c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2207c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2217c478bd9Sstevel@tonic-gate } laioc_modify_t;
2227c478bd9Sstevel@tonic-gate 
2237c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
2247c478bd9Sstevel@tonic-gate 
2257c478bd9Sstevel@tonic-gate typedef struct laioc_modify32 {
2267c478bd9Sstevel@tonic-gate 	uint32_t	lu_key;
2277c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2287c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2297c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2307c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2317c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2327c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2337c478bd9Sstevel@tonic-gate } laioc_modify32_t;
2347c478bd9Sstevel@tonic-gate 
2357c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
2367c478bd9Sstevel@tonic-gate 
2377c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2387c478bd9Sstevel@tonic-gate }
2397c478bd9Sstevel@tonic-gate #endif
2407c478bd9Sstevel@tonic-gate 
2417c478bd9Sstevel@tonic-gate #endif	/* _SYS_AGGR_H */
242