Lines Matching +full:current +full:- +full:speed

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
50 * key is determined according to the link speed, duplex and
52 * --------------------------------------------------------------
53 * Port key | User key (10 bits) | Speed (5 bits) | Duplex|
54 * --------------------------------------------------------------
118 * __get_bond_by_port - get the port's bonding struct
125 if (port->slave == NULL) in __get_bond_by_port()
128 return bond_get_bond_by_slave(port->slave); in __get_bond_by_port()
132 * __get_first_agg - get the first aggregator in the bond
151 agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL; in __get_first_agg()
158 * __agg_has_partner - see if we have a partner
161 * Return nonzero if aggregator has a partner (denoted by a non-zero ether
166 return !is_zero_ether_addr(agg->partner_system.mac_addr_value); in __agg_has_partner()
170 * __disable_port - disable the port's slave
175 bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); in __disable_port()
179 * __enable_port - enable the port's slave, if it's up
184 struct slave *slave = port->slave; in __enable_port()
186 if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave)) in __enable_port()
191 * __port_is_enabled - check if the port's slave is in active state
196 return bond_is_active_slave(port->slave); in __port_is_enabled()
200 * __get_agg_selection_mode - get the aggregator selection mode
212 return bond->params.ad_select; in __get_agg_selection_mode()
216 * __check_agg_selection_timer - check if the selection timer has expired
230 * __get_link_speed - get a port's speed
233 * Return @port's speed in 802.3ad enum format. i.e. one of:
251 struct slave *slave = port->slave; in __get_link_speed()
252 u16 speed; in __get_link_speed() local
255 * with link down, it sets the speed to 0. in __get_link_speed()
259 if (slave->link != BOND_LINK_UP) in __get_link_speed()
260 speed = 0; in __get_link_speed()
262 switch (slave->speed) { in __get_link_speed()
264 speed = AD_LINK_SPEED_10MBPS; in __get_link_speed()
268 speed = AD_LINK_SPEED_100MBPS; in __get_link_speed()
272 speed = AD_LINK_SPEED_1000MBPS; in __get_link_speed()
276 speed = AD_LINK_SPEED_2500MBPS; in __get_link_speed()
280 speed = AD_LINK_SPEED_5000MBPS; in __get_link_speed()
284 speed = AD_LINK_SPEED_10000MBPS; in __get_link_speed()
288 speed = AD_LINK_SPEED_14000MBPS; in __get_link_speed()
292 speed = AD_LINK_SPEED_20000MBPS; in __get_link_speed()
296 speed = AD_LINK_SPEED_25000MBPS; in __get_link_speed()
300 speed = AD_LINK_SPEED_40000MBPS; in __get_link_speed()
304 speed = AD_LINK_SPEED_50000MBPS; in __get_link_speed()
308 speed = AD_LINK_SPEED_56000MBPS; in __get_link_speed()
312 speed = AD_LINK_SPEED_100000MBPS; in __get_link_speed()
316 /* unknown speed value from ethtool. shouldn't happen */ in __get_link_speed()
317 if (slave->speed != SPEED_UNKNOWN) in __get_link_speed()
318 pr_warn_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n", in __get_link_speed()
319 slave->bond->dev->name, in __get_link_speed()
320 slave->dev->name, slave->speed, in __get_link_speed()
321 port->actor_port_number); in __get_link_speed()
322 speed = 0; in __get_link_speed()
327 slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n", in __get_link_speed()
328 port->actor_port_number, speed); in __get_link_speed()
329 return speed; in __get_link_speed()
333 * __get_duplex - get a port's duplex
342 struct slave *slave = port->slave; in __get_duplex()
348 if (slave->link == BOND_LINK_UP) { in __get_duplex()
349 switch (slave->duplex) { in __get_duplex()
352 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n… in __get_duplex()
353 port->actor_port_number); in __get_duplex()
358 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapt… in __get_duplex()
359 port->actor_port_number); in __get_duplex()
368 const struct bonding *bond = bond_get_bond_by_slave(port->slave); in __ad_actor_update_port()
370 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; in __ad_actor_update_port()
371 port->actor_system_priority = BOND_AD_INFO(bond).system.sys_priority; in __ad_actor_update_port()
377 * __ad_timer_to_ticks - convert a given timer type to AD module ticks
417 * __choose_matched - update a port's matched variable from a received lacpdu
445 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && in __choose_matched()
446 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && in __choose_matched()
447 MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) && in __choose_matched()
448 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && in __choose_matched()
449 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && in __choose_matched()
450 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGG… in __choose_matched()
451 ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0) in __choose_matched()
453 port->sm_vars |= AD_PORT_MATCHED; in __choose_matched()
455 port->sm_vars &= ~AD_PORT_MATCHED; in __choose_matched()
460 * __record_pdu - record parameters from a received lacpdu
465 * the current partner operational parameter values and sets
471 struct port_params *partner = &port->partner_oper; in __record_pdu()
477 partner->port_number = ntohs(lacpdu->actor_port); in __record_pdu()
478 partner->port_priority = ntohs(lacpdu->actor_port_priority); in __record_pdu()
479 partner->system = lacpdu->actor_system; in __record_pdu()
480 partner->system_priority = ntohs(lacpdu->actor_system_priority); in __record_pdu()
481 partner->key = ntohs(lacpdu->actor_key); in __record_pdu()
482 partner->port_state = lacpdu->actor_state; in __record_pdu()
485 port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED; in __record_pdu()
490 if ((port->sm_vars & AD_PORT_MATCHED) && in __record_pdu()
491 (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) { in __record_pdu()
492 partner->port_state |= LACP_STATE_SYNCHRONIZATION; in __record_pdu()
493 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
496 partner->port_state &= ~LACP_STATE_SYNCHRONIZATION; in __record_pdu()
497 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
504 * __record_default - record default parameters
508 * in the Partner Admin parameters as the current partner operational parameter
515 memcpy(&port->partner_oper, &port->partner_admin, in __record_default()
519 port->actor_oper_port_state |= LACP_STATE_DEFAULTED; in __record_default()
524 * __update_selected - update a port's Selected variable from a received lacpdu
532 * the value(s) received in the PDU differ from the current operational values,
539 const struct port_params *partner = &port->partner_oper; in __update_selected()
544 if (ntohs(lacpdu->actor_port) != partner->port_number || in __update_selected()
545 ntohs(lacpdu->actor_port_priority) != partner->port_priority || in __update_selected()
546 !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) || in __update_selected()
547 ntohs(lacpdu->actor_system_priority) != partner->system_priority || in __update_selected()
548 ntohs(lacpdu->actor_key) != partner->key || in __update_selected()
549 …(lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) { in __update_selected()
550 port->sm_vars &= ~AD_PORT_SELECTED; in __update_selected()
556 * __update_default_selected - update a port's Selected variable from Partner
563 * the current operational values, then Selected is set to FALSE and
570 const struct port_params *admin = &port->partner_admin; in __update_default_selected()
571 const struct port_params *oper = &port->partner_oper; in __update_default_selected()
576 if (admin->port_number != oper->port_number || in __update_default_selected()
577 admin->port_priority != oper->port_priority || in __update_default_selected()
578 !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) || in __update_default_selected()
579 admin->system_priority != oper->system_priority || in __update_default_selected()
580 admin->key != oper->key || in __update_default_selected()
581 (admin->port_state & LACP_STATE_AGGREGATION) in __update_default_selected()
582 != (oper->port_state & LACP_STATE_AGGREGATION)) { in __update_default_selected()
583 port->sm_vars &= ~AD_PORT_SELECTED; in __update_default_selected()
589 * __update_ntt - update a port's ntt variable from a received lacpdu
597 * value(s) received in the PDU differ from the current operational values,
605 * update the port->ntt. in __update_ntt()
607 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || in __update_ntt()
608 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || in __update_ntt()
609 !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) || in __update_ntt()
610 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || in __update_ntt()
611 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || in __update_ntt()
612 …((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_L… in __update_ntt()
613 …((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LA… in __update_ntt()
614 …((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE… in __update_ntt()
615 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGG… in __update_ntt()
617 port->ntt = true; in __update_ntt()
623 * __agg_ports_are_ready - check if all ports in an aggregator are ready
636 for (port = aggregator->lag_ports; in __agg_ports_are_ready()
638 port = port->next_port_in_aggregator) { in __agg_ports_are_ready()
639 if (!(port->sm_vars & AD_PORT_READY_N)) { in __agg_ports_are_ready()
650 * __set_agg_ports_ready - set value of Ready bit in all ports of an aggregator
659 for (port = aggregator->lag_ports; port; in __set_agg_ports_ready()
660 port = port->next_port_in_aggregator) { in __set_agg_ports_ready()
662 port->sm_vars |= AD_PORT_READY; in __set_agg_ports_ready()
664 port->sm_vars &= ~AD_PORT_READY; in __set_agg_ports_ready()
673 for (port = agg->lag_ports; port; in __agg_active_ports()
674 port = port->next_port_in_aggregator) { in __agg_active_ports()
675 if (port->is_enabled) in __agg_active_ports()
683 * __get_agg_bandwidth - get the total bandwidth of an aggregator
693 switch (__get_link_speed(aggregator->lag_ports)) { in __get_agg_bandwidth()
744 * __get_active_agg - get the current active aggregator
751 struct bonding *bond = aggregator->slave->bond; in __get_active_agg()
756 if (SLAVE_AD_INFO(slave)->aggregator.is_active) in __get_active_agg()
757 return &(SLAVE_AD_INFO(slave)->aggregator); in __get_active_agg()
763 * __update_lacpdu_from_port - update a port's lacpdu fields
768 struct lacpdu *lacpdu = &port->lacpdu; in __update_lacpdu_from_port()
769 const struct port_params *partner = &port->partner_oper; in __update_lacpdu_from_port()
771 /* update current actual Actor parameters in __update_lacpdu_from_port()
772 * lacpdu->subtype initialized in __update_lacpdu_from_port()
773 * lacpdu->version_number initialized in __update_lacpdu_from_port()
774 * lacpdu->tlv_type_actor_info initialized in __update_lacpdu_from_port()
775 * lacpdu->actor_information_length initialized in __update_lacpdu_from_port()
778 lacpdu->actor_system_priority = htons(port->actor_system_priority); in __update_lacpdu_from_port()
779 lacpdu->actor_system = port->actor_system; in __update_lacpdu_from_port()
780 lacpdu->actor_key = htons(port->actor_oper_port_key); in __update_lacpdu_from_port()
781 lacpdu->actor_port_priority = htons(port->actor_port_priority); in __update_lacpdu_from_port()
782 lacpdu->actor_port = htons(port->actor_port_number); in __update_lacpdu_from_port()
783 lacpdu->actor_state = port->actor_oper_port_state; in __update_lacpdu_from_port()
784 slave_dbg(port->slave->bond->dev, port->slave->dev, in __update_lacpdu_from_port()
786 port->actor_oper_port_state); in __update_lacpdu_from_port()
788 /* lacpdu->reserved_3_1 initialized in __update_lacpdu_from_port()
789 * lacpdu->tlv_type_partner_info initialized in __update_lacpdu_from_port()
790 * lacpdu->partner_information_length initialized in __update_lacpdu_from_port()
793 lacpdu->partner_system_priority = htons(partner->system_priority); in __update_lacpdu_from_port()
794 lacpdu->partner_system = partner->system; in __update_lacpdu_from_port()
795 lacpdu->partner_key = htons(partner->key); in __update_lacpdu_from_port()
796 lacpdu->partner_port_priority = htons(partner->port_priority); in __update_lacpdu_from_port()
797 lacpdu->partner_port = htons(partner->port_number); in __update_lacpdu_from_port()
798 lacpdu->partner_state = partner->port_state; in __update_lacpdu_from_port()
800 /* lacpdu->reserved_3_2 initialized in __update_lacpdu_from_port()
801 * lacpdu->tlv_type_collector_info initialized in __update_lacpdu_from_port()
802 * lacpdu->collector_information_length initialized in __update_lacpdu_from_port()
814 * ad_lacpdu_send - send out a lacpdu packet on a given port
822 struct slave *slave = port->slave; in ad_lacpdu_send()
829 return -ENOMEM; in ad_lacpdu_send()
831 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx); in ad_lacpdu_send()
832 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx); in ad_lacpdu_send()
834 skb->dev = slave->dev; in ad_lacpdu_send()
836 skb->network_header = skb->mac_header + ETH_HLEN; in ad_lacpdu_send()
837 skb->protocol = PKT_TYPE_LACPDU; in ad_lacpdu_send()
838 skb->priority = TC_PRIO_CONTROL; in ad_lacpdu_send()
842 ether_addr_copy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr); in ad_lacpdu_send()
846 ether_addr_copy(lacpdu_header->hdr.h_source, slave->perm_hwaddr); in ad_lacpdu_send()
847 lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_lacpdu_send()
849 lacpdu_header->lacpdu = port->lacpdu; in ad_lacpdu_send()
857 * ad_marker_send - send marker information/response on a given port
866 struct slave *slave = port->slave; in ad_marker_send()
873 return -ENOMEM; in ad_marker_send()
875 switch (marker->tlv_type) { in ad_marker_send()
877 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx); in ad_marker_send()
878 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx); in ad_marker_send()
881 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx); in ad_marker_send()
882 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx); in ad_marker_send()
888 skb->dev = slave->dev; in ad_marker_send()
890 skb->network_header = skb->mac_header + ETH_HLEN; in ad_marker_send()
891 skb->protocol = PKT_TYPE_LACPDU; in ad_marker_send()
895 ether_addr_copy(marker_header->hdr.h_dest, lacpdu_mcast_addr); in ad_marker_send()
899 ether_addr_copy(marker_header->hdr.h_source, slave->perm_hwaddr); in ad_marker_send()
900 marker_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_marker_send()
902 marker_header->marker = *marker; in ad_marker_send()
910 * ad_mux_machine - handle a port's mux state machine
918 /* keep current State Machine state to compare later if it was in ad_mux_machine()
921 last_state = port->sm_mux_state; in ad_mux_machine()
923 if (port->sm_vars & AD_PORT_BEGIN) { in ad_mux_machine()
924 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
926 switch (port->sm_mux_state) { in ad_mux_machine()
928 if ((port->sm_vars & AD_PORT_SELECTED) in ad_mux_machine()
929 || (port->sm_vars & AD_PORT_STANDBY)) in ad_mux_machine()
931 port->sm_mux_state = AD_MUX_WAITING; in ad_mux_machine()
935 if (!(port->sm_vars & AD_PORT_SELECTED)) { in ad_mux_machine()
936 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
942 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
943 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
948 if (port->sm_mux_timer_counter in ad_mux_machine()
949 && !(--port->sm_mux_timer_counter)) in ad_mux_machine()
950 port->sm_vars |= AD_PORT_READY_N; in ad_mux_machine()
957 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
962 if ((port->sm_vars & AD_PORT_READY) in ad_mux_machine()
963 && !port->sm_mux_timer_counter) in ad_mux_machine()
964 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
970 if ((port->sm_vars & AD_PORT_SELECTED) && in ad_mux_machine()
971 (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) && in ad_mux_machine()
973 if (port->aggregator->is_active) in ad_mux_machine()
974 port->sm_mux_state = in ad_mux_machine()
976 } else if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
977 (port->sm_vars & AD_PORT_STANDBY)) { in ad_mux_machine()
979 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
985 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
986 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
987 } else if (port->aggregator->is_active) { in ad_mux_machine()
988 port->actor_oper_port_state |= in ad_mux_machine()
993 if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
994 (port->sm_vars & AD_PORT_STANDBY) || in ad_mux_machine()
995 !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) || in ad_mux_machine()
996 !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) { in ad_mux_machine()
997 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
1003 if (port->aggregator && in ad_mux_machine()
1004 port->aggregator->is_active && in ad_mux_machine()
1017 if (port->sm_mux_state != last_state) { in ad_mux_machine()
1018 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_mux_machine()
1020 port->actor_port_number, in ad_mux_machine()
1022 port->sm_mux_state); in ad_mux_machine()
1023 switch (port->sm_mux_state) { in ad_mux_machine()
1025 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1028 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1029 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1030 port->ntt = true; in ad_mux_machine()
1033 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); in ad_mux_machine()
1036 if (port->aggregator->is_active) in ad_mux_machine()
1037 port->actor_oper_port_state |= in ad_mux_machine()
1040 port->actor_oper_port_state &= in ad_mux_machine()
1042 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1043 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1046 port->ntt = true; in ad_mux_machine()
1049 port->actor_oper_port_state |= LACP_STATE_COLLECTING; in ad_mux_machine()
1050 port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1051 port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1054 port->ntt = true; in ad_mux_machine()
1063 * ad_rx_machine - handle a port's rx State Machine
1068 * CURRENT. If timer expired set the state machine in the proper state.
1075 /* keep current State Machine state to compare later if it was in ad_rx_machine()
1078 last_state = port->sm_rx_state; in ad_rx_machine()
1081 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx); in ad_rx_machine()
1082 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx); in ad_rx_machine()
1087 if (port->sm_vars & AD_PORT_BEGIN) { in ad_rx_machine()
1088 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1089 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1091 } else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled) in ad_rx_machine()
1092 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1094 else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || in ad_rx_machine()
1095 (port->sm_rx_state == AD_RX_DEFAULTED) || in ad_rx_machine()
1096 (port->sm_rx_state == AD_RX_CURRENT))) { in ad_rx_machine()
1097 if (port->sm_rx_state != AD_RX_CURRENT) in ad_rx_machine()
1098 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1099 port->sm_rx_timer_counter = 0; in ad_rx_machine()
1100 port->sm_rx_state = AD_RX_CURRENT; in ad_rx_machine()
1103 if (port->sm_rx_timer_counter && in ad_rx_machine()
1104 !(--port->sm_rx_timer_counter)) { in ad_rx_machine()
1105 switch (port->sm_rx_state) { in ad_rx_machine()
1107 port->sm_rx_state = AD_RX_DEFAULTED; in ad_rx_machine()
1110 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1117 switch (port->sm_rx_state) { in ad_rx_machine()
1119 if (port->is_enabled && in ad_rx_machine()
1120 (port->sm_vars & AD_PORT_LACP_ENABLED)) in ad_rx_machine()
1121 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1122 else if (port->is_enabled in ad_rx_machine()
1123 && ((port->sm_vars in ad_rx_machine()
1125 port->sm_rx_state = AD_RX_LACP_DISABLED; in ad_rx_machine()
1135 if ((port->sm_rx_state != last_state) || (lacpdu)) { in ad_rx_machine()
1136 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_rx_machine()
1138 port->actor_port_number, in ad_rx_machine()
1140 port->sm_rx_state); in ad_rx_machine()
1141 switch (port->sm_rx_state) { in ad_rx_machine()
1143 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) in ad_rx_machine()
1144 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_rx_machine()
1146 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_rx_machine()
1147 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1149 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1150 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1154 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1157 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1159 port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION; in ad_rx_machine()
1160 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1161 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1170 port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_rx_machine()
1171 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1172 port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT; in ad_rx_machine()
1173 port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY; in ad_rx_machine()
1174 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); in ad_rx_machine()
1175 port->actor_oper_port_state |= LACP_STATE_EXPIRED; in ad_rx_machine()
1176 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1181 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1182 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1186 if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system), in ad_rx_machine()
1187 &(port->actor_system))) { in ad_rx_machine()
1188 slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n" in ad_rx_machine()
1195 …port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_por… in ad_rx_machine()
1196 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1205 * ad_churn_machine - handle port churn's state machine
1211 if (port->sm_vars & AD_PORT_CHURNED) { in ad_churn_machine()
1212 port->sm_vars &= ~AD_PORT_CHURNED; in ad_churn_machine()
1213 port->sm_churn_actor_state = AD_CHURN_MONITOR; in ad_churn_machine()
1214 port->sm_churn_partner_state = AD_CHURN_MONITOR; in ad_churn_machine()
1215 port->sm_churn_actor_timer_counter = in ad_churn_machine()
1217 port->sm_churn_partner_timer_counter = in ad_churn_machine()
1221 if (port->sm_churn_actor_timer_counter && in ad_churn_machine()
1222 !(--port->sm_churn_actor_timer_counter) && in ad_churn_machine()
1223 port->sm_churn_actor_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1224 if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1225 port->sm_churn_actor_state = AD_NO_CHURN; in ad_churn_machine()
1227 port->churn_actor_count++; in ad_churn_machine()
1228 port->sm_churn_actor_state = AD_CHURN; in ad_churn_machine()
1231 if (port->sm_churn_partner_timer_counter && in ad_churn_machine()
1232 !(--port->sm_churn_partner_timer_counter) && in ad_churn_machine()
1233 port->sm_churn_partner_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1234 if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1235 port->sm_churn_partner_state = AD_NO_CHURN; in ad_churn_machine()
1237 port->churn_partner_count++; in ad_churn_machine()
1238 port->sm_churn_partner_state = AD_CHURN; in ad_churn_machine()
1244 * ad_tx_machine - handle a port's tx state machine
1252 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) { in ad_tx_machine()
1254 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) { in ad_tx_machine()
1258 slave_dbg(port->slave->bond->dev, in ad_tx_machine()
1259 port->slave->dev, in ad_tx_machine()
1261 port->actor_port_number); in ad_tx_machine()
1266 port->ntt = false; in ad_tx_machine()
1272 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in ad_tx_machine()
1277 * ad_periodic_machine - handle a port's periodic state machine
1286 /* keep current state machine state to compare later if it was changed */ in ad_periodic_machine()
1287 last_state = port->sm_periodic_state; in ad_periodic_machine()
1290 …if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabl… in ad_periodic_machine()
1291 …(!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LA… in ad_periodic_machine()
1293 port->sm_periodic_state = AD_NO_PERIODIC; in ad_periodic_machine()
1296 else if (port->sm_periodic_timer_counter) { in ad_periodic_machine()
1298 if (!(--port->sm_periodic_timer_counter)) { in ad_periodic_machine()
1300 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1305 switch (port->sm_periodic_state) { in ad_periodic_machine()
1307 if (!(port->partner_oper.port_state in ad_periodic_machine()
1309 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1312 if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) { in ad_periodic_machine()
1313 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1314 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1322 switch (port->sm_periodic_state) { in ad_periodic_machine()
1324 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1327 if (!(port->partner_oper.port_state & in ad_periodic_machine()
1329 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1331 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1339 if (port->sm_periodic_state != last_state) { in ad_periodic_machine()
1340 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_periodic_machine()
1342 port->actor_port_number, last_state, in ad_periodic_machine()
1343 port->sm_periodic_state); in ad_periodic_machine()
1344 switch (port->sm_periodic_state) { in ad_periodic_machine()
1346 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1350 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TI… in ad_periodic_machine()
1354 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TI… in ad_periodic_machine()
1357 port->ntt = true; in ad_periodic_machine()
1366 * ad_port_selection_logic - select aggregation groups
1384 if (port->sm_vars & AD_PORT_SELECTED) in ad_port_selection_logic()
1390 if (port->aggregator) { in ad_port_selection_logic()
1392 temp_aggregator = port->aggregator; in ad_port_selection_logic()
1393 for (curr_port = temp_aggregator->lag_ports; curr_port; in ad_port_selection_logic()
1395 curr_port = curr_port->next_port_in_aggregator) { in ad_port_selection_logic()
1397 temp_aggregator->num_of_ports--; in ad_port_selection_logic()
1402 temp_aggregator->lag_ports = in ad_port_selection_logic()
1403 port->next_port_in_aggregator; in ad_port_selection_logic()
1408 last_port->next_port_in_aggregator = in ad_port_selection_logic()
1409 port->next_port_in_aggregator; in ad_port_selection_logic()
1415 port->aggregator = NULL; in ad_port_selection_logic()
1416 port->next_port_in_aggregator = NULL; in ad_port_selection_logic()
1417 port->actor_port_aggregator_identifier = 0; in ad_port_selection_logic()
1419 slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n", in ad_port_selection_logic()
1420 port->actor_port_number, in ad_port_selection_logic()
1421 temp_aggregator->aggregator_identifier); in ad_port_selection_logic()
1425 if (!temp_aggregator->lag_ports) in ad_port_selection_logic()
1435 port->slave->bond->dev->name, in ad_port_selection_logic()
1436 port->slave->dev->name, in ad_port_selection_logic()
1437 port->actor_port_number, in ad_port_selection_logic()
1438 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1443 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in ad_port_selection_logic()
1446 if (!aggregator->lag_ports) { in ad_port_selection_logic()
1451 /* check if current aggregator suits us */ in ad_port_selection_logic()
1452 …if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters … in ad_port_selection_logic()
1453 MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) && in ad_port_selection_logic()
1454 (aggregator->partner_system_priority == port->partner_oper.system_priority) && in ad_port_selection_logic()
1455 (aggregator->partner_oper_aggregator_key == port->partner_oper.key) in ad_port_selection_logic()
1457 ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */ in ad_port_selection_logic()
1458 !aggregator->is_individual) /* but is not individual OR */ in ad_port_selection_logic()
1462 port->aggregator = aggregator; in ad_port_selection_logic()
1463 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1464 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1465 port->next_port_in_aggregator = aggregator->lag_ports; in ad_port_selection_logic()
1466 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1467 aggregator->lag_ports = port; in ad_port_selection_logic()
1468 slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n", in ad_port_selection_logic()
1469 port->actor_port_number, in ad_port_selection_logic()
1470 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1473 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1479 /* the port couldn't find an aggregator - attach it to a new in ad_port_selection_logic()
1485 port->aggregator = free_aggregator; in ad_port_selection_logic()
1486 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1487 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1490 * if port was responsed from the end-user in ad_port_selection_logic()
1492 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS) in ad_port_selection_logic()
1494 port->aggregator->is_individual = false; in ad_port_selection_logic()
1496 port->aggregator->is_individual = true; in ad_port_selection_logic()
1498 port->aggregator->actor_admin_aggregator_key = in ad_port_selection_logic()
1499 port->actor_admin_port_key; in ad_port_selection_logic()
1500 port->aggregator->actor_oper_aggregator_key = in ad_port_selection_logic()
1501 port->actor_oper_port_key; in ad_port_selection_logic()
1502 port->aggregator->partner_system = in ad_port_selection_logic()
1503 port->partner_oper.system; in ad_port_selection_logic()
1504 port->aggregator->partner_system_priority = in ad_port_selection_logic()
1505 port->partner_oper.system_priority; in ad_port_selection_logic()
1506 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key; in ad_port_selection_logic()
1507 port->aggregator->receive_state = 1; in ad_port_selection_logic()
1508 port->aggregator->transmit_state = 1; in ad_port_selection_logic()
1509 port->aggregator->lag_ports = port; in ad_port_selection_logic()
1510 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1513 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1515 slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n", in ad_port_selection_logic()
1516 port->actor_port_number, in ad_port_selection_logic()
1517 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1519 slave_err(bond->dev, port->slave->dev, in ad_port_selection_logic()
1521 port->actor_port_number); in ad_port_selection_logic()
1528 __set_agg_ports_ready(port->aggregator, in ad_port_selection_logic()
1529 __agg_ports_are_ready(port->aggregator)); in ad_port_selection_logic()
1534 if (!port->aggregator->is_active) in ad_port_selection_logic()
1535 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_port_selection_logic()
1539 * the current best, according to the ad_select policy.
1544 /* 0. If no best, select current. in ad_agg_selection_test()
1546 * 1. If the current agg is not individual, and the best is in ad_agg_selection_test()
1547 * individual, select current. in ad_agg_selection_test()
1549 * 2. If current agg is individual and the best is not, keep best. in ad_agg_selection_test()
1551 * 3. Therefore, current and best are both individual or both not in ad_agg_selection_test()
1554 * 3a. If current agg partner replied, and best agg partner did not, in ad_agg_selection_test()
1555 * select current. in ad_agg_selection_test()
1557 * 3b. If current agg partner did not reply and best agg partner in ad_agg_selection_test()
1560 * 4. Therefore, current and best both have partner replies or in ad_agg_selection_test()
1571 if (!curr->is_individual && best->is_individual) in ad_agg_selection_test()
1574 if (curr->is_individual && !best->is_individual) in ad_agg_selection_test()
1583 switch (__get_agg_selection_mode(curr->lag_ports)) { in ad_agg_selection_test()
1601 curr->slave->bond->dev->name, in ad_agg_selection_test()
1602 curr->slave->dev->name, in ad_agg_selection_test()
1603 __get_agg_selection_mode(curr->lag_ports)); in ad_agg_selection_test()
1612 struct port *port = agg->lag_ports; in agg_device_up()
1617 for (port = agg->lag_ports; port; in agg_device_up()
1618 port = port->next_port_in_aggregator) { in agg_device_up()
1619 if (netif_running(port->slave->dev) && in agg_device_up()
1620 netif_carrier_ok(port->slave->dev)) in agg_device_up()
1628 * ad_agg_selection_logic - select an aggregation group for a team
1657 struct bonding *bond = agg->slave->bond; in ad_agg_selection_logic()
1668 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1670 agg->is_active = 0; in ad_agg_selection_logic()
1677 __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) { in ad_agg_selection_logic()
1683 if (active && active->lag_ports && in ad_agg_selection_logic()
1688 if (!(!active->actor_oper_aggregator_key && in ad_agg_selection_logic()
1689 best->actor_oper_aggregator_key)) { in ad_agg_selection_logic()
1691 active->is_active = 1; in ad_agg_selection_logic()
1698 active->is_active = 1; in ad_agg_selection_logic()
1703 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()
1704 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1705 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1706 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1707 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1708 best->is_individual, best->is_active); in ad_agg_selection_logic()
1709 netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n", in ad_agg_selection_logic()
1710 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1711 best->lag_ports, best->slave); in ad_agg_selection_logic()
1714 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1716 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()
1717 agg->aggregator_identifier, agg->num_of_ports, in ad_agg_selection_logic()
1718 agg->actor_oper_aggregator_key, in ad_agg_selection_logic()
1719 agg->partner_oper_aggregator_key, in ad_agg_selection_logic()
1720 agg->is_individual, agg->is_active); in ad_agg_selection_logic()
1724 if (best->is_individual) in ad_agg_selection_logic()
1726 bond->dev->name); in ad_agg_selection_logic()
1728 best->is_active = 1; in ad_agg_selection_logic()
1729 netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n", in ad_agg_selection_logic()
1730 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1731 best->aggregator_identifier); in ad_agg_selection_logic()
1732 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()
1733 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1734 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1735 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1736 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1737 best->is_individual, best->is_active); in ad_agg_selection_logic()
1743 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1744 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1759 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1760 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1772 * ad_clear_agg - clear a given aggregator's parameters
1778 aggregator->is_individual = false; in ad_clear_agg()
1779 aggregator->actor_admin_aggregator_key = 0; in ad_clear_agg()
1780 aggregator->actor_oper_aggregator_key = 0; in ad_clear_agg()
1781 eth_zero_addr(aggregator->partner_system.mac_addr_value); in ad_clear_agg()
1782 aggregator->partner_system_priority = 0; in ad_clear_agg()
1783 aggregator->partner_oper_aggregator_key = 0; in ad_clear_agg()
1784 aggregator->receive_state = 0; in ad_clear_agg()
1785 aggregator->transmit_state = 0; in ad_clear_agg()
1786 aggregator->lag_ports = NULL; in ad_clear_agg()
1787 aggregator->is_active = 0; in ad_clear_agg()
1788 aggregator->num_of_ports = 0; in ad_clear_agg()
1790 aggregator->slave ? in ad_clear_agg()
1791 aggregator->slave->dev->name : "NULL", in ad_clear_agg()
1792 aggregator->aggregator_identifier); in ad_clear_agg()
1797 * ad_initialize_agg - initialize a given aggregator's parameters
1805 eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value); in ad_initialize_agg()
1806 aggregator->aggregator_identifier = 0; in ad_initialize_agg()
1807 aggregator->slave = NULL; in ad_initialize_agg()
1812 * ad_initialize_port - initialize a given port's parameters
1838 port->actor_port_priority = 0xff; in ad_initialize_port()
1839 port->actor_port_aggregator_identifier = 0; in ad_initialize_port()
1840 port->ntt = false; in ad_initialize_port()
1841 port->actor_admin_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1843 port->actor_oper_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1847 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in ad_initialize_port()
1849 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1850 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1852 port->is_enabled = true; in ad_initialize_port()
1854 port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED; in ad_initialize_port()
1855 port->sm_rx_state = 0; in ad_initialize_port()
1856 port->sm_rx_timer_counter = 0; in ad_initialize_port()
1857 port->sm_periodic_state = 0; in ad_initialize_port()
1858 port->sm_periodic_timer_counter = 0; in ad_initialize_port()
1859 port->sm_mux_state = 0; in ad_initialize_port()
1860 port->sm_mux_timer_counter = 0; in ad_initialize_port()
1861 port->sm_tx_state = 0; in ad_initialize_port()
1862 port->aggregator = NULL; in ad_initialize_port()
1863 port->next_port_in_aggregator = NULL; in ad_initialize_port()
1864 port->transaction_id = 0; in ad_initialize_port()
1866 port->sm_churn_actor_timer_counter = 0; in ad_initialize_port()
1867 port->sm_churn_actor_state = 0; in ad_initialize_port()
1868 port->churn_actor_count = 0; in ad_initialize_port()
1869 port->sm_churn_partner_timer_counter = 0; in ad_initialize_port()
1870 port->sm_churn_partner_state = 0; in ad_initialize_port()
1871 port->churn_partner_count = 0; in ad_initialize_port()
1873 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu)); in ad_initialize_port()
1878 * ad_enable_collecting_distributing - enable a port's transmit/receive
1887 if (port->aggregator->is_active) { in ad_enable_collecting_distributing()
1888 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_enable_collecting_distributing()
1890 port->actor_port_number, in ad_enable_collecting_distributing()
1891 port->aggregator->aggregator_identifier); in ad_enable_collecting_distributing()
1899 * ad_disable_collecting_distributing - disable a port's transmit/receive
1906 if (port->aggregator && in ad_disable_collecting_distributing()
1907 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), in ad_disable_collecting_distributing()
1909 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_disable_collecting_distributing()
1911 port->actor_port_number, in ad_disable_collecting_distributing()
1912 port->aggregator->aggregator_identifier); in ad_disable_collecting_distributing()
1920 * ad_marker_info_received - handle receive of a Marker information frame
1929 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx); in ad_marker_info_received()
1930 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx); in ad_marker_info_received()
1939 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_marker_info_received()
1941 port->actor_port_number); in ad_marker_info_received()
1945 * ad_marker_response_received - handle receive of a marker response frame
1956 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx); in ad_marker_response_received()
1957 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx); in ad_marker_response_received()
1968 * bond_3ad_initiate_agg_selection - initate aggregator selection
1982 * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
1992 bond->dev->dev_addr)) { in bond_3ad_initialize()
1997 bond->params.ad_actor_sys_prio; in bond_3ad_initialize()
1998 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_initialize()
2000 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_initialize()
2003 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_initialize()
2017 * bond_3ad_bind_slave - initialize a slave's port
2030 if (SLAVE_AD_INFO(slave)->port.slave != slave) { in bond_3ad_bind_slave()
2033 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_bind_slave()
2035 ad_initialize_port(port, bond->params.lacp_fast); in bond_3ad_bind_slave()
2037 port->slave = slave; in bond_3ad_bind_slave()
2038 port->actor_port_number = SLAVE_AD_INFO(slave)->id; in bond_3ad_bind_slave()
2039 /* key is determined according to the link speed, duplex and in bond_3ad_bind_slave()
2042 port->actor_admin_port_key = bond->params.ad_user_port_key << 6; in bond_3ad_bind_slave()
2049 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in bond_3ad_bind_slave()
2054 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_bind_slave()
2058 aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_bind_slave()
2059 aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier; in bond_3ad_bind_slave()
2060 aggregator->slave = slave; in bond_3ad_bind_slave()
2061 aggregator->is_active = 0; in bond_3ad_bind_slave()
2062 aggregator->num_of_ports = 0; in bond_3ad_bind_slave()
2067 * bond_3ad_unbind_slave - deinitialize a slave's port
2079 struct bonding *bond = slave->bond; in bond_3ad_unbind_slave()
2085 spin_lock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2086 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_unbind_slave()
2087 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_unbind_slave()
2090 if (!port->slave) { in bond_3ad_unbind_slave()
2091 slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n"); in bond_3ad_unbind_slave()
2095 slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n", in bond_3ad_unbind_slave()
2096 aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2099 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in bond_3ad_unbind_slave()
2100 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in bond_3ad_unbind_slave()
2101 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in bond_3ad_unbind_slave()
2102 port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION; in bond_3ad_unbind_slave()
2107 if (aggregator->lag_ports) { in bond_3ad_unbind_slave()
2113 if ((aggregator->lag_ports != port) || in bond_3ad_unbind_slave()
2114 (aggregator->lag_ports->next_port_in_aggregator)) { in bond_3ad_unbind_slave()
2117 new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2121 if (!new_aggregator->lag_ports || in bond_3ad_unbind_slave()
2122 ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2123 !new_aggregator->lag_ports->next_port_in_aggregator)) in bond_3ad_unbind_slave()
2133 …ew_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_ag… in bond_3ad_unbind_slave()
2134 slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n", in bond_3ad_unbind_slave()
2135 aggregator->aggregator_identifier, in bond_3ad_unbind_slave()
2136 new_aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2138 if ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2139 new_aggregator->is_active) { in bond_3ad_unbind_slave()
2140 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2144 new_aggregator->is_individual = aggregator->is_individual; in bond_3ad_unbind_slave()
2145 new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key; in bond_3ad_unbind_slave()
2146 new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key; in bond_3ad_unbind_slave()
2147 new_aggregator->partner_system = aggregator->partner_system; in bond_3ad_unbind_slave()
2148 new_aggregator->partner_system_priority = aggregator->partner_system_priority; in bond_3ad_unbind_slave()
2149 new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key; in bond_3ad_unbind_slave()
2150 new_aggregator->receive_state = aggregator->receive_state; in bond_3ad_unbind_slave()
2151 new_aggregator->transmit_state = aggregator->transmit_state; in bond_3ad_unbind_slave()
2152 new_aggregator->lag_ports = aggregator->lag_ports; in bond_3ad_unbind_slave()
2153 new_aggregator->is_active = aggregator->is_active; in bond_3ad_unbind_slave()
2154 new_aggregator->num_of_ports = aggregator->num_of_ports; in bond_3ad_unbind_slave()
2159 for (temp_port = aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2160 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2161 temp_port->aggregator = new_aggregator; in bond_3ad_unbind_slave()
2162 temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier; in bond_3ad_unbind_slave()
2171 …slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for i… in bond_3ad_unbind_slave()
2177 select_new_active_agg = aggregator->is_active; in bond_3ad_unbind_slave()
2180 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2190 slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number); in bond_3ad_unbind_slave()
2194 temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2197 for (temp_port = temp_aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2199 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2201 /* the aggregator found - detach the port from in bond_3ad_unbind_slave()
2205 prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2207 temp_aggregator->lag_ports = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2208 temp_aggregator->num_of_ports--; in bond_3ad_unbind_slave()
2210 select_new_active_agg = temp_aggregator->is_active; in bond_3ad_unbind_slave()
2213 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2223 port->slave = NULL; in bond_3ad_unbind_slave()
2226 spin_unlock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2230 * bond_3ad_update_ad_actor_settings - reflect change of actor settings to ports
2243 BOND_AD_INFO(bond).system.sys_priority = bond->params.ad_actor_sys_prio; in bond_3ad_update_ad_actor_settings()
2244 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_update_ad_actor_settings()
2246 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_update_ad_actor_settings()
2249 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_update_ad_actor_settings()
2251 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2253 struct port *port = &(SLAVE_AD_INFO(slave))->port; in bond_3ad_update_ad_actor_settings()
2256 port->ntt = true; in bond_3ad_update_ad_actor_settings()
2258 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2262 * bond_3ad_state_machine_handler - handle state machines timeout
2285 /* Lock to protect data accessed by all (e.g., port->sm_vars) and in bond_3ad_state_machine_handler()
2289 spin_lock_bh(&bond->mode_lock); in bond_3ad_state_machine_handler()
2298 !(--BOND_AD_INFO(bond).agg_select_timer)) { in bond_3ad_state_machine_handler()
2300 port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; in bond_3ad_state_machine_handler()
2304 if (!port->slave) { in bond_3ad_state_machine_handler()
2306 bond->dev->name); in bond_3ad_state_machine_handler()
2318 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_state_machine_handler()
2319 if (!port->slave) { in bond_3ad_state_machine_handler()
2321 bond->dev->name); in bond_3ad_state_machine_handler()
2333 if (port->sm_vars & AD_PORT_BEGIN) in bond_3ad_state_machine_handler()
2334 port->sm_vars &= ~AD_PORT_BEGIN; in bond_3ad_state_machine_handler()
2339 if (slave->should_notify) { in bond_3ad_state_machine_handler()
2345 spin_unlock_bh(&bond->mode_lock); in bond_3ad_state_machine_handler()
2354 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); in bond_3ad_state_machine_handler()
2358 * bond_3ad_rx_indication - handle a received frame
2368 struct bonding *bond = slave->bond; in bond_3ad_rx_indication()
2374 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_rx_indication()
2375 if (!port->slave) { in bond_3ad_rx_indication()
2377 slave->dev->name, slave->bond->dev->name); in bond_3ad_rx_indication()
2381 switch (lacpdu->subtype) { in bond_3ad_rx_indication()
2384 slave_dbg(slave->bond->dev, slave->dev, in bond_3ad_rx_indication()
2386 port->actor_port_number); in bond_3ad_rx_indication()
2388 spin_lock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2390 spin_unlock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2398 switch (marker->tlv_type) { in bond_3ad_rx_indication()
2400 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n", in bond_3ad_rx_indication()
2401 port->actor_port_number); in bond_3ad_rx_indication()
2405 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n", in bond_3ad_rx_indication()
2406 port->actor_port_number); in bond_3ad_rx_indication()
2410 slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n", in bond_3ad_rx_indication()
2411 port->actor_port_number); in bond_3ad_rx_indication()
2412 stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx; in bond_3ad_rx_indication()
2419 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx); in bond_3ad_rx_indication()
2427 * ad_update_actor_keys - Update the oper / admin keys for a port based on
2428 * its current speed and duplex settings.
2431 * @reset: Boolean to just reset the speed and the duplex part of the key
2435 * (b) When the speed is changed, LACP need to be reinitiated.
2440 u16 ospeed = 0, speed = 0; in ad_update_actor_keys() local
2441 u16 old_oper_key = port->actor_oper_port_key; in ad_update_actor_keys()
2443 port->actor_admin_port_key &= ~(AD_SPEED_KEY_MASKS|AD_DUPLEX_KEY_MASKS); in ad_update_actor_keys()
2445 speed = __get_link_speed(port); in ad_update_actor_keys()
2448 port->actor_admin_port_key |= (speed << 1) | duplex; in ad_update_actor_keys()
2450 port->actor_oper_port_key = port->actor_admin_port_key; in ad_update_actor_keys()
2452 if (old_oper_key != port->actor_oper_port_key) { in ad_update_actor_keys()
2455 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2457 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2460 if (!speed) { in ad_update_actor_keys()
2461 slave_err(port->slave->bond->dev, in ad_update_actor_keys()
2462 port->slave->dev, in ad_update_actor_keys()
2463 "speed changed to 0 on port %d\n", in ad_update_actor_keys()
2464 port->actor_port_number); in ad_update_actor_keys()
2465 } else if (duplex && ospeed != speed) { in ad_update_actor_keys()
2466 /* Speed change restarts LACP state-machine */ in ad_update_actor_keys()
2467 port->sm_vars |= AD_PORT_BEGIN; in ad_update_actor_keys()
2474 * bond_3ad_adapter_speed_duplex_changed - handle a slave's speed / duplex
2485 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_adapter_speed_duplex_changed()
2488 if (!port->slave) { in bond_3ad_adapter_speed_duplex_changed()
2489 slave_warn(slave->bond->dev, slave->dev, in bond_3ad_adapter_speed_duplex_changed()
2490 "speed/duplex changed for uninitialized port\n"); in bond_3ad_adapter_speed_duplex_changed()
2494 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2496 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2497 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n", in bond_3ad_adapter_speed_duplex_changed()
2498 port->actor_port_number); in bond_3ad_adapter_speed_duplex_changed()
2502 * bond_3ad_handle_link_change - handle a slave's link status change indication
2514 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_handle_link_change()
2517 if (!port->slave) { in bond_3ad_handle_link_change()
2518 slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n"); in bond_3ad_handle_link_change()
2522 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2523 /* on link down we are zeroing duplex and speed since in bond_3ad_handle_link_change()
2524 * some of the adaptors(ce1000.lan) report full duplex/speed in bond_3ad_handle_link_change()
2525 * instead of N/A(duplex) / 0(speed). in bond_3ad_handle_link_change()
2527 * on link up we are forcing recheck on the duplex and speed since in bond_3ad_handle_link_change()
2531 port->is_enabled = true; in bond_3ad_handle_link_change()
2535 port->is_enabled = false; in bond_3ad_handle_link_change()
2541 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2543 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n", in bond_3ad_handle_link_change()
2544 port->actor_port_number, in bond_3ad_handle_link_change()
2550 bond_update_slave_arr(slave->bond, NULL); in bond_3ad_handle_link_change()
2554 * bond_3ad_set_carrier - set link state for bonding master
2578 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator)); in bond_3ad_set_carrier()
2581 if (__agg_active_ports(active) < bond->params.min_links) { in bond_3ad_set_carrier()
2582 if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2583 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2586 } else if (!netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2587 netif_carrier_on(bond->dev); in bond_3ad_set_carrier()
2590 } else if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2591 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2599 * __bond_3ad_get_active_agg_info - get information of the active aggregator
2615 port = &(SLAVE_AD_INFO(slave)->port); in __bond_3ad_get_active_agg_info()
2616 if (port->aggregator && port->aggregator->is_active) { in __bond_3ad_get_active_agg_info()
2617 aggregator = port->aggregator; in __bond_3ad_get_active_agg_info()
2623 return -1; in __bond_3ad_get_active_agg_info()
2625 ad_info->aggregator_id = aggregator->aggregator_identifier; in __bond_3ad_get_active_agg_info()
2626 ad_info->ports = __agg_active_ports(aggregator); in __bond_3ad_get_active_agg_info()
2627 ad_info->actor_key = aggregator->actor_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2628 ad_info->partner_key = aggregator->partner_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2629 ether_addr_copy(ad_info->partner_system, in __bond_3ad_get_active_agg_info()
2630 aggregator->partner_system.mac_addr_value); in __bond_3ad_get_active_agg_info()
2650 if (skb->protocol != PKT_TYPE_LACPDU) in bond_3ad_lacpdu_recv()
2653 if (!MAC_ADDRESS_EQUAL(eth_hdr(skb)->h_dest, lacpdu_mcast_addr)) in bond_3ad_lacpdu_recv()
2658 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx); in bond_3ad_lacpdu_recv()
2667 * bond_3ad_update_lacp_rate - change the lacp rate
2673 * Hold bond->mode_lock,
2674 * so we can modify port->actor_oper_port_state,
2684 lacp_fast = bond->params.lacp_fast; in bond_3ad_update_lacp_rate()
2685 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2687 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_update_lacp_rate()
2689 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2691 port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2693 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2713 val = atomic64_read(&stats->lacpdu_rx); in bond_3ad_stats_fill()
2716 return -EMSGSIZE; in bond_3ad_stats_fill()
2717 val = atomic64_read(&stats->lacpdu_tx); in bond_3ad_stats_fill()
2720 return -EMSGSIZE; in bond_3ad_stats_fill()
2721 val = atomic64_read(&stats->lacpdu_unknown_rx); in bond_3ad_stats_fill()
2724 return -EMSGSIZE; in bond_3ad_stats_fill()
2725 val = atomic64_read(&stats->lacpdu_illegal_rx); in bond_3ad_stats_fill()
2728 return -EMSGSIZE; in bond_3ad_stats_fill()
2730 val = atomic64_read(&stats->marker_rx); in bond_3ad_stats_fill()
2733 return -EMSGSIZE; in bond_3ad_stats_fill()
2734 val = atomic64_read(&stats->marker_tx); in bond_3ad_stats_fill()
2737 return -EMSGSIZE; in bond_3ad_stats_fill()
2738 val = atomic64_read(&stats->marker_resp_rx); in bond_3ad_stats_fill()
2741 return -EMSGSIZE; in bond_3ad_stats_fill()
2742 val = atomic64_read(&stats->marker_resp_tx); in bond_3ad_stats_fill()
2745 return -EMSGSIZE; in bond_3ad_stats_fill()
2746 val = atomic64_read(&stats->marker_unknown_rx); in bond_3ad_stats_fill()
2749 return -EMSGSIZE; in bond_3ad_stats_fill()