Lines Matching refs:grp

206 	aggr_grp_t *grp = buf;  in aggr_grp_constructor()  local
208 bzero(grp, sizeof (*grp)); in aggr_grp_constructor()
209 mutex_init(&grp->lg_lacp_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
210 cv_init(&grp->lg_lacp_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
211 rw_init(&grp->lg_tx_lock, NULL, RW_DRIVER, NULL); in aggr_grp_constructor()
212 mutex_init(&grp->lg_port_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
213 cv_init(&grp->lg_port_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
214 mutex_init(&grp->lg_tx_flowctl_lock, NULL, MUTEX_DEFAULT, NULL); in aggr_grp_constructor()
215 cv_init(&grp->lg_tx_flowctl_cv, NULL, CV_DEFAULT, NULL); in aggr_grp_constructor()
216 grp->lg_link_state = LINK_STATE_UNKNOWN; in aggr_grp_constructor()
224 aggr_grp_t *grp = buf; in aggr_grp_destructor() local
226 if (grp->lg_tx_ports != NULL) { in aggr_grp_destructor()
227 kmem_free(grp->lg_tx_ports, in aggr_grp_destructor()
228 grp->lg_tx_ports_size * sizeof (aggr_port_t *)); in aggr_grp_destructor()
231 mutex_destroy(&grp->lg_lacp_lock); in aggr_grp_destructor()
232 cv_destroy(&grp->lg_lacp_cv); in aggr_grp_destructor()
233 mutex_destroy(&grp->lg_port_lock); in aggr_grp_destructor()
234 cv_destroy(&grp->lg_port_cv); in aggr_grp_destructor()
235 rw_destroy(&grp->lg_tx_lock); in aggr_grp_destructor()
236 mutex_destroy(&grp->lg_tx_flowctl_lock); in aggr_grp_destructor()
237 cv_destroy(&grp->lg_tx_flowctl_cv); in aggr_grp_destructor()
290 aggr_grp_t *grp = port->lp_grp; in aggr_grp_port_hold() local
293 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_hold()
294 grp->lg_port_ref++; in aggr_grp_port_hold()
295 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_hold()
305 aggr_grp_t *grp = port->lp_grp; in aggr_grp_port_rele() local
307 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_rele()
308 if (--grp->lg_port_ref == 0) in aggr_grp_port_rele()
309 cv_signal(&grp->lg_port_cv); in aggr_grp_port_rele()
310 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_rele()
319 aggr_grp_port_wait(aggr_grp_t *grp) in aggr_grp_port_wait() argument
321 mutex_enter(&grp->lg_port_lock); in aggr_grp_port_wait()
322 if (grp->lg_port_ref != 0) in aggr_grp_port_wait()
323 cv_wait(&grp->lg_port_cv, &grp->lg_port_lock); in aggr_grp_port_wait()
324 mutex_exit(&grp->lg_port_lock); in aggr_grp_port_wait()
338 aggr_grp_attach_port(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_attach_port() argument
342 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_attach_port()
362 mutex_enter(&grp->lg_stat_lock); in aggr_grp_attach_port()
363 if (grp->lg_ifspeed == 0) { in aggr_grp_attach_port()
368 grp->lg_ifspeed = port->lp_ifspeed; in aggr_grp_attach_port()
370 } else if (grp->lg_ifspeed != port->lp_ifspeed) { in aggr_grp_attach_port()
376 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
379 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
381 grp->lg_nattached_ports++; in aggr_grp_attach_port()
386 if (grp->lg_link_state != LINK_STATE_UP) { in aggr_grp_attach_port()
387 grp->lg_link_state = LINK_STATE_UP; in aggr_grp_attach_port()
388 mutex_enter(&grp->lg_stat_lock); in aggr_grp_attach_port()
389 grp->lg_link_duplex = LINK_DUPLEX_FULL; in aggr_grp_attach_port()
390 mutex_exit(&grp->lg_stat_lock); in aggr_grp_attach_port()
418 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_grp_attach_port()
427 aggr_grp_detach_port(aggr_grp_t *grp, aggr_port_t *port) in aggr_grp_detach_port() argument
431 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_detach_port()
442 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_grp_detach_port()
449 grp->lg_nattached_ports--; in aggr_grp_detach_port()
450 if (grp->lg_nattached_ports == 0) { in aggr_grp_detach_port()
452 grp->lg_link_state = LINK_STATE_DOWN; in aggr_grp_detach_port()
453 mutex_enter(&grp->lg_stat_lock); in aggr_grp_detach_port()
454 grp->lg_ifspeed = 0; in aggr_grp_detach_port()
455 grp->lg_link_duplex = LINK_DUPLEX_UNKNOWN; in aggr_grp_detach_port()
456 mutex_exit(&grp->lg_stat_lock); in aggr_grp_detach_port()
478 aggr_grp_update_ports_mac(aggr_grp_t *grp) in aggr_grp_update_ports_mac() argument
484 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_update_ports_mac()
486 for (cport = grp->lg_ports; cport != NULL; in aggr_grp_update_ports_mac()
490 if (aggr_grp_detach_port(grp, cport)) in aggr_grp_update_ports_mac()
500 if (aggr_grp_attach_port(grp, cport)) in aggr_grp_update_ports_mac()
519 aggr_grp_port_mac_changed(aggr_grp_t *grp, aggr_port_t *port, in aggr_grp_port_mac_changed() argument
522 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_port_mac_changed()
530 if (grp->lg_addr_fixed) { in aggr_grp_port_mac_changed()
538 if (grp->lg_mac_addr_port == port) { in aggr_grp_port_mac_changed()
543 bcopy(port->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_port_mac_changed()
551 *link_state_changedp = aggr_grp_detach_port(grp, port); in aggr_grp_port_mac_changed()
560 *link_state_changedp = aggr_grp_attach_port(grp, port); in aggr_grp_port_mac_changed()
569 aggr_grp_add_port(aggr_grp_t *grp, datalink_id_t port_linkid, boolean_t force, in aggr_grp_add_port() argument
580 if (grp->lg_zoneid != port_zoneid) in aggr_grp_add_port()
589 ASSERT(grp->lg_mh == NULL || MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_add_port()
591 err = aggr_port_create(grp, port_linkid, force, &port); in aggr_grp_add_port()
598 cport = &grp->lg_ports; in aggr_grp_add_port()
608 port->lp_grp = grp; in aggr_grp_add_port()
609 AGGR_GRP_REFHOLD(grp); in aggr_grp_add_port()
610 grp->lg_nports++; in aggr_grp_add_port()
611 if (grp->lg_nports > grp->lg_nports_high) in aggr_grp_add_port()
612 grp->lg_nports_high = grp->lg_nports; in aggr_grp_add_port()
642 aggr_grp_update_default(aggr_grp_t *grp) in aggr_grp_update_default() argument
645 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_update_default()
647 rw_enter(&grp->lg_tx_lock, RW_WRITER); in aggr_grp_update_default()
649 if (grp->lg_ntx_ports == 0) { in aggr_grp_update_default()
650 rw_exit(&grp->lg_tx_lock); in aggr_grp_update_default()
654 port = grp->lg_tx_ports[0]; in aggr_grp_update_default()
656 mac_hwring_set_default(grp->lg_mh, port->lp_pseudo_tx_rings[0]); in aggr_grp_update_default()
657 rw_exit(&grp->lg_tx_lock); in aggr_grp_update_default()
957 aggr_grp_t *grp = port->lp_grp; in aggr_add_pseudo_tx_group() local
966 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_add_pseudo_tx_group()
1027 aggr_grp_update_default(grp); in aggr_add_pseudo_tx_group()
1038 aggr_grp_t *grp = port->lp_grp; in aggr_rem_pseudo_tx_group() local
1042 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_rem_pseudo_tx_group()
1061 aggr_grp_update_default(grp); in aggr_rem_pseudo_tx_group()
1127 aggr_grp_balance_tx(aggr_grp_t *grp, uint_t tx_ring_limit) in aggr_grp_balance_tx() argument
1134 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_balance_tx()
1136 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_balance_tx()
1143 rw_enter(&grp->lg_tx_lock, RW_WRITER); in aggr_grp_balance_tx()
1145 rw_exit(&grp->lg_tx_lock); in aggr_grp_balance_tx()
1152 rw_exit(&grp->lg_tx_lock); in aggr_grp_balance_tx()
1155 aggr_rem_pseudo_tx_ring(&grp->lg_tx_group, in aggr_grp_balance_tx()
1175 aggr_grp_t *grp = NULL; in aggr_grp_add_ports() local
1183 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_add_ports()
1187 AGGR_GRP_REFHOLD(grp); in aggr_grp_add_ports()
1192 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_add_ports()
1200 nports_high = MAX(grp->lg_nports_high, grp->lg_nports + nports); in aggr_grp_add_ports()
1211 aggr_grp_balance_tx(grp, tx_ring_limit); in aggr_grp_add_ports()
1217 if ((rc = aggr_grp_add_port(grp, ports[i].lp_linkid, in aggr_grp_add_ports()
1226 if (!aggr_grp_capab_check(grp, port) || in aggr_grp_add_ports()
1227 !aggr_grp_sdu_check(grp, port) || in aggr_grp_add_ports()
1228 !aggr_grp_margin_check(grp, port)) { in aggr_grp_add_ports()
1237 rc = aggr_add_pseudo_tx_group(port, &grp->lg_tx_group, in aggr_grp_add_ports()
1242 for (uint_t j = 0; j < grp->lg_rx_group_count; j++) { in aggr_grp_add_ports()
1244 &grp->lg_rx_groups[j]); in aggr_grp_add_ports()
1255 aggr_port_lacp_set_mode(grp, port); in aggr_grp_add_ports()
1258 if (grp->lg_started) { in aggr_grp_add_ports()
1271 if (grp->lg_promisc || port->lp_prom_addr != NULL) { in aggr_grp_add_ports()
1284 if (aggr_port_notify_link(grp, port)) in aggr_grp_add_ports()
1294 if (aggr_grp_update_ports_mac(grp)) in aggr_grp_add_ports()
1298 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_add_ports()
1306 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_add_ports()
1309 if (grp->lg_started) { in aggr_grp_add_ports()
1316 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_add_ports()
1323 grp->lg_rx_group_count; in aggr_grp_add_ports()
1327 &grp->lg_rx_groups[j]); in aggr_grp_add_ports()
1330 (void) aggr_grp_rem_port(grp, port, NULL, NULL); in aggr_grp_add_ports()
1335 AGGR_GRP_REFRELE(grp); in aggr_grp_add_ports()
1340 aggr_grp_modify_common(aggr_grp_t *grp, uint8_t update_mask, uint32_t policy, in aggr_grp_modify_common() argument
1348 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_modify_common()
1359 aggr_send_update_policy(grp, policy); in aggr_grp_modify_common()
1365 grp->lg_mac_addr_port = NULL; in aggr_grp_modify_common()
1366 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) != 0) { in aggr_grp_modify_common()
1367 bcopy(mac_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_modify_common()
1370 } else if (grp->lg_addr_fixed) { in aggr_grp_modify_common()
1372 aggr_port_t *port = grp->lg_ports; in aggr_grp_modify_common()
1375 bcopy(port->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_modify_common()
1376 grp->lg_mac_addr_port = port; in aggr_grp_modify_common()
1380 grp->lg_addr_fixed = mac_fixed; in aggr_grp_modify_common()
1384 link_state_changed = aggr_grp_update_ports_mac(grp); in aggr_grp_modify_common()
1387 aggr_lacp_update_mode(grp, lacp_mode); in aggr_grp_modify_common()
1390 aggr_lacp_update_timer(grp, lacp_timer); in aggr_grp_modify_common()
1393 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_modify_common()
1396 mac_unicst_update(grp->lg_mh, grp->lg_addr); in aggr_grp_modify_common()
1409 aggr_grp_t *grp = NULL; in aggr_grp_modify() local
1416 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_modify()
1420 AGGR_GRP_REFHOLD(grp); in aggr_grp_modify()
1425 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_modify()
1428 err = aggr_grp_modify_common(grp, update_mask, policy, mac_fixed, in aggr_grp_modify()
1432 AGGR_GRP_REFRELE(grp); in aggr_grp_modify()
1446 aggr_grp_t *grp = NULL; in aggr_grp_create() local
1467 (mod_hash_val_t *)&grp); in aggr_grp_create()
1473 grp = kmem_cache_alloc(aggr_grp_cache, KM_SLEEP); in aggr_grp_create()
1475 grp->lg_refs = 1; in aggr_grp_create()
1476 grp->lg_closing = B_FALSE; in aggr_grp_create()
1477 grp->lg_force = force; in aggr_grp_create()
1478 grp->lg_linkid = linkid; in aggr_grp_create()
1479 grp->lg_zoneid = crgetzoneid(credp); in aggr_grp_create()
1480 grp->lg_ifspeed = 0; in aggr_grp_create()
1481 grp->lg_link_state = LINK_STATE_UNKNOWN; in aggr_grp_create()
1482 grp->lg_link_duplex = LINK_DUPLEX_UNKNOWN; in aggr_grp_create()
1483 grp->lg_started = B_FALSE; in aggr_grp_create()
1484 grp->lg_promisc = B_FALSE; in aggr_grp_create()
1485 grp->lg_lacp_done = B_FALSE; in aggr_grp_create()
1486 grp->lg_tx_notify_done = B_FALSE; in aggr_grp_create()
1487 grp->lg_lacp_head = grp->lg_lacp_tail = NULL; in aggr_grp_create()
1488 grp->lg_lacp_rx_thread = thread_create(NULL, 0, in aggr_grp_create()
1489 aggr_lacp_rx_thread, grp, 0, &p0, TS_RUN, minclsyspri); in aggr_grp_create()
1490 grp->lg_tx_notify_thread = thread_create(NULL, 0, in aggr_grp_create()
1491 aggr_tx_notify_thread, grp, 0, &p0, TS_RUN, minclsyspri); in aggr_grp_create()
1492 grp->lg_tx_blocked_rings = kmem_zalloc((sizeof (mac_ring_handle_t *) * in aggr_grp_create()
1494 grp->lg_tx_blocked_cnt = 0; in aggr_grp_create()
1495 bzero(&grp->lg_rx_groups, in aggr_grp_create()
1497 bzero(&grp->lg_tx_group, sizeof (aggr_pseudo_tx_group_t)); in aggr_grp_create()
1498 aggr_lacp_init_grp(grp); in aggr_grp_create()
1501 grp->lg_ports = NULL; in aggr_grp_create()
1502 grp->lg_nports = 0; in aggr_grp_create()
1503 grp->lg_nattached_ports = 0; in aggr_grp_create()
1504 grp->lg_ntx_ports = 0; in aggr_grp_create()
1513 grp->lg_key = key; in aggr_grp_create()
1516 err = aggr_grp_add_port(grp, ports[i].lp_linkid, force, &port); in aggr_grp_create()
1521 grp->lg_rx_group_count = 1; in aggr_grp_create()
1523 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_create()
1537 grp->lg_rx_group_count = MAX(grp->lg_rx_group_count, in aggr_grp_create()
1546 grp->lg_rx_group_count = MIN(grp->lg_rx_group_count, in aggr_grp_create()
1549 ASSERT3U(grp->lg_rx_group_count, >, 0); in aggr_grp_create()
1551 grp->lg_rx_groups[i].arg_index = i; in aggr_grp_create()
1552 grp->lg_rx_groups[i].arg_untagged = 0; in aggr_grp_create()
1553 list_create(&(grp->lg_rx_groups[i].arg_vlans), in aggr_grp_create()
1561 grp->lg_addr_fixed = mac_fixed; in aggr_grp_create()
1562 if (grp->lg_addr_fixed) { in aggr_grp_create()
1568 bcopy(mac_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_create()
1570 bcopy(grp->lg_ports->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_create()
1571 grp->lg_mac_addr_port = grp->lg_ports; in aggr_grp_create()
1575 aggr_grp_capab_set(grp); in aggr_grp_create()
1582 mac->m_driver = grp; in aggr_grp_create()
1584 mac->m_instance = grp->lg_key > AGGR_MAX_KEY ? (uint_t)-1 : grp->lg_key; in aggr_grp_create()
1585 mac->m_src_addr = grp->lg_addr; in aggr_grp_create()
1588 mac->m_max_sdu = grp->lg_max_sdu = aggr_grp_max_sdu(grp); in aggr_grp_create()
1589 mac->m_margin = aggr_grp_max_margin(grp); in aggr_grp_create()
1591 err = mac_register(mac, &grp->lg_mh); in aggr_grp_create()
1596 err = dls_devnet_create(grp->lg_mh, grp->lg_linkid, crgetzoneid(credp)); in aggr_grp_create()
1598 (void) mac_unregister(grp->lg_mh); in aggr_grp_create()
1599 grp->lg_mh = NULL; in aggr_grp_create()
1605 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_create()
1616 link_state_changed = aggr_grp_update_ports_mac(grp); in aggr_grp_create()
1620 aggr_send_update_policy(grp, policy); in aggr_grp_create()
1623 aggr_lacp_set_mode(grp, lacp_mode, lacp_timer); in aggr_grp_create()
1647 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_create()
1653 err = aggr_add_pseudo_tx_group(port, &grp->lg_tx_group, in aggr_grp_create()
1661 for (i = 0; i < grp->lg_rx_group_count; i++) { in aggr_grp_create()
1663 &grp->lg_rx_groups[i]); in aggr_grp_create()
1671 &grp->lg_tx_group); in aggr_grp_create()
1675 &grp->lg_rx_groups[j]); in aggr_grp_create()
1683 if (aggr_port_notify_link(grp, port)) in aggr_grp_create()
1695 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_create()
1699 (mod_hash_val_t)grp); in aggr_grp_create()
1708 grp->lg_closing = B_TRUE; in aggr_grp_create()
1713 mutex_enter(&grp->lg_lacp_lock); in aggr_grp_create()
1714 grp->lg_lacp_done = B_TRUE; in aggr_grp_create()
1715 cv_signal(&grp->lg_lacp_cv); in aggr_grp_create()
1716 while (grp->lg_lacp_rx_thread != NULL) in aggr_grp_create()
1717 cv_wait(&grp->lg_lacp_cv, &grp->lg_lacp_lock); in aggr_grp_create()
1718 mutex_exit(&grp->lg_lacp_lock); in aggr_grp_create()
1722 mutex_enter(&grp->lg_tx_flowctl_lock); in aggr_grp_create()
1723 if (grp->lg_tx_notify_thread != NULL) { in aggr_grp_create()
1724 tid = grp->lg_tx_notify_thread->t_did; in aggr_grp_create()
1725 grp->lg_tx_notify_done = B_TRUE; in aggr_grp_create()
1726 cv_signal(&grp->lg_tx_flowctl_cv); in aggr_grp_create()
1728 mutex_exit(&grp->lg_tx_flowctl_lock); in aggr_grp_create()
1733 (void) dls_devnet_destroy(grp->lg_mh, &tempid, B_TRUE); in aggr_grp_create()
1734 (void) mac_disable(grp->lg_mh); in aggr_grp_create()
1740 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_create()
1742 for (port = grp->lg_ports; ; port = port->lp_next) { in aggr_grp_create()
1744 (void) aggr_grp_detach_port(grp, port); in aggr_grp_create()
1748 &grp->lg_tx_group); in aggr_grp_create()
1750 for (i = 0; i < grp->lg_rx_group_count; i++) { in aggr_grp_create()
1752 &grp->lg_rx_groups[i]); in aggr_grp_create()
1761 (void) mac_unregister(grp->lg_mh); in aggr_grp_create()
1764 port = grp->lg_ports; in aggr_grp_create()
1773 kmem_free(grp->lg_tx_blocked_rings, in aggr_grp_create()
1776 AGGR_GRP_REFRELE(grp); in aggr_grp_create()
1784 aggr_grp_port_lookup(aggr_grp_t *grp, datalink_id_t linkid) in aggr_grp_port_lookup() argument
1788 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_port_lookup()
1790 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_port_lookup()
1802 aggr_grp_rem_port(aggr_grp_t *grp, aggr_port_t *port, in aggr_grp_rem_port() argument
1814 ASSERT(MAC_PERIM_HELD(grp->lg_mh)); in aggr_grp_rem_port()
1815 ASSERT(grp->lg_nports > 1); in aggr_grp_rem_port()
1816 ASSERT(!grp->lg_closing); in aggr_grp_rem_port()
1819 for (pport = &grp->lg_ports; *pport != port; in aggr_grp_rem_port()
1835 if (!grp->lg_addr_fixed && grp->lg_mac_addr_port == port) { in aggr_grp_rem_port()
1840 bcopy(grp->lg_ports->lp_addr, grp->lg_addr, ETHERADDRL); in aggr_grp_rem_port()
1841 grp->lg_mac_addr_port = grp->lg_ports; in aggr_grp_rem_port()
1845 link_state_changed = aggr_grp_detach_port(grp, port); in aggr_grp_rem_port()
1860 mutex_enter(&grp->lg_stat_lock); in aggr_grp_rem_port()
1861 grp->lg_stat[i] += val; in aggr_grp_rem_port()
1862 mutex_exit(&grp->lg_stat_lock); in aggr_grp_rem_port()
1870 mutex_enter(&grp->lg_stat_lock); in aggr_grp_rem_port()
1871 grp->lg_ether_stat[i] += val; in aggr_grp_rem_port()
1872 mutex_exit(&grp->lg_stat_lock); in aggr_grp_rem_port()
1875 grp->lg_nports--; in aggr_grp_rem_port()
1878 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_rem_port()
1886 if (mac_addr_changed && aggr_grp_update_ports_mac(grp)) in aggr_grp_rem_port()
1906 aggr_grp_t *grp = NULL; in aggr_grp_rem_ports() local
1915 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_rem_ports()
1919 AGGR_GRP_REFHOLD(grp); in aggr_grp_rem_ports()
1924 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_rem_ports()
1928 if (nports >= grp->lg_nports) { in aggr_grp_rem_ports()
1935 if (aggr_grp_port_lookup(grp, ports[i].lp_linkid) == NULL) { in aggr_grp_rem_ports()
1945 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_rem_ports()
1954 port = aggr_grp_port_lookup(grp, in aggr_grp_rem_ports()
1964 if (port->lp_started && (grp->lg_promisc || in aggr_grp_rem_ports()
1976 port = aggr_grp_port_lookup(grp, ports[i].lp_linkid); in aggr_grp_rem_ports()
1980 if (grp->lg_started) { in aggr_grp_rem_ports()
1998 for (uint_t j = 0; j < grp->lg_rx_group_count; j++) in aggr_grp_rem_ports()
1999 aggr_rem_pseudo_rx_group(port, &grp->lg_rx_groups[j]); in aggr_grp_rem_ports()
2002 rc = aggr_grp_rem_port(grp, port, &mac_addr_changed, in aggr_grp_rem_ports()
2011 mac_unicst_update(grp->lg_mh, grp->lg_addr); in aggr_grp_rem_ports()
2013 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_grp_rem_ports()
2016 AGGR_GRP_REFRELE(grp); in aggr_grp_rem_ports()
2024 aggr_grp_t *grp = NULL; in aggr_grp_delete() local
2035 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_delete()
2046 if ((err = dls_devnet_destroy(grp->lg_mh, &tmpid, B_TRUE)) != 0) { in aggr_grp_delete()
2057 if ((err = mac_disable(grp->lg_mh)) != 0) { in aggr_grp_delete()
2058 (void) dls_devnet_create(grp->lg_mh, linkid, crgetzoneid(cred)); in aggr_grp_delete()
2063 ASSERT(grp == (aggr_grp_t *)val); in aggr_grp_delete()
2072 mutex_enter(&grp->lg_lacp_lock); in aggr_grp_delete()
2073 grp->lg_lacp_done = B_TRUE; in aggr_grp_delete()
2074 cv_signal(&grp->lg_lacp_cv); in aggr_grp_delete()
2075 while (grp->lg_lacp_rx_thread != NULL) in aggr_grp_delete()
2076 cv_wait(&grp->lg_lacp_cv, &grp->lg_lacp_lock); in aggr_grp_delete()
2077 mutex_exit(&grp->lg_lacp_lock); in aggr_grp_delete()
2081 mutex_enter(&grp->lg_tx_flowctl_lock); in aggr_grp_delete()
2082 if (grp->lg_tx_notify_thread != NULL) { in aggr_grp_delete()
2083 tid = grp->lg_tx_notify_thread->t_did; in aggr_grp_delete()
2084 grp->lg_tx_notify_done = B_TRUE; in aggr_grp_delete()
2085 cv_signal(&grp->lg_tx_flowctl_cv); in aggr_grp_delete()
2087 mutex_exit(&grp->lg_tx_flowctl_lock); in aggr_grp_delete()
2091 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_delete()
2093 grp->lg_closing = B_TRUE; in aggr_grp_delete()
2095 port = grp->lg_ports; in aggr_grp_delete()
2099 if (grp->lg_started) in aggr_grp_delete()
2101 (void) aggr_grp_detach_port(grp, port); in aggr_grp_delete()
2103 aggr_rem_pseudo_tx_group(port, &grp->lg_tx_group); in aggr_grp_delete()
2104 for (uint_t i = 0; i < grp->lg_rx_group_count; i++) in aggr_grp_delete()
2105 aggr_rem_pseudo_rx_group(port, &grp->lg_rx_groups[i]); in aggr_grp_delete()
2112 kmem_free(grp->lg_tx_blocked_rings, in aggr_grp_delete()
2119 aggr_grp_port_wait(grp); in aggr_grp_delete()
2121 VERIFY(mac_unregister(grp->lg_mh) == 0); in aggr_grp_delete()
2122 grp->lg_mh = NULL; in aggr_grp_delete()
2125 list_destroy(&(grp->lg_rx_groups[i].arg_vlans)); in aggr_grp_delete()
2128 AGGR_GRP_REFRELE(grp); in aggr_grp_delete()
2133 aggr_grp_free(aggr_grp_t *grp) in aggr_grp_free() argument
2135 ASSERT(grp->lg_refs == 0); in aggr_grp_free()
2136 ASSERT(grp->lg_port_ref == 0); in aggr_grp_free()
2137 if (grp->lg_key > AGGR_MAX_KEY) { in aggr_grp_free()
2138 id_free(key_ids, grp->lg_key); in aggr_grp_free()
2139 grp->lg_key = 0; in aggr_grp_free()
2141 kmem_cache_free(aggr_grp_cache, grp); in aggr_grp_free()
2149 aggr_grp_t *grp; in aggr_grp_info() local
2164 (mod_hash_val_t *)&grp) != 0) { in aggr_grp_info()
2168 AGGR_GRP_REFHOLD(grp); in aggr_grp_info()
2170 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_grp_info()
2173 rc = new_grp_fn(fn_arg, grp->lg_linkid, in aggr_grp_info()
2174 (grp->lg_key > AGGR_MAX_KEY) ? 0 : grp->lg_key, grp->lg_addr, in aggr_grp_info()
2175 grp->lg_addr_fixed, grp->lg_force, grp->lg_tx_policy, in aggr_grp_info()
2176 grp->lg_nports, grp->lg_lacp_mode, grp->aggr.PeriodicTimer); in aggr_grp_info()
2181 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_info()
2193 AGGR_GRP_REFRELE(grp); in aggr_grp_info()
2205 aggr_grp_stat(aggr_grp_t *grp, uint_t stat, uint64_t *val) in aggr_grp_stat() argument
2210 ASSERT(MUTEX_HELD(&grp->lg_stat_lock)); in aggr_grp_stat()
2225 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_grp_stat()
2235 *val += grp->lg_stat[stat_index]; in aggr_grp_stat()
2239 *val += grp->lg_ether_stat[stat_index]; in aggr_grp_stat()
2279 aggr_grp_t *grp = arg; in aggr_m_stat() local
2282 mutex_enter(&grp->lg_stat_lock); in aggr_m_stat()
2286 *val = grp->lg_ifspeed; in aggr_m_stat()
2290 *val = grp->lg_link_duplex; in aggr_m_stat()
2299 rval = aggr_grp_stat(grp, stat, val); in aggr_m_stat()
2302 mutex_exit(&grp->lg_stat_lock); in aggr_m_stat()
2309 aggr_grp_t *grp = arg; in aggr_m_start() local
2313 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_start()
2320 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_start()
2332 if (grp->lg_promisc || port->lp_prom_addr != NULL) { in aggr_m_start()
2339 grp->lg_started = B_TRUE; in aggr_m_start()
2348 aggr_grp_t *grp = arg; in aggr_m_stop() local
2352 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_stop()
2354 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_stop()
2364 grp->lg_started = B_FALSE; in aggr_m_stop()
2371 aggr_grp_t *grp = arg; in aggr_m_promisc() local
2376 AGGR_GRP_REFHOLD(grp); in aggr_m_promisc()
2377 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_m_promisc()
2379 ASSERT(!grp->lg_closing); in aggr_m_promisc()
2381 if (on == grp->lg_promisc) in aggr_m_promisc()
2384 for (port = grp->lg_ports; port != NULL; port = port->lp_next) { in aggr_m_promisc()
2395 if (aggr_grp_detach_port(grp, port)) in aggr_m_promisc()
2405 if (aggr_grp_attach_port(grp, port)) in aggr_m_promisc()
2412 grp->lg_promisc = on; in aggr_m_promisc()
2415 mac_link_update(grp->lg_mh, grp->lg_link_state); in aggr_m_promisc()
2419 AGGR_GRP_REFRELE(grp); in aggr_m_promisc()
2468 aggr_grp_t *grp = arg; in aggr_m_capab_get() local
2473 *hcksum_txflags = grp->lg_hcksum_txflags; in aggr_m_capab_get()
2479 if (grp->lg_lso) { in aggr_m_capab_get()
2480 *cap_lso = grp->lg_cap_lso; in aggr_m_capab_get()
2487 return (!grp->lg_vlan); in aggr_m_capab_get()
2489 return (!grp->lg_zcopy); in aggr_m_capab_get()
2494 for (uint_t i = 0; i < grp->lg_rx_group_count; i++) in aggr_m_capab_get()
2495 ring_cnt += grp->lg_rx_groups[i].arg_ring_cnt; in aggr_m_capab_get()
2500 cap_rings->mr_gnum = grp->lg_rx_group_count; in aggr_m_capab_get()
2505 cap_rings->mr_rnum = grp->lg_tx_group.atg_ring_cnt; in aggr_m_capab_get()
2538 aggr_grp_t *grp = arg; in aggr_fill_group() local
2541 aggr_pseudo_rx_group_t *rx_group = &grp->lg_rx_groups[index]; in aggr_fill_group()
2544 rx_group->arg_grp = grp; in aggr_fill_group()
2561 aggr_pseudo_tx_group_t *tx_group = &grp->lg_tx_group; in aggr_fill_group()
2575 aggr_grp_t *grp = arg; in aggr_fill_ring() local
2583 rx_group = &grp->lg_rx_groups[rg_index]; in aggr_fill_ring()
2609 aggr_pseudo_tx_group_t *tx_group = &grp->lg_tx_group; in aggr_fill_ring()
2644 aggr_grp_t *grp = port->lp_grp; in aggr_rx_poll() local
2649 if (grp->lg_lacp_mode == AGGR_LACP_OFF) in aggr_rx_poll()
2683 aggr_grp_t *grp = rx_group->arg_grp; in aggr_addmac() local
2689 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_addmac()
2691 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) == 0) { in aggr_addmac()
2713 for (port = grp->lg_ports; port != NULL; port = port->lp_next) in aggr_addmac()
2718 for (p = grp->lg_ports; p != port; p = p->lp_next) in aggr_addmac()
2734 aggr_grp_t *grp = rx_group->arg_grp; in aggr_remmac() local
2739 mac_perim_enter_by_mh(grp->lg_mh, &mph); in aggr_remmac()
2741 if (bcmp(mac_addr, grp->lg_addr, ETHERADDRL) == 0) { in aggr_remmac()
2763 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, &rcount); in aggr_m_propinfo()