xref: /illumos-gate/usr/src/uts/common/sys/aggr.h (revision 210db2243d3b5ca39c96a4c34c6d9453ddfbeaa9)
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
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*
237c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
247c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
257c478bd9Sstevel@tonic-gate  */
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #ifndef	_SYS_AGGR_H
287c478bd9Sstevel@tonic-gate #define	_SYS_AGGR_H
297c478bd9Sstevel@tonic-gate 
307c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #include <sys/types.h>
337c478bd9Sstevel@tonic-gate #include <sys/ethernet.h>
347c478bd9Sstevel@tonic-gate #include <sys/param.h>
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
377c478bd9Sstevel@tonic-gate extern "C" {
387c478bd9Sstevel@tonic-gate #endif
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate /* control interface name */
417c478bd9Sstevel@tonic-gate #define	AGGR_DEVNAME_CTL	"ctl"
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate /*
447c478bd9Sstevel@tonic-gate  * Transmit load balancing policies.
457c478bd9Sstevel@tonic-gate  */
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L2		0x01
487c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L3		0x02
497c478bd9Sstevel@tonic-gate #define	AGGR_POLICY_L4		0x04
507c478bd9Sstevel@tonic-gate 
517c478bd9Sstevel@tonic-gate /*
527c478bd9Sstevel@tonic-gate  * LACP mode and timer.
537c478bd9Sstevel@tonic-gate  */
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate typedef enum {
567c478bd9Sstevel@tonic-gate 	AGGR_LACP_OFF		= 0,
577c478bd9Sstevel@tonic-gate 	AGGR_LACP_ACTIVE	= 1,
587c478bd9Sstevel@tonic-gate 	AGGR_LACP_PASSIVE	= 2
597c478bd9Sstevel@tonic-gate } aggr_lacp_mode_t;
607c478bd9Sstevel@tonic-gate 
617c478bd9Sstevel@tonic-gate typedef enum {
627c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_LONG	= 0,
637c478bd9Sstevel@tonic-gate 	AGGR_LACP_TIMER_SHORT	= 1
647c478bd9Sstevel@tonic-gate } aggr_lacp_timer_t;
657c478bd9Sstevel@tonic-gate 
667c478bd9Sstevel@tonic-gate /*
677c478bd9Sstevel@tonic-gate  * MAC port state.
687c478bd9Sstevel@tonic-gate  */
697c478bd9Sstevel@tonic-gate typedef enum {
707c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_STANDBY = 1,
717c478bd9Sstevel@tonic-gate 	AGGR_PORT_STATE_ATTACHED = 2
727c478bd9Sstevel@tonic-gate } aggr_port_state_t;
737c478bd9Sstevel@tonic-gate 
747c478bd9Sstevel@tonic-gate /* Maximum number of ports per aggregation. */
757c478bd9Sstevel@tonic-gate #define	AGGR_MAX_PORTS	256
767c478bd9Sstevel@tonic-gate 
777c478bd9Sstevel@tonic-gate /*
787c478bd9Sstevel@tonic-gate  * LACP port state.
797c478bd9Sstevel@tonic-gate  */
807c478bd9Sstevel@tonic-gate typedef union {
817c478bd9Sstevel@tonic-gate 	struct {
827c478bd9Sstevel@tonic-gate #if defined(_BIT_FIELDS_HTOL)
837c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
847c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
857c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
867c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
877c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
887c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
897c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
907c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
917c478bd9Sstevel@tonic-gate #elif defined(_BIT_FIELDS_LTOH)
927c478bd9Sstevel@tonic-gate 		uint8_t	activity:	1;
937c478bd9Sstevel@tonic-gate 		uint8_t timeout:	1;
947c478bd9Sstevel@tonic-gate 		uint8_t aggregation:	1;
957c478bd9Sstevel@tonic-gate 		uint8_t sync:	1;
967c478bd9Sstevel@tonic-gate 		uint8_t collecting:	1;
977c478bd9Sstevel@tonic-gate 		uint8_t distributing:	1;
987c478bd9Sstevel@tonic-gate 		uint8_t defaulted:	1;
997c478bd9Sstevel@tonic-gate 		uint8_t expired:	1;
1007c478bd9Sstevel@tonic-gate #else
1017c478bd9Sstevel@tonic-gate #error "unknown bit fields ordering"
1027c478bd9Sstevel@tonic-gate #endif
1037c478bd9Sstevel@tonic-gate 	} bit;
1047c478bd9Sstevel@tonic-gate 	uint8_t state;
1057c478bd9Sstevel@tonic-gate } aggr_lacp_state_t;
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate #define	LAIOC(x)		(('l' << 24) | ('a' << 16) | ('m' << 8) | (x))
1087c478bd9Sstevel@tonic-gate 
1097c478bd9Sstevel@tonic-gate /* one of the ports of a link aggregation group */
1107c478bd9Sstevel@tonic-gate typedef struct laioc_port {
1117c478bd9Sstevel@tonic-gate 	char		lp_devname[MAXNAMELEN + 1];
1127c478bd9Sstevel@tonic-gate 	uint_t		lp_port;
1137c478bd9Sstevel@tonic-gate } laioc_port_t;
1147c478bd9Sstevel@tonic-gate 
1157c478bd9Sstevel@tonic-gate #define	LAIOC_CREATE		LAIOC(1)
1167c478bd9Sstevel@tonic-gate 
1177c478bd9Sstevel@tonic-gate typedef struct laioc_create {
1187c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1197c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1207c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1217c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1227c478bd9Sstevel@tonic-gate 	boolean_t	lc_mac_fixed;
1237c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1247c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
1257c478bd9Sstevel@tonic-gate } laioc_create_t;
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
1287c478bd9Sstevel@tonic-gate 
1297c478bd9Sstevel@tonic-gate typedef struct laioc_create32 {
1307c478bd9Sstevel@tonic-gate 	uint32_t	lc_key;
1317c478bd9Sstevel@tonic-gate 	uint32_t	lc_nports;
1327c478bd9Sstevel@tonic-gate 	uint32_t	lc_policy;
1337c478bd9Sstevel@tonic-gate 	uchar_t		lc_mac[ETHERADDRL];
1347c478bd9Sstevel@tonic-gate 	boolean_t	lc_mac_fixed;
1357c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lc_lacp_mode;
1367c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lc_lacp_timer;
1377c478bd9Sstevel@tonic-gate } laioc_create32_t;
1387c478bd9Sstevel@tonic-gate 
1397c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate #define	LAIOC_DELETE		LAIOC(2)
1427c478bd9Sstevel@tonic-gate 
1437c478bd9Sstevel@tonic-gate typedef struct laioc_delete {
1447c478bd9Sstevel@tonic-gate 	uint32_t	ld_key;
1457c478bd9Sstevel@tonic-gate } laioc_delete_t;
1467c478bd9Sstevel@tonic-gate 
1477c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
1487c478bd9Sstevel@tonic-gate 
1497c478bd9Sstevel@tonic-gate typedef struct laioc_delete32 {
1507c478bd9Sstevel@tonic-gate 	uint32_t	ld_key;
1517c478bd9Sstevel@tonic-gate } laioc_delete32_t;
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1547c478bd9Sstevel@tonic-gate 
1557c478bd9Sstevel@tonic-gate #define	LAIOC_INFO		LAIOC(3)
1567c478bd9Sstevel@tonic-gate 
1577c478bd9Sstevel@tonic-gate typedef enum aggr_link_duplex {
1587c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_FULL = 1,
1597c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_HALF = 2,
1607c478bd9Sstevel@tonic-gate 	AGGR_LINK_DUPLEX_UNKNOWN = 3
1617c478bd9Sstevel@tonic-gate } aggr_link_duplex_t;
1627c478bd9Sstevel@tonic-gate 
1637c478bd9Sstevel@tonic-gate typedef enum aggr_link_state {
1647c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UP = 1,
1657c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_DOWN = 2,
1667c478bd9Sstevel@tonic-gate 	AGGR_LINK_STATE_UNKNOWN = 3
1677c478bd9Sstevel@tonic-gate } aggr_link_state_t;
1687c478bd9Sstevel@tonic-gate 
1697c478bd9Sstevel@tonic-gate typedef struct laioc_info_port {
1707c478bd9Sstevel@tonic-gate 	char		lp_devname[MAXNAMELEN + 1];
1717c478bd9Sstevel@tonic-gate 	uint32_t	lp_port;
1727c478bd9Sstevel@tonic-gate 	uchar_t		lp_mac[ETHERADDRL];
1737c478bd9Sstevel@tonic-gate 	aggr_port_state_t lp_state;
1747c478bd9Sstevel@tonic-gate 	aggr_lacp_state_t lp_lacp_state;
1757c478bd9Sstevel@tonic-gate } laioc_info_port_t;
1767c478bd9Sstevel@tonic-gate 
1777c478bd9Sstevel@tonic-gate typedef struct laioc_info_group {
1787c478bd9Sstevel@tonic-gate 	uint32_t	lg_key;
1797c478bd9Sstevel@tonic-gate 	uchar_t		lg_mac[ETHERADDRL];
1807c478bd9Sstevel@tonic-gate 	boolean_t	lg_mac_fixed;
1817c478bd9Sstevel@tonic-gate 	uint32_t	lg_policy;
1827c478bd9Sstevel@tonic-gate 	uint32_t	lg_nports;
1837c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lg_lacp_mode;
1847c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lg_lacp_timer;
1857c478bd9Sstevel@tonic-gate } laioc_info_group_t;
1867c478bd9Sstevel@tonic-gate 
1877c478bd9Sstevel@tonic-gate typedef struct laioc_info {
1887c478bd9Sstevel@tonic-gate 	uint32_t	li_ngroups;
1897c478bd9Sstevel@tonic-gate 	uint32_t	li_group_key;	/* 0 returns all */
1907c478bd9Sstevel@tonic-gate } laioc_info_t;
1917c478bd9Sstevel@tonic-gate 
1927c478bd9Sstevel@tonic-gate #define	LAIOC_ADD		LAIOC(4)
1937c478bd9Sstevel@tonic-gate #define	LAIOC_REMOVE		LAIOC(5)
1947c478bd9Sstevel@tonic-gate 
1957c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem {
1967c478bd9Sstevel@tonic-gate 	uint32_t	la_key;
1977c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
198*210db224Sericheng } laioc_add_rem_t;
1997c478bd9Sstevel@tonic-gate 
2007c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
2017c478bd9Sstevel@tonic-gate 
2027c478bd9Sstevel@tonic-gate typedef struct laioc_add_rem32 {
2037c478bd9Sstevel@tonic-gate 	uint32_t	la_key;
2047c478bd9Sstevel@tonic-gate 	uint32_t	la_nports;
2057c478bd9Sstevel@tonic-gate } laioc_add_rem32_t;
2067c478bd9Sstevel@tonic-gate 
2077c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY			LAIOC(6)
2107c478bd9Sstevel@tonic-gate 
2117c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_POLICY		0x01
2127c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_MAC		0x02
2137c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_MODE		0x04
2147c478bd9Sstevel@tonic-gate #define	LAIOC_MODIFY_LACP_TIMER		0x08
2157c478bd9Sstevel@tonic-gate 
2167c478bd9Sstevel@tonic-gate typedef struct laioc_modify {
2177c478bd9Sstevel@tonic-gate 	uint32_t	lu_key;
2187c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2197c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2207c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2217c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2227c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2237c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2247c478bd9Sstevel@tonic-gate } laioc_modify_t;
2257c478bd9Sstevel@tonic-gate 
2267c478bd9Sstevel@tonic-gate #ifdef _SYSCALL32
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate typedef struct laioc_modify32 {
2297c478bd9Sstevel@tonic-gate 	uint32_t	lu_key;
2307c478bd9Sstevel@tonic-gate 	uint8_t		lu_modify_mask;
2317c478bd9Sstevel@tonic-gate 	uint32_t	lu_policy;
2327c478bd9Sstevel@tonic-gate 	uchar_t		lu_mac[ETHERADDRL];
2337c478bd9Sstevel@tonic-gate 	boolean_t	lu_mac_fixed;
2347c478bd9Sstevel@tonic-gate 	aggr_lacp_mode_t lu_lacp_mode;
2357c478bd9Sstevel@tonic-gate 	aggr_lacp_timer_t lu_lacp_timer;
2367c478bd9Sstevel@tonic-gate } laioc_modify32_t;
2377c478bd9Sstevel@tonic-gate 
2387c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
2397c478bd9Sstevel@tonic-gate 
2407c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2417c478bd9Sstevel@tonic-gate }
2427c478bd9Sstevel@tonic-gate #endif
2437c478bd9Sstevel@tonic-gate 
2447c478bd9Sstevel@tonic-gate #endif	/* _SYS_AGGR_H */
245