aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/bonding/bond_3ad.c55
-rw-r--r--drivers/net/bonding/bond_main.c6
-rw-r--r--drivers/net/bonding/bond_options.c1
-rw-r--r--include/net/bond_3ad.h1
-rw-r--r--include/net/bonding.h1
5 files changed, 47 insertions, 17 deletions
diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
index 8baa87df1738..cfc4a9c1000a 100644
--- a/drivers/net/bonding/bond_3ad.c
+++ b/drivers/net/bonding/bond_3ad.c
@@ -467,11 +467,14 @@ static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
467 /* set the partner sync. to on if the partner is sync, 467 /* set the partner sync. to on if the partner is sync,
468 * and the port is matched 468 * and the port is matched
469 */ 469 */
470 if ((port->sm_vars & AD_PORT_MATCHED) 470 if ((port->sm_vars & AD_PORT_MATCHED) &&
471 && (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) 471 (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) {
472 partner->port_state |= AD_STATE_SYNCHRONIZATION; 472 partner->port_state |= AD_STATE_SYNCHRONIZATION;
473 else 473 pr_debug("%s partner sync=1\n", port->slave->dev->name);
474 } else {
474 partner->port_state &= ~AD_STATE_SYNCHRONIZATION; 475 partner->port_state &= ~AD_STATE_SYNCHRONIZATION;
476 pr_debug("%s partner sync=0\n", port->slave->dev->name);
477 }
475 } 478 }
476} 479}
477 480
@@ -726,6 +729,8 @@ static inline void __update_lacpdu_from_port(struct port *port)
726 lacpdu->actor_port_priority = htons(port->actor_port_priority); 729 lacpdu->actor_port_priority = htons(port->actor_port_priority);
727 lacpdu->actor_port = htons(port->actor_port_number); 730 lacpdu->actor_port = htons(port->actor_port_number);
728 lacpdu->actor_state = port->actor_oper_port_state; 731 lacpdu->actor_state = port->actor_oper_port_state;
732 pr_debug("update lacpdu: %s, actor port state %x\n",
733 port->slave->dev->name, port->actor_oper_port_state);
729 734
730 /* lacpdu->reserved_3_1 initialized 735 /* lacpdu->reserved_3_1 initialized
731 * lacpdu->tlv_type_partner_info initialized 736 * lacpdu->tlv_type_partner_info initialized
@@ -898,7 +903,9 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
898 if ((port->sm_vars & AD_PORT_SELECTED) && 903 if ((port->sm_vars & AD_PORT_SELECTED) &&
899 (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && 904 (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) &&
900 !__check_agg_selection_timer(port)) { 905 !__check_agg_selection_timer(port)) {
901 port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING; 906 if (port->aggregator->is_active)
907 port->sm_mux_state =
908 AD_MUX_COLLECTING_DISTRIBUTING;
902 } else if (!(port->sm_vars & AD_PORT_SELECTED) || 909 } else if (!(port->sm_vars & AD_PORT_SELECTED) ||
903 (port->sm_vars & AD_PORT_STANDBY)) { 910 (port->sm_vars & AD_PORT_STANDBY)) {
904 /* if UNSELECTED or STANDBY */ 911 /* if UNSELECTED or STANDBY */
@@ -910,12 +917,16 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
910 */ 917 */
911 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator)); 918 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
912 port->sm_mux_state = AD_MUX_DETACHED; 919 port->sm_mux_state = AD_MUX_DETACHED;
920 } else if (port->aggregator->is_active) {
921 port->actor_oper_port_state |=
922 AD_STATE_SYNCHRONIZATION;
913 } 923 }
914 break; 924 break;
915 case AD_MUX_COLLECTING_DISTRIBUTING: 925 case AD_MUX_COLLECTING_DISTRIBUTING:
916 if (!(port->sm_vars & AD_PORT_SELECTED) || 926 if (!(port->sm_vars & AD_PORT_SELECTED) ||
917 (port->sm_vars & AD_PORT_STANDBY) || 927 (port->sm_vars & AD_PORT_STANDBY) ||
918 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION)) { 928 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) ||
929 !(port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) {
919 port->sm_mux_state = AD_MUX_ATTACHED; 930 port->sm_mux_state = AD_MUX_ATTACHED;
920 } else { 931 } else {
921 /* if port state hasn't changed make 932 /* if port state hasn't changed make
@@ -937,8 +948,10 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
937 948
938 /* check if the state machine was changed */ 949 /* check if the state machine was changed */
939 if (port->sm_mux_state != last_state) { 950 if (port->sm_mux_state != last_state) {
940 pr_debug("Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", 951 pr_debug("Mux Machine: Port=%d (%s), Last State=%d, Curr State=%d\n",
941 port->actor_port_number, last_state, 952 port->actor_port_number,
953 port->slave->dev->name,
954 last_state,
942 port->sm_mux_state); 955 port->sm_mux_state);
943 switch (port->sm_mux_state) { 956 switch (port->sm_mux_state) {
944 case AD_MUX_DETACHED: 957 case AD_MUX_DETACHED:
@@ -953,7 +966,12 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
953 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0); 966 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0);
954 break; 967 break;
955 case AD_MUX_ATTACHED: 968 case AD_MUX_ATTACHED:
956 port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION; 969 if (port->aggregator->is_active)
970 port->actor_oper_port_state |=
971 AD_STATE_SYNCHRONIZATION;
972 else
973 port->actor_oper_port_state &=
974 ~AD_STATE_SYNCHRONIZATION;
957 port->actor_oper_port_state &= ~AD_STATE_COLLECTING; 975 port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
958 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; 976 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
959 ad_disable_collecting_distributing(port, 977 ad_disable_collecting_distributing(port,
@@ -963,6 +981,7 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
963 case AD_MUX_COLLECTING_DISTRIBUTING: 981 case AD_MUX_COLLECTING_DISTRIBUTING:
964 port->actor_oper_port_state |= AD_STATE_COLLECTING; 982 port->actor_oper_port_state |= AD_STATE_COLLECTING;
965 port->actor_oper_port_state |= AD_STATE_DISTRIBUTING; 983 port->actor_oper_port_state |= AD_STATE_DISTRIBUTING;
984 port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION;
966 ad_enable_collecting_distributing(port, 985 ad_enable_collecting_distributing(port,
967 update_slave_arr); 986 update_slave_arr);
968 port->ntt = true; 987 port->ntt = true;
@@ -1044,8 +1063,10 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1044 1063
1045 /* check if the State machine was changed or new lacpdu arrived */ 1064 /* check if the State machine was changed or new lacpdu arrived */
1046 if ((port->sm_rx_state != last_state) || (lacpdu)) { 1065 if ((port->sm_rx_state != last_state) || (lacpdu)) {
1047 pr_debug("Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", 1066 pr_debug("Rx Machine: Port=%d (%s), Last State=%d, Curr State=%d\n",
1048 port->actor_port_number, last_state, 1067 port->actor_port_number,
1068 port->slave->dev->name,
1069 last_state,
1049 port->sm_rx_state); 1070 port->sm_rx_state);
1050 switch (port->sm_rx_state) { 1071 switch (port->sm_rx_state) {
1051 case AD_RX_INITIALIZE: 1072 case AD_RX_INITIALIZE:
@@ -1394,6 +1415,9 @@ static void ad_port_selection_logic(struct port *port, bool *update_slave_arr)
1394 1415
1395 aggregator = __get_first_agg(port); 1416 aggregator = __get_first_agg(port);
1396 ad_agg_selection_logic(aggregator, update_slave_arr); 1417 ad_agg_selection_logic(aggregator, update_slave_arr);
1418
1419 if (!port->aggregator->is_active)
1420 port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
1397} 1421}
1398 1422
1399/* Decide if "agg" is a better choice for the new active aggregator that 1423/* Decide if "agg" is a better choice for the new active aggregator that
@@ -2195,8 +2219,10 @@ static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave,
2195 switch (lacpdu->subtype) { 2219 switch (lacpdu->subtype) {
2196 case AD_TYPE_LACPDU: 2220 case AD_TYPE_LACPDU:
2197 ret = RX_HANDLER_CONSUMED; 2221 ret = RX_HANDLER_CONSUMED;
2198 netdev_dbg(slave->bond->dev, "Received LACPDU on port %d\n", 2222 netdev_dbg(slave->bond->dev,
2199 port->actor_port_number); 2223 "Received LACPDU on port %d slave %s\n",
2224 port->actor_port_number,
2225 slave->dev->name);
2200 /* Protect against concurrent state machines */ 2226 /* Protect against concurrent state machines */
2201 spin_lock(&slave->bond->mode_lock); 2227 spin_lock(&slave->bond->mode_lock);
2202 ad_rx_machine(lacpdu, port); 2228 ad_rx_machine(lacpdu, port);
@@ -2288,7 +2314,10 @@ void bond_3ad_adapter_duplex_changed(struct slave *slave)
2288 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS; 2314 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_MASKS;
2289 port->actor_oper_port_key = port->actor_admin_port_key |= 2315 port->actor_oper_port_key = port->actor_admin_port_key |=
2290 __get_duplex(port); 2316 __get_duplex(port);
2291 netdev_dbg(slave->bond->dev, "Port %d changed duplex\n", port->actor_port_number); 2317 netdev_dbg(slave->bond->dev, "Port %d slave %s changed duplex\n",
2318 port->actor_port_number, slave->dev->name);
2319 if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)
2320 port->sm_vars |= AD_PORT_LACP_ENABLED;
2292 /* there is no need to reselect a new aggregator, just signal the 2321 /* there is no need to reselect a new aggregator, just signal the
2293 * state machines to reinitialize 2322 * state machines to reinitialize
2294 */ 2323 */
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index f47bc433407a..e229a8657de8 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -334,7 +334,7 @@ static int bond_vlan_rx_kill_vid(struct net_device *bond_dev,
334 * 334 *
335 * Returns zero if carrier state does not change, nonzero if it does. 335 * Returns zero if carrier state does not change, nonzero if it does.
336 */ 336 */
337static int bond_set_carrier(struct bonding *bond) 337int bond_set_carrier(struct bonding *bond)
338{ 338{
339 struct list_head *iter; 339 struct list_head *iter;
340 struct slave *slave; 340 struct slave *slave;
@@ -3066,7 +3066,7 @@ static int bond_open(struct net_device *bond_dev)
3066 slave != rcu_access_pointer(bond->curr_active_slave)) { 3066 slave != rcu_access_pointer(bond->curr_active_slave)) {
3067 bond_set_slave_inactive_flags(slave, 3067 bond_set_slave_inactive_flags(slave,
3068 BOND_SLAVE_NOTIFY_NOW); 3068 BOND_SLAVE_NOTIFY_NOW);
3069 } else { 3069 } else if (BOND_MODE(bond) != BOND_MODE_8023AD) {
3070 bond_set_slave_active_flags(slave, 3070 bond_set_slave_active_flags(slave,
3071 BOND_SLAVE_NOTIFY_NOW); 3071 BOND_SLAVE_NOTIFY_NOW);
3072 } 3072 }
@@ -3734,7 +3734,7 @@ out:
3734 * usable slave array is formed in the control path. The xmit function 3734 * usable slave array is formed in the control path. The xmit function
3735 * just calculates hash and sends the packet out. 3735 * just calculates hash and sends the packet out.
3736 */ 3736 */
3737int bond_3ad_xor_xmit(struct sk_buff *skb, struct net_device *dev) 3737static int bond_3ad_xor_xmit(struct sk_buff *skb, struct net_device *dev)
3738{ 3738{
3739 struct bonding *bond = netdev_priv(dev); 3739 struct bonding *bond = netdev_priv(dev);
3740 struct slave *slave; 3740 struct slave *slave;
diff --git a/drivers/net/bonding/bond_options.c b/drivers/net/bonding/bond_options.c
index 9bd538d4474b..4df28943d222 100644
--- a/drivers/net/bonding/bond_options.c
+++ b/drivers/net/bonding/bond_options.c
@@ -1181,6 +1181,7 @@ static int bond_option_min_links_set(struct bonding *bond,
1181 netdev_info(bond->dev, "Setting min links value to %llu\n", 1181 netdev_info(bond->dev, "Setting min links value to %llu\n",
1182 newval->value); 1182 newval->value);
1183 bond->params.min_links = newval->value; 1183 bond->params.min_links = newval->value;
1184 bond_set_carrier(bond);
1184 1185
1185 return 0; 1186 return 0;
1186} 1187}
diff --git a/include/net/bond_3ad.h b/include/net/bond_3ad.h
index e01d903633ef..f04cdbb7848e 100644
--- a/include/net/bond_3ad.h
+++ b/include/net/bond_3ad.h
@@ -274,7 +274,6 @@ void bond_3ad_handle_link_change(struct slave *slave, char link);
274int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); 274int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info);
275int __bond_3ad_get_active_agg_info(struct bonding *bond, 275int __bond_3ad_get_active_agg_info(struct bonding *bond,
276 struct ad_info *ad_info); 276 struct ad_info *ad_info);
277int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev);
278int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, 277int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
279 struct slave *slave); 278 struct slave *slave);
280int bond_3ad_set_carrier(struct bonding *bond); 279int bond_3ad_set_carrier(struct bonding *bond);
diff --git a/include/net/bonding.h b/include/net/bonding.h
index 983a94b86b95..29f53eacac0a 100644
--- a/include/net/bonding.h
+++ b/include/net/bonding.h
@@ -525,6 +525,7 @@ void bond_sysfs_slave_del(struct slave *slave);
525int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); 525int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev);
526int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); 526int bond_release(struct net_device *bond_dev, struct net_device *slave_dev);
527u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); 527u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb);
528int bond_set_carrier(struct bonding *bond);
528void bond_select_active_slave(struct bonding *bond); 529void bond_select_active_slave(struct bonding *bond);
529void bond_change_active_slave(struct bonding *bond, struct slave *new_active); 530void bond_change_active_slave(struct bonding *bond, struct slave *new_active);
530void bond_create_debugfs(void); 531void bond_create_debugfs(void);