Lines Matching +full:slave +full:- +full:if
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
52 * --------------------------------------------------------------
54 * --------------------------------------------------------------
119 * __get_bond_by_port - get the port's bonding struct
122 * Return @port's bonding struct, or %NULL if it can't be found.
126 if (port->slave == NULL) in __get_bond_by_port()
129 return bond_get_bond_by_slave(port->slave); in __get_bond_by_port()
133 * __get_first_agg - get the first aggregator in the bond
136 * Return the aggregator of the first slave in @bond, or %NULL if it can't be
143 struct slave *first_slave; in __get_first_agg()
146 /* If there's no bond for this port, or bond has no slaves */ in __get_first_agg()
147 if (bond == NULL) in __get_first_agg()
152 agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL; in __get_first_agg()
159 * __agg_has_partner - see if we have a partner
162 * Return nonzero if aggregator has a partner (denoted by a non-zero ether
163 * address for the partner). Return 0 if not.
167 return !is_zero_ether_addr(agg->partner_system.mac_addr_value); in __agg_has_partner()
171 * __disable_port - disable the port's slave
176 bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); in __disable_port()
180 * __enable_port - enable the port's slave, if it's up
185 struct slave *slave = port->slave; in __enable_port() local
187 if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave)) in __enable_port()
188 bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER); in __enable_port()
192 * __port_is_enabled - check if the port's slave is in active state
197 return bond_is_active_slave(port->slave); in __port_is_enabled()
201 * __get_agg_selection_mode - get the aggregator selection mode
210 if (bond == NULL) in __get_agg_selection_mode()
213 return bond->params.ad_select; in __get_agg_selection_mode()
217 * __check_agg_selection_timer - check if the selection timer has expired
224 if (bond == NULL) in __check_agg_selection_timer()
231 * __get_link_speed - get a port's speed
252 struct slave *slave = port->slave; in __get_link_speed() local
255 /* this if covers only a special case: when the configuration starts in __get_link_speed()
260 if (slave->link != BOND_LINK_UP) in __get_link_speed()
263 switch (slave->speed) { in __get_link_speed()
318 if (slave->speed != SPEED_UNKNOWN) in __get_link_speed()
319 pr_warn_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n", in __get_link_speed()
320 slave->bond->dev->name, in __get_link_speed()
321 slave->dev->name, slave->speed, in __get_link_speed()
322 port->actor_port_number); in __get_link_speed()
328 slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n", in __get_link_speed()
329 port->actor_port_number, speed); in __get_link_speed()
334 * __get_duplex - get a port's duplex
338 * 0x01 if in full duplex
343 struct slave *slave = port->slave; in __get_duplex() local
349 if (slave->link == BOND_LINK_UP) { in __get_duplex()
350 switch (slave->duplex) { in __get_duplex()
353 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n… in __get_duplex()
354 port->actor_port_number); in __get_duplex()
359 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapt… in __get_duplex()
360 port->actor_port_number); in __get_duplex()
369 const struct bonding *bond = bond_get_bond_by_slave(port->slave); in __ad_actor_update_port()
371 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; in __ad_actor_update_port()
372 port->actor_system_priority = BOND_AD_INFO(bond).system.sys_priority; in __ad_actor_update_port()
378 * __ad_timer_to_ticks - convert a given timer type to AD module ticks
382 * If @timer_type is %current_while_timer, @par indicates long/short timer.
383 * If @timer_type is %periodic_timer, @par is one of %FAST_PERIODIC_TIME,
392 if (par) in __ad_timer_to_ticks()
418 * __choose_matched - update a port's matched variable from a received lacpdu
425 * values for the actor. Matched is set to TRUE if all of these parameters
428 * in the aggregation. Matched is also set to TRUE if the value of
432 * link if either the PDU's actor_state.lacp_activity variable is TRUE or both
442 /* check if all parameters are alike in __choose_matched()
446 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && in __choose_matched()
447 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && in __choose_matched()
448 MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) && in __choose_matched()
449 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && in __choose_matched()
450 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && in __choose_matched()
451 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGG… in __choose_matched()
452 ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0) in __choose_matched()
454 port->sm_vars |= AD_PORT_MATCHED; in __choose_matched()
456 port->sm_vars &= ~AD_PORT_MATCHED; in __choose_matched()
461 * __record_pdu - record parameters from a received lacpdu
471 if (lacpdu && port) { in __record_pdu()
472 struct port_params *partner = &port->partner_oper; in __record_pdu()
478 partner->port_number = ntohs(lacpdu->actor_port); in __record_pdu()
479 partner->port_priority = ntohs(lacpdu->actor_port_priority); in __record_pdu()
480 partner->system = lacpdu->actor_system; in __record_pdu()
481 partner->system_priority = ntohs(lacpdu->actor_system_priority); in __record_pdu()
482 partner->key = ntohs(lacpdu->actor_key); in __record_pdu()
483 partner->port_state = lacpdu->actor_state; in __record_pdu()
486 port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED; in __record_pdu()
488 /* set the partner sync. to on if the partner is sync, in __record_pdu()
491 if ((port->sm_vars & AD_PORT_MATCHED) && in __record_pdu()
492 (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) { in __record_pdu()
493 partner->port_state |= LACP_STATE_SYNCHRONIZATION; in __record_pdu()
494 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
497 partner->port_state &= ~LACP_STATE_SYNCHRONIZATION; in __record_pdu()
498 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
505 * __record_default - record default parameters
514 if (port) { in __record_default()
516 memcpy(&port->partner_oper, &port->partner_admin, in __record_default()
520 port->actor_oper_port_state |= LACP_STATE_DEFAULTED; in __record_default()
525 * __update_selected - update a port's Selected variable from a received lacpdu
532 * values for the ports partner. If one or more of the comparisons shows that
539 if (lacpdu && port) { in __update_selected()
540 const struct port_params *partner = &port->partner_oper; in __update_selected()
542 /* check if any parameter is different then in __update_selected()
545 if (ntohs(lacpdu->actor_port) != partner->port_number || in __update_selected()
546 ntohs(lacpdu->actor_port_priority) != partner->port_priority || in __update_selected()
547 !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) || in __update_selected()
548 ntohs(lacpdu->actor_system_priority) != partner->system_priority || in __update_selected()
549 ntohs(lacpdu->actor_key) != partner->key || in __update_selected()
550 …(lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) { in __update_selected()
551 port->sm_vars &= ~AD_PORT_SELECTED; in __update_selected()
557 * __update_default_selected - update a port's Selected variable from Partner
562 * the corresponding operational parameter values for the partner. If one or
570 if (port) { in __update_default_selected()
571 const struct port_params *admin = &port->partner_admin; in __update_default_selected()
572 const struct port_params *oper = &port->partner_oper; in __update_default_selected()
574 /* check if any parameter is different then in __update_default_selected()
577 if (admin->port_number != oper->port_number || in __update_default_selected()
578 admin->port_priority != oper->port_priority || in __update_default_selected()
579 !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) || in __update_default_selected()
580 admin->system_priority != oper->system_priority || in __update_default_selected()
581 admin->key != oper->key || in __update_default_selected()
582 (admin->port_state & LACP_STATE_AGGREGATION) in __update_default_selected()
583 != (oper->port_state & LACP_STATE_AGGREGATION)) { in __update_default_selected()
584 port->sm_vars &= ~AD_PORT_SELECTED; in __update_default_selected()
590 * __update_ntt - update a port's ntt variable from a received lacpdu
597 * values for the Actor. If one or more of the comparisons shows that the
604 if (lacpdu && port) { in __update_ntt()
605 /* check if any parameter is different then in __update_ntt()
606 * update the port->ntt. in __update_ntt()
608 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || in __update_ntt()
609 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || in __update_ntt()
610 !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) || in __update_ntt()
611 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || in __update_ntt()
612 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || in __update_ntt()
613 …((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_L… in __update_ntt()
614 …((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LA… in __update_ntt()
615 …((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE… in __update_ntt()
616 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGG… in __update_ntt()
618 port->ntt = true; in __update_ntt()
624 * __agg_ports_are_ready - check if all ports in an aggregator are ready
633 if (aggregator) { in __agg_ports_are_ready()
634 /* scan all ports in this aggregator to verfy if they are in __agg_ports_are_ready()
637 for (port = aggregator->lag_ports; in __agg_ports_are_ready()
639 port = port->next_port_in_aggregator) { in __agg_ports_are_ready()
640 if (!(port->sm_vars & AD_PORT_READY_N)) { in __agg_ports_are_ready()
651 * __set_agg_ports_ready - set value of Ready bit in all ports of an aggregator
660 for (port = aggregator->lag_ports; port; in __set_agg_ports_ready()
661 port = port->next_port_in_aggregator) { in __set_agg_ports_ready()
662 if (val) in __set_agg_ports_ready()
663 port->sm_vars |= AD_PORT_READY; in __set_agg_ports_ready()
665 port->sm_vars &= ~AD_PORT_READY; in __set_agg_ports_ready()
674 for (port = agg->lag_ports; port; in __agg_active_ports()
675 port = port->next_port_in_aggregator) { in __agg_active_ports()
676 if (port->is_enabled) in __agg_active_ports()
684 * __get_agg_bandwidth - get the total bandwidth of an aggregator
693 if (nports) { in __get_agg_bandwidth()
694 switch (__get_link_speed(aggregator->lag_ports)) { in __get_agg_bandwidth()
745 * __get_active_agg - get the current active aggregator
752 struct bonding *bond = aggregator->slave->bond; in __get_active_agg()
754 struct slave *slave; in __get_active_agg() local
756 bond_for_each_slave_rcu(bond, slave, iter) in __get_active_agg()
757 if (SLAVE_AD_INFO(slave)->aggregator.is_active) in __get_active_agg()
758 return &(SLAVE_AD_INFO(slave)->aggregator); in __get_active_agg()
764 * __update_lacpdu_from_port - update a port's lacpdu fields
769 struct lacpdu *lacpdu = &port->lacpdu; in __update_lacpdu_from_port()
770 const struct port_params *partner = &port->partner_oper; in __update_lacpdu_from_port()
773 * lacpdu->subtype initialized in __update_lacpdu_from_port()
774 * lacpdu->version_number initialized in __update_lacpdu_from_port()
775 * lacpdu->tlv_type_actor_info initialized in __update_lacpdu_from_port()
776 * lacpdu->actor_information_length initialized in __update_lacpdu_from_port()
779 lacpdu->actor_system_priority = htons(port->actor_system_priority); in __update_lacpdu_from_port()
780 lacpdu->actor_system = port->actor_system; in __update_lacpdu_from_port()
781 lacpdu->actor_key = htons(port->actor_oper_port_key); in __update_lacpdu_from_port()
782 lacpdu->actor_port_priority = htons(port->actor_port_priority); in __update_lacpdu_from_port()
783 lacpdu->actor_port = htons(port->actor_port_number); in __update_lacpdu_from_port()
784 lacpdu->actor_state = port->actor_oper_port_state; in __update_lacpdu_from_port()
785 slave_dbg(port->slave->bond->dev, port->slave->dev, in __update_lacpdu_from_port()
787 port->actor_oper_port_state); in __update_lacpdu_from_port()
789 /* lacpdu->reserved_3_1 initialized in __update_lacpdu_from_port()
790 * lacpdu->tlv_type_partner_info initialized in __update_lacpdu_from_port()
791 * lacpdu->partner_information_length initialized in __update_lacpdu_from_port()
794 lacpdu->partner_system_priority = htons(partner->system_priority); in __update_lacpdu_from_port()
795 lacpdu->partner_system = partner->system; in __update_lacpdu_from_port()
796 lacpdu->partner_key = htons(partner->key); in __update_lacpdu_from_port()
797 lacpdu->partner_port_priority = htons(partner->port_priority); in __update_lacpdu_from_port()
798 lacpdu->partner_port = htons(partner->port_number); in __update_lacpdu_from_port()
799 lacpdu->partner_state = partner->port_state; in __update_lacpdu_from_port()
801 /* lacpdu->reserved_3_2 initialized in __update_lacpdu_from_port()
802 * lacpdu->tlv_type_collector_info initialized in __update_lacpdu_from_port()
803 * lacpdu->collector_information_length initialized in __update_lacpdu_from_port()
815 * ad_lacpdu_send - send out a lacpdu packet on a given port
823 struct slave *slave = port->slave; in ad_lacpdu_send() local
829 if (!skb) in ad_lacpdu_send()
830 return -ENOMEM; in ad_lacpdu_send()
832 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx); in ad_lacpdu_send()
833 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx); in ad_lacpdu_send()
835 skb->dev = slave->dev; in ad_lacpdu_send()
837 skb->network_header = skb->mac_header + ETH_HLEN; in ad_lacpdu_send()
838 skb->protocol = PKT_TYPE_LACPDU; in ad_lacpdu_send()
839 skb->priority = TC_PRIO_CONTROL; in ad_lacpdu_send()
843 ether_addr_copy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr); in ad_lacpdu_send()
847 ether_addr_copy(lacpdu_header->hdr.h_source, slave->perm_hwaddr); in ad_lacpdu_send()
848 lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_lacpdu_send()
850 lacpdu_header->lacpdu = port->lacpdu; in ad_lacpdu_send()
858 * ad_marker_send - send marker information/response on a given port
867 struct slave *slave = port->slave; in ad_marker_send() local
873 if (!skb) in ad_marker_send()
874 return -ENOMEM; in ad_marker_send()
876 switch (marker->tlv_type) { in ad_marker_send()
878 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx); in ad_marker_send()
879 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx); in ad_marker_send()
882 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx); in ad_marker_send()
883 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx); in ad_marker_send()
889 skb->dev = slave->dev; in ad_marker_send()
891 skb->network_header = skb->mac_header + ETH_HLEN; in ad_marker_send()
892 skb->protocol = PKT_TYPE_LACPDU; in ad_marker_send()
896 ether_addr_copy(marker_header->hdr.h_dest, lacpdu_mcast_addr); in ad_marker_send()
900 ether_addr_copy(marker_header->hdr.h_source, slave->perm_hwaddr); in ad_marker_send()
901 marker_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_marker_send()
903 marker_header->marker = *marker; in ad_marker_send()
911 * ad_mux_machine - handle a port's mux state machine
913 * @update_slave_arr: Does slave array need update?
919 /* keep current State Machine state to compare later if it was in ad_mux_machine()
922 last_state = port->sm_mux_state; in ad_mux_machine()
924 if (port->sm_vars & AD_PORT_BEGIN) { in ad_mux_machine()
925 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
927 switch (port->sm_mux_state) { in ad_mux_machine()
929 if ((port->sm_vars & AD_PORT_SELECTED) in ad_mux_machine()
930 || (port->sm_vars & AD_PORT_STANDBY)) in ad_mux_machine()
931 /* if SELECTED or STANDBY */ in ad_mux_machine()
932 port->sm_mux_state = AD_MUX_WAITING; in ad_mux_machine()
935 /* if SELECTED == FALSE return to DETACH state */ in ad_mux_machine()
936 if (!(port->sm_vars & AD_PORT_SELECTED)) { in ad_mux_machine()
937 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
943 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
944 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
948 /* check if the wait_while_timer expired */ in ad_mux_machine()
949 if (port->sm_mux_timer_counter in ad_mux_machine()
950 && !(--port->sm_mux_timer_counter)) in ad_mux_machine()
951 port->sm_vars |= AD_PORT_READY_N; in ad_mux_machine()
958 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
960 /* if the wait_while_timer expired, and the port is in ad_mux_machine()
963 if ((port->sm_vars & AD_PORT_READY) in ad_mux_machine()
964 && !port->sm_mux_timer_counter) in ad_mux_machine()
965 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
968 /* check also if agg_select_timer expired (so the in ad_mux_machine()
971 if ((port->sm_vars & AD_PORT_SELECTED) && in ad_mux_machine()
972 (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) && in ad_mux_machine()
974 if (port->aggregator->is_active) in ad_mux_machine()
975 port->sm_mux_state = in ad_mux_machine()
977 } else if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
978 (port->sm_vars & AD_PORT_STANDBY)) { in ad_mux_machine()
979 /* if UNSELECTED or STANDBY */ in ad_mux_machine()
980 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
986 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
987 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
988 } else if (port->aggregator->is_active) { in ad_mux_machine()
989 port->actor_oper_port_state |= in ad_mux_machine()
994 if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
995 (port->sm_vars & AD_PORT_STANDBY) || in ad_mux_machine()
996 !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) || in ad_mux_machine()
997 !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) { in ad_mux_machine()
998 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
1000 /* if port state hasn't changed make in ad_mux_machine()
1004 if (port->aggregator && in ad_mux_machine()
1005 port->aggregator->is_active && in ad_mux_machine()
1017 /* check if the state machine was changed */ in ad_mux_machine()
1018 if (port->sm_mux_state != last_state) { in ad_mux_machine()
1019 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_mux_machine()
1021 port->actor_port_number, in ad_mux_machine()
1023 port->sm_mux_state); in ad_mux_machine()
1024 switch (port->sm_mux_state) { in ad_mux_machine()
1026 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1029 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1030 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1031 port->ntt = true; in ad_mux_machine()
1034 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); in ad_mux_machine()
1037 if (port->aggregator->is_active) in ad_mux_machine()
1038 port->actor_oper_port_state |= in ad_mux_machine()
1041 port->actor_oper_port_state &= in ad_mux_machine()
1043 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1044 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1047 port->ntt = true; in ad_mux_machine()
1050 port->actor_oper_port_state |= LACP_STATE_COLLECTING; in ad_mux_machine()
1051 port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1052 port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1055 port->ntt = true; in ad_mux_machine()
1064 * ad_rx_machine - handle a port's rx State Machine
1068 * If lacpdu arrived, stop previous timer (if exists) and set the next state as
1069 * CURRENT. If timer expired set the state machine in the proper state.
1070 * In other cases, this function checks if we need to switch to other state.
1076 /* keep current State Machine state to compare later if it was in ad_rx_machine()
1079 last_state = port->sm_rx_state; in ad_rx_machine()
1081 if (lacpdu) { in ad_rx_machine()
1082 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx); in ad_rx_machine()
1083 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx); in ad_rx_machine()
1085 /* check if state machine should change state */ in ad_rx_machine()
1087 /* first, check if port was reinitialized */ in ad_rx_machine()
1088 if (port->sm_vars & AD_PORT_BEGIN) { in ad_rx_machine()
1089 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1090 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1091 /* check if port is not enabled */ in ad_rx_machine()
1092 } else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled) in ad_rx_machine()
1093 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1094 /* check if new lacpdu arrived */ in ad_rx_machine()
1095 else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || in ad_rx_machine()
1096 (port->sm_rx_state == AD_RX_DEFAULTED) || in ad_rx_machine()
1097 (port->sm_rx_state == AD_RX_CURRENT))) { in ad_rx_machine()
1098 if (port->sm_rx_state != AD_RX_CURRENT) in ad_rx_machine()
1099 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1100 port->sm_rx_timer_counter = 0; in ad_rx_machine()
1101 port->sm_rx_state = AD_RX_CURRENT; in ad_rx_machine()
1103 /* if timer is on, and if it is expired */ in ad_rx_machine()
1104 if (port->sm_rx_timer_counter && in ad_rx_machine()
1105 !(--port->sm_rx_timer_counter)) { in ad_rx_machine()
1106 switch (port->sm_rx_state) { in ad_rx_machine()
1108 port->sm_rx_state = AD_RX_DEFAULTED; in ad_rx_machine()
1111 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1117 /* if no lacpdu arrived and no timer is on */ in ad_rx_machine()
1118 switch (port->sm_rx_state) { in ad_rx_machine()
1120 if (port->is_enabled && in ad_rx_machine()
1121 (port->sm_vars & AD_PORT_LACP_ENABLED)) in ad_rx_machine()
1122 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1123 else if (port->is_enabled in ad_rx_machine()
1124 && ((port->sm_vars in ad_rx_machine()
1126 port->sm_rx_state = AD_RX_LACP_DISABLED; in ad_rx_machine()
1135 /* check if the State machine was changed or new lacpdu arrived */ in ad_rx_machine()
1136 if ((port->sm_rx_state != last_state) || (lacpdu)) { in ad_rx_machine()
1137 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_rx_machine()
1139 port->actor_port_number, in ad_rx_machine()
1141 port->sm_rx_state); in ad_rx_machine()
1142 switch (port->sm_rx_state) { in ad_rx_machine()
1144 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) in ad_rx_machine()
1145 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_rx_machine()
1147 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_rx_machine()
1148 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1150 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1151 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1155 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1158 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1160 port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION; in ad_rx_machine()
1161 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1162 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1168 * case of EXPIRED even if LINK_DOWN didn't arrive for in ad_rx_machine()
1171 port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_rx_machine()
1172 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1173 port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT; in ad_rx_machine()
1174 port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY; in ad_rx_machine()
1175 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); in ad_rx_machine()
1176 port->actor_oper_port_state |= LACP_STATE_EXPIRED; in ad_rx_machine()
1177 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1182 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1183 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1187 if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system), in ad_rx_machine()
1188 &(port->actor_system))) { in ad_rx_machine()
1189 slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n" in ad_rx_machine()
1196 …port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_por… in ad_rx_machine()
1197 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1206 * ad_churn_machine - handle port churn's state machine
1212 if (port->sm_vars & AD_PORT_CHURNED) { in ad_churn_machine()
1213 port->sm_vars &= ~AD_PORT_CHURNED; in ad_churn_machine()
1214 port->sm_churn_actor_state = AD_CHURN_MONITOR; in ad_churn_machine()
1215 port->sm_churn_partner_state = AD_CHURN_MONITOR; in ad_churn_machine()
1216 port->sm_churn_actor_timer_counter = in ad_churn_machine()
1218 port->sm_churn_partner_timer_counter = in ad_churn_machine()
1222 if (port->sm_churn_actor_timer_counter && in ad_churn_machine()
1223 !(--port->sm_churn_actor_timer_counter) && in ad_churn_machine()
1224 port->sm_churn_actor_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1225 if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1226 port->sm_churn_actor_state = AD_NO_CHURN; in ad_churn_machine()
1228 port->churn_actor_count++; in ad_churn_machine()
1229 port->sm_churn_actor_state = AD_CHURN; in ad_churn_machine()
1232 if (port->sm_churn_partner_timer_counter && in ad_churn_machine()
1233 !(--port->sm_churn_partner_timer_counter) && in ad_churn_machine()
1234 port->sm_churn_partner_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1235 if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1236 port->sm_churn_partner_state = AD_NO_CHURN; in ad_churn_machine()
1238 port->churn_partner_count++; in ad_churn_machine()
1239 port->sm_churn_partner_state = AD_CHURN; in ad_churn_machine()
1245 * ad_tx_machine - handle a port's tx state machine
1250 /* check if tx timer expired, to verify that we do not send more than in ad_tx_machine()
1253 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) { in ad_tx_machine()
1254 /* check if there is something to send */ in ad_tx_machine()
1255 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) { in ad_tx_machine()
1258 if (ad_lacpdu_send(port) >= 0) { in ad_tx_machine()
1259 slave_dbg(port->slave->bond->dev, in ad_tx_machine()
1260 port->slave->dev, in ad_tx_machine()
1262 port->actor_port_number); in ad_tx_machine()
1267 port->ntt = false; in ad_tx_machine()
1273 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in ad_tx_machine()
1278 * ad_periodic_machine - handle a port's periodic state machine
1287 /* keep current state machine state to compare later if it was changed */ in ad_periodic_machine()
1288 last_state = port->sm_periodic_state; in ad_periodic_machine()
1290 /* check if port was reinitialized */ in ad_periodic_machine()
1291 …if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabl… in ad_periodic_machine()
1292 …(!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LA… in ad_periodic_machine()
1294 port->sm_periodic_state = AD_NO_PERIODIC; in ad_periodic_machine()
1296 /* check if state machine should change state */ in ad_periodic_machine()
1297 else if (port->sm_periodic_timer_counter) { in ad_periodic_machine()
1298 /* check if periodic state machine expired */ in ad_periodic_machine()
1299 if (!(--port->sm_periodic_timer_counter)) { in ad_periodic_machine()
1300 /* if expired then do tx */ in ad_periodic_machine()
1301 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1303 /* If not expired, check if there is some new timeout in ad_periodic_machine()
1306 switch (port->sm_periodic_state) { in ad_periodic_machine()
1308 if (!(port->partner_oper.port_state in ad_periodic_machine()
1310 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1313 if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) { in ad_periodic_machine()
1314 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1315 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1323 switch (port->sm_periodic_state) { in ad_periodic_machine()
1325 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1328 if (!(port->partner_oper.port_state & in ad_periodic_machine()
1330 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1332 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1339 /* check if the state machine was changed */ in ad_periodic_machine()
1340 if (port->sm_periodic_state != last_state) { in ad_periodic_machine()
1341 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_periodic_machine()
1343 port->actor_port_number, last_state, in ad_periodic_machine()
1344 port->sm_periodic_state); in ad_periodic_machine()
1345 switch (port->sm_periodic_state) { in ad_periodic_machine()
1347 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1351 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TI… in ad_periodic_machine()
1355 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TI… in ad_periodic_machine()
1358 port->ntt = true; in ad_periodic_machine()
1367 * ad_port_selection_logic - select aggregation groups
1369 * @update_slave_arr: Does slave array need update?
1373 * and after every lacpdu receive (if selected is off).
1381 struct slave *slave; in ad_port_selection_logic() local
1384 /* if the port is already Selected, do nothing */ in ad_port_selection_logic()
1385 if (port->sm_vars & AD_PORT_SELECTED) in ad_port_selection_logic()
1390 /* if the port is connected to other aggregator, detach it */ in ad_port_selection_logic()
1391 if (port->aggregator) { in ad_port_selection_logic()
1393 temp_aggregator = port->aggregator; in ad_port_selection_logic()
1394 for (curr_port = temp_aggregator->lag_ports; curr_port; in ad_port_selection_logic()
1396 curr_port = curr_port->next_port_in_aggregator) { in ad_port_selection_logic()
1397 if (curr_port == port) { in ad_port_selection_logic()
1398 temp_aggregator->num_of_ports--; in ad_port_selection_logic()
1399 /* if it is the first port attached to the in ad_port_selection_logic()
1402 if (!last_port) { in ad_port_selection_logic()
1403 temp_aggregator->lag_ports = in ad_port_selection_logic()
1404 port->next_port_in_aggregator; in ad_port_selection_logic()
1409 last_port->next_port_in_aggregator = in ad_port_selection_logic()
1410 port->next_port_in_aggregator; in ad_port_selection_logic()
1416 port->aggregator = NULL; in ad_port_selection_logic()
1417 port->next_port_in_aggregator = NULL; in ad_port_selection_logic()
1418 port->actor_port_aggregator_identifier = 0; in ad_port_selection_logic()
1420 slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n", in ad_port_selection_logic()
1421 port->actor_port_number, in ad_port_selection_logic()
1422 temp_aggregator->aggregator_identifier); in ad_port_selection_logic()
1423 /* if the aggregator is empty, clear its in ad_port_selection_logic()
1426 if (!temp_aggregator->lag_ports) in ad_port_selection_logic()
1431 if (!curr_port) { in ad_port_selection_logic()
1435 …net_warn_ratelimited("%s: (slave %s): Warning: Port %d was related to aggregator %d but was not on… in ad_port_selection_logic()
1436 port->slave->bond->dev->name, in ad_port_selection_logic()
1437 port->slave->dev->name, in ad_port_selection_logic()
1438 port->actor_port_number, in ad_port_selection_logic()
1439 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1443 bond_for_each_slave(bond, slave, iter) { in ad_port_selection_logic()
1444 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in ad_port_selection_logic()
1446 /* keep a free aggregator for later use(if needed) */ in ad_port_selection_logic()
1447 if (!aggregator->lag_ports) { in ad_port_selection_logic()
1448 if (!free_aggregator) in ad_port_selection_logic()
1452 /* check if current aggregator suits us */ in ad_port_selection_logic()
1453 …if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters … in ad_port_selection_logic()
1454 MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) && in ad_port_selection_logic()
1455 (aggregator->partner_system_priority == port->partner_oper.system_priority) && in ad_port_selection_logic()
1456 (aggregator->partner_oper_aggregator_key == port->partner_oper.key) in ad_port_selection_logic()
1458 ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */ in ad_port_selection_logic()
1459 !aggregator->is_individual) /* but is not individual OR */ in ad_port_selection_logic()
1463 port->aggregator = aggregator; in ad_port_selection_logic()
1464 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1465 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1466 port->next_port_in_aggregator = aggregator->lag_ports; in ad_port_selection_logic()
1467 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1468 aggregator->lag_ports = port; in ad_port_selection_logic()
1469 slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n", in ad_port_selection_logic()
1470 port->actor_port_number, in ad_port_selection_logic()
1471 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1474 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1480 /* the port couldn't find an aggregator - attach it to a new in ad_port_selection_logic()
1483 if (!found) { in ad_port_selection_logic()
1484 if (free_aggregator) { in ad_port_selection_logic()
1486 port->aggregator = free_aggregator; in ad_port_selection_logic()
1487 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1488 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1491 * if port was responsed from the end-user in ad_port_selection_logic()
1493 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS) in ad_port_selection_logic()
1494 /* if port is full duplex */ in ad_port_selection_logic()
1495 port->aggregator->is_individual = false; in ad_port_selection_logic()
1497 port->aggregator->is_individual = true; in ad_port_selection_logic()
1499 port->aggregator->actor_admin_aggregator_key = in ad_port_selection_logic()
1500 port->actor_admin_port_key; in ad_port_selection_logic()
1501 port->aggregator->actor_oper_aggregator_key = in ad_port_selection_logic()
1502 port->actor_oper_port_key; in ad_port_selection_logic()
1503 port->aggregator->partner_system = in ad_port_selection_logic()
1504 port->partner_oper.system; in ad_port_selection_logic()
1505 port->aggregator->partner_system_priority = in ad_port_selection_logic()
1506 port->partner_oper.system_priority; in ad_port_selection_logic()
1507 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key; in ad_port_selection_logic()
1508 port->aggregator->receive_state = 1; in ad_port_selection_logic()
1509 port->aggregator->transmit_state = 1; in ad_port_selection_logic()
1510 port->aggregator->lag_ports = port; in ad_port_selection_logic()
1511 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1514 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1516 slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n", in ad_port_selection_logic()
1517 port->actor_port_number, in ad_port_selection_logic()
1518 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1520 slave_err(bond->dev, port->slave->dev, in ad_port_selection_logic()
1522 port->actor_port_number); in ad_port_selection_logic()
1525 /* if all aggregator's ports are READY_N == TRUE, set ready=TRUE in ad_port_selection_logic()
1529 __set_agg_ports_ready(port->aggregator, in ad_port_selection_logic()
1530 __agg_ports_are_ready(port->aggregator)); in ad_port_selection_logic()
1535 if (!port->aggregator->is_active) in ad_port_selection_logic()
1536 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_port_selection_logic()
1539 /* Decide if "agg" is a better choice for the new active aggregator that
1545 /* 0. If no best, select current. in ad_agg_selection_test()
1547 * 1. If the current agg is not individual, and the best is in ad_agg_selection_test()
1550 * 2. If current agg is individual and the best is not, keep best. in ad_agg_selection_test()
1555 * 3a. If current agg partner replied, and best agg partner did not, in ad_agg_selection_test()
1558 * 3b. If current agg partner did not reply and best agg partner in ad_agg_selection_test()
1564 * BOND_AD_COUNT: Select by count of ports. If count is equal, in ad_agg_selection_test()
1569 if (!best) in ad_agg_selection_test()
1572 if (!curr->is_individual && best->is_individual) in ad_agg_selection_test()
1575 if (curr->is_individual && !best->is_individual) in ad_agg_selection_test()
1578 if (__agg_has_partner(curr) && !__agg_has_partner(best)) in ad_agg_selection_test()
1581 if (!__agg_has_partner(curr) && __agg_has_partner(best)) in ad_agg_selection_test()
1584 switch (__get_agg_selection_mode(curr->lag_ports)) { in ad_agg_selection_test()
1586 if (__agg_active_ports(curr) > __agg_active_ports(best)) in ad_agg_selection_test()
1589 if (__agg_active_ports(curr) < __agg_active_ports(best)) in ad_agg_selection_test()
1595 if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best)) in ad_agg_selection_test()
1601 net_warn_ratelimited("%s: (slave %s): Impossible agg select mode %d\n", in ad_agg_selection_test()
1602 curr->slave->bond->dev->name, in ad_agg_selection_test()
1603 curr->slave->dev->name, in ad_agg_selection_test()
1604 __get_agg_selection_mode(curr->lag_ports)); in ad_agg_selection_test()
1613 struct port *port = agg->lag_ports; in agg_device_up()
1615 if (!port) in agg_device_up()
1618 for (port = agg->lag_ports; port; in agg_device_up()
1619 port = port->next_port_in_aggregator) { in agg_device_up()
1620 if (netif_running(port->slave->dev) && in agg_device_up()
1621 netif_carrier_ok(port->slave->dev)) in agg_device_up()
1629 * ad_agg_selection_logic - select an aggregation group for a team
1631 * @update_slave_arr: Does slave array need update?
1639 * it, and to reselect the active aggregator only if the previous
1658 struct bonding *bond = agg->slave->bond; in ad_agg_selection_logic()
1660 struct slave *slave; in ad_agg_selection_logic() local
1668 bond_for_each_slave_rcu(bond, slave, iter) { in ad_agg_selection_logic()
1669 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1671 agg->is_active = 0; in ad_agg_selection_logic()
1673 if (__agg_active_ports(agg) && agg_device_up(agg)) in ad_agg_selection_logic()
1677 if (best && in ad_agg_selection_logic()
1678 __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) { in ad_agg_selection_logic()
1680 * aggregator if it's still active (it has an answering in ad_agg_selection_logic()
1681 * partner) or if both the best and active don't have an in ad_agg_selection_logic()
1684 if (active && active->lag_ports && in ad_agg_selection_logic()
1689 if (!(!active->actor_oper_aggregator_key && in ad_agg_selection_logic()
1690 best->actor_oper_aggregator_key)) { in ad_agg_selection_logic()
1692 active->is_active = 1; in ad_agg_selection_logic()
1697 if (best && (best == active)) { in ad_agg_selection_logic()
1699 active->is_active = 1; in ad_agg_selection_logic()
1702 /* if there is new best aggregator, activate it */ in ad_agg_selection_logic()
1703 if (best) { in ad_agg_selection_logic()
1704 netdev_dbg(bond->dev, "(slave %s): best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", in ad_agg_selection_logic()
1705 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1706 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1707 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1708 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1709 best->is_individual, best->is_active); in ad_agg_selection_logic()
1710 netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n", in ad_agg_selection_logic()
1711 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1712 best->lag_ports, best->slave); in ad_agg_selection_logic()
1714 bond_for_each_slave_rcu(bond, slave, iter) { in ad_agg_selection_logic()
1715 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1717 slave_dbg(bond->dev, slave->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", in ad_agg_selection_logic()
1718 agg->aggregator_identifier, agg->num_of_ports, in ad_agg_selection_logic()
1719 agg->actor_oper_aggregator_key, in ad_agg_selection_logic()
1720 agg->partner_oper_aggregator_key, in ad_agg_selection_logic()
1721 agg->is_individual, agg->is_active); in ad_agg_selection_logic()
1724 /* check if any partner replies */ in ad_agg_selection_logic()
1725 if (best->is_individual) in ad_agg_selection_logic()
1727 bond->dev->name); in ad_agg_selection_logic()
1729 best->is_active = 1; in ad_agg_selection_logic()
1730 netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n", in ad_agg_selection_logic()
1731 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1732 best->aggregator_identifier); in ad_agg_selection_logic()
1733 netdev_dbg(bond->dev, "(slave %s): Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", in ad_agg_selection_logic()
1734 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1735 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1736 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1737 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1738 best->is_individual, best->is_active); in ad_agg_selection_logic()
1743 if (active) { in ad_agg_selection_logic()
1744 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1745 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1749 /* Slave array needs update. */ in ad_agg_selection_logic()
1753 /* if the selected aggregator is of join individuals in ad_agg_selection_logic()
1758 if (active) { in ad_agg_selection_logic()
1759 if (!__agg_has_partner(active)) { in ad_agg_selection_logic()
1760 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1761 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1774 * ad_clear_agg - clear a given aggregator's parameters
1779 if (aggregator) { in ad_clear_agg()
1780 aggregator->is_individual = false; in ad_clear_agg()
1781 aggregator->actor_admin_aggregator_key = 0; in ad_clear_agg()
1782 aggregator->actor_oper_aggregator_key = 0; in ad_clear_agg()
1783 eth_zero_addr(aggregator->partner_system.mac_addr_value); in ad_clear_agg()
1784 aggregator->partner_system_priority = 0; in ad_clear_agg()
1785 aggregator->partner_oper_aggregator_key = 0; in ad_clear_agg()
1786 aggregator->receive_state = 0; in ad_clear_agg()
1787 aggregator->transmit_state = 0; in ad_clear_agg()
1788 aggregator->lag_ports = NULL; in ad_clear_agg()
1789 aggregator->is_active = 0; in ad_clear_agg()
1790 aggregator->num_of_ports = 0; in ad_clear_agg()
1792 aggregator->slave ? in ad_clear_agg()
1793 aggregator->slave->dev->name : "NULL", in ad_clear_agg()
1794 aggregator->aggregator_identifier); in ad_clear_agg()
1799 * ad_initialize_agg - initialize a given aggregator's parameters
1804 if (aggregator) { in ad_initialize_agg()
1807 eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value); in ad_initialize_agg()
1808 aggregator->aggregator_identifier = 0; in ad_initialize_agg()
1809 aggregator->slave = NULL; in ad_initialize_agg()
1814 * ad_initialize_port - initialize a given port's parameters
1839 if (port) { in ad_initialize_port()
1840 port->actor_port_priority = 0xff; in ad_initialize_port()
1841 port->actor_port_aggregator_identifier = 0; in ad_initialize_port()
1842 port->ntt = false; in ad_initialize_port()
1843 port->actor_admin_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1845 port->actor_oper_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1848 if (lacp_fast) in ad_initialize_port()
1849 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in ad_initialize_port()
1851 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1852 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1854 port->is_enabled = true; in ad_initialize_port()
1856 port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED; in ad_initialize_port()
1857 port->sm_rx_state = 0; in ad_initialize_port()
1858 port->sm_rx_timer_counter = 0; in ad_initialize_port()
1859 port->sm_periodic_state = 0; in ad_initialize_port()
1860 port->sm_periodic_timer_counter = 0; in ad_initialize_port()
1861 port->sm_mux_state = 0; in ad_initialize_port()
1862 port->sm_mux_timer_counter = 0; in ad_initialize_port()
1863 port->sm_tx_state = 0; in ad_initialize_port()
1864 port->aggregator = NULL; in ad_initialize_port()
1865 port->next_port_in_aggregator = NULL; in ad_initialize_port()
1866 port->transaction_id = 0; in ad_initialize_port()
1868 port->sm_churn_actor_timer_counter = 0; in ad_initialize_port()
1869 port->sm_churn_actor_state = 0; in ad_initialize_port()
1870 port->churn_actor_count = 0; in ad_initialize_port()
1871 port->sm_churn_partner_timer_counter = 0; in ad_initialize_port()
1872 port->sm_churn_partner_state = 0; in ad_initialize_port()
1873 port->churn_partner_count = 0; in ad_initialize_port()
1875 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu)); in ad_initialize_port()
1880 * ad_enable_collecting_distributing - enable a port's transmit/receive
1882 * @update_slave_arr: Does slave array need update?
1884 * Enable @port if it's in an active aggregator
1889 if (port->aggregator->is_active) { in ad_enable_collecting_distributing()
1890 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_enable_collecting_distributing()
1892 port->actor_port_number, in ad_enable_collecting_distributing()
1893 port->aggregator->aggregator_identifier); in ad_enable_collecting_distributing()
1895 /* Slave array needs update */ in ad_enable_collecting_distributing()
1901 * ad_disable_collecting_distributing - disable a port's transmit/receive
1903 * @update_slave_arr: Does slave array need update?
1908 if (port->aggregator && in ad_disable_collecting_distributing()
1909 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), in ad_disable_collecting_distributing()
1911 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_disable_collecting_distributing()
1913 port->actor_port_number, in ad_disable_collecting_distributing()
1914 port->aggregator->aggregator_identifier); in ad_disable_collecting_distributing()
1916 /* Slave array needs an update */ in ad_disable_collecting_distributing()
1922 * ad_marker_info_received - handle receive of a Marker information frame
1931 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx); in ad_marker_info_received()
1932 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx); in ad_marker_info_received()
1940 if (ad_marker_send(port, &marker) >= 0) in ad_marker_info_received()
1941 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_marker_info_received()
1943 port->actor_port_number); in ad_marker_info_received()
1947 * ad_marker_response_received - handle receive of a marker response frame
1958 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx); in ad_marker_response_received()
1959 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx); in ad_marker_response_received()
1970 * bond_3ad_initiate_agg_selection - initate aggregator selection
1984 * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
1994 bond->params.ad_actor_sys_prio; in bond_3ad_initialize()
1995 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_initialize()
1997 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_initialize()
2000 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_initialize()
2013 * bond_3ad_bind_slave - initialize a slave's port
2014 * @slave: slave struct to work on
2019 void bond_3ad_bind_slave(struct slave *slave) in bond_3ad_bind_slave() argument
2021 struct bonding *bond = bond_get_bond_by_slave(slave); in bond_3ad_bind_slave()
2025 /* check that the slave has not been initialized yet. */ in bond_3ad_bind_slave()
2026 if (SLAVE_AD_INFO(slave)->port.slave != slave) { in bond_3ad_bind_slave()
2029 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_bind_slave()
2031 ad_initialize_port(port, bond->params.lacp_fast); in bond_3ad_bind_slave()
2033 port->slave = slave; in bond_3ad_bind_slave()
2034 port->actor_port_number = SLAVE_AD_INFO(slave)->id; in bond_3ad_bind_slave()
2038 port->actor_admin_port_key = bond->params.ad_user_port_key << 6; in bond_3ad_bind_slave()
2045 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in bond_3ad_bind_slave()
2050 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_bind_slave()
2054 aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_bind_slave()
2055 aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier; in bond_3ad_bind_slave()
2056 aggregator->slave = slave; in bond_3ad_bind_slave()
2057 aggregator->is_active = 0; in bond_3ad_bind_slave()
2058 aggregator->num_of_ports = 0; in bond_3ad_bind_slave()
2063 * bond_3ad_unbind_slave - deinitialize a slave's port
2064 * @slave: slave struct to work on
2068 * (if any), and remove the port.
2070 void bond_3ad_unbind_slave(struct slave *slave) in bond_3ad_unbind_slave() argument
2075 struct bonding *bond = slave->bond; in bond_3ad_unbind_slave()
2076 struct slave *slave_iter; in bond_3ad_unbind_slave()
2081 spin_lock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2082 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_unbind_slave()
2083 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_unbind_slave()
2085 /* if slave is null, the whole port is not initialized */ in bond_3ad_unbind_slave()
2086 if (!port->slave) { in bond_3ad_unbind_slave()
2087 slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n"); in bond_3ad_unbind_slave()
2091 slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n", in bond_3ad_unbind_slave()
2092 aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2095 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in bond_3ad_unbind_slave()
2096 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in bond_3ad_unbind_slave()
2097 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in bond_3ad_unbind_slave()
2098 port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION; in bond_3ad_unbind_slave()
2102 /* check if this aggregator is occupied */ in bond_3ad_unbind_slave()
2103 if (aggregator->lag_ports) { in bond_3ad_unbind_slave()
2104 /* check if there are other ports related to this aggregator in bond_3ad_unbind_slave()
2105 * except the port related to this slave(thats ensure us that in bond_3ad_unbind_slave()
2109 if ((aggregator->lag_ports != port) || in bond_3ad_unbind_slave()
2110 (aggregator->lag_ports->next_port_in_aggregator)) { in bond_3ad_unbind_slave()
2113 new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2114 /* if the new aggregator is empty, or it is in bond_3ad_unbind_slave()
2117 if (!new_aggregator->lag_ports || in bond_3ad_unbind_slave()
2118 ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2119 !new_aggregator->lag_ports->next_port_in_aggregator)) in bond_3ad_unbind_slave()
2122 if (!slave_iter) in bond_3ad_unbind_slave()
2125 /* if new aggregator found, copy the aggregator's in bond_3ad_unbind_slave()
2129 …if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !… in bond_3ad_unbind_slave()
2130 slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n", in bond_3ad_unbind_slave()
2131 aggregator->aggregator_identifier, in bond_3ad_unbind_slave()
2132 new_aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2134 if ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2135 new_aggregator->is_active) { in bond_3ad_unbind_slave()
2136 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2140 new_aggregator->is_individual = aggregator->is_individual; in bond_3ad_unbind_slave()
2141 new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key; in bond_3ad_unbind_slave()
2142 new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key; in bond_3ad_unbind_slave()
2143 new_aggregator->partner_system = aggregator->partner_system; in bond_3ad_unbind_slave()
2144 new_aggregator->partner_system_priority = aggregator->partner_system_priority; in bond_3ad_unbind_slave()
2145 new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key; in bond_3ad_unbind_slave()
2146 new_aggregator->receive_state = aggregator->receive_state; in bond_3ad_unbind_slave()
2147 new_aggregator->transmit_state = aggregator->transmit_state; in bond_3ad_unbind_slave()
2148 new_aggregator->lag_ports = aggregator->lag_ports; in bond_3ad_unbind_slave()
2149 new_aggregator->is_active = aggregator->is_active; in bond_3ad_unbind_slave()
2150 new_aggregator->num_of_ports = aggregator->num_of_ports; in bond_3ad_unbind_slave()
2155 for (temp_port = aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2156 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2157 temp_port->aggregator = new_aggregator; in bond_3ad_unbind_slave()
2158 temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier; in bond_3ad_unbind_slave()
2163 if (select_new_active_agg) in bond_3ad_unbind_slave()
2167 …slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for i… in bond_3ad_unbind_slave()
2173 select_new_active_agg = aggregator->is_active; in bond_3ad_unbind_slave()
2175 if (select_new_active_agg) { in bond_3ad_unbind_slave()
2176 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2179 if (temp_aggregator) in bond_3ad_unbind_slave()
2186 slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number); in bond_3ad_unbind_slave()
2190 temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2193 for (temp_port = temp_aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2195 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2196 if (temp_port == port) { in bond_3ad_unbind_slave()
2197 /* the aggregator found - detach the port from in bond_3ad_unbind_slave()
2200 if (prev_port) in bond_3ad_unbind_slave()
2201 prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2203 temp_aggregator->lag_ports = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2204 temp_aggregator->num_of_ports--; in bond_3ad_unbind_slave()
2205 if (__agg_active_ports(temp_aggregator) == 0) { in bond_3ad_unbind_slave()
2206 select_new_active_agg = temp_aggregator->is_active; in bond_3ad_unbind_slave()
2207 if (temp_aggregator->num_of_ports == 0) in bond_3ad_unbind_slave()
2209 if (select_new_active_agg) { in bond_3ad_unbind_slave()
2210 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2220 port->slave = NULL; in bond_3ad_unbind_slave()
2223 spin_unlock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2227 * bond_3ad_update_ad_actor_settings - reflect change of actor settings to ports
2230 * If an ad_actor setting gets changed we need to update the individual port
2236 struct slave *slave; in bond_3ad_update_ad_actor_settings() local
2240 BOND_AD_INFO(bond).system.sys_priority = bond->params.ad_actor_sys_prio; in bond_3ad_update_ad_actor_settings()
2241 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_update_ad_actor_settings()
2243 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_update_ad_actor_settings()
2246 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_update_ad_actor_settings()
2248 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2249 bond_for_each_slave(bond, slave, iter) { in bond_3ad_update_ad_actor_settings()
2250 struct port *port = &(SLAVE_AD_INFO(slave))->port; in bond_3ad_update_ad_actor_settings()
2253 port->ntt = true; in bond_3ad_update_ad_actor_settings()
2255 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2259 * bond_agg_timer_advance - advance agg_select_timer
2270 if (!val) in bond_agg_timer_advance()
2272 nval = val - 1; in bond_agg_timer_advance()
2273 if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer, in bond_agg_timer_advance()
2281 * bond_3ad_state_machine_handler - handle state machines timeout
2299 struct slave *slave; in bond_3ad_state_machine_handler() local
2304 /* Lock to protect data accessed by all (e.g., port->sm_vars) and in bond_3ad_state_machine_handler()
2308 spin_lock_bh(&bond->mode_lock); in bond_3ad_state_machine_handler()
2311 /* check if there are any slaves */ in bond_3ad_state_machine_handler()
2312 if (!bond_has_slaves(bond)) in bond_3ad_state_machine_handler()
2315 if (bond_agg_timer_advance(bond)) { in bond_3ad_state_machine_handler()
2316 slave = bond_first_slave_rcu(bond); in bond_3ad_state_machine_handler()
2317 port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; in bond_3ad_state_machine_handler()
2320 if (port) { in bond_3ad_state_machine_handler()
2321 if (!port->slave) { in bond_3ad_state_machine_handler()
2323 bond->dev->name); in bond_3ad_state_machine_handler()
2334 bond_for_each_slave_rcu(bond, slave, iter) { in bond_3ad_state_machine_handler()
2335 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_state_machine_handler()
2336 if (!port->slave) { in bond_3ad_state_machine_handler()
2338 bond->dev->name); in bond_3ad_state_machine_handler()
2350 if (port->sm_vars & AD_PORT_BEGIN) in bond_3ad_state_machine_handler()
2351 port->sm_vars &= ~AD_PORT_BEGIN; in bond_3ad_state_machine_handler()
2355 bond_for_each_slave_rcu(bond, slave, iter) { in bond_3ad_state_machine_handler()
2356 if (slave->should_notify) { in bond_3ad_state_machine_handler()
2362 spin_unlock_bh(&bond->mode_lock); in bond_3ad_state_machine_handler()
2364 if (update_slave_arr) in bond_3ad_state_machine_handler()
2367 if (should_notify_rtnl && rtnl_trylock()) { in bond_3ad_state_machine_handler()
2371 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); in bond_3ad_state_machine_handler()
2375 * bond_3ad_rx_indication - handle a received frame
2377 * @slave: slave struct to work on
2383 static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave) in bond_3ad_rx_indication() argument
2385 struct bonding *bond = slave->bond; in bond_3ad_rx_indication()
2391 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_rx_indication()
2392 if (!port->slave) { in bond_3ad_rx_indication()
2393 net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n", in bond_3ad_rx_indication()
2394 slave->dev->name, slave->bond->dev->name); in bond_3ad_rx_indication()
2398 switch (lacpdu->subtype) { in bond_3ad_rx_indication()
2401 slave_dbg(slave->bond->dev, slave->dev, in bond_3ad_rx_indication()
2403 port->actor_port_number); in bond_3ad_rx_indication()
2405 spin_lock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2407 spin_unlock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2415 switch (marker->tlv_type) { in bond_3ad_rx_indication()
2417 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n", in bond_3ad_rx_indication()
2418 port->actor_port_number); in bond_3ad_rx_indication()
2422 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n", in bond_3ad_rx_indication()
2423 port->actor_port_number); in bond_3ad_rx_indication()
2427 slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n", in bond_3ad_rx_indication()
2428 port->actor_port_number); in bond_3ad_rx_indication()
2429 stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx; in bond_3ad_rx_indication()
2436 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx); in bond_3ad_rx_indication()
2444 * ad_update_actor_keys - Update the oper / admin keys for a port based on
2458 u16 old_oper_key = port->actor_oper_port_key; in ad_update_actor_keys()
2460 port->actor_admin_port_key &= ~(AD_SPEED_KEY_MASKS|AD_DUPLEX_KEY_MASKS); in ad_update_actor_keys()
2461 if (!reset) { in ad_update_actor_keys()
2465 port->actor_admin_port_key |= (speed << 1) | duplex; in ad_update_actor_keys()
2467 port->actor_oper_port_key = port->actor_admin_port_key; in ad_update_actor_keys()
2469 if (old_oper_key != port->actor_oper_port_key) { in ad_update_actor_keys()
2471 if (duplex) in ad_update_actor_keys()
2472 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2474 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2476 if (!reset) { in ad_update_actor_keys()
2477 if (!speed) { in ad_update_actor_keys()
2478 slave_err(port->slave->bond->dev, in ad_update_actor_keys()
2479 port->slave->dev, in ad_update_actor_keys()
2481 port->actor_port_number); in ad_update_actor_keys()
2482 } else if (duplex && ospeed != speed) { in ad_update_actor_keys()
2483 /* Speed change restarts LACP state-machine */ in ad_update_actor_keys()
2484 port->sm_vars |= AD_PORT_BEGIN; in ad_update_actor_keys()
2491 * bond_3ad_adapter_speed_duplex_changed - handle a slave's speed / duplex
2494 * @slave: slave struct to work on
2496 * Handle reselection of aggregator (if needed) for this port.
2498 void bond_3ad_adapter_speed_duplex_changed(struct slave *slave) in bond_3ad_adapter_speed_duplex_changed() argument
2502 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_adapter_speed_duplex_changed()
2504 /* if slave is null, the whole port is not initialized */ in bond_3ad_adapter_speed_duplex_changed()
2505 if (!port->slave) { in bond_3ad_adapter_speed_duplex_changed()
2506 slave_warn(slave->bond->dev, slave->dev, in bond_3ad_adapter_speed_duplex_changed()
2511 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2513 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2514 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n", in bond_3ad_adapter_speed_duplex_changed()
2515 port->actor_port_number); in bond_3ad_adapter_speed_duplex_changed()
2519 * bond_3ad_handle_link_change - handle a slave's link status change indication
2520 * @slave: slave struct to work on
2523 * Handle reselection of aggregator (if needed) for this port.
2525 void bond_3ad_handle_link_change(struct slave *slave, char link) in bond_3ad_handle_link_change() argument
2531 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_handle_link_change()
2533 /* if slave is null, the whole port is not initialized */ in bond_3ad_handle_link_change()
2534 if (!port->slave) { in bond_3ad_handle_link_change()
2535 slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n"); in bond_3ad_handle_link_change()
2539 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2547 if (link == BOND_LINK_UP) { in bond_3ad_handle_link_change()
2548 port->is_enabled = true; in bond_3ad_handle_link_change()
2552 port->is_enabled = false; in bond_3ad_handle_link_change()
2558 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2560 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n", in bond_3ad_handle_link_change()
2561 port->actor_port_number, in bond_3ad_handle_link_change()
2567 bond_update_slave_arr(slave->bond, NULL); in bond_3ad_handle_link_change()
2571 * bond_3ad_set_carrier - set link state for bonding master
2574 * if we have an active aggregator, we're up, if not, we're down.
2575 * Presumes that we cannot have an active aggregator if there are
2580 * Called by bond_set_carrier(). Return zero if carrier state does not
2581 * change, nonzero if it does.
2586 struct slave *first_slave; in bond_3ad_set_carrier()
2591 if (!first_slave) { in bond_3ad_set_carrier()
2595 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator)); in bond_3ad_set_carrier()
2596 if (active) { in bond_3ad_set_carrier()
2598 if (__agg_active_ports(active) < bond->params.min_links) { in bond_3ad_set_carrier()
2599 if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2600 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2603 } else if (!netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2604 netif_carrier_on(bond->dev); in bond_3ad_set_carrier()
2607 } else if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2608 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2616 * __bond_3ad_get_active_agg_info - get information of the active aggregator
2628 struct slave *slave; in __bond_3ad_get_active_agg_info() local
2631 bond_for_each_slave_rcu(bond, slave, iter) { in __bond_3ad_get_active_agg_info()
2632 port = &(SLAVE_AD_INFO(slave)->port); in __bond_3ad_get_active_agg_info()
2633 if (port->aggregator && port->aggregator->is_active) { in __bond_3ad_get_active_agg_info()
2634 aggregator = port->aggregator; in __bond_3ad_get_active_agg_info()
2639 if (!aggregator) in __bond_3ad_get_active_agg_info()
2640 return -1; in __bond_3ad_get_active_agg_info()
2642 ad_info->aggregator_id = aggregator->aggregator_identifier; in __bond_3ad_get_active_agg_info()
2643 ad_info->ports = __agg_active_ports(aggregator); in __bond_3ad_get_active_agg_info()
2644 ad_info->actor_key = aggregator->actor_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2645 ad_info->partner_key = aggregator->partner_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2646 ether_addr_copy(ad_info->partner_system, in __bond_3ad_get_active_agg_info()
2647 aggregator->partner_system.mac_addr_value); in __bond_3ad_get_active_agg_info()
2663 struct slave *slave) in bond_3ad_lacpdu_recv() argument
2667 if (skb->protocol != PKT_TYPE_LACPDU) in bond_3ad_lacpdu_recv()
2670 if (!MAC_ADDRESS_EQUAL(eth_hdr(skb)->h_dest, lacpdu_mcast_addr)) in bond_3ad_lacpdu_recv()
2674 if (!lacpdu) { in bond_3ad_lacpdu_recv()
2675 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx); in bond_3ad_lacpdu_recv()
2680 return bond_3ad_rx_indication(lacpdu, slave); in bond_3ad_lacpdu_recv()
2684 * bond_3ad_update_lacp_rate - change the lacp rate
2690 * Hold bond->mode_lock,
2691 * so we can modify port->actor_oper_port_state,
2698 struct slave *slave; in bond_3ad_update_lacp_rate() local
2701 lacp_fast = bond->params.lacp_fast; in bond_3ad_update_lacp_rate()
2702 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2703 bond_for_each_slave(bond, slave, iter) { in bond_3ad_update_lacp_rate()
2704 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_update_lacp_rate()
2705 if (lacp_fast) in bond_3ad_update_lacp_rate()
2706 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2708 port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2710 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2730 val = atomic64_read(&stats->lacpdu_rx); in bond_3ad_stats_fill()
2731 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_RX, val, in bond_3ad_stats_fill()
2733 return -EMSGSIZE; in bond_3ad_stats_fill()
2734 val = atomic64_read(&stats->lacpdu_tx); in bond_3ad_stats_fill()
2735 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_TX, val, in bond_3ad_stats_fill()
2737 return -EMSGSIZE; in bond_3ad_stats_fill()
2738 val = atomic64_read(&stats->lacpdu_unknown_rx); in bond_3ad_stats_fill()
2739 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_UNKNOWN_RX, val, in bond_3ad_stats_fill()
2741 return -EMSGSIZE; in bond_3ad_stats_fill()
2742 val = atomic64_read(&stats->lacpdu_illegal_rx); in bond_3ad_stats_fill()
2743 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_ILLEGAL_RX, val, in bond_3ad_stats_fill()
2745 return -EMSGSIZE; in bond_3ad_stats_fill()
2747 val = atomic64_read(&stats->marker_rx); in bond_3ad_stats_fill()
2748 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RX, val, in bond_3ad_stats_fill()
2750 return -EMSGSIZE; in bond_3ad_stats_fill()
2751 val = atomic64_read(&stats->marker_tx); in bond_3ad_stats_fill()
2752 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_TX, val, in bond_3ad_stats_fill()
2754 return -EMSGSIZE; in bond_3ad_stats_fill()
2755 val = atomic64_read(&stats->marker_resp_rx); in bond_3ad_stats_fill()
2756 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_RX, val, in bond_3ad_stats_fill()
2758 return -EMSGSIZE; in bond_3ad_stats_fill()
2759 val = atomic64_read(&stats->marker_resp_tx); in bond_3ad_stats_fill()
2760 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_TX, val, in bond_3ad_stats_fill()
2762 return -EMSGSIZE; in bond_3ad_stats_fill()
2763 val = atomic64_read(&stats->marker_unknown_rx); in bond_3ad_stats_fill()
2764 if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_UNKNOWN_RX, val, in bond_3ad_stats_fill()
2766 return -EMSGSIZE; in bond_3ad_stats_fill()