Lines Matching refs:grp

205 	aggr_grp_t *grp = buf;  in aggr_grp_constructor()  local
207 bzero(grp, sizeof (*grp)); in aggr_grp_constructor()
208 mutex_init(&grp->lg_lacp_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
209 cv_init(&grp->lg_lacp_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
210 rw_init(&grp->lg_tx_lock, NULL, RW_DRIVER, NULL); in aggr_grp_constructor()
211 mutex_init(&grp->lg_port_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
212 cv_init(&grp->lg_port_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
213 mutex_init(&grp->lg_tx_flowctl_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
214 cv_init(&grp->lg_tx_flowctl_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
215 grp->lg_link_state = LINK_STATE_UNKNOWN; in aggr_grp_constructor()
223 aggr_grp_t *grp = buf; in aggr_grp_destructor() local
225 if (grp->lg_tx_ports != NULL) { in aggr_grp_destructor()
226 kmem_free(grp->lg_tx_ports, in aggr_grp_destructor()
227 grp->lg_tx_ports_size * sizeof (aggr_port_t *)); in aggr_grp_destructor()
230 mutex_destroy(&grp->lg_lacp_lock); in aggr_grp_destructor()
231 cv_destroy(&grp->lg_lacp_cv); in aggr_grp_destructor()
232 mutex_destroy(&grp->lg_port_lock); in aggr_grp_destructor()
233 cv_destroy(&grp->lg_port_cv); in aggr_grp_destructor()
234 rw_destroy(&grp->lg_tx_lock); in aggr_grp_destructor()
235 mutex_destroy(&grp->lg_tx_flowctl_lock); in aggr_grp_destructor()
236 cv_destroy(&grp->lg_tx_flowctl_cv); in aggr_grp_destructor()
289 aggr_grp_t *grp = port->lp_grp; in aggr_grp_port_hold() local
292 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_hold()
293 grp->lg_port_ref++; in aggr_grp_port_hold()
294 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_hold()
304 aggr_grp_t *grp = port->lp_grp; in aggr_grp_port_rele() local
306 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_rele()
307 if (--grp->lg_port_ref == 0) in aggr_grp_port_rele()
308 cv_signal(&grp->lg_port_cv); in aggr_grp_port_rele()
309 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_rele()
318 aggr_grp_port_wait(aggr_grp_t *grp) in aggr_grp_port_wait() argument
320 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_wait()
321 if (grp->lg_port_ref != 0) in aggr_grp_port_wait()
322 cv_wait(&grp->lg_port_cv, &grp->lg_port_lock); in aggr_grp_port_wait()
323 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_wait()
337 aggr_grp_attach_port(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_attach_port() argument
341 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_attach_port()
361 mutex_enter(&grp->lg_stat_lock); in aggr_grp_attach_port()
362 if (grp->lg_ifspeed == 0) { in aggr_grp_attach_port()
367 grp->lg_ifspeed = port->lp_ifspeed; in aggr_grp_attach_port()
369 } else if (grp->lg_ifspeed != port->lp_ifspeed) { in aggr_grp_attach_port()
375 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
378 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
380 grp->lg_nattached_ports++; in aggr_grp_attach_port()
385 if (grp->lg_link_state != LINK_STATE_UP) { in aggr_grp_attach_port()
386 grp->lg_link_state = LINK_STATE_UP; in aggr_grp_attach_port()
387 mutex_enter(&grp->lg_stat_lock); in aggr_grp_attach_port()
388 grp->lg_link_duplex = LINK_DUPLEX_FULL; in aggr_grp_attach_port()
389 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
417 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_grp_attach_port()
426 aggr_grp_detach_port(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_detach_port() argument
430 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_detach_port()
441 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_grp_detach_port()
448 grp->lg_nattached_ports--; in aggr_grp_detach_port()
449 if (grp->lg_nattached_ports == 0) { in aggr_grp_detach_port()
451 grp->lg_link_state = LINK_STATE_DOWN; in aggr_grp_detach_port()
452 mutex_enter(&grp->lg_stat_lock); in aggr_grp_detach_port()
453 grp->lg_ifspeed = 0; in aggr_grp_detach_port()
454 grp->lg_link_duplex = LINK_DUPLEX_UNKNOWN; in aggr_grp_detach_port()
455 mutex_exit(&grp->lg_stat_lock); in aggr_grp_detach_port()
477 aggr_grp_update_ports_mac(aggr_grp_t *grp) in aggr_grp_update_ports_mac() argument
483 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_update_ports_mac()
485 for (cport = grp->lg_ports; cport != NULL; in aggr_grp_update_ports_mac()
489 if (aggr_grp_detach_port(grp, cport)) in aggr_grp_update_ports_mac()
499 if (aggr_grp_attach_port(grp, cport)) in aggr_grp_update_ports_mac()
518 aggr_grp_port_mac_changed(aggr_grp_t *grp, aggr_port_t *port, in aggr_grp_port_mac_changed() argument
521 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_port_mac_changed()
529 if (grp->lg_addr_fixed) { in aggr_grp_port_mac_changed()
537 if (grp->lg_mac_addr_port == port) { in aggr_grp_port_mac_changed()
542 bcopy(port->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_port_mac_changed()
550 *link_state_changedp = aggr_grp_detach_port(grp, port); in aggr_grp_port_mac_changed()
559 *link_state_changedp = aggr_grp_attach_port(grp, port); in aggr_grp_port_mac_changed()
568 aggr_grp_add_port(aggr_grp_t *grp, datalink_id_t port_linkid, boolean_t force, in aggr_grp_add_port() argument
579 if (grp->lg_zoneid != port_zoneid) in aggr_grp_add_port()
588 ASSERT(grp->lg_mh == NULL || MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_add_port()
590 err = aggr_port_create(grp, port_linkid, force, &port); in aggr_grp_add_port()
597 cport = &grp->lg_ports; in aggr_grp_add_port()
607 port->lp_grp = grp; in aggr_grp_add_port()
608 AGGR_GRP_REFHOLD(grp); in aggr_grp_add_port()
609 grp->lg_nports++; in aggr_grp_add_port()
610 if (grp->lg_nports > grp->lg_nports_high) in aggr_grp_add_port()
611 grp->lg_nports_high = grp->lg_nports; in aggr_grp_add_port()
641 aggr_grp_update_default(aggr_grp_t *grp) in aggr_grp_update_default() argument
644 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_update_default()
646 rw_enter(&grp->lg_tx_lock, RW_WRITER); in aggr_grp_update_default()
648 if (grp->lg_ntx_ports == 0) { in aggr_grp_update_default()
649 rw_exit(&grp->lg_tx_lock); in aggr_grp_update_default()
653 port = grp->lg_tx_ports[0]; in aggr_grp_update_default()
655 mac_hwring_set_default(grp->lg_mh, port->lp_pseudo_tx_rings[0]); in aggr_grp_update_default()
656 rw_exit(&grp->lg_tx_lock); in aggr_grp_update_default()
956 aggr_grp_t *grp = port->lp_grp; in aggr_add_pseudo_tx_group() local
965 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_add_pseudo_tx_group()
1026 aggr_grp_update_default(grp); in aggr_add_pseudo_tx_group()
1037 aggr_grp_t *grp = port->lp_grp; in aggr_rem_pseudo_tx_group() local
1041 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_rem_pseudo_tx_group()
1060 aggr_grp_update_default(grp); in aggr_rem_pseudo_tx_group()
1126 aggr_grp_balance_tx(aggr_grp_t *grp, uint_t tx_ring_limit) in aggr_grp_balance_tx() argument
1133 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_balance_tx()
1135 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_balance_tx()
1142 rw_enter(&grp->lg_tx_lock, RW_WRITER); in aggr_grp_balance_tx()
1144 rw_exit(&grp->lg_tx_lock); in aggr_grp_balance_tx()
1151 rw_exit(&grp->lg_tx_lock); in aggr_grp_balance_tx()
1154 aggr_rem_pseudo_tx_ring(&grp->lg_tx_group, in aggr_grp_balance_tx()
1174 aggr_grp_t *grp = NULL; in aggr_grp_add_ports() local
1182 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_add_ports()
1186 AGGR_GRP_REFHOLD(grp); in aggr_grp_add_ports()
1191 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_add_ports()
1199 nports_high = MAX(grp->lg_nports_high, grp->lg_nports + nports); in aggr_grp_add_ports()
1210 aggr_grp_balance_tx(grp, tx_ring_limit); in aggr_grp_add_ports()
1216 if ((rc = aggr_grp_add_port(grp, ports[i].lp_linkid, in aggr_grp_add_ports()
1225 if (!aggr_grp_capab_check(grp, port) || in aggr_grp_add_ports()
1226 !aggr_grp_sdu_check(grp, port) || in aggr_grp_add_ports()
1227 !aggr_grp_margin_check(grp, port)) { in aggr_grp_add_ports()
1236 rc = aggr_add_pseudo_tx_group(port, &grp->lg_tx_group, in aggr_grp_add_ports()
1241 for (uint_t j = 0; j < grp->lg_rx_group_count; j++) { in aggr_grp_add_ports()
1243 &grp->lg_rx_groups[j]); in aggr_grp_add_ports()
1254 aggr_port_lacp_set_mode(grp, port); in aggr_grp_add_ports()
1257 if (grp->lg_started) { in aggr_grp_add_ports()
1270 if (grp->lg_promisc || port->lp_prom_addr != NULL) { in aggr_grp_add_ports()
1283 if (aggr_port_notify_link(grp, port)) in aggr_grp_add_ports()
1293 if (aggr_grp_update_ports_mac(grp)) in aggr_grp_add_ports()
1297 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_add_ports()
1305 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_add_ports()
1308 if (grp->lg_started) { in aggr_grp_add_ports()
1315 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_add_ports()
1322 grp->lg_rx_group_count; in aggr_grp_add_ports()
1326 &grp->lg_rx_groups[j]); in aggr_grp_add_ports()
1329 (void) aggr_grp_rem_port(grp, port, NULL, NULL); in aggr_grp_add_ports()
1334 AGGR_GRP_REFRELE(grp); in aggr_grp_add_ports()
1339 aggr_grp_modify_common(aggr_grp_t *grp, uint8_t update_mask, uint32_t policy, in aggr_grp_modify_common() argument
1347 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_modify_common()
1358 aggr_send_update_policy(grp, policy); in aggr_grp_modify_common()
1364 grp->lg_mac_addr_port = NULL; in aggr_grp_modify_common()
1365 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) != 0) { in aggr_grp_modify_common()
1366 bcopy(mac_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_modify_common()
1369 } else if (grp->lg_addr_fixed) { in aggr_grp_modify_common()
1371 aggr_port_t *port = grp->lg_ports; in aggr_grp_modify_common()
1374 bcopy(port->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_modify_common()
1375 grp->lg_mac_addr_port = port; in aggr_grp_modify_common()
1379 grp->lg_addr_fixed = mac_fixed; in aggr_grp_modify_common()
1383 link_state_changed = aggr_grp_update_ports_mac(grp); in aggr_grp_modify_common()
1386 aggr_lacp_update_mode(grp, lacp_mode); in aggr_grp_modify_common()
1389 aggr_lacp_update_timer(grp, lacp_timer); in aggr_grp_modify_common()
1392 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_modify_common()
1395 mac_unicst_update(grp->lg_mh, grp->lg_addr); in aggr_grp_modify_common()
1408 aggr_grp_t *grp = NULL; in aggr_grp_modify() local
1415 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_modify()
1419 AGGR_GRP_REFHOLD(grp); in aggr_grp_modify()
1424 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_modify()
1427 err = aggr_grp_modify_common(grp, update_mask, policy, mac_fixed, in aggr_grp_modify()
1431 AGGR_GRP_REFRELE(grp); in aggr_grp_modify()
1445 aggr_grp_t *grp = NULL; in aggr_grp_create() local
1466 (mod_hash_val_t *)&grp); in aggr_grp_create()
1472 grp = kmem_cache_alloc(aggr_grp_cache, KM_SLEEP); in aggr_grp_create()
1474 grp->lg_refs = 1; in aggr_grp_create()
1475 grp->lg_closing = B_FALSE; in aggr_grp_create()
1476 grp->lg_force = force; in aggr_grp_create()
1477 grp->lg_linkid = linkid; in aggr_grp_create()
1478 grp->lg_zoneid = crgetzoneid(credp); in aggr_grp_create()
1479 grp->lg_ifspeed = 0; in aggr_grp_create()
1480 grp->lg_link_state = LINK_STATE_UNKNOWN; in aggr_grp_create()
1481 grp->lg_link_duplex = LINK_DUPLEX_UNKNOWN; in aggr_grp_create()
1482 grp->lg_started = B_FALSE; in aggr_grp_create()
1483 grp->lg_promisc = B_FALSE; in aggr_grp_create()
1484 grp->lg_lacp_done = B_FALSE; in aggr_grp_create()
1485 grp->lg_tx_notify_done = B_FALSE; in aggr_grp_create()
1486 grp->lg_lacp_head = grp->lg_lacp_tail = NULL; in aggr_grp_create()
1487 grp->lg_lacp_rx_thread = thread_create(NULL, 0, in aggr_grp_create()
1488 aggr_lacp_rx_thread, grp, 0, &p0, TS_RUN, minclsyspri); in aggr_grp_create()
1489 grp->lg_tx_notify_thread = thread_create(NULL, 0, in aggr_grp_create()
1490 aggr_tx_notify_thread, grp, 0, &p0, TS_RUN, minclsyspri); in aggr_grp_create()
1491 grp->lg_tx_blocked_rings = kmem_zalloc((sizeof (mac_ring_handle_t *) * in aggr_grp_create()
1493 grp->lg_tx_blocked_cnt = 0; in aggr_grp_create()
1494 bzero(&grp->lg_rx_groups, in aggr_grp_create()
1496 bzero(&grp->lg_tx_group, sizeof (aggr_pseudo_tx_group_t)); in aggr_grp_create()
1497 aggr_lacp_init_grp(grp); in aggr_grp_create()
1500 grp->lg_ports = NULL; in aggr_grp_create()
1501 grp->lg_nports = 0; in aggr_grp_create()
1502 grp->lg_nattached_ports = 0; in aggr_grp_create()
1503 grp->lg_ntx_ports = 0; in aggr_grp_create()
1512 grp->lg_key = key; in aggr_grp_create()
1515 err = aggr_grp_add_port(grp, ports[i].lp_linkid, force, &port); in aggr_grp_create()
1520 grp->lg_rx_group_count = 1; in aggr_grp_create()
1522 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_create()
1536 grp->lg_rx_group_count = MAX(grp->lg_rx_group_count, in aggr_grp_create()
1545 grp->lg_rx_group_count = MIN(grp->lg_rx_group_count, in aggr_grp_create()
1548 ASSERT3U(grp->lg_rx_group_count, >, 0); in aggr_grp_create()
1550 grp->lg_rx_groups[i].arg_index = i; in aggr_grp_create()
1551 grp->lg_rx_groups[i].arg_untagged = 0; in aggr_grp_create()
1552 list_create(&(grp->lg_rx_groups[i].arg_vlans), in aggr_grp_create()
1560 grp->lg_addr_fixed = mac_fixed; in aggr_grp_create()
1561 if (grp->lg_addr_fixed) { in aggr_grp_create()
1567 bcopy(mac_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_create()
1569 bcopy(grp->lg_ports->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_create()
1570 grp->lg_mac_addr_port = grp->lg_ports; in aggr_grp_create()
1574 aggr_grp_capab_set(grp); in aggr_grp_create()
1581 mac->m_driver = grp; in aggr_grp_create()
1583 mac->m_instance = grp->lg_key > AGGR_MAX_KEY ? (uint_t)-1 : grp->lg_key; in aggr_grp_create()
1584 mac->m_src_addr = grp->lg_addr; in aggr_grp_create()
1587 mac->m_max_sdu = grp->lg_max_sdu = aggr_grp_max_sdu(grp); in aggr_grp_create()
1588 mac->m_margin = aggr_grp_max_margin(grp); in aggr_grp_create()
1590 err = mac_register(mac, &grp->lg_mh); in aggr_grp_create()
1595 err = dls_devnet_create(grp->lg_mh, grp->lg_linkid, crgetzoneid(credp)); in aggr_grp_create()
1597 (void) mac_unregister(grp->lg_mh); in aggr_grp_create()
1598 grp->lg_mh = NULL; in aggr_grp_create()
1604 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_create()
1615 link_state_changed = aggr_grp_update_ports_mac(grp); in aggr_grp_create()
1619 aggr_send_update_policy(grp, policy); in aggr_grp_create()
1622 aggr_lacp_set_mode(grp, lacp_mode, lacp_timer); in aggr_grp_create()
1646 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_create()
1652 err = aggr_add_pseudo_tx_group(port, &grp->lg_tx_group, in aggr_grp_create()
1660 for (i = 0; i < grp->lg_rx_group_count; i++) { in aggr_grp_create()
1662 &grp->lg_rx_groups[i]); in aggr_grp_create()
1670 &grp->lg_tx_group); in aggr_grp_create()
1674 &grp->lg_rx_groups[j]); in aggr_grp_create()
1682 if (aggr_port_notify_link(grp, port)) in aggr_grp_create()
1694 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_create()
1698 (mod_hash_val_t)grp); in aggr_grp_create()
1707 grp->lg_closing = B_TRUE; in aggr_grp_create()
1712 mutex_enter(&grp->lg_lacp_lock); in aggr_grp_create()
1713 grp->lg_lacp_done = B_TRUE; in aggr_grp_create()
1714 cv_signal(&grp->lg_lacp_cv); in aggr_grp_create()
1715 while (grp->lg_lacp_rx_thread != NULL) in aggr_grp_create()
1716 cv_wait(&grp->lg_lacp_cv, &grp->lg_lacp_lock); in aggr_grp_create()
1717 mutex_exit(&grp->lg_lacp_lock); in aggr_grp_create()
1721 mutex_enter(&grp->lg_tx_flowctl_lock); in aggr_grp_create()
1722 if (grp->lg_tx_notify_thread != NULL) { in aggr_grp_create()
1723 tid = grp->lg_tx_notify_thread->t_did; in aggr_grp_create()
1724 grp->lg_tx_notify_done = B_TRUE; in aggr_grp_create()
1725 cv_signal(&grp->lg_tx_flowctl_cv); in aggr_grp_create()
1727 mutex_exit(&grp->lg_tx_flowctl_lock); in aggr_grp_create()
1732 (void) dls_devnet_destroy(grp->lg_mh, &tempid, B_TRUE); in aggr_grp_create()
1733 (void) mac_disable(grp->lg_mh); in aggr_grp_create()
1739 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_create()
1741 for (port = grp->lg_ports; ; port = port->lp_next) { in aggr_grp_create()
1743 (void) aggr_grp_detach_port(grp, port); in aggr_grp_create()
1747 &grp->lg_tx_group); in aggr_grp_create()
1749 for (i = 0; i < grp->lg_rx_group_count; i++) { in aggr_grp_create()
1751 &grp->lg_rx_groups[i]); in aggr_grp_create()
1760 (void) mac_unregister(grp->lg_mh); in aggr_grp_create()
1763 port = grp->lg_ports; in aggr_grp_create()
1772 kmem_free(grp->lg_tx_blocked_rings, in aggr_grp_create()
1775 AGGR_GRP_REFRELE(grp); in aggr_grp_create()
1783 aggr_grp_port_lookup(aggr_grp_t *grp, datalink_id_t linkid) in aggr_grp_port_lookup() argument
1787 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_port_lookup()
1789 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_port_lookup()
1801 aggr_grp_rem_port(aggr_grp_t *grp, aggr_port_t *port, in aggr_grp_rem_port() argument
1813 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_rem_port()
1814 ASSERT(grp->lg_nports > 1); in aggr_grp_rem_port()
1815 ASSERT(!grp->lg_closing); in aggr_grp_rem_port()
1818 for (pport = &grp->lg_ports; *pport != port; in aggr_grp_rem_port()
1834 if (!grp->lg_addr_fixed && grp->lg_mac_addr_port == port) { in aggr_grp_rem_port()
1839 bcopy(grp->lg_ports->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_rem_port()
1840 grp->lg_mac_addr_port = grp->lg_ports; in aggr_grp_rem_port()
1844 link_state_changed = aggr_grp_detach_port(grp, port); in aggr_grp_rem_port()
1859 mutex_enter(&grp->lg_stat_lock); in aggr_grp_rem_port()
1860 grp->lg_stat[i] += val; in aggr_grp_rem_port()
1861 mutex_exit(&grp->lg_stat_lock); in aggr_grp_rem_port()
1869 mutex_enter(&grp->lg_stat_lock); in aggr_grp_rem_port()
1870 grp->lg_ether_stat[i] += val; in aggr_grp_rem_port()
1871 mutex_exit(&grp->lg_stat_lock); in aggr_grp_rem_port()
1874 grp->lg_nports--; in aggr_grp_rem_port()
1877 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_rem_port()
1885 if (mac_addr_changed && aggr_grp_update_ports_mac(grp)) in aggr_grp_rem_port()
1905 aggr_grp_t *grp = NULL; in aggr_grp_rem_ports() local
1914 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_rem_ports()
1918 AGGR_GRP_REFHOLD(grp); in aggr_grp_rem_ports()
1923 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_rem_ports()
1927 if (nports >= grp->lg_nports) { in aggr_grp_rem_ports()
1934 if (aggr_grp_port_lookup(grp, ports[i].lp_linkid) == NULL) { in aggr_grp_rem_ports()
1944 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_rem_ports()
1953 port = aggr_grp_port_lookup(grp, in aggr_grp_rem_ports()
1963 if (port->lp_started && (grp->lg_promisc || in aggr_grp_rem_ports()
1975 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_rem_ports()
1979 if (grp->lg_started) { in aggr_grp_rem_ports()
1997 for (uint_t j = 0; j < grp->lg_rx_group_count; j++) in aggr_grp_rem_ports()
1998 aggr_rem_pseudo_rx_group(port, &grp->lg_rx_groups[j]); in aggr_grp_rem_ports()
2001 rc = aggr_grp_rem_port(grp, port, &mac_addr_changed, in aggr_grp_rem_ports()
2010 mac_unicst_update(grp->lg_mh, grp->lg_addr); in aggr_grp_rem_ports()
2012 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_rem_ports()
2015 AGGR_GRP_REFRELE(grp); in aggr_grp_rem_ports()
2023 aggr_grp_t *grp = NULL; in aggr_grp_delete() local
2034 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_delete()
2045 if ((err = dls_devnet_destroy(grp->lg_mh, &tmpid, B_TRUE)) != 0) { in aggr_grp_delete()
2056 if ((err = mac_disable(grp->lg_mh)) != 0) { in aggr_grp_delete()
2057 (void) dls_devnet_create(grp->lg_mh, linkid, crgetzoneid(cred)); in aggr_grp_delete()
2062 ASSERT(grp == (aggr_grp_t *)val); in aggr_grp_delete()
2071 mutex_enter(&grp->lg_lacp_lock); in aggr_grp_delete()
2072 grp->lg_lacp_done = B_TRUE; in aggr_grp_delete()
2073 cv_signal(&grp->lg_lacp_cv); in aggr_grp_delete()
2074 while (grp->lg_lacp_rx_thread != NULL) in aggr_grp_delete()
2075 cv_wait(&grp->lg_lacp_cv, &grp->lg_lacp_lock); in aggr_grp_delete()
2076 mutex_exit(&grp->lg_lacp_lock); in aggr_grp_delete()
2080 mutex_enter(&grp->lg_tx_flowctl_lock); in aggr_grp_delete()
2081 if (grp->lg_tx_notify_thread != NULL) { in aggr_grp_delete()
2082 tid = grp->lg_tx_notify_thread->t_did; in aggr_grp_delete()
2083 grp->lg_tx_notify_done = B_TRUE; in aggr_grp_delete()
2084 cv_signal(&grp->lg_tx_flowctl_cv); in aggr_grp_delete()
2086 mutex_exit(&grp->lg_tx_flowctl_lock); in aggr_grp_delete()
2090 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_delete()
2092 grp->lg_closing = B_TRUE; in aggr_grp_delete()
2094 port = grp->lg_ports; in aggr_grp_delete()
2098 if (grp->lg_started) in aggr_grp_delete()
2100 (void) aggr_grp_detach_port(grp, port); in aggr_grp_delete()
2102 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_delete()
2103 for (uint_t i = 0; i < grp->lg_rx_group_count; i++) in aggr_grp_delete()
2104 aggr_rem_pseudo_rx_group(port, &grp->lg_rx_groups[i]); in aggr_grp_delete()
2111 kmem_free(grp->lg_tx_blocked_rings, in aggr_grp_delete()
2118 aggr_grp_port_wait(grp); in aggr_grp_delete()
2120 VERIFY(mac_unregister(grp->lg_mh) == 0); in aggr_grp_delete()
2121 grp->lg_mh = NULL; in aggr_grp_delete()
2124 list_destroy(&(grp->lg_rx_groups[i].arg_vlans)); in aggr_grp_delete()
2127 AGGR_GRP_REFRELE(grp); in aggr_grp_delete()
2132 aggr_grp_free(aggr_grp_t *grp) in aggr_grp_free() argument
2134 ASSERT(grp->lg_refs == 0); in aggr_grp_free()
2135 ASSERT(grp->lg_port_ref == 0); in aggr_grp_free()
2136 if (grp->lg_key > AGGR_MAX_KEY) { in aggr_grp_free()
2137 id_free(key_ids, grp->lg_key); in aggr_grp_free()
2138 grp->lg_key = 0; in aggr_grp_free()
2140 kmem_cache_free(aggr_grp_cache, grp); in aggr_grp_free()
2148 aggr_grp_t *grp; in aggr_grp_info() local
2163 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_info()
2167 AGGR_GRP_REFHOLD(grp); in aggr_grp_info()
2169 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_info()
2172 rc = new_grp_fn(fn_arg, grp->lg_linkid, in aggr_grp_info()
2173 (grp->lg_key > AGGR_MAX_KEY) ? 0 : grp->lg_key, grp->lg_addr, in aggr_grp_info()
2174 grp->lg_addr_fixed, grp->lg_force, grp->lg_tx_policy, in aggr_grp_info()
2175 grp->lg_nports, grp->lg_lacp_mode, grp->aggr.PeriodicTimer); in aggr_grp_info()
2180 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_info()
2192 AGGR_GRP_REFRELE(grp); in aggr_grp_info()
2204 aggr_grp_stat(aggr_grp_t *grp, uint_t stat, uint64_t *val) in aggr_grp_stat() argument
2209 ASSERT(MUTEX_HELD(&grp->lg_stat_lock)); in aggr_grp_stat()
2224 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_stat()
2234 *val += grp->lg_stat[stat_index]; in aggr_grp_stat()
2238 *val += grp->lg_ether_stat[stat_index]; in aggr_grp_stat()
2278 aggr_grp_t *grp = arg; in aggr_m_stat() local
2281 mutex_enter(&grp->lg_stat_lock); in aggr_m_stat()
2285 *val = grp->lg_ifspeed; in aggr_m_stat()
2289 *val = grp->lg_link_duplex; in aggr_m_stat()
2298 rval = aggr_grp_stat(grp, stat, val); in aggr_m_stat()
2301 mutex_exit(&grp->lg_stat_lock); in aggr_m_stat()
2308 aggr_grp_t *grp = arg; in aggr_m_start() local
2312 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_start()
2319 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_start()
2331 if (grp->lg_promisc || port->lp_prom_addr != NULL) { in aggr_m_start()
2338 grp->lg_started = B_TRUE; in aggr_m_start()
2347 aggr_grp_t *grp = arg; in aggr_m_stop() local
2351 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_stop()
2353 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_stop()
2363 grp->lg_started = B_FALSE; in aggr_m_stop()
2370 aggr_grp_t *grp = arg; in aggr_m_promisc() local
2375 AGGR_GRP_REFHOLD(grp); in aggr_m_promisc()
2376 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_promisc()
2378 ASSERT(!grp->lg_closing); in aggr_m_promisc()
2380 if (on == grp->lg_promisc) in aggr_m_promisc()
2383 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_promisc()
2394 if (aggr_grp_detach_port(grp, port)) in aggr_m_promisc()
2404 if (aggr_grp_attach_port(grp, port)) in aggr_m_promisc()
2411 grp->lg_promisc = on; in aggr_m_promisc()
2414 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_m_promisc()
2418 AGGR_GRP_REFRELE(grp); in aggr_m_promisc()
2467 aggr_grp_t *grp = arg; in aggr_m_capab_get() local
2472 *hcksum_txflags = grp->lg_hcksum_txflags; in aggr_m_capab_get()
2478 if (grp->lg_lso) { in aggr_m_capab_get()
2479 *cap_lso = grp->lg_cap_lso; in aggr_m_capab_get()
2486 return (!grp->lg_vlan); in aggr_m_capab_get()
2488 return (!grp->lg_zcopy); in aggr_m_capab_get()
2493 for (uint_t i = 0; i < grp->lg_rx_group_count; i++) in aggr_m_capab_get()
2494 ring_cnt += grp->lg_rx_groups[i].arg_ring_cnt; in aggr_m_capab_get()
2499 cap_rings->mr_gnum = grp->lg_rx_group_count; in aggr_m_capab_get()
2504 cap_rings->mr_rnum = grp->lg_tx_group.atg_ring_cnt; in aggr_m_capab_get()
2537 aggr_grp_t *grp = arg; in aggr_fill_group() local
2540 aggr_pseudo_rx_group_t *rx_group = &grp->lg_rx_groups[index]; in aggr_fill_group()
2543 rx_group->arg_grp = grp; in aggr_fill_group()
2560 aggr_pseudo_tx_group_t *tx_group = &grp->lg_tx_group; in aggr_fill_group()
2574 aggr_grp_t *grp = arg; in aggr_fill_ring() local
2582 rx_group = &grp->lg_rx_groups[rg_index]; in aggr_fill_ring()
2608 aggr_pseudo_tx_group_t *tx_group = &grp->lg_tx_group; in aggr_fill_ring()
2643 aggr_grp_t *grp = port->lp_grp; in aggr_rx_poll() local
2648 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_rx_poll()
2682 aggr_grp_t *grp = rx_group->arg_grp; in aggr_addmac() local
2688 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_addmac()
2690 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) == 0) { in aggr_addmac()
2712 for (port = grp->lg_ports; port != NULL; port = port->lp_next) in aggr_addmac()
2717 for (p = grp->lg_ports; p != port; p = p->lp_next) in aggr_addmac()
2733 aggr_grp_t *grp = rx_group->arg_grp; in aggr_remmac() local
2738 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_remmac()
2740 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) == 0) { in aggr_remmac()
2762 for (port = grp->lg_ports; port != NULL; port = port->lp_next) in aggr_remmac()
2965 aggr_grp_t *grp = port->lp_grp; in aggr_grp_multicst_port() local
2968 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_multicst_port()
2973 mac_multicast_refresh(grp->lg_mh, aggr_port_multicst, port, add); in aggr_grp_multicst_port()
2979 aggr_grp_t *grp = arg; in aggr_m_multicst() local
2984 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_multicst()
2985 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_multicst()
3005 for (port = grp->lg_ports; port != errport; in aggr_m_multicst()
3021 aggr_grp_t *grp = arg; in aggr_m_unicst() local
3025 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_unicst()
3026 err = aggr_grp_modify_common(grp, AGGR_MODIFY_MAC, 0, B_TRUE, macaddr, in aggr_m_unicst()
3037 aggr_grp_capab_set(aggr_grp_t *grp) in aggr_grp_capab_set() argument
3043 ASSERT(grp->lg_mh == NULL); in aggr_grp_capab_set()
3044 ASSERT(grp->lg_ports != NULL); in aggr_grp_capab_set()
3046 grp->lg_hcksum_txflags = (uint32_t)-1; in aggr_grp_capab_set()
3047 grp->lg_zcopy = B_TRUE; in aggr_grp_capab_set()
3048 grp->lg_vlan = B_TRUE; in aggr_grp_capab_set()
3050 grp->lg_lso = B_TRUE; in aggr_grp_capab_set()
3051 grp->lg_cap_lso.lso_flags = (t_uscalar_t)-1; in aggr_grp_capab_set()
3052 grp->lg_cap_lso.lso_basic_tcp_ipv4.lso_max = (t_uscalar_t)-1; in aggr_grp_capab_set()
3054 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_capab_set()
3057 grp->lg_hcksum_txflags &= cksum; in aggr_grp_capab_set()
3059 grp->lg_vlan &= in aggr_grp_capab_set()
3062 grp->lg_zcopy &= in aggr_grp_capab_set()
3065 grp->lg_lso &= in aggr_grp_capab_set()
3067 if (grp->lg_lso) { in aggr_grp_capab_set()
3068 grp->lg_cap_lso.lso_flags &= cap_lso.lso_flags; in aggr_grp_capab_set()
3069 if (grp->lg_cap_lso.lso_basic_tcp_ipv4.lso_max > in aggr_grp_capab_set()
3071 grp->lg_cap_lso.lso_basic_tcp_ipv4.lso_max = in aggr_grp_capab_set()
3082 aggr_grp_capab_check(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_capab_check() argument
3086 ASSERT(grp->lg_ports != NULL); in aggr_grp_capab_check()
3089 grp->lg_vlan) != grp->lg_vlan) { in aggr_grp_capab_check()
3094 grp->lg_zcopy) != grp->lg_zcopy) { in aggr_grp_capab_check()
3099 if (grp->lg_hcksum_txflags != 0) in aggr_grp_capab_check()
3101 } else if ((hcksum_txflags & grp->lg_hcksum_txflags) != in aggr_grp_capab_check()
3102 grp->lg_hcksum_txflags) { in aggr_grp_capab_check()
3106 if (grp->lg_lso) { in aggr_grp_capab_check()
3110 if ((grp->lg_cap_lso.lso_flags & cap_lso.lso_flags) != in aggr_grp_capab_check()
3111 grp->lg_cap_lso.lso_flags) in aggr_grp_capab_check()
3113 if (grp->lg_cap_lso.lso_basic_tcp_ipv4.lso_max > in aggr_grp_capab_check()
3128 aggr_grp_max_sdu(aggr_grp_t *grp) in aggr_grp_max_sdu() argument
3133 ASSERT(grp->lg_ports != NULL); in aggr_grp_max_sdu()
3135 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_max_sdu()
3152 aggr_grp_sdu_check(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_sdu_check() argument
3157 return (port_sdu_max >= grp->lg_max_sdu); in aggr_grp_sdu_check()
3164 aggr_grp_max_margin(aggr_grp_t *grp) in aggr_grp_max_margin() argument
3169 ASSERT(grp->lg_mh == NULL); in aggr_grp_max_margin()
3170 ASSERT(grp->lg_ports != NULL); in aggr_grp_max_margin()
3172 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_max_margin()
3177 grp->lg_margin = margin; in aggr_grp_max_margin()
3187 aggr_grp_margin_check(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_margin_check() argument
3189 if (port->lp_margin >= grp->lg_margin) in aggr_grp_margin_check()
3196 if (!mac_margin_update(grp->lg_mh, port->lp_margin)) in aggr_grp_margin_check()
3199 grp->lg_margin = port->lp_margin; in aggr_grp_margin_check()
3207 aggr_set_port_sdu(aggr_grp_t *grp, aggr_port_t *port, uint32_t sdu, in aggr_set_port_sdu() argument
3239 (void) aggr_grp_detach_port(grp, port); in aggr_set_port_sdu()
3249 aggr_sdu_update(aggr_grp_t *grp, uint32_t sdu) in aggr_sdu_update() argument
3255 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_sdu_update()
3261 if (sdu == grp->lg_max_sdu) in aggr_sdu_update()
3268 mtu = kmem_alloc(sizeof (uint32_t) * grp->lg_nports, KM_SLEEP); in aggr_sdu_update()
3269 for (port = grp->lg_ports, i = 0; port != NULL && err == 0; in aggr_sdu_update()
3271 err = aggr_set_port_sdu(grp, port, sdu, mtu + i); in aggr_sdu_update()
3277 for (tmp = grp->lg_ports, i = 0; tmp != port; in aggr_sdu_update()
3279 (void) aggr_set_port_sdu(grp, tmp, *(mtu + i), NULL); in aggr_sdu_update()
3283 grp->lg_max_sdu = aggr_grp_max_sdu(grp); in aggr_sdu_update()
3284 rv = mac_maxsdu_update(grp->lg_mh, grp->lg_max_sdu); in aggr_sdu_update()
3287 kmem_free(mtu, sizeof (uint32_t) * grp->lg_nports); in aggr_sdu_update()
3300 aggr_grp_t *grp = m_driver; in aggr_m_setprop() local
3311 err = aggr_sdu_update(grp, mtu); in aggr_m_setprop()
3431 aggr_grp_possible_mtu_range(aggr_grp_t *grp, mac_propval_uint32_range_t **prval, in aggr_grp_possible_mtu_range() argument
3445 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_possible_mtu_range()
3447 vals = kmem_zalloc(sizeof (mac_propval_range_t *) * grp->lg_nports, in aggr_grp_possible_mtu_range()
3450 for (port = grp->lg_ports, i = 0; port != NULL; in aggr_grp_possible_mtu_range()
3492 aggr_mtu_range_intersection(vals, grp->lg_nports, prval, prmaxcnt, in aggr_grp_possible_mtu_range()
3496 for (i = 0; i < grp->lg_nports; i++) { in aggr_grp_possible_mtu_range()
3504 kmem_free(vals, sizeof (mac_propval_range_t *) * grp->lg_nports); in aggr_grp_possible_mtu_range()
3512 aggr_grp_t *grp = m_driver; in aggr_m_propinfo() local
3522 err = aggr_grp_possible_mtu_range(grp, &rval, &rmaxcnt, in aggr_m_propinfo()