diff options
-rw-r--r-- | drivers/net/bonding/bond_3ad.c | 55 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 6 | ||||
-rw-r--r-- | drivers/net/bonding/bond_options.c | 1 | ||||
-rw-r--r-- | include/net/bond_3ad.h | 1 | ||||
-rw-r--r-- | include/net/bonding.h | 1 |
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 | */ |
337 | static int bond_set_carrier(struct bonding *bond) | 337 | int 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 | */ |
3737 | int bond_3ad_xor_xmit(struct sk_buff *skb, struct net_device *dev) | 3737 | static 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); | |||
274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); | 274 | int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info); |
275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, | 275 | int __bond_3ad_get_active_agg_info(struct bonding *bond, |
276 | struct ad_info *ad_info); | 276 | struct ad_info *ad_info); |
277 | int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev); | ||
278 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, | 277 | int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond, |
279 | struct slave *slave); | 278 | struct slave *slave); |
280 | int bond_3ad_set_carrier(struct bonding *bond); | 279 | int 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); | |||
525 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); | 525 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev); |
526 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); | 526 | int bond_release(struct net_device *bond_dev, struct net_device *slave_dev); |
527 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); | 527 | u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb); |
528 | int bond_set_carrier(struct bonding *bond); | ||
528 | void bond_select_active_slave(struct bonding *bond); | 529 | void bond_select_active_slave(struct bonding *bond); |
529 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); | 530 | void bond_change_active_slave(struct bonding *bond, struct slave *new_active); |
530 | void bond_create_debugfs(void); | 531 | void bond_create_debugfs(void); |