Home | History | Annotate | Download | only in lagg

Lines Matching defs:lsc

308 lacp_dprintf(const struct lacp_softc *lsc, const struct lacp_port *lacpp,
314 if (lsc != NULL && lsc->lsc_softc != NULL) {
315 sc = lsc->lsc_softc;
332 lacp_evcnt_attach(struct lacp_softc *lsc,
337 lsc->lsc_evgroup, name);
355 lacp_isactive(struct lacp_softc *lsc, struct lacp_port *lacpp)
364 if (lacpp->lp_aggregator != lsc->lsc_aggregator)
465 struct lacp_softc *lsc;
471 lsc = kmem_zalloc(sizeof(*lsc), KM_NOSLEEP);
472 if (lsc == NULL)
475 lsc->lsc_du_q = pcq_create(LACP_RCVDU_LIMIT, KM_NOSLEEP);
476 if (lsc->lsc_du_q == NULL) {
481 mutex_init(&lsc->lsc_lock, MUTEX_DEFAULT, IPL_SOFTNET);
482 lsc->lsc_softc = sc;
483 lsc->lsc_key = htons(if_get_index(&sc->sc_if));
484 lsc->lsc_system_prio = htons(LACP_SYSTEM_PRIO);
485 lsc->lsc_running = false;
486 lsc->lsc_max_ports = LACP_MAX_PORTS;
487 lsc->lsc_multi_linkspeed = true;
488 TAILQ_INIT(&lsc->lsc_aggregators);
490 lagg_work_set(&lsc->lsc_work_tick, lacp_tick_work, lsc);
491 lagg_work_set(&lsc->lsc_work_rcvdu, lacp_rcvdu_work, lsc);
492 lagg_work_set(&lsc->lsc_work_linkspeed,
493 lacp_linkspeed_work, lsc);
497 lsc->lsc_workq = lagg_workq_create(xnamebuf,
499 if (lsc->lsc_workq == NULL) {
505 lsc->lsc_psz = pserialize_create();
507 callout_init(&lsc->lsc_tick, CALLOUT_MPSAFE);
508 callout_setfunc(&lsc->lsc_tick, lacp_tick, lsc);
510 snprintf(lsc->lsc_evgroup, sizeof(lsc->lsc_evgroup),
512 lacp_evcnt_attach(lsc, &lsc->lsc_mgethdr_failed, "MGETHDR failed");
513 lacp_evcnt_attach(lsc, &lsc->lsc_mpullup_failed, "m_pullup failed");
514 lacp_evcnt_attach(lsc, &lsc->lsc_badlacpdu, "Bad LACPDU received");
515 lacp_evcnt_attach(lsc, &lsc->lsc_badmarkerdu, "Bad MarkerDU received");
516 lacp_evcnt_attach(lsc, &lsc->lsc_norcvif, "No received interface");
517 lacp_evcnt_attach(lsc, &lsc->lsc_nolaggport, "No lagg context");
518 lacp_evcnt_attach(lsc, &lsc->lsc_duq_nospc, "No space left on queues");
522 *lscp = (struct lagg_proto_softc *)lsc;
525 mutex_destroy(&lsc->lsc_lock);
526 pcq_destroy(lsc->lsc_du_q);
528 kmem_free(lsc, sizeof(*lsc));
536 struct lacp_softc *lsc = (struct lacp_softc *)xlsc;
537 struct lagg_softc *sc __diagused = lsc->lsc_softc;
539 KASSERT(TAILQ_EMPTY(&lsc->lsc_aggregators));
542 LAGG_LOCK(lsc->lsc_softc);
544 LAGG_UNLOCK(lsc->lsc_softc);
546 lagg_workq_wait(lsc->lsc_workq, &lsc->lsc_work_rcvdu);
547 lagg_workq_wait(lsc->lsc_workq, &lsc->lsc_work_tick);
548 evcnt_detach(&lsc->lsc_mgethdr_failed);
549 evcnt_detach(&lsc->lsc_mpullup_failed);
550 evcnt_detach(&lsc->lsc_badlacpdu);
551 evcnt_detach(&lsc->lsc_badmarkerdu);
552 evcnt_detach(&lsc->lsc_norcvif);
553 evcnt_detach(&lsc->lsc_nolaggport);
554 evcnt_detach(&lsc->lsc_duq_nospc);
555 lagg_workq_destroy(lsc->lsc_workq);
556 pserialize_destroy(lsc->lsc_psz);
557 mutex_destroy(&lsc->lsc_lock);
558 pcq_destroy(lsc->lsc_du_q);
559 kmem_free(lsc, sizeof(*lsc));
567 struct lacp_softc *lsc;
569 lsc = (struct lacp_softc *)xlsc;
570 sc = lsc->lsc_softc;
574 LACP_LOCK(lsc);
575 if (memcmp(lsc->lsc_system_mac, LAGG_CLLADDR(sc),
576 sizeof(lsc->lsc_system_mac)) != 0) {
577 lsc->lsc_system_mac, LAGG_CLLADDR(sc),
578 sizeof(lsc->lsc_system_mac));
580 lsc->lsc_running = true;
581 callout_schedule(&lsc->lsc_tick, hz);
582 LACP_UNLOCK(lsc);
588 LACP_DPRINTF((lsc, NULL, "lacp start\n"));
594 lacp_down_locked(struct lacp_softc *lsc)
599 sc = lsc->lsc_softc;
602 KASSERT(LACP_LOCKED(lsc));
604 lsc->lsc_running = false;
605 callout_halt(&lsc->lsc_tick, &lsc->lsc_lock);
608 lacp_port_disable(lsc, lp->lp_proto_ctx);
611 memset(lsc->lsc_system_mac, 0,
612 sizeof(lsc->lsc_system_mac));
614 LACP_DPRINTF((lsc, NULL, "lacp stopped\n"));
620 struct lacp_softc *lsc;
622 lsc = (struct lacp_softc *)xlsc;
624 KASSERT(LAGG_LOCKED(lsc->lsc_softc));
626 LACP_LOCK(lsc);
627 lacp_down_locked(lsc);
628 LACP_UNLOCK(lsc);
634 struct lacp_softc *lsc;
639 lsc = (struct lacp_softc *)xlsc;
641 if (__predict_false(lsc->lsc_suppress_distributing)) {
642 LACP_DPRINTF((lsc, NULL, "waiting transit\n"));
647 lp = lacp_select_tx_port(lsc, m, &psref);
649 LACP_DPRINTF((lsc, NULL, "no distributing port\n"));
650 ifp = &lsc->lsc_softc->sc_if;
656 lagg_output(lsc->lsc_softc, lp, m);
666 struct lacp_softc *lsc;
672 lsc = (struct lacp_softc *)xlsc;
673 sc = lsc->lsc_softc;
700 lagg_work_set(&lacpp->lp_work_smtx, lacp_sm_tx_work, lsc);
701 lagg_work_set(&lacpp->lp_work_marker, lacp_marker_work, lsc);
703 LACP_LOCK(lsc);
704 lacp_sm_port_init(lsc, lacpp, lp);
705 LACP_UNLOCK(lsc);
730 struct lacp_softc *lsc;
734 lsc = (struct lacp_softc *)xlsc;
737 KASSERT(LAGG_LOCKED(lsc->lsc_softc));
739 LACP_LOCK(lsc);
744 lacp_port_disable(lsc, lacpp);
745 LACP_UNLOCK(lsc);
751 struct lacp_softc *lsc;
755 lsc = (struct lacp_softc *)xlsc;
758 KASSERT(LAGG_LOCKED(lsc->lsc_softc));
761 lagg_workq_wait(lsc->lsc_workq, &lacpp->lp_work_smtx);
762 lagg_workq_wait(lsc->lsc_workq, &lacpp->lp_work_marker);
778 struct lacp_softc *lsc;
782 lsc = (struct lacp_softc *)xlsc;
784 LACP_LOCK(lsc);
785 la = lsc->lsc_aggregator;
788 if (lsc->lsc_optimistic)
790 if (lsc->lsc_dump_du)
792 if (lsc->lsc_stop_lacpdu)
794 if (lsc->lsc_multi_linkspeed)
797 rplacp->maxports = lsc->lsc_max_ports;
798 rplacp->actor_prio = ntohs(lsc->lsc_system_prio);
799 memcpy(rplacp->actor_mac, lsc->lsc_system_mac,
801 rplacp->actor_key = ntohs(lsc->lsc_key);
810 LACP_UNLOCK(lsc);
818 struct lacp_softc *lsc;
823 lsc = (struct lacp_softc *)xlsc;
828 if (lacp_isactive(lsc, lacpp))
857 struct lacp_softc *lsc;
867 lsc = (struct lacp_softc *)xlsc;
889 LACP_DPRINTF((lsc, lacpp,
894 LACP_LOCK(lsc);
895 if (lsc->lsc_running) {
900 LACP_DPRINTF((lsc, lacpp,
909 lacp_port_enable(lsc, lacpp);
911 LACP_DPRINTF((lsc, lacpp,
916 lacp_port_disable(lsc, lacpp);
921 LACP_DPRINTF((lsc, lacpp,
926 LACP_DPRINTF((lsc, lacpp,
929 LACP_UNLOCK(lsc);
935 struct lacp_softc *lsc;
942 lsc = (struct lacp_softc *)xlsc;
952 LACP_LOCK(lsc);
955 lsc->lsc_optimistic = set;
957 lsc->lsc_dump_du = set;
959 lsc->lsc_stop_lacpdu = set;
962 lsc->lsc_multi_linkspeed != set) {
963 lsc->lsc_multi_linkspeed = set;
964 TAILQ_FOREACH(la, &lsc->lsc_aggregators, la_q) {
965 lacp_selected_update(lsc, la);
969 LACP_UNLOCK(lsc);
980 LACP_LOCK(lsc);
981 if (lsc->lsc_max_ports != maxports) {
982 lsc->lsc_max_ports = maxports;
983 TAILQ_FOREACH(la, &lsc->lsc_aggregators, la_q) {
984 lacp_selected_update(lsc, la);
987 LACP_UNLOCK(lsc);
997 lacp_pdu_input(struct lacp_softc *lsc, struct lacp_port *lacpp, struct mbuf *m)
1031 lsc->lsc_mpullup_failed.ev_count++;
1052 if (LACP_ISDUMPING(lsc)) {
1053 lacp_dprintf(lsc, lacpp, "lacpdu received\n");
1057 LACP_LOCK(lsc);
1058 lacp_sm_rx(lsc, lacpp, pi_partner, pi_actor);
1059 LACP_UNLOCK(lsc);
1064 lsc->lsc_badlacpdu.ev_count++;
1071 struct lacp_softc *lsc, struct lacp_port *lacpp)
1074 KASSERT(LACP_LOCKED(lsc));
1082 return memcmp(mi->mi_rq_system, lsc->lsc_system_mac,
1087 lacp_marker_reply(struct lacp_softc *lsc, struct lacp_port *lacpp,
1095 LACP_LOCK(lsc);
1098 LACP_UNLOCK(lsc);
1109 if (LACP_ISDUMPING(lsc)) {
1110 lacp_dprintf(lsc, lacpp, "markerdu reply\n");
1119 lacp_marker_recv_response(struct lacp_softc *lsc, struct lacp_port *lacpp,
1127 sc = lsc->lsc_softc;
1129 LACP_LOCK(lsc);
1130 if (marker_cmp(mi_res, lsc, lacpp) != 0) {
1131 LACP_UNLOCK(lsc);
1135 LACP_UNLOCK(lsc);
1138 LACP_LOCK(lsc);
1140 if (lsc->lsc_suppress_distributing) {
1151 LACP_DPRINTF((lsc, NULL, "queue flush complete\n"));
1152 LACP_PTIMER_DISARM(lsc, LACP_PTIMER_DISTRIBUTING);
1153 lsc->lsc_suppress_distributing = false;
1157 LACP_UNLOCK(lsc);
1164 lacp_marker_input(struct lacp_softc *lsc, struct lacp_port *lacpp,
1195 lsc->lsc_mpullup_failed.ev_count++;
1212 if (LACP_ISDUMPING(lsc)) {
1213 lacp_dprintf(lsc, lacpp, "markerdu received\n");
1218 lacp_marker_reply(lsc, lacpp, m);
1220 error = lacp_marker_recv_response(lsc, lacpp,
1233 lsc->lsc_badmarkerdu.ev_count++;
1242 struct lacp_softc *lsc;
1248 lsc = (struct lacp_softc *)xlsc;
1249 ifp = &lsc->lsc_softc->sc_if;
1265 if (pcq_put(lsc->lsc_du_q, (void *)m)) {
1266 lagg_workq_add(lsc->lsc_workq,
1267 &lsc->lsc_work_rcvdu);
1270 lsc->lsc_duq_nospc.ev_count++;
1276 if (!lacp_iscollecting(lacpp) || !lacp_isactive(lsc, lacpp)) {
1288 struct lacp_softc *lsc = (struct lacp_softc *)xlsc;
1299 m = pcq_get(lsc->lsc_du_q);
1306 lsc->lsc_norcvif.ev_count++;
1316 lsc->lsc_norcvif.ev_count++;
1329 (void)lacp_pdu_input(lsc,
1333 (void)lacp_marker_input(lsc,
1381 lacp_lacpdu_mbuf(struct lacp_softc *lsc, struct lacp_port *lacpp)
1387 KASSERT(LACP_LOCKED(lsc));
1393 lsc->lsc_mgethdr_failed.ev_count++;
1414 lacp_peerinfo_actor(lsc, lacpp, &du->ldu_actor);
1433 struct lacp_softc *lsc;
1441 lsc = xlsc;
1444 LACP_LOCK(lsc);
1446 if (lsc->lsc_stop_lacpdu) {
1447 LACP_UNLOCK(lsc);
1451 m = lacp_lacpdu_mbuf(lsc, lacpp);
1453 LACP_UNLOCK(lsc);
1460 LACP_UNLOCK(lsc);
1462 if (LACP_ISDUMPING(lsc)) {
1463 lacp_dprintf(lsc, lacpp, "lacpdu transmit\n");
1475 lacp_sm_tx(struct lacp_softc *lsc, struct lacp_port *lacpp)
1481 lagg_workq_add(lsc->lsc_workq, &lacpp->lp_work_smtx);
1487 struct lacp_softc *lsc;
1489 lsc = xlsc;
1491 LACP_LOCK(lsc);
1493 if (!lsc->lsc_running) {
1494 LACP_UNLOCK(lsc);
1498 lagg_workq_add(lsc->lsc_workq, &lsc->lsc_work_tick);
1499 callout_schedule(&lsc->lsc_tick, hz);
1501 LACP_UNLOCK(lsc);
1505 lacp_run_timers(struct lacp_softc *lsc, struct lacp_port *lacpp)
1509 KASSERT(LACP_LOCKED(lsc));
1520 lacp_timer_funcs[i](lsc, lacpp);
1525 lacp_run_prototimers(struct lacp_softc *lsc)
1530 KASSERT(lsc->lsc_timer[i] >= 0);
1532 if (lsc->lsc_timer[i] == 0)
1534 if (--lsc->lsc_timer[i] > 0)
1538 lacp_ptimer_funcs[i](lsc);
1545 struct lacp_softc *lsc;
1550 lsc = xlsc;
1551 sc = lsc->lsc_softc;
1553 LACP_LOCK(lsc);
1554 if (!lsc->lsc_running) {
1555 LACP_UNLOCK(lsc);
1559 lacp_run_prototimers(lsc);
1560 LACP_UNLOCK(lsc);
1563 LACP_LOCK(lsc);
1571 lacp_run_timers(lsc, lacpp);
1572 lacp_select(lsc, lacpp);
1573 lacp_sm_mux(lsc, lacpp);
1574 lacp_sm_tx(lsc, lacpp);
1578 LACP_UNLOCK(lsc);
1623 lacp_select_tx_port(struct lacp_softc *lsc, struct mbuf *m,
1632 hash = lagg_hashmbuf(lsc->lsc_softc, m);
1635 act = LACP_PORTMAP_ACTIVE(lsc);
1636 pm = &lsc->lsc_portmaps[act];
1653 lacp_peerinfo_actor(struct lacp_softc *lsc, struct lacp_port *lacpp,
1657 memcpy(dst->lpi_system_mac, lsc->lsc_system_mac, LACP_MAC_LEN);
1658 dst->lpi_system_prio = lsc->lsc_system_prio;
1659 dst->lpi_key = lsc->lsc_key;
1694 lacp_sm_rx_record_default(struct lacp_softc *lsc, struct lacp_port *lacpp)
1706 if (lsc->lsc_optimistic)
1715 LACP_DPRINTF((lsc, lacpp, "oldpstate %s\n", buf));
1718 LACP_DPRINTF((lsc, lacpp, "newpstate %s\n", buf));
1725 lacp_port_is_synced(struct lacp_softc *lsc, struct lacp_port *lacpp,
1738 lacp_peerinfo_actor(lsc, lacpp, &actor);
1751 lacp_sm_rx_record_peerinfo(struct lacp_softc *lsc, struct lacp_port *lacpp,
1773 if (lacp_port_is_synced(lsc, lacpp, my_pi, peer_pi)) {
1774 if (lsc->lsc_optimistic)
1784 LACP_DPRINTF((lsc, lacpp, "oldpstate %s\n", buf));
1788 LACP_DPRINTF((lsc, lacpp, "newpstate %s\n", buf));
1811 lacp_sm_port_init(struct lacp_softc *lsc, struct lacp_port *lacpp,
1815 KASSERT(LACP_LOCKED(lsc));
1826 lacp_set_mux(lsc, lacpp, LACP_MUX_DETACHED);
1827 lacp_sm_rx_record_default(lsc, lacpp);
1831 lacp_port_disable(struct lacp_softc *lsc, struct lacp_port *lacpp)
1834 KASSERT(LACP_LOCKED(lsc));
1837 LACP_DPRINTF((lsc, lacpp, "enable -> disable\n"));
1839 lacp_set_mux(lsc, lacpp, LACP_MUX_DETACHED);
1840 lacp_sm_rx_record_default(lsc, lacpp);
1847 lacp_port_enable(struct lacp_softc *lsc __LACPDEBUGUSED,
1851 KASSERT(LACP_LOCKED(lsc));
1854 LACP_DPRINTF((lsc, lacpp, "disable -> enable\n"));
1861 lacp_sm_rx_timer(struct lacp_softc *lsc, struct lacp_port *lacpp)
1864 KASSERT(LACP_LOCKED(lsc));
1868 LACP_DPRINTF((lsc, lacpp, "CURRENT -> EXPIRED\n"));
1871 LACP_DPRINTF((lsc, lacpp, "EXPIRED -> DEFAULTED\n"));
1872 lacp_set_mux(lsc, lacpp, LACP_MUX_DETACHED);
1873 lacp_sm_rx_record_default(lsc, lacpp);
1878 lacp_sm_ptx_timer(struct lacp_softc *lsc __unused, struct lacp_port *lacpp)
1881 KASSERT(LACP_LOCKED(lsc));
1924 lacp_sm_mux_timer(struct lacp_softc *lsc __LACPDEBUGUSED,
1929 KASSERT(LACP_LOCKED(lsc));
1933 LACP_DPRINTF((lsc, lacpp, "aggregator %s, pending %d -> %d\n",
1940 lacp_sm_rx_update_selected(struct lacp_softc *lsc, struct lacp_port *lacpp,
1954 LACP_DPRINTF((lsc, lacpp,
1961 LACP_DPRINTF((lsc, lacpp,
1977 lacp_sm_rx_update_ntt(struct lacp_softc *lsc, struct lacp_port *lacpp,
1982 lacp_peerinfo_actor(lsc, lacpp, &actor);
1989 LACP_DPRINTF((lsc, lacpp,
1992 LACP_DPRINTF((lsc, lacpp, "assert ntt\n"));
1999 lacp_sm_rx(struct lacp_softc *lsc, struct lacp_port *lacpp,
2004 KASSERT(LACP_LOCKED(lsc));
2011 if (memcmp(lsc->lsc_system_mac, peer_pi->lpi_system_mac,
2013 lsc->lsc_system_prio == peer_pi->lpi_system_prio)
2016 lacp_sm_rx_update_selected(lsc, lacpp, peer_pi);
2017 lacp_sm_rx_update_ntt(lsc, lacpp, my_pi);
2018 lacp_sm_rx_record_peerinfo(lsc, lacpp, my_pi, peer_pi);
2027 lacp_sm_tx(lsc, lacpp);
2048 lacp_update_portmap(struct lacp_softc *lsc)
2057 KASSERT(LACP_LOCKED(lsc));
2059 la = lsc->lsc_aggregator;
2061 pmap = LACP_PORTMAP_ACTIVE(lsc);
2062 pm_act = &lsc->lsc_portmaps[pmap];
2064 pmap = LACP_PORTMAP_NEXT(lsc);
2065 pm_next = &lsc->lsc_portmaps[pmap];
2084 atomic_store_release(&lsc->lsc_activemap, pmap);
2085 pserialize_perform(lsc->lsc_psz);
2087 LACP_DPRINTF((lsc, NULL, "portmap count updated (%zu -> %zu)\n",
2092 sc = lsc->lsc_softc;
2096 lagg_workq_add(lsc->lsc_workq, &lsc->lsc_work_linkspeed);
2104 lacp_disable_distributing(struct lacp_softc *lsc, struct lacp_port *lacpp)
2111 KASSERT(LACP_LOCKED(lsc));
2114 LAGG_LOG(lsc->lsc_softc, LOG_INFO,
2120 act = LACP_PORTMAP_ACTIVE(lsc);
2121 pm = &lsc->lsc_portmaps[act];
2133 lacp_update_portmap(lsc);
2137 lacp_enable_distributing(struct lacp_softc *lsc, struct lacp_port *lacpp)
2140 KASSERT(LACP_LOCKED(lsc));
2142 KASSERT(lacp_isactive(lsc, lacpp));
2144 LAGG_LOG(lsc->lsc_softc, LOG_INFO,
2147 lacp_suppress_distributing(lsc);
2148 lacp_update_portmap(lsc);
2152 lacp_select_active_aggregator(struct lacp_softc *lsc)
2157 KASSERT(LACP_LOCKED(lsc));
2159 la = lsc->lsc_aggregator;
2166 TAILQ_FOREACH(la, &lsc->lsc_aggregators, la_q) {
2175 if (best_la != lsc->lsc_aggregator) {
2176 LACP_DPRINTF((lsc, NULL, "active aggregator changed\n"));
2178 if (lsc->lsc_aggregator != NULL) {
2179 LACP_AGGREGATOR_STR(lsc->lsc_aggregator,
2184 LACP_DPRINTF((lsc, NULL, "old aggregator=%s\n", str));
2191 LACP_DPRINTF((lsc, NULL, "new aggregator=%s\n", str));
2193 lsc->lsc_aggregator = best_la;
2198 lacp_port_attached(struct lacp_softc *lsc, struct lacp_port *lacpp)
2202 KASSERT(LACP_LOCKED(lsc));
2213 lacp_select_active_aggregator(lsc);
2217 lacp_port_detached(struct lacp_softc *lsc, struct lacp_port *lacpp)
2221 KASSERT(LACP_LOCKED(lsc));
2232 lacp_select_active_aggregator(lsc);
2236 lacp_set_mux(struct lacp_softc *lsc, struct lacp_port *lacpp,
2242 KASSERT(LACP_LOCKED(lsc));
2252 lacp_port_detached(lsc, lacpp);
2253 lacp_disable_distributing(lsc, lacpp);
2262 lacp_unselect(lsc, lacpp);
2271 lacp_port_attached(lsc, lacpp);
2277 lacp_port_attached(lsc, lacpp);
2283 lacp_disable_distributing(lsc, lacpp);
2287 lacp_enable_distributing(lsc, lacpp);
2294 LACP_DPRINTF((lsc, lacpp, "mux_state %d -> %d\n",
2302 lacp_sm_mux(struct lacp_softc *lsc, struct lacp_port *lacpp)
2353 LAGG_LOG(lsc->lsc_softc, LOG_INFO,
2357 } else if (lacp_isactive(lsc, lacpp) && p_sync) {
2363 !lacp_isactive(lsc, lacpp)
2372 !lacp_isactive(lsc, lacpp)
2375 LACP_DPRINTF((lsc, lacpp,
2383 lsc->lsc_softc->sc_if.if_xname);
2385 } while (lacp_set_mux(lsc, lacpp, next_state) == 0);
2406 lacp_selected_update(struct lacp_softc *lsc, struct lacp_aggregator *la)
2414 KASSERT(LACP_LOCKED(lsc));
2429 if (nselected >= lsc->lsc_max_ports) {
2434 if (!lsc->lsc_multi_linkspeed &&
2442 LAGG_LOG(lsc->lsc_softc, LOG_INFO,
2452 lacp_select(struct lacp_softc *lsc, struct lacp_port *lacpp)
2470 TAILQ_FOREACH(la, &lsc->lsc_aggregators, la_q) {
2478 LACP_DPRINTF((lsc, lacpp,
2486 TAILQ_INSERT_TAIL(&lsc->lsc_aggregators, la, la_q);
2487 LACP_DPRINTF((lsc, lacpp, "a new aggregator created\n"));
2489 LACP_DPRINTF((lsc, lacpp, "aggregator found\n"));
2494 LACP_DPRINTF((lsc, lacpp, "aggregator lagid=%s\n", buf));
2514 lacp_selected_update(lsc, la);
2518 lacp_unselect(struct lacp_softc *lsc, struct lacp_port *lacpp)
2524 KASSERT(LACP_LOCKED(lsc));
2536 LACP_DPRINTF((lsc, lacpp, "unselect aggregator lagid=%s\n", buf));
2544 if (la == lsc->lsc_aggregator) {
2545 LACP_DPRINTF((lsc, NULL, "remove active aggregator\n"));
2546 lsc->lsc_aggregator = NULL;
2550 TAILQ_REMOVE(&lsc->lsc_aggregators, la, la_q);
2554 lacp_select_active_aggregator(lsc);
2556 lacp_selected_update(lsc, la);
2561 lacp_suppress_distributing(struct lacp_softc *lsc)
2567 KASSERT(LACP_LOCKED(lsc));
2569 la = lsc->lsc_aggregator;
2575 lagg_workq_add(lsc->lsc_workq,
2581 lsc->lsc_suppress_distributing = marker_scheduled;
2582 LACP_PTIMER_ARM(lsc, LACP_PTIMER_DISTRIBUTING,
2587 lacp_distributing_timer(struct lacp_softc *lsc)
2590 KASSERT(LACP_LOCKED(lsc));
2592 if (lsc->lsc_suppress_distributing) {
2593 LACP_DPRINTF((lsc, NULL,
2595 lsc->lsc_suppress_distributing = false;
2600 lacp_markerdu_mbuf(struct lacp_softc *lsc, struct lacp_port *lacpp)
2607 KASSERT(LACP_LOCKED(lsc));
2613 lsc->lsc_mgethdr_failed.ev_count++;
2638 memcpy(mi->mi_rq_system, lsc->lsc_system_mac, LACP_MAC_LEN);
2649 struct lacp_softc *lsc;
2657 lsc = xlsc;
2660 LACP_LOCK(lsc);
2662 m = lacp_markerdu_mbuf(lsc, lacpp);
2664 LACP_UNLOCK(lsc);
2671 LACP_UNLOCK(lsc);
2673 if (LACP_ISDUMPING(lsc)) {
2674 lacp_dprintf(lsc, lacpp, "markerdu transmit\n");
2764 struct lacp_softc *lsc = (struct lacp_softc *)xlsc;
2765 struct lagg_softc *sc = lsc->lsc_softc;
2774 LACP_LOCK(lsc);
2775 act = LACP_PORTMAP_ACTIVE(lsc);
2776 pm = &lsc->lsc_portmaps[act];
2782 LACP_UNLOCK(lsc);