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 * --------------------------------------------------------------
120 * __get_bond_by_port - get the port's bonding struct
127 if (port->slave == NULL) in __get_bond_by_port()
130 return bond_get_bond_by_slave(port->slave); in __get_bond_by_port()
134 * __get_first_agg - get the first aggregator in the bond
153 agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL; in __get_first_agg()
160 * __agg_has_partner - see if we have a partner
163 * Return nonzero if aggregator has a partner (denoted by a non-zero ether
168 return !is_zero_ether_addr(agg->partner_system.mac_addr_value); in __agg_has_partner()
172 * __disable_port - disable the port's slave
177 bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER); in __disable_port()
181 * __enable_port - enable the port's slave, if it's up
186 struct slave *slave = port->slave; in __enable_port()
188 if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave)) in __enable_port()
193 * __port_is_enabled - check if the port's slave is in active state
198 return bond_is_active_slave(port->slave); in __port_is_enabled()
202 * __get_agg_selection_mode - get the aggregator selection mode
214 return bond->params.ad_select; in __get_agg_selection_mode()
218 * __check_agg_selection_timer - check if the selection timer has expired
232 * __get_link_speed - get a port's speed
235 * Return @port's speed in 802.3ad enum format. i.e. one of:
255 struct slave *slave = port->slave; in __get_link_speed()
256 u16 speed; in __get_link_speed() local
259 * with link down, it sets the speed to 0. in __get_link_speed()
263 if (slave->link != BOND_LINK_UP) in __get_link_speed()
264 speed = 0; in __get_link_speed()
266 switch (slave->speed) { in __get_link_speed()
268 speed = AD_LINK_SPEED_10MBPS; in __get_link_speed()
272 speed = AD_LINK_SPEED_100MBPS; in __get_link_speed()
276 speed = AD_LINK_SPEED_1000MBPS; in __get_link_speed()
280 speed = AD_LINK_SPEED_2500MBPS; in __get_link_speed()
284 speed = AD_LINK_SPEED_5000MBPS; in __get_link_speed()
288 speed = AD_LINK_SPEED_10000MBPS; in __get_link_speed()
292 speed = AD_LINK_SPEED_14000MBPS; in __get_link_speed()
296 speed = AD_LINK_SPEED_20000MBPS; in __get_link_speed()
300 speed = AD_LINK_SPEED_25000MBPS; in __get_link_speed()
304 speed = AD_LINK_SPEED_40000MBPS; in __get_link_speed()
308 speed = AD_LINK_SPEED_50000MBPS; in __get_link_speed()
312 speed = AD_LINK_SPEED_56000MBPS; in __get_link_speed()
316 speed = AD_LINK_SPEED_100000MBPS; in __get_link_speed()
320 speed = AD_LINK_SPEED_200000MBPS; in __get_link_speed()
324 speed = AD_LINK_SPEED_400000MBPS; in __get_link_speed()
328 /* unknown speed value from ethtool. shouldn't happen */ in __get_link_speed()
329 if (slave->speed != SPEED_UNKNOWN) in __get_link_speed()
330 pr_err_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n", in __get_link_speed()
331 slave->bond->dev->name, in __get_link_speed()
332 slave->dev->name, slave->speed, in __get_link_speed()
333 port->actor_port_number); in __get_link_speed()
334 speed = 0; in __get_link_speed()
339 slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n", in __get_link_speed()
340 port->actor_port_number, speed); in __get_link_speed()
341 return speed; in __get_link_speed()
345 * __get_duplex - get a port's duplex
354 struct slave *slave = port->slave; in __get_duplex()
360 if (slave->link == BOND_LINK_UP) { in __get_duplex()
361 switch (slave->duplex) { in __get_duplex()
364 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n… in __get_duplex()
365 port->actor_port_number); in __get_duplex()
370 …slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapt… in __get_duplex()
371 port->actor_port_number); in __get_duplex()
380 const struct bonding *bond = bond_get_bond_by_slave(port->slave); in __ad_actor_update_port()
382 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr; in __ad_actor_update_port()
383 port->actor_system_priority = BOND_AD_INFO(bond).system.sys_priority; in __ad_actor_update_port()
389 * __ad_timer_to_ticks - convert a given timer type to AD module ticks
429 * __choose_matched - update a port's matched variable from a received lacpdu
457 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) && in __choose_matched()
458 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) && in __choose_matched()
459 MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) && in __choose_matched()
460 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && in __choose_matched()
461 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && in __choose_matched()
462 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGG… in __choose_matched()
463 ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0) in __choose_matched()
465 port->sm_vars |= AD_PORT_MATCHED; in __choose_matched()
467 port->sm_vars &= ~AD_PORT_MATCHED; in __choose_matched()
472 * __record_pdu - record parameters from a received lacpdu
477 * the current partner operational parameter values and sets
483 struct port_params *partner = &port->partner_oper; in __record_pdu()
489 partner->port_number = ntohs(lacpdu->actor_port); in __record_pdu()
490 partner->port_priority = ntohs(lacpdu->actor_port_priority); in __record_pdu()
491 partner->system = lacpdu->actor_system; in __record_pdu()
492 partner->system_priority = ntohs(lacpdu->actor_system_priority); in __record_pdu()
493 partner->key = ntohs(lacpdu->actor_key); in __record_pdu()
494 partner->port_state = lacpdu->actor_state; in __record_pdu()
497 port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED; in __record_pdu()
502 if ((port->sm_vars & AD_PORT_MATCHED) && in __record_pdu()
503 (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) { in __record_pdu()
504 partner->port_state |= LACP_STATE_SYNCHRONIZATION; in __record_pdu()
505 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
508 partner->port_state &= ~LACP_STATE_SYNCHRONIZATION; in __record_pdu()
509 slave_dbg(port->slave->bond->dev, port->slave->dev, in __record_pdu()
516 * __record_default - record default parameters
520 * in the Partner Admin parameters as the current partner operational parameter
527 memcpy(&port->partner_oper, &port->partner_admin, in __record_default()
531 port->actor_oper_port_state |= LACP_STATE_DEFAULTED; in __record_default()
536 * __update_selected - update a port's Selected variable from a received lacpdu
544 * the value(s) received in the PDU differ from the current operational values,
551 const struct port_params *partner = &port->partner_oper; in __update_selected()
556 if (ntohs(lacpdu->actor_port) != partner->port_number || in __update_selected()
557 ntohs(lacpdu->actor_port_priority) != partner->port_priority || in __update_selected()
558 !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) || in __update_selected()
559 ntohs(lacpdu->actor_system_priority) != partner->system_priority || in __update_selected()
560 ntohs(lacpdu->actor_key) != partner->key || in __update_selected()
561 …(lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) { in __update_selected()
562 port->sm_vars &= ~AD_PORT_SELECTED; in __update_selected()
568 * __update_default_selected - update a port's Selected variable from Partner
575 * the current operational values, then Selected is set to FALSE and
582 const struct port_params *admin = &port->partner_admin; in __update_default_selected()
583 const struct port_params *oper = &port->partner_oper; in __update_default_selected()
588 if (admin->port_number != oper->port_number || in __update_default_selected()
589 admin->port_priority != oper->port_priority || in __update_default_selected()
590 !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) || in __update_default_selected()
591 admin->system_priority != oper->system_priority || in __update_default_selected()
592 admin->key != oper->key || in __update_default_selected()
593 (admin->port_state & LACP_STATE_AGGREGATION) in __update_default_selected()
594 != (oper->port_state & LACP_STATE_AGGREGATION)) { in __update_default_selected()
595 port->sm_vars &= ~AD_PORT_SELECTED; in __update_default_selected()
601 * __update_ntt - update a port's ntt variable from a received lacpdu
609 * value(s) received in the PDU differ from the current operational values,
617 * update the port->ntt. in __update_ntt()
619 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) || in __update_ntt()
620 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) || in __update_ntt()
621 !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) || in __update_ntt()
622 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || in __update_ntt()
623 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || in __update_ntt()
624 …((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_L… in __update_ntt()
625 …((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LA… in __update_ntt()
626 …((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE… in __update_ntt()
627 …((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGG… in __update_ntt()
629 port->ntt = true; in __update_ntt()
635 * __agg_ports_are_ready - check if all ports in an aggregator are ready
648 for (port = aggregator->lag_ports; in __agg_ports_are_ready()
650 port = port->next_port_in_aggregator) { in __agg_ports_are_ready()
651 if (!(port->sm_vars & AD_PORT_READY_N)) { in __agg_ports_are_ready()
662 * __set_agg_ports_ready - set value of Ready bit in all ports of an aggregator
671 for (port = aggregator->lag_ports; port; in __set_agg_ports_ready()
672 port = port->next_port_in_aggregator) { in __set_agg_ports_ready()
674 port->sm_vars |= AD_PORT_READY; in __set_agg_ports_ready()
676 port->sm_vars &= ~AD_PORT_READY; in __set_agg_ports_ready()
685 for (port = agg->lag_ports; port; in __agg_active_ports()
686 port = port->next_port_in_aggregator) { in __agg_active_ports()
687 if (port->is_enabled) in __agg_active_ports()
695 * __get_agg_bandwidth - get the total bandwidth of an aggregator
705 switch (__get_link_speed(aggregator->lag_ports)) { in __get_agg_bandwidth()
762 * __get_active_agg - get the current active aggregator
769 struct bonding *bond = aggregator->slave->bond; in __get_active_agg()
774 if (SLAVE_AD_INFO(slave)->aggregator.is_active) in __get_active_agg()
775 return &(SLAVE_AD_INFO(slave)->aggregator); in __get_active_agg()
781 * __update_lacpdu_from_port - update a port's lacpdu fields
786 struct lacpdu *lacpdu = &port->lacpdu; in __update_lacpdu_from_port()
787 const struct port_params *partner = &port->partner_oper; in __update_lacpdu_from_port()
789 /* update current actual Actor parameters in __update_lacpdu_from_port()
790 * lacpdu->subtype initialized in __update_lacpdu_from_port()
791 * lacpdu->version_number initialized in __update_lacpdu_from_port()
792 * lacpdu->tlv_type_actor_info initialized in __update_lacpdu_from_port()
793 * lacpdu->actor_information_length initialized in __update_lacpdu_from_port()
796 lacpdu->actor_system_priority = htons(port->actor_system_priority); in __update_lacpdu_from_port()
797 lacpdu->actor_system = port->actor_system; in __update_lacpdu_from_port()
798 lacpdu->actor_key = htons(port->actor_oper_port_key); in __update_lacpdu_from_port()
799 lacpdu->actor_port_priority = htons(port->actor_port_priority); in __update_lacpdu_from_port()
800 lacpdu->actor_port = htons(port->actor_port_number); in __update_lacpdu_from_port()
801 lacpdu->actor_state = port->actor_oper_port_state; in __update_lacpdu_from_port()
802 slave_dbg(port->slave->bond->dev, port->slave->dev, in __update_lacpdu_from_port()
804 port->actor_oper_port_state); in __update_lacpdu_from_port()
806 /* lacpdu->reserved_3_1 initialized in __update_lacpdu_from_port()
807 * lacpdu->tlv_type_partner_info initialized in __update_lacpdu_from_port()
808 * lacpdu->partner_information_length initialized in __update_lacpdu_from_port()
811 lacpdu->partner_system_priority = htons(partner->system_priority); in __update_lacpdu_from_port()
812 lacpdu->partner_system = partner->system; in __update_lacpdu_from_port()
813 lacpdu->partner_key = htons(partner->key); in __update_lacpdu_from_port()
814 lacpdu->partner_port_priority = htons(partner->port_priority); in __update_lacpdu_from_port()
815 lacpdu->partner_port = htons(partner->port_number); in __update_lacpdu_from_port()
816 lacpdu->partner_state = partner->port_state; in __update_lacpdu_from_port()
818 /* lacpdu->reserved_3_2 initialized in __update_lacpdu_from_port()
819 * lacpdu->tlv_type_collector_info initialized in __update_lacpdu_from_port()
820 * lacpdu->collector_information_length initialized in __update_lacpdu_from_port()
832 * ad_lacpdu_send - send out a lacpdu packet on a given port
840 struct slave *slave = port->slave; in ad_lacpdu_send()
847 return -ENOMEM; in ad_lacpdu_send()
849 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx); in ad_lacpdu_send()
850 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx); in ad_lacpdu_send()
852 skb->dev = slave->dev; in ad_lacpdu_send()
854 skb->network_header = skb->mac_header + ETH_HLEN; in ad_lacpdu_send()
855 skb->protocol = PKT_TYPE_LACPDU; in ad_lacpdu_send()
856 skb->priority = TC_PRIO_CONTROL; in ad_lacpdu_send()
860 ether_addr_copy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr); in ad_lacpdu_send()
864 ether_addr_copy(lacpdu_header->hdr.h_source, slave->perm_hwaddr); in ad_lacpdu_send()
865 lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_lacpdu_send()
867 lacpdu_header->lacpdu = port->lacpdu; in ad_lacpdu_send()
875 * ad_marker_send - send marker information/response on a given port
884 struct slave *slave = port->slave; in ad_marker_send()
891 return -ENOMEM; in ad_marker_send()
893 switch (marker->tlv_type) { in ad_marker_send()
895 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx); in ad_marker_send()
896 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx); in ad_marker_send()
899 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx); in ad_marker_send()
900 atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx); in ad_marker_send()
906 skb->dev = slave->dev; in ad_marker_send()
908 skb->network_header = skb->mac_header + ETH_HLEN; in ad_marker_send()
909 skb->protocol = PKT_TYPE_LACPDU; in ad_marker_send()
913 ether_addr_copy(marker_header->hdr.h_dest, lacpdu_mcast_addr); in ad_marker_send()
917 ether_addr_copy(marker_header->hdr.h_source, slave->perm_hwaddr); in ad_marker_send()
918 marker_header->hdr.h_proto = PKT_TYPE_LACPDU; in ad_marker_send()
920 marker_header->marker = *marker; in ad_marker_send()
928 * ad_mux_machine - handle a port's mux state machine
936 /* keep current State Machine state to compare later if it was in ad_mux_machine()
939 last_state = port->sm_mux_state; in ad_mux_machine()
941 if (port->sm_vars & AD_PORT_BEGIN) { in ad_mux_machine()
942 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
944 switch (port->sm_mux_state) { in ad_mux_machine()
946 if ((port->sm_vars & AD_PORT_SELECTED) in ad_mux_machine()
947 || (port->sm_vars & AD_PORT_STANDBY)) in ad_mux_machine()
949 port->sm_mux_state = AD_MUX_WAITING; in ad_mux_machine()
953 if (!(port->sm_vars & AD_PORT_SELECTED)) { in ad_mux_machine()
954 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
960 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
961 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
966 if (port->sm_mux_timer_counter in ad_mux_machine()
967 && !(--port->sm_mux_timer_counter)) in ad_mux_machine()
968 port->sm_vars |= AD_PORT_READY_N; in ad_mux_machine()
975 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
980 if ((port->sm_vars & AD_PORT_READY) in ad_mux_machine()
981 && !port->sm_mux_timer_counter) in ad_mux_machine()
982 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
988 if ((port->sm_vars & AD_PORT_SELECTED) && in ad_mux_machine()
989 (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) && in ad_mux_machine()
991 if (port->aggregator->is_active) in ad_mux_machine()
992 port->sm_mux_state = in ad_mux_machine()
994 } else if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
995 (port->sm_vars & AD_PORT_STANDBY)) { in ad_mux_machine()
997 port->sm_vars &= ~AD_PORT_READY_N; in ad_mux_machine()
1003 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); in ad_mux_machine()
1004 port->sm_mux_state = AD_MUX_DETACHED; in ad_mux_machine()
1005 } else if (port->aggregator->is_active) { in ad_mux_machine()
1006 port->actor_oper_port_state |= in ad_mux_machine()
1011 if (!(port->sm_vars & AD_PORT_SELECTED) || in ad_mux_machine()
1012 (port->sm_vars & AD_PORT_STANDBY) || in ad_mux_machine()
1013 !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) || in ad_mux_machine()
1014 !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) { in ad_mux_machine()
1015 port->sm_mux_state = AD_MUX_ATTACHED; in ad_mux_machine()
1021 if (port->aggregator && in ad_mux_machine()
1022 port->aggregator->is_active && in ad_mux_machine()
1035 if (port->sm_mux_state != last_state) { in ad_mux_machine()
1036 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_mux_machine()
1038 port->actor_port_number, in ad_mux_machine()
1040 port->sm_mux_state); in ad_mux_machine()
1041 switch (port->sm_mux_state) { in ad_mux_machine()
1043 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1046 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1047 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1048 port->ntt = true; in ad_mux_machine()
1051 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); in ad_mux_machine()
1054 if (port->aggregator->is_active) in ad_mux_machine()
1055 port->actor_oper_port_state |= in ad_mux_machine()
1058 port->actor_oper_port_state &= in ad_mux_machine()
1060 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in ad_mux_machine()
1061 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1064 port->ntt = true; in ad_mux_machine()
1067 port->actor_oper_port_state |= LACP_STATE_COLLECTING; in ad_mux_machine()
1068 port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING; in ad_mux_machine()
1069 port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION; in ad_mux_machine()
1072 port->ntt = true; in ad_mux_machine()
1081 * ad_rx_machine - handle a port's rx State Machine
1086 * CURRENT. If timer expired set the state machine in the proper state.
1093 /* keep current State Machine state to compare later if it was in ad_rx_machine()
1096 last_state = port->sm_rx_state; in ad_rx_machine()
1099 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx); in ad_rx_machine()
1100 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx); in ad_rx_machine()
1105 if (port->sm_vars & AD_PORT_BEGIN) { in ad_rx_machine()
1106 port->sm_rx_state = AD_RX_INITIALIZE; in ad_rx_machine()
1107 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1109 } else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled) in ad_rx_machine()
1110 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1112 else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || in ad_rx_machine()
1113 (port->sm_rx_state == AD_RX_DEFAULTED) || in ad_rx_machine()
1114 (port->sm_rx_state == AD_RX_CURRENT))) { in ad_rx_machine()
1115 if (port->sm_rx_state != AD_RX_CURRENT) in ad_rx_machine()
1116 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1117 port->sm_rx_timer_counter = 0; in ad_rx_machine()
1118 port->sm_rx_state = AD_RX_CURRENT; in ad_rx_machine()
1121 if (port->sm_rx_timer_counter && in ad_rx_machine()
1122 !(--port->sm_rx_timer_counter)) { in ad_rx_machine()
1123 switch (port->sm_rx_state) { in ad_rx_machine()
1125 port->sm_rx_state = AD_RX_DEFAULTED; in ad_rx_machine()
1128 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1135 switch (port->sm_rx_state) { in ad_rx_machine()
1137 if (port->is_enabled && in ad_rx_machine()
1138 (port->sm_vars & AD_PORT_LACP_ENABLED)) in ad_rx_machine()
1139 port->sm_rx_state = AD_RX_EXPIRED; in ad_rx_machine()
1140 else if (port->is_enabled in ad_rx_machine()
1141 && ((port->sm_vars in ad_rx_machine()
1143 port->sm_rx_state = AD_RX_LACP_DISABLED; in ad_rx_machine()
1153 if ((port->sm_rx_state != last_state) || (lacpdu)) { in ad_rx_machine()
1154 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_rx_machine()
1156 port->actor_port_number, in ad_rx_machine()
1158 port->sm_rx_state); in ad_rx_machine()
1159 switch (port->sm_rx_state) { in ad_rx_machine()
1161 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) in ad_rx_machine()
1162 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_rx_machine()
1164 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_rx_machine()
1165 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1167 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1168 port->sm_rx_state = AD_RX_PORT_DISABLED; in ad_rx_machine()
1172 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1175 port->sm_vars &= ~AD_PORT_SELECTED; in ad_rx_machine()
1177 port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION; in ad_rx_machine()
1178 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1179 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1188 port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_rx_machine()
1189 port->sm_vars &= ~AD_PORT_MATCHED; in ad_rx_machine()
1190 port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT; in ad_rx_machine()
1191 port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY; in ad_rx_machine()
1192 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); in ad_rx_machine()
1193 port->actor_oper_port_state |= LACP_STATE_EXPIRED; in ad_rx_machine()
1194 port->sm_vars |= AD_PORT_CHURNED; in ad_rx_machine()
1199 port->sm_vars |= AD_PORT_MATCHED; in ad_rx_machine()
1200 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1204 if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system), in ad_rx_machine()
1205 &(port->actor_system))) { in ad_rx_machine()
1206 slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n" in ad_rx_machine()
1213 …port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_por… in ad_rx_machine()
1214 port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; in ad_rx_machine()
1223 * ad_churn_machine - handle port churn's state machine
1229 if (port->sm_vars & AD_PORT_CHURNED) { in ad_churn_machine()
1230 port->sm_vars &= ~AD_PORT_CHURNED; in ad_churn_machine()
1231 port->sm_churn_actor_state = AD_CHURN_MONITOR; in ad_churn_machine()
1232 port->sm_churn_partner_state = AD_CHURN_MONITOR; in ad_churn_machine()
1233 port->sm_churn_actor_timer_counter = in ad_churn_machine()
1235 port->sm_churn_partner_timer_counter = in ad_churn_machine()
1239 if (port->sm_churn_actor_timer_counter && in ad_churn_machine()
1240 !(--port->sm_churn_actor_timer_counter) && in ad_churn_machine()
1241 port->sm_churn_actor_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1242 if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1243 port->sm_churn_actor_state = AD_NO_CHURN; in ad_churn_machine()
1245 port->churn_actor_count++; in ad_churn_machine()
1246 port->sm_churn_actor_state = AD_CHURN; in ad_churn_machine()
1249 if (port->sm_churn_partner_timer_counter && in ad_churn_machine()
1250 !(--port->sm_churn_partner_timer_counter) && in ad_churn_machine()
1251 port->sm_churn_partner_state == AD_CHURN_MONITOR) { in ad_churn_machine()
1252 if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) { in ad_churn_machine()
1253 port->sm_churn_partner_state = AD_NO_CHURN; in ad_churn_machine()
1255 port->churn_partner_count++; in ad_churn_machine()
1256 port->sm_churn_partner_state = AD_CHURN; in ad_churn_machine()
1262 * ad_tx_machine - handle a port's tx state machine
1270 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) { in ad_tx_machine()
1272 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) { in ad_tx_machine()
1276 slave_dbg(port->slave->bond->dev, in ad_tx_machine()
1277 port->slave->dev, in ad_tx_machine()
1279 port->actor_port_number); in ad_tx_machine()
1284 port->ntt = false; in ad_tx_machine()
1290 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in ad_tx_machine()
1295 * ad_periodic_machine - handle a port's periodic state machine
1305 /* keep current state machine state to compare later if it was changed */ in ad_periodic_machine()
1306 last_state = port->sm_periodic_state; in ad_periodic_machine()
1309 …if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabl… in ad_periodic_machine()
1310 …(!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LA… in ad_periodic_machine()
1311 !bond_params->lacp_active) { in ad_periodic_machine()
1312 port->sm_periodic_state = AD_NO_PERIODIC; in ad_periodic_machine()
1315 else if (port->sm_periodic_timer_counter) { in ad_periodic_machine()
1317 if (!(--port->sm_periodic_timer_counter)) { in ad_periodic_machine()
1319 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1324 switch (port->sm_periodic_state) { in ad_periodic_machine()
1326 if (!(port->partner_oper.port_state in ad_periodic_machine()
1328 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1331 if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) { in ad_periodic_machine()
1332 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1333 port->sm_periodic_state = AD_PERIODIC_TX; in ad_periodic_machine()
1341 switch (port->sm_periodic_state) { in ad_periodic_machine()
1343 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1346 if (!(port->partner_oper.port_state & in ad_periodic_machine()
1348 port->sm_periodic_state = AD_SLOW_PERIODIC; in ad_periodic_machine()
1350 port->sm_periodic_state = AD_FAST_PERIODIC; in ad_periodic_machine()
1358 if (port->sm_periodic_state != last_state) { in ad_periodic_machine()
1359 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_periodic_machine()
1361 port->actor_port_number, last_state, in ad_periodic_machine()
1362 port->sm_periodic_state); in ad_periodic_machine()
1363 switch (port->sm_periodic_state) { in ad_periodic_machine()
1365 port->sm_periodic_timer_counter = 0; in ad_periodic_machine()
1369 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TI… in ad_periodic_machine()
1373 …port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TI… in ad_periodic_machine()
1376 port->ntt = true; in ad_periodic_machine()
1385 * ad_port_selection_logic - select aggregation groups
1403 if (port->sm_vars & AD_PORT_SELECTED) in ad_port_selection_logic()
1409 if (port->aggregator) { in ad_port_selection_logic()
1411 temp_aggregator = port->aggregator; in ad_port_selection_logic()
1412 for (curr_port = temp_aggregator->lag_ports; curr_port; in ad_port_selection_logic()
1414 curr_port = curr_port->next_port_in_aggregator) { in ad_port_selection_logic()
1416 temp_aggregator->num_of_ports--; in ad_port_selection_logic()
1421 temp_aggregator->lag_ports = in ad_port_selection_logic()
1422 port->next_port_in_aggregator; in ad_port_selection_logic()
1427 last_port->next_port_in_aggregator = in ad_port_selection_logic()
1428 port->next_port_in_aggregator; in ad_port_selection_logic()
1434 port->aggregator = NULL; in ad_port_selection_logic()
1435 port->next_port_in_aggregator = NULL; in ad_port_selection_logic()
1436 port->actor_port_aggregator_identifier = 0; in ad_port_selection_logic()
1438 slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n", in ad_port_selection_logic()
1439 port->actor_port_number, in ad_port_selection_logic()
1440 temp_aggregator->aggregator_identifier); in ad_port_selection_logic()
1444 if (!temp_aggregator->lag_ports) in ad_port_selection_logic()
1454 port->slave->bond->dev->name, in ad_port_selection_logic()
1455 port->slave->dev->name, in ad_port_selection_logic()
1456 port->actor_port_number, in ad_port_selection_logic()
1457 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1462 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in ad_port_selection_logic()
1465 if (!aggregator->lag_ports) { in ad_port_selection_logic()
1470 /* check if current aggregator suits us */ in ad_port_selection_logic()
1471 …if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters … in ad_port_selection_logic()
1472 MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) && in ad_port_selection_logic()
1473 (aggregator->partner_system_priority == port->partner_oper.system_priority) && in ad_port_selection_logic()
1474 (aggregator->partner_oper_aggregator_key == port->partner_oper.key) in ad_port_selection_logic()
1476 ((!MAC_ADDRESS_EQUAL(&(port->partner_oper.system), &(null_mac_addr)) && /* partner answers */ in ad_port_selection_logic()
1477 !aggregator->is_individual) /* but is not individual OR */ in ad_port_selection_logic()
1481 port->aggregator = aggregator; in ad_port_selection_logic()
1482 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1483 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1484 port->next_port_in_aggregator = aggregator->lag_ports; in ad_port_selection_logic()
1485 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1486 aggregator->lag_ports = port; in ad_port_selection_logic()
1487 slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n", in ad_port_selection_logic()
1488 port->actor_port_number, in ad_port_selection_logic()
1489 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1492 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1498 /* the port couldn't find an aggregator - attach it to a new in ad_port_selection_logic()
1504 port->aggregator = free_aggregator; in ad_port_selection_logic()
1505 port->actor_port_aggregator_identifier = in ad_port_selection_logic()
1506 port->aggregator->aggregator_identifier; in ad_port_selection_logic()
1509 * if port was responsed from the end-user in ad_port_selection_logic()
1511 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS) in ad_port_selection_logic()
1513 port->aggregator->is_individual = false; in ad_port_selection_logic()
1515 port->aggregator->is_individual = true; in ad_port_selection_logic()
1517 port->aggregator->actor_admin_aggregator_key = in ad_port_selection_logic()
1518 port->actor_admin_port_key; in ad_port_selection_logic()
1519 port->aggregator->actor_oper_aggregator_key = in ad_port_selection_logic()
1520 port->actor_oper_port_key; in ad_port_selection_logic()
1521 port->aggregator->partner_system = in ad_port_selection_logic()
1522 port->partner_oper.system; in ad_port_selection_logic()
1523 port->aggregator->partner_system_priority = in ad_port_selection_logic()
1524 port->partner_oper.system_priority; in ad_port_selection_logic()
1525 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key; in ad_port_selection_logic()
1526 port->aggregator->receive_state = 1; in ad_port_selection_logic()
1527 port->aggregator->transmit_state = 1; in ad_port_selection_logic()
1528 port->aggregator->lag_ports = port; in ad_port_selection_logic()
1529 port->aggregator->num_of_ports++; in ad_port_selection_logic()
1532 port->sm_vars |= AD_PORT_SELECTED; in ad_port_selection_logic()
1534 slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n", in ad_port_selection_logic()
1535 port->actor_port_number, in ad_port_selection_logic()
1536 port->aggregator->aggregator_identifier); in ad_port_selection_logic()
1538 slave_err(bond->dev, port->slave->dev, in ad_port_selection_logic()
1540 port->actor_port_number); in ad_port_selection_logic()
1547 __set_agg_ports_ready(port->aggregator, in ad_port_selection_logic()
1548 __agg_ports_are_ready(port->aggregator)); in ad_port_selection_logic()
1553 if (!port->aggregator->is_active) in ad_port_selection_logic()
1554 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in ad_port_selection_logic()
1558 * the current best, according to the ad_select policy.
1563 /* 0. If no best, select current. in ad_agg_selection_test()
1565 * 1. If the current agg is not individual, and the best is in ad_agg_selection_test()
1566 * individual, select current. in ad_agg_selection_test()
1568 * 2. If current agg is individual and the best is not, keep best. in ad_agg_selection_test()
1570 * 3. Therefore, current and best are both individual or both not in ad_agg_selection_test()
1573 * 3a. If current agg partner replied, and best agg partner did not, in ad_agg_selection_test()
1574 * select current. in ad_agg_selection_test()
1576 * 3b. If current agg partner did not reply and best agg partner in ad_agg_selection_test()
1579 * 4. Therefore, current and best both have partner replies or in ad_agg_selection_test()
1590 if (!curr->is_individual && best->is_individual) in ad_agg_selection_test()
1593 if (curr->is_individual && !best->is_individual) in ad_agg_selection_test()
1602 switch (__get_agg_selection_mode(curr->lag_ports)) { in ad_agg_selection_test()
1620 curr->slave->bond->dev->name, in ad_agg_selection_test()
1621 curr->slave->dev->name, in ad_agg_selection_test()
1622 __get_agg_selection_mode(curr->lag_ports)); in ad_agg_selection_test()
1631 struct port *port = agg->lag_ports; in agg_device_up()
1636 for (port = agg->lag_ports; port; in agg_device_up()
1637 port = port->next_port_in_aggregator) { in agg_device_up()
1638 if (netif_running(port->slave->dev) && in agg_device_up()
1639 netif_carrier_ok(port->slave->dev)) in agg_device_up()
1647 * ad_agg_selection_logic - select an aggregation group for a team
1676 struct bonding *bond = agg->slave->bond; in ad_agg_selection_logic()
1687 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1689 agg->is_active = 0; in ad_agg_selection_logic()
1696 __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) { in ad_agg_selection_logic()
1702 if (active && active->lag_ports && in ad_agg_selection_logic()
1707 if (!(!active->actor_oper_aggregator_key && in ad_agg_selection_logic()
1708 best->actor_oper_aggregator_key)) { in ad_agg_selection_logic()
1710 active->is_active = 1; in ad_agg_selection_logic()
1717 active->is_active = 1; in ad_agg_selection_logic()
1722 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()
1723 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1724 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1725 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1726 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1727 best->is_individual, best->is_active); in ad_agg_selection_logic()
1728 netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n", in ad_agg_selection_logic()
1729 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1730 best->lag_ports, best->slave); in ad_agg_selection_logic()
1733 agg = &(SLAVE_AD_INFO(slave)->aggregator); in ad_agg_selection_logic()
1735 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()
1736 agg->aggregator_identifier, agg->num_of_ports, in ad_agg_selection_logic()
1737 agg->actor_oper_aggregator_key, in ad_agg_selection_logic()
1738 agg->partner_oper_aggregator_key, in ad_agg_selection_logic()
1739 agg->is_individual, agg->is_active); in ad_agg_selection_logic()
1743 if (best->is_individual) in ad_agg_selection_logic()
1745 bond->dev->name); in ad_agg_selection_logic()
1747 best->is_active = 1; in ad_agg_selection_logic()
1748 netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n", in ad_agg_selection_logic()
1749 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1750 best->aggregator_identifier); in ad_agg_selection_logic()
1751 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()
1752 best->slave ? best->slave->dev->name : "NULL", in ad_agg_selection_logic()
1753 best->aggregator_identifier, best->num_of_ports, in ad_agg_selection_logic()
1754 best->actor_oper_aggregator_key, in ad_agg_selection_logic()
1755 best->partner_oper_aggregator_key, in ad_agg_selection_logic()
1756 best->is_individual, best->is_active); in ad_agg_selection_logic()
1762 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1763 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1778 for (port = active->lag_ports; port; in ad_agg_selection_logic()
1779 port = port->next_port_in_aggregator) { in ad_agg_selection_logic()
1791 * ad_clear_agg - clear a given aggregator's parameters
1797 aggregator->is_individual = false; in ad_clear_agg()
1798 aggregator->actor_admin_aggregator_key = 0; in ad_clear_agg()
1799 aggregator->actor_oper_aggregator_key = 0; in ad_clear_agg()
1800 eth_zero_addr(aggregator->partner_system.mac_addr_value); in ad_clear_agg()
1801 aggregator->partner_system_priority = 0; in ad_clear_agg()
1802 aggregator->partner_oper_aggregator_key = 0; in ad_clear_agg()
1803 aggregator->receive_state = 0; in ad_clear_agg()
1804 aggregator->transmit_state = 0; in ad_clear_agg()
1805 aggregator->lag_ports = NULL; in ad_clear_agg()
1806 aggregator->is_active = 0; in ad_clear_agg()
1807 aggregator->num_of_ports = 0; in ad_clear_agg()
1809 aggregator->slave ? in ad_clear_agg()
1810 aggregator->slave->dev->name : "NULL", in ad_clear_agg()
1811 aggregator->aggregator_identifier); in ad_clear_agg()
1816 * ad_initialize_agg - initialize a given aggregator's parameters
1824 eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value); in ad_initialize_agg()
1825 aggregator->aggregator_identifier = 0; in ad_initialize_agg()
1826 aggregator->slave = NULL; in ad_initialize_agg()
1831 * ad_initialize_port - initialize a given port's parameters
1857 port->actor_port_priority = 0xff; in ad_initialize_port()
1858 port->actor_port_aggregator_identifier = 0; in ad_initialize_port()
1859 port->ntt = false; in ad_initialize_port()
1860 port->actor_admin_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1862 port->actor_oper_port_state = LACP_STATE_AGGREGATION | in ad_initialize_port()
1866 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in ad_initialize_port()
1868 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1869 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); in ad_initialize_port()
1871 port->is_enabled = true; in ad_initialize_port()
1873 port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED; in ad_initialize_port()
1874 port->sm_rx_state = 0; in ad_initialize_port()
1875 port->sm_rx_timer_counter = 0; in ad_initialize_port()
1876 port->sm_periodic_state = 0; in ad_initialize_port()
1877 port->sm_periodic_timer_counter = 0; in ad_initialize_port()
1878 port->sm_mux_state = 0; in ad_initialize_port()
1879 port->sm_mux_timer_counter = 0; in ad_initialize_port()
1880 port->sm_tx_state = 0; in ad_initialize_port()
1881 port->aggregator = NULL; in ad_initialize_port()
1882 port->next_port_in_aggregator = NULL; in ad_initialize_port()
1883 port->transaction_id = 0; in ad_initialize_port()
1885 port->sm_churn_actor_timer_counter = 0; in ad_initialize_port()
1886 port->sm_churn_actor_state = 0; in ad_initialize_port()
1887 port->churn_actor_count = 0; in ad_initialize_port()
1888 port->sm_churn_partner_timer_counter = 0; in ad_initialize_port()
1889 port->sm_churn_partner_state = 0; in ad_initialize_port()
1890 port->churn_partner_count = 0; in ad_initialize_port()
1892 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu)); in ad_initialize_port()
1897 * ad_enable_collecting_distributing - enable a port's transmit/receive
1906 if (port->aggregator->is_active) { in ad_enable_collecting_distributing()
1907 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_enable_collecting_distributing()
1909 port->actor_port_number, in ad_enable_collecting_distributing()
1910 port->aggregator->aggregator_identifier); in ad_enable_collecting_distributing()
1918 * ad_disable_collecting_distributing - disable a port's transmit/receive
1925 if (port->aggregator && in ad_disable_collecting_distributing()
1926 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), in ad_disable_collecting_distributing()
1928 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_disable_collecting_distributing()
1930 port->actor_port_number, in ad_disable_collecting_distributing()
1931 port->aggregator->aggregator_identifier); in ad_disable_collecting_distributing()
1939 * ad_marker_info_received - handle receive of a Marker information frame
1948 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx); in ad_marker_info_received()
1949 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx); in ad_marker_info_received()
1958 slave_dbg(port->slave->bond->dev, port->slave->dev, in ad_marker_info_received()
1960 port->actor_port_number); in ad_marker_info_received()
1964 * ad_marker_response_received - handle receive of a marker response frame
1975 atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx); in ad_marker_response_received()
1976 atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx); in ad_marker_response_received()
1987 * bond_3ad_initiate_agg_selection - initate aggregator selection
2001 * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
2011 bond->dev->dev_addr)) { in bond_3ad_initialize()
2016 bond->params.ad_actor_sys_prio; in bond_3ad_initialize()
2017 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_initialize()
2019 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_initialize()
2022 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_initialize()
2036 * bond_3ad_bind_slave - initialize a slave's port
2049 if (SLAVE_AD_INFO(slave)->port.slave != slave) { in bond_3ad_bind_slave()
2052 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_bind_slave()
2054 ad_initialize_port(port, bond->params.lacp_fast); in bond_3ad_bind_slave()
2056 port->slave = slave; in bond_3ad_bind_slave()
2057 port->actor_port_number = SLAVE_AD_INFO(slave)->id; in bond_3ad_bind_slave()
2058 /* key is determined according to the link speed, duplex and in bond_3ad_bind_slave()
2061 port->actor_admin_port_key = bond->params.ad_user_port_key << 6; in bond_3ad_bind_slave()
2068 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND; in bond_3ad_bind_slave()
2073 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_bind_slave()
2077 aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_bind_slave()
2078 aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier; in bond_3ad_bind_slave()
2079 aggregator->slave = slave; in bond_3ad_bind_slave()
2080 aggregator->is_active = 0; in bond_3ad_bind_slave()
2081 aggregator->num_of_ports = 0; in bond_3ad_bind_slave()
2086 * bond_3ad_unbind_slave - deinitialize a slave's port
2098 struct bonding *bond = slave->bond; in bond_3ad_unbind_slave()
2104 spin_lock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2105 aggregator = &(SLAVE_AD_INFO(slave)->aggregator); in bond_3ad_unbind_slave()
2106 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_unbind_slave()
2109 if (!port->slave) { in bond_3ad_unbind_slave()
2110 slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n"); in bond_3ad_unbind_slave()
2114 slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n", in bond_3ad_unbind_slave()
2115 aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2118 port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; in bond_3ad_unbind_slave()
2119 port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; in bond_3ad_unbind_slave()
2120 port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; in bond_3ad_unbind_slave()
2121 port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION; in bond_3ad_unbind_slave()
2126 if (aggregator->lag_ports) { in bond_3ad_unbind_slave()
2132 if ((aggregator->lag_ports != port) || in bond_3ad_unbind_slave()
2133 (aggregator->lag_ports->next_port_in_aggregator)) { in bond_3ad_unbind_slave()
2136 new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2140 if (!new_aggregator->lag_ports || in bond_3ad_unbind_slave()
2141 ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2142 !new_aggregator->lag_ports->next_port_in_aggregator)) in bond_3ad_unbind_slave()
2152 …ew_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_ag… in bond_3ad_unbind_slave()
2153 slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n", in bond_3ad_unbind_slave()
2154 aggregator->aggregator_identifier, in bond_3ad_unbind_slave()
2155 new_aggregator->aggregator_identifier); in bond_3ad_unbind_slave()
2157 if ((new_aggregator->lag_ports == port) && in bond_3ad_unbind_slave()
2158 new_aggregator->is_active) { in bond_3ad_unbind_slave()
2159 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2163 new_aggregator->is_individual = aggregator->is_individual; in bond_3ad_unbind_slave()
2164 new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key; in bond_3ad_unbind_slave()
2165 new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key; in bond_3ad_unbind_slave()
2166 new_aggregator->partner_system = aggregator->partner_system; in bond_3ad_unbind_slave()
2167 new_aggregator->partner_system_priority = aggregator->partner_system_priority; in bond_3ad_unbind_slave()
2168 new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key; in bond_3ad_unbind_slave()
2169 new_aggregator->receive_state = aggregator->receive_state; in bond_3ad_unbind_slave()
2170 new_aggregator->transmit_state = aggregator->transmit_state; in bond_3ad_unbind_slave()
2171 new_aggregator->lag_ports = aggregator->lag_ports; in bond_3ad_unbind_slave()
2172 new_aggregator->is_active = aggregator->is_active; in bond_3ad_unbind_slave()
2173 new_aggregator->num_of_ports = aggregator->num_of_ports; in bond_3ad_unbind_slave()
2178 for (temp_port = aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2179 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2180 temp_port->aggregator = new_aggregator; in bond_3ad_unbind_slave()
2181 temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier; in bond_3ad_unbind_slave()
2190 …slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for i… in bond_3ad_unbind_slave()
2196 select_new_active_agg = aggregator->is_active; in bond_3ad_unbind_slave()
2199 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2209 slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number); in bond_3ad_unbind_slave()
2213 temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator); in bond_3ad_unbind_slave()
2216 for (temp_port = temp_aggregator->lag_ports; temp_port; in bond_3ad_unbind_slave()
2218 temp_port = temp_port->next_port_in_aggregator) { in bond_3ad_unbind_slave()
2220 /* the aggregator found - detach the port from in bond_3ad_unbind_slave()
2224 prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2226 temp_aggregator->lag_ports = temp_port->next_port_in_aggregator; in bond_3ad_unbind_slave()
2227 temp_aggregator->num_of_ports--; in bond_3ad_unbind_slave()
2229 select_new_active_agg = temp_aggregator->is_active; in bond_3ad_unbind_slave()
2232 slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); in bond_3ad_unbind_slave()
2242 port->slave = NULL; in bond_3ad_unbind_slave()
2245 spin_unlock_bh(&bond->mode_lock); in bond_3ad_unbind_slave()
2249 * bond_3ad_update_ad_actor_settings - reflect change of actor settings to ports
2262 BOND_AD_INFO(bond).system.sys_priority = bond->params.ad_actor_sys_prio; in bond_3ad_update_ad_actor_settings()
2263 if (is_zero_ether_addr(bond->params.ad_actor_system)) in bond_3ad_update_ad_actor_settings()
2265 *((struct mac_addr *)bond->dev->dev_addr); in bond_3ad_update_ad_actor_settings()
2268 *((struct mac_addr *)bond->params.ad_actor_system); in bond_3ad_update_ad_actor_settings()
2270 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2272 struct port *port = &(SLAVE_AD_INFO(slave))->port; in bond_3ad_update_ad_actor_settings()
2275 port->ntt = true; in bond_3ad_update_ad_actor_settings()
2277 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_ad_actor_settings()
2281 * bond_3ad_state_machine_handler - handle state machines timeout
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()
2317 !(--BOND_AD_INFO(bond).agg_select_timer)) { in bond_3ad_state_machine_handler()
2319 port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL; in bond_3ad_state_machine_handler()
2323 if (!port->slave) { in bond_3ad_state_machine_handler()
2325 bond->dev->name); in bond_3ad_state_machine_handler()
2337 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_state_machine_handler()
2338 if (!port->slave) { in bond_3ad_state_machine_handler()
2340 bond->dev->name); in bond_3ad_state_machine_handler()
2345 ad_periodic_machine(port, &bond->params); in bond_3ad_state_machine_handler()
2352 if (port->sm_vars & AD_PORT_BEGIN) in bond_3ad_state_machine_handler()
2353 port->sm_vars &= ~AD_PORT_BEGIN; in bond_3ad_state_machine_handler()
2358 if (slave->should_notify) { in bond_3ad_state_machine_handler()
2364 spin_unlock_bh(&bond->mode_lock); in bond_3ad_state_machine_handler()
2373 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks); in bond_3ad_state_machine_handler()
2377 * bond_3ad_rx_indication - handle a received frame
2387 struct bonding *bond = slave->bond; in bond_3ad_rx_indication()
2393 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_rx_indication()
2394 if (!port->slave) { in bond_3ad_rx_indication()
2396 slave->dev->name, slave->bond->dev->name); in bond_3ad_rx_indication()
2400 switch (lacpdu->subtype) { in bond_3ad_rx_indication()
2403 slave_dbg(slave->bond->dev, slave->dev, in bond_3ad_rx_indication()
2405 port->actor_port_number); in bond_3ad_rx_indication()
2407 spin_lock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2409 spin_unlock(&slave->bond->mode_lock); in bond_3ad_rx_indication()
2417 switch (marker->tlv_type) { in bond_3ad_rx_indication()
2419 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n", in bond_3ad_rx_indication()
2420 port->actor_port_number); in bond_3ad_rx_indication()
2424 slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n", in bond_3ad_rx_indication()
2425 port->actor_port_number); in bond_3ad_rx_indication()
2429 slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n", in bond_3ad_rx_indication()
2430 port->actor_port_number); in bond_3ad_rx_indication()
2431 stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx; in bond_3ad_rx_indication()
2438 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx); in bond_3ad_rx_indication()
2446 * ad_update_actor_keys - Update the oper / admin keys for a port based on
2447 * its current speed and duplex settings.
2450 * @reset: Boolean to just reset the speed and the duplex part of the key
2454 * (b) When the speed is changed, LACP need to be reinitiated.
2459 u16 ospeed = 0, speed = 0; in ad_update_actor_keys() local
2460 u16 old_oper_key = port->actor_oper_port_key; in ad_update_actor_keys()
2462 port->actor_admin_port_key &= ~(AD_SPEED_KEY_MASKS|AD_DUPLEX_KEY_MASKS); in ad_update_actor_keys()
2464 speed = __get_link_speed(port); in ad_update_actor_keys()
2467 port->actor_admin_port_key |= (speed << 1) | duplex; in ad_update_actor_keys()
2469 port->actor_oper_port_key = port->actor_admin_port_key; in ad_update_actor_keys()
2471 if (old_oper_key != port->actor_oper_port_key) { in ad_update_actor_keys()
2474 port->sm_vars |= AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2476 port->sm_vars &= ~AD_PORT_LACP_ENABLED; in ad_update_actor_keys()
2479 if (!speed) { in ad_update_actor_keys()
2480 slave_err(port->slave->bond->dev, in ad_update_actor_keys()
2481 port->slave->dev, in ad_update_actor_keys()
2482 "speed changed to 0 on port %d\n", in ad_update_actor_keys()
2483 port->actor_port_number); in ad_update_actor_keys()
2484 } else if (duplex && ospeed != speed) { in ad_update_actor_keys()
2485 /* Speed change restarts LACP state-machine */ in ad_update_actor_keys()
2486 port->sm_vars |= AD_PORT_BEGIN; in ad_update_actor_keys()
2493 * bond_3ad_adapter_speed_duplex_changed - handle a slave's speed / duplex
2504 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_adapter_speed_duplex_changed()
2507 if (!port->slave) { in bond_3ad_adapter_speed_duplex_changed()
2508 slave_warn(slave->bond->dev, slave->dev, in bond_3ad_adapter_speed_duplex_changed()
2509 "speed/duplex changed for uninitialized port\n"); in bond_3ad_adapter_speed_duplex_changed()
2513 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2515 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_adapter_speed_duplex_changed()
2516 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n", in bond_3ad_adapter_speed_duplex_changed()
2517 port->actor_port_number); in bond_3ad_adapter_speed_duplex_changed()
2521 * bond_3ad_handle_link_change - handle a slave's link status change indication
2533 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_handle_link_change()
2536 if (!port->slave) { in bond_3ad_handle_link_change()
2537 slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n"); in bond_3ad_handle_link_change()
2541 spin_lock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2542 /* on link down we are zeroing duplex and speed since in bond_3ad_handle_link_change()
2543 * some of the adaptors(ce1000.lan) report full duplex/speed in bond_3ad_handle_link_change()
2544 * instead of N/A(duplex) / 0(speed). in bond_3ad_handle_link_change()
2546 * on link up we are forcing recheck on the duplex and speed since in bond_3ad_handle_link_change()
2550 port->is_enabled = true; in bond_3ad_handle_link_change()
2554 port->is_enabled = false; in bond_3ad_handle_link_change()
2560 spin_unlock_bh(&slave->bond->mode_lock); in bond_3ad_handle_link_change()
2562 slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n", in bond_3ad_handle_link_change()
2563 port->actor_port_number, in bond_3ad_handle_link_change()
2569 bond_update_slave_arr(slave->bond, NULL); in bond_3ad_handle_link_change()
2573 * bond_3ad_set_carrier - set link state for bonding master
2597 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator)); in bond_3ad_set_carrier()
2600 if (__agg_active_ports(active) < bond->params.min_links) { in bond_3ad_set_carrier()
2601 if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2602 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2605 } else if (!netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2606 netif_carrier_on(bond->dev); in bond_3ad_set_carrier()
2609 } else if (netif_carrier_ok(bond->dev)) { in bond_3ad_set_carrier()
2610 netif_carrier_off(bond->dev); in bond_3ad_set_carrier()
2618 * __bond_3ad_get_active_agg_info - get information of the active aggregator
2634 port = &(SLAVE_AD_INFO(slave)->port); in __bond_3ad_get_active_agg_info()
2635 if (port->aggregator && port->aggregator->is_active) { in __bond_3ad_get_active_agg_info()
2636 aggregator = port->aggregator; in __bond_3ad_get_active_agg_info()
2642 return -1; in __bond_3ad_get_active_agg_info()
2644 ad_info->aggregator_id = aggregator->aggregator_identifier; in __bond_3ad_get_active_agg_info()
2645 ad_info->ports = __agg_active_ports(aggregator); in __bond_3ad_get_active_agg_info()
2646 ad_info->actor_key = aggregator->actor_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2647 ad_info->partner_key = aggregator->partner_oper_aggregator_key; in __bond_3ad_get_active_agg_info()
2648 ether_addr_copy(ad_info->partner_system, in __bond_3ad_get_active_agg_info()
2649 aggregator->partner_system.mac_addr_value); in __bond_3ad_get_active_agg_info()
2669 if (skb->protocol != PKT_TYPE_LACPDU) in bond_3ad_lacpdu_recv()
2672 if (!MAC_ADDRESS_EQUAL(eth_hdr(skb)->h_dest, lacpdu_mcast_addr)) in bond_3ad_lacpdu_recv()
2677 atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx); in bond_3ad_lacpdu_recv()
2686 * bond_3ad_update_lacp_rate - change the lacp rate
2692 * Hold bond->mode_lock,
2693 * so we can modify port->actor_oper_port_state,
2703 lacp_fast = bond->params.lacp_fast; in bond_3ad_update_lacp_rate()
2704 spin_lock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2706 port = &(SLAVE_AD_INFO(slave)->port); in bond_3ad_update_lacp_rate()
2708 port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2710 port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT; in bond_3ad_update_lacp_rate()
2712 spin_unlock_bh(&bond->mode_lock); in bond_3ad_update_lacp_rate()
2732 val = atomic64_read(&stats->lacpdu_rx); in bond_3ad_stats_fill()
2735 return -EMSGSIZE; in bond_3ad_stats_fill()
2736 val = atomic64_read(&stats->lacpdu_tx); in bond_3ad_stats_fill()
2739 return -EMSGSIZE; in bond_3ad_stats_fill()
2740 val = atomic64_read(&stats->lacpdu_unknown_rx); in bond_3ad_stats_fill()
2743 return -EMSGSIZE; in bond_3ad_stats_fill()
2744 val = atomic64_read(&stats->lacpdu_illegal_rx); in bond_3ad_stats_fill()
2747 return -EMSGSIZE; in bond_3ad_stats_fill()
2749 val = atomic64_read(&stats->marker_rx); in bond_3ad_stats_fill()
2752 return -EMSGSIZE; in bond_3ad_stats_fill()
2753 val = atomic64_read(&stats->marker_tx); in bond_3ad_stats_fill()
2756 return -EMSGSIZE; in bond_3ad_stats_fill()
2757 val = atomic64_read(&stats->marker_resp_rx); in bond_3ad_stats_fill()
2760 return -EMSGSIZE; in bond_3ad_stats_fill()
2761 val = atomic64_read(&stats->marker_resp_tx); in bond_3ad_stats_fill()
2764 return -EMSGSIZE; in bond_3ad_stats_fill()
2765 val = atomic64_read(&stats->marker_unknown_rx); in bond_3ad_stats_fill()
2768 return -EMSGSIZE; in bond_3ad_stats_fill()