10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * CDDL HEADER START 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * The contents of this file are subject to the terms of the 51537Snd99603 * Common Development and Distribution License (the "License"). 61537Snd99603 * You may not use this file except in compliance with the License. 70Sstevel@tonic-gate * 80Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate * See the License for the specific language governing permissions 110Sstevel@tonic-gate * and limitations under the License. 120Sstevel@tonic-gate * 130Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate * 190Sstevel@tonic-gate * CDDL HEADER END 200Sstevel@tonic-gate */ 210Sstevel@tonic-gate /* 22*11878SVenu.Iyer@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 230Sstevel@tonic-gate * Use is subject to license terms. 240Sstevel@tonic-gate */ 250Sstevel@tonic-gate 260Sstevel@tonic-gate #ifndef _SYS_AGGR_IMPL_H 270Sstevel@tonic-gate #define _SYS_AGGR_IMPL_H 280Sstevel@tonic-gate 290Sstevel@tonic-gate #include <sys/types.h> 3010616SSebastien.Roy@Sun.COM #include <sys/cred.h> 312311Sseb #include <sys/mac_ether.h> 328275SEric Cheng #include <sys/mac_provider.h> 338275SEric Cheng #include <sys/mac_client.h> 348275SEric Cheng #include <sys/mac_client_priv.h> 350Sstevel@tonic-gate #include <sys/aggr_lacp.h> 360Sstevel@tonic-gate 370Sstevel@tonic-gate #ifdef __cplusplus 380Sstevel@tonic-gate extern "C" { 390Sstevel@tonic-gate #endif 400Sstevel@tonic-gate 410Sstevel@tonic-gate #ifdef _KERNEL 420Sstevel@tonic-gate 43269Sericheng #define AGGR_MINOR_CTL 1 /* control interface minor */ 440Sstevel@tonic-gate 450Sstevel@tonic-gate /* flags for aggr_grp_modify() */ 460Sstevel@tonic-gate #define AGGR_MODIFY_POLICY 0x01 470Sstevel@tonic-gate #define AGGR_MODIFY_MAC 0x02 480Sstevel@tonic-gate #define AGGR_MODIFY_LACP_MODE 0x04 490Sstevel@tonic-gate #define AGGR_MODIFY_LACP_TIMER 0x08 500Sstevel@tonic-gate 510Sstevel@tonic-gate /* 528275SEric Cheng * Possible value of aggr_rseudo_rx_ring_t.arr_flags. Set when the ring entry 538275SEric Cheng * in the pseudo RX group is used. 548275SEric Cheng */ 558275SEric Cheng #define MAC_PSEUDO_RING_INUSE 0x01 568275SEric Cheng 578275SEric Cheng typedef struct aggr_unicst_addr_s { 588275SEric Cheng uint8_t aua_addr[ETHERADDRL]; 598275SEric Cheng struct aggr_unicst_addr_s *aua_next; 608275SEric Cheng } aggr_unicst_addr_t; 618275SEric Cheng 628275SEric Cheng typedef struct aggr_pseudo_rx_ring_s { 638275SEric Cheng mac_ring_handle_t arr_rh; /* filled in by aggr_fill_ring() */ 648275SEric Cheng struct aggr_port_s *arr_port; 658275SEric Cheng mac_ring_handle_t arr_hw_rh; 668275SEric Cheng uint_t arr_flags; 678275SEric Cheng uint64_t arr_gen; 688275SEric Cheng } aggr_pseudo_rx_ring_t; 698275SEric Cheng 708275SEric Cheng typedef struct aggr_pseudo_rx_group_s { 718275SEric Cheng struct aggr_grp_s *arg_grp; /* filled in by aggr_fill_group() */ 728275SEric Cheng mac_group_handle_t arg_gh; /* filled in by aggr_fill_group() */ 738275SEric Cheng aggr_unicst_addr_t *arg_macaddr; 748275SEric Cheng aggr_pseudo_rx_ring_t arg_rings[MAX_RINGS_PER_GROUP]; 758275SEric Cheng uint_t arg_ring_cnt; 768275SEric Cheng } aggr_pseudo_rx_group_t; 778275SEric Cheng 78*11878SVenu.Iyer@Sun.COM typedef struct aggr_pseudo_tx_ring_s { 79*11878SVenu.Iyer@Sun.COM mac_ring_handle_t atr_rh; /* filled in by aggr_fill_ring() */ 80*11878SVenu.Iyer@Sun.COM struct aggr_port_s *atr_port; 81*11878SVenu.Iyer@Sun.COM mac_ring_handle_t atr_hw_rh; 82*11878SVenu.Iyer@Sun.COM uint_t atr_flags; 83*11878SVenu.Iyer@Sun.COM } aggr_pseudo_tx_ring_t; 84*11878SVenu.Iyer@Sun.COM 85*11878SVenu.Iyer@Sun.COM typedef struct aggr_pseudo_tx_group_s { 86*11878SVenu.Iyer@Sun.COM mac_group_handle_t atg_gh; /* filled in by aggr_fill_group() */ 87*11878SVenu.Iyer@Sun.COM uint_t atg_ring_cnt; 88*11878SVenu.Iyer@Sun.COM aggr_pseudo_tx_ring_t atg_rings[MAX_RINGS_PER_GROUP]; 89*11878SVenu.Iyer@Sun.COM } aggr_pseudo_tx_group_t; 90*11878SVenu.Iyer@Sun.COM 918275SEric Cheng /* 920Sstevel@tonic-gate * A link aggregation MAC port. 930Sstevel@tonic-gate * Note that lp_next is protected by the lg_lock of the group the 940Sstevel@tonic-gate * port is part of. 950Sstevel@tonic-gate */ 960Sstevel@tonic-gate typedef struct aggr_port_s { 970Sstevel@tonic-gate struct aggr_port_s *lp_next; 980Sstevel@tonic-gate struct aggr_grp_s *lp_grp; /* back ptr to group */ 995895Syz147064 datalink_id_t lp_linkid; 1005102Syz147064 uint16_t lp_portid; 1010Sstevel@tonic-gate uint8_t lp_addr[ETHERADDRL]; /* port MAC address */ 1020Sstevel@tonic-gate uint32_t lp_refs; /* refcount */ 1030Sstevel@tonic-gate aggr_port_state_t lp_state; 1040Sstevel@tonic-gate uint32_t lp_started : 1, 1050Sstevel@tonic-gate lp_tx_enabled : 1, 1060Sstevel@tonic-gate lp_collector_enabled : 1, 1070Sstevel@tonic-gate lp_promisc_on : 1, 1085895Syz147064 lp_no_link_update : 1, 109*11878SVenu.Iyer@Sun.COM lp_rx_grp_added : 1, 110*11878SVenu.Iyer@Sun.COM lp_tx_grp_added : 1, 1118275SEric Cheng lp_closing : 1, 112*11878SVenu.Iyer@Sun.COM lp_pad_bits : 24; 1130Sstevel@tonic-gate mac_handle_t lp_mh; 1148275SEric Cheng mac_client_handle_t lp_mch; 1150Sstevel@tonic-gate const mac_info_t *lp_mip; 1160Sstevel@tonic-gate mac_notify_handle_t lp_mnh; 1170Sstevel@tonic-gate uint_t lp_tx_idx; /* idx in group's tx array */ 1180Sstevel@tonic-gate uint64_t lp_ifspeed; 1190Sstevel@tonic-gate link_state_t lp_link_state; 1200Sstevel@tonic-gate link_duplex_t lp_link_duplex; 1210Sstevel@tonic-gate uint64_t lp_stat[MAC_NSTAT]; 1222311Sseb uint64_t lp_ether_stat[ETHER_NSTAT]; 1230Sstevel@tonic-gate aggr_lacp_port_t lp_lacp; /* LACP state */ 1240Sstevel@tonic-gate lacp_stats_t lp_lacp_stats; 1255895Syz147064 uint32_t lp_margin; 1268275SEric Cheng mac_promisc_handle_t lp_mphp; 1278275SEric Cheng mac_unicast_handle_t lp_mah; 1280Sstevel@tonic-gate 1298275SEric Cheng /* List of non-primary addresses that requires promiscous mode set */ 1308275SEric Cheng aggr_unicst_addr_t *lp_prom_addr; 1318275SEric Cheng /* handle of the underlying HW RX group */ 1328275SEric Cheng mac_group_handle_t lp_hwgh; 133*11878SVenu.Iyer@Sun.COM int lp_tx_ring_cnt; 134*11878SVenu.Iyer@Sun.COM /* handles of the underlying HW TX rings */ 135*11878SVenu.Iyer@Sun.COM mac_ring_handle_t *lp_tx_rings; 136*11878SVenu.Iyer@Sun.COM /* 137*11878SVenu.Iyer@Sun.COM * Handles of the pseudo TX rings. Each of them maps to 138*11878SVenu.Iyer@Sun.COM * corresponding hardware TX ring in lp_tx_rings[]. A 139*11878SVenu.Iyer@Sun.COM * pseudo TX ring is presented to aggr primary mac 140*11878SVenu.Iyer@Sun.COM * client even when underlying NIC has no TX ring. 141*11878SVenu.Iyer@Sun.COM */ 142*11878SVenu.Iyer@Sun.COM mac_ring_handle_t *lp_pseudo_tx_rings; 143*11878SVenu.Iyer@Sun.COM void *lp_tx_notify_mh; 1448275SEric Cheng } aggr_port_t; 1457085Sudpa 1460Sstevel@tonic-gate /* 1470Sstevel@tonic-gate * A link aggregation group. 1480Sstevel@tonic-gate * 1490Sstevel@tonic-gate * The following per-group flags are defined: 1500Sstevel@tonic-gate * 1510Sstevel@tonic-gate * - lg_addr_fixed: set when the MAC address has been explicitely set 1520Sstevel@tonic-gate * when the group was created, or by a m_unicst_set() request. 1530Sstevel@tonic-gate * If this flag is not set, the MAC address of the group will be 1540Sstevel@tonic-gate * set to the first port that is added to the group. 1550Sstevel@tonic-gate * 1560Sstevel@tonic-gate * - lg_add_set: used only when lg_addr_fixed is not set. Captures whether 1570Sstevel@tonic-gate * the MAC address was initialized according to the members of the group. 1580Sstevel@tonic-gate * When set, the lg_port field points to the port from which the 1590Sstevel@tonic-gate * MAC address was initialized. 1600Sstevel@tonic-gate * 1610Sstevel@tonic-gate */ 1620Sstevel@tonic-gate typedef struct aggr_grp_s { 1635895Syz147064 datalink_id_t lg_linkid; 1640Sstevel@tonic-gate uint16_t lg_key; /* key (group port number) */ 1650Sstevel@tonic-gate uint32_t lg_refs; /* refcount */ 1660Sstevel@tonic-gate uint16_t lg_nports; /* number of MAC ports */ 1670Sstevel@tonic-gate uint8_t lg_addr[ETHERADDRL]; /* group MAC address */ 1680Sstevel@tonic-gate uint16_t 1692047Syz147064 lg_closing : 1, 1700Sstevel@tonic-gate lg_addr_fixed : 1, /* fixed MAC address? */ 1710Sstevel@tonic-gate lg_started : 1, /* group started? */ 1720Sstevel@tonic-gate lg_promisc : 1, /* in promiscuous mode? */ 1735895Syz147064 lg_zcopy : 1, 1745895Syz147064 lg_vlan : 1, 1755895Syz147064 lg_force : 1, 1768970SRoamer@Sun.COM lg_lso : 1, 1778970SRoamer@Sun.COM lg_pad_bits : 8; 1780Sstevel@tonic-gate aggr_port_t *lg_ports; /* list of configured ports */ 1790Sstevel@tonic-gate aggr_port_t *lg_mac_addr_port; 1802311Sseb mac_handle_t lg_mh; 18110616SSebastien.Roy@Sun.COM zoneid_t lg_zoneid; 1820Sstevel@tonic-gate uint_t lg_nattached_ports; 1838275SEric Cheng krwlock_t lg_tx_lock; 1840Sstevel@tonic-gate uint_t lg_ntx_ports; 1850Sstevel@tonic-gate aggr_port_t **lg_tx_ports; /* array of tx ports */ 1860Sstevel@tonic-gate uint_t lg_tx_ports_size; /* size of lg_tx_ports */ 1870Sstevel@tonic-gate uint32_t lg_tx_policy; /* outbound policy */ 1888833SVenu.Iyer@Sun.COM uint8_t lg_mac_tx_policy; 1890Sstevel@tonic-gate uint64_t lg_ifspeed; 1900Sstevel@tonic-gate link_state_t lg_link_state; 1910Sstevel@tonic-gate link_duplex_t lg_link_duplex; 1920Sstevel@tonic-gate uint64_t lg_stat[MAC_NSTAT]; 1932311Sseb uint64_t lg_ether_stat[ETHER_NSTAT]; 1940Sstevel@tonic-gate aggr_lacp_mode_t lg_lacp_mode; /* off, active, or passive */ 1950Sstevel@tonic-gate Agg_t aggr; /* 802.3ad data */ 1962311Sseb uint32_t lg_hcksum_txflags; 1972803Snd99603 uint_t lg_max_sdu; 1985895Syz147064 uint32_t lg_margin; 1998970SRoamer@Sun.COM mac_capab_lso_t lg_cap_lso; 2000Sstevel@tonic-gate 2018275SEric Cheng /* 2028275SEric Cheng * The following fields are used by the LACP packets processing. 2038275SEric Cheng * Specifically, as the LACP packets processing is not performance 2048275SEric Cheng * critical, all LACP packets will be handled by a dedicated thread 2058275SEric Cheng * instead of in the mac_rx() call. This is to avoid the dead lock 2068275SEric Cheng * with mac_unicast_remove(), which holding the mac perimeter of the 2078275SEric Cheng * aggr, and wait for the mr_refcnt of the RX ring to drop to zero. 2088275SEric Cheng */ 2098275SEric Cheng kmutex_t lg_lacp_lock; 2108275SEric Cheng kcondvar_t lg_lacp_cv; 2118275SEric Cheng mblk_t *lg_lacp_head; 2128275SEric Cheng mblk_t *lg_lacp_tail; 2138275SEric Cheng kthread_t *lg_lacp_rx_thread; 2148275SEric Cheng boolean_t lg_lacp_done; 215*11878SVenu.Iyer@Sun.COM 2168275SEric Cheng aggr_pseudo_rx_group_t lg_rx_group; 217*11878SVenu.Iyer@Sun.COM aggr_pseudo_tx_group_t lg_tx_group; 218*11878SVenu.Iyer@Sun.COM 219*11878SVenu.Iyer@Sun.COM kmutex_t lg_tx_flowctl_lock; 220*11878SVenu.Iyer@Sun.COM kcondvar_t lg_tx_flowctl_cv; 221*11878SVenu.Iyer@Sun.COM uint_t lg_tx_blocked_cnt; 222*11878SVenu.Iyer@Sun.COM mac_ring_handle_t *lg_tx_blocked_rings; 223*11878SVenu.Iyer@Sun.COM kthread_t *lg_tx_notify_thread; 224*11878SVenu.Iyer@Sun.COM boolean_t lg_tx_notify_done; 2258275SEric Cheng 2268275SEric Cheng /* 2278275SEric Cheng * The following fields are used by aggr to wait for all the 2288275SEric Cheng * aggr_port_notify_cb() and aggr_port_timer_thread() to finish 2298275SEric Cheng * before it calls mac_unregister() when the aggr is deleted. 2308275SEric Cheng */ 2318275SEric Cheng kmutex_t lg_port_lock; 2328275SEric Cheng kcondvar_t lg_port_cv; 2338275SEric Cheng int lg_port_ref; 2348275SEric Cheng } aggr_grp_t; 2350Sstevel@tonic-gate 2360Sstevel@tonic-gate #define AGGR_GRP_REFHOLD(grp) { \ 2370Sstevel@tonic-gate atomic_add_32(&(grp)->lg_refs, 1); \ 2380Sstevel@tonic-gate ASSERT((grp)->lg_refs != 0); \ 2390Sstevel@tonic-gate } 2400Sstevel@tonic-gate 2410Sstevel@tonic-gate #define AGGR_GRP_REFRELE(grp) { \ 2420Sstevel@tonic-gate ASSERT((grp)->lg_refs != 0); \ 2430Sstevel@tonic-gate membar_exit(); \ 2440Sstevel@tonic-gate if (atomic_add_32_nv(&(grp)->lg_refs, -1) == 0) \ 2450Sstevel@tonic-gate aggr_grp_free(grp); \ 2460Sstevel@tonic-gate } 2470Sstevel@tonic-gate 2480Sstevel@tonic-gate #define AGGR_PORT_REFHOLD(port) { \ 2490Sstevel@tonic-gate atomic_add_32(&(port)->lp_refs, 1); \ 2500Sstevel@tonic-gate ASSERT((port)->lp_refs != 0); \ 2510Sstevel@tonic-gate } 2520Sstevel@tonic-gate 2530Sstevel@tonic-gate #define AGGR_PORT_REFRELE(port) { \ 2540Sstevel@tonic-gate ASSERT((port)->lp_refs != 0); \ 2550Sstevel@tonic-gate membar_exit(); \ 2560Sstevel@tonic-gate if (atomic_add_32_nv(&(port)->lp_refs, -1) == 0) \ 2570Sstevel@tonic-gate aggr_port_free(port); \ 2580Sstevel@tonic-gate } 2590Sstevel@tonic-gate 2600Sstevel@tonic-gate extern dev_info_t *aggr_dip; 2617408SSebastien.Roy@Sun.COM extern int aggr_ioc_init(void); 2627408SSebastien.Roy@Sun.COM extern void aggr_ioc_fini(void); 2630Sstevel@tonic-gate 2645895Syz147064 typedef int (*aggr_grp_info_new_grp_fn_t)(void *, datalink_id_t, uint32_t, 2655895Syz147064 uchar_t *, boolean_t, boolean_t, uint32_t, uint32_t, aggr_lacp_mode_t, 2665895Syz147064 aggr_lacp_timer_t); 2675895Syz147064 typedef int (*aggr_grp_info_new_port_fn_t)(void *, datalink_id_t, uchar_t *, 2682311Sseb aggr_port_state_t, aggr_lacp_state_t *); 2690Sstevel@tonic-gate 2700Sstevel@tonic-gate extern void aggr_grp_init(void); 2711804Sericheng extern void aggr_grp_fini(void); 2725895Syz147064 extern int aggr_grp_create(datalink_id_t, uint32_t, uint_t, laioc_port_t *, 2735895Syz147064 uint32_t, boolean_t, boolean_t, uchar_t *, aggr_lacp_mode_t, 27410616SSebastien.Roy@Sun.COM aggr_lacp_timer_t, cred_t *); 27510616SSebastien.Roy@Sun.COM extern int aggr_grp_delete(datalink_id_t, cred_t *); 2760Sstevel@tonic-gate extern void aggr_grp_free(aggr_grp_t *); 2770Sstevel@tonic-gate 2785895Syz147064 extern int aggr_grp_info(datalink_id_t, void *, aggr_grp_info_new_grp_fn_t, 27910616SSebastien.Roy@Sun.COM aggr_grp_info_new_port_fn_t, cred_t *); 2800Sstevel@tonic-gate extern void aggr_grp_notify(aggr_grp_t *, uint32_t); 2810Sstevel@tonic-gate extern boolean_t aggr_grp_attach_port(aggr_grp_t *, aggr_port_t *); 2828275SEric Cheng extern boolean_t aggr_grp_detach_port(aggr_grp_t *, aggr_port_t *); 2832047Syz147064 extern void aggr_grp_port_mac_changed(aggr_grp_t *, aggr_port_t *, 2842047Syz147064 boolean_t *, boolean_t *); 2855895Syz147064 extern int aggr_grp_add_ports(datalink_id_t, uint_t, boolean_t, 2865895Syz147064 laioc_port_t *); 2875895Syz147064 extern int aggr_grp_rem_ports(datalink_id_t, uint_t, laioc_port_t *); 2882047Syz147064 extern boolean_t aggr_grp_update_ports_mac(aggr_grp_t *); 2898275SEric Cheng extern int aggr_grp_modify(datalink_id_t, uint8_t, uint32_t, boolean_t, 2908275SEric Cheng const uchar_t *, aggr_lacp_mode_t, aggr_lacp_timer_t); 2910Sstevel@tonic-gate extern void aggr_grp_multicst_port(aggr_port_t *, boolean_t); 292269Sericheng extern uint_t aggr_grp_count(void); 2930Sstevel@tonic-gate 2940Sstevel@tonic-gate extern void aggr_port_init(void); 2951804Sericheng extern void aggr_port_fini(void); 2968275SEric Cheng extern int aggr_port_create(aggr_grp_t *, const datalink_id_t, boolean_t, 2978275SEric Cheng aggr_port_t **); 2980Sstevel@tonic-gate extern void aggr_port_delete(aggr_port_t *); 2990Sstevel@tonic-gate extern void aggr_port_free(aggr_port_t *); 3000Sstevel@tonic-gate extern int aggr_port_start(aggr_port_t *); 3010Sstevel@tonic-gate extern void aggr_port_stop(aggr_port_t *); 3020Sstevel@tonic-gate extern int aggr_port_promisc(aggr_port_t *, boolean_t); 3038275SEric Cheng extern int aggr_port_unicst(aggr_port_t *); 3040Sstevel@tonic-gate extern int aggr_port_multicst(void *, boolean_t, const uint8_t *); 3052311Sseb extern uint64_t aggr_port_stat(aggr_port_t *, uint_t); 3068275SEric Cheng extern boolean_t aggr_port_notify_link(aggr_grp_t *, aggr_port_t *); 3072163Syz147064 extern void aggr_port_init_callbacks(aggr_port_t *); 3080Sstevel@tonic-gate 3098275SEric Cheng extern void aggr_recv_cb(void *, mac_resource_handle_t, mblk_t *, boolean_t); 3100Sstevel@tonic-gate 311*11878SVenu.Iyer@Sun.COM extern void aggr_tx_ring_update(void *, uintptr_t); 312*11878SVenu.Iyer@Sun.COM extern void aggr_tx_notify_thread(void *); 3130Sstevel@tonic-gate extern void aggr_send_port_enable(aggr_port_t *); 3140Sstevel@tonic-gate extern void aggr_send_port_disable(aggr_port_t *); 3150Sstevel@tonic-gate extern void aggr_send_update_policy(aggr_grp_t *, uint32_t); 3160Sstevel@tonic-gate 3171537Snd99603 extern void aggr_lacp_init(void); 3181537Snd99603 extern void aggr_lacp_fini(void); 3190Sstevel@tonic-gate extern void aggr_lacp_init_port(aggr_port_t *); 3200Sstevel@tonic-gate extern void aggr_lacp_init_grp(aggr_grp_t *); 3210Sstevel@tonic-gate extern void aggr_lacp_set_mode(aggr_grp_t *, aggr_lacp_mode_t, 3220Sstevel@tonic-gate aggr_lacp_timer_t); 3230Sstevel@tonic-gate extern void aggr_lacp_update_mode(aggr_grp_t *, aggr_lacp_mode_t); 3240Sstevel@tonic-gate extern void aggr_lacp_update_timer(aggr_grp_t *, aggr_lacp_timer_t); 3258275SEric Cheng extern void aggr_lacp_rx_enqueue(aggr_port_t *, mblk_t *); 3260Sstevel@tonic-gate extern void aggr_lacp_port_attached(aggr_port_t *); 3270Sstevel@tonic-gate extern void aggr_lacp_port_detached(aggr_port_t *); 3288275SEric Cheng extern void aggr_port_lacp_set_mode(aggr_grp_t *, aggr_port_t *); 3298275SEric Cheng 3308275SEric Cheng extern void aggr_lacp_rx_thread(void *); 3318275SEric Cheng extern void aggr_recv_lacp(aggr_port_t *, mac_resource_handle_t, mblk_t *); 3328275SEric Cheng 3338275SEric Cheng extern void aggr_grp_port_hold(aggr_port_t *); 3348275SEric Cheng extern void aggr_grp_port_rele(aggr_port_t *); 3358275SEric Cheng extern void aggr_grp_port_wait(aggr_grp_t *); 3368275SEric Cheng 3378275SEric Cheng extern int aggr_port_addmac(aggr_port_t *, const uint8_t *); 3388275SEric Cheng extern void aggr_port_remmac(aggr_port_t *, const uint8_t *); 3390Sstevel@tonic-gate 340*11878SVenu.Iyer@Sun.COM extern mblk_t *aggr_ring_tx(void *, mblk_t *); 341*11878SVenu.Iyer@Sun.COM extern mblk_t *aggr_find_tx_ring(void *, mblk_t *, 342*11878SVenu.Iyer@Sun.COM uintptr_t, mac_ring_handle_t *); 343*11878SVenu.Iyer@Sun.COM 3440Sstevel@tonic-gate #endif /* _KERNEL */ 3450Sstevel@tonic-gate 3460Sstevel@tonic-gate #ifdef __cplusplus 3470Sstevel@tonic-gate } 3480Sstevel@tonic-gate #endif 3490Sstevel@tonic-gate 3500Sstevel@tonic-gate #endif /* _SYS_AGGR_IMPL_H */ 351