@@ -95,13 +95,13 @@ static int ad_marker_send(struct port *port, struct bond_marker *marker);
9595static void ad_mux_machine (struct port * port , bool * update_slave_arr );
9696static void ad_rx_machine (struct lacpdu * lacpdu , struct port * port );
9797static void ad_tx_machine (struct port * port );
98- static void ad_periodic_machine (struct port * port , struct bond_params * bond_params );
98+ static void ad_periodic_machine (struct port * port );
9999static void ad_port_selection_logic (struct port * port , bool * update_slave_arr );
100100static void ad_agg_selection_logic (struct aggregator * aggregator ,
101101 bool * update_slave_arr );
102102static void ad_clear_agg (struct aggregator * aggregator );
103103static void ad_initialize_agg (struct aggregator * aggregator );
104- static void ad_initialize_port (struct port * port , int lacp_fast );
104+ static void ad_initialize_port (struct port * port , const struct bond_params * bond_params );
105105static void ad_enable_collecting (struct port * port );
106106static void ad_disable_distributing (struct port * port ,
107107 bool * update_slave_arr );
@@ -1296,10 +1296,16 @@ static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
12961296 * case of EXPIRED even if LINK_DOWN didn't arrive for
12971297 * the port.
12981298 */
1299- port -> partner_oper .port_state &= ~LACP_STATE_SYNCHRONIZATION ;
13001299 port -> sm_vars &= ~AD_PORT_MATCHED ;
1300+ /* Based on IEEE 8021AX-2014, Figure 6-18 - Receive
1301+ * machine state diagram, the statue should be
1302+ * Partner_Oper_Port_State.Synchronization = FALSE;
1303+ * Partner_Oper_Port_State.LACP_Timeout = Short Timeout;
1304+ * start current_while_timer(Short Timeout);
1305+ * Actor_Oper_Port_State.Expired = TRUE;
1306+ */
1307+ port -> partner_oper .port_state &= ~LACP_STATE_SYNCHRONIZATION ;
13011308 port -> partner_oper .port_state |= LACP_STATE_LACP_TIMEOUT ;
1302- port -> partner_oper .port_state |= LACP_STATE_LACP_ACTIVITY ;
13031309 port -> sm_rx_timer_counter = __ad_timer_to_ticks (AD_CURRENT_WHILE_TIMER , (u16 )(AD_SHORT_TIMEOUT ));
13041310 port -> actor_oper_port_state |= LACP_STATE_EXPIRED ;
13051311 port -> sm_vars |= AD_PORT_CHURNED ;
@@ -1405,11 +1411,10 @@ static void ad_tx_machine(struct port *port)
14051411/**
14061412 * ad_periodic_machine - handle a port's periodic state machine
14071413 * @port: the port we're looking at
1408- * @bond_params: bond parameters we will use
14091414 *
14101415 * Turn ntt flag on priodically to perform periodic transmission of lacpdu's.
14111416 */
1412- static void ad_periodic_machine (struct port * port , struct bond_params * bond_params )
1417+ static void ad_periodic_machine (struct port * port )
14131418{
14141419 periodic_states_t last_state ;
14151420
@@ -1418,8 +1423,7 @@ static void ad_periodic_machine(struct port *port, struct bond_params *bond_para
14181423
14191424 /* check if port was reinitialized */
14201425 if (((port -> sm_vars & AD_PORT_BEGIN ) || !(port -> sm_vars & AD_PORT_LACP_ENABLED ) || !port -> is_enabled ) ||
1421- (!(port -> actor_oper_port_state & LACP_STATE_LACP_ACTIVITY ) && !(port -> partner_oper .port_state & LACP_STATE_LACP_ACTIVITY )) ||
1422- !bond_params -> lacp_active ) {
1426+ (!(port -> actor_oper_port_state & LACP_STATE_LACP_ACTIVITY ) && !(port -> partner_oper .port_state & LACP_STATE_LACP_ACTIVITY ))) {
14231427 port -> sm_periodic_state = AD_NO_PERIODIC ;
14241428 }
14251429 /* check if state machine should change state */
@@ -1943,16 +1947,16 @@ static void ad_initialize_agg(struct aggregator *aggregator)
19431947/**
19441948 * ad_initialize_port - initialize a given port's parameters
19451949 * @port: the port we're looking at
1946- * @lacp_fast: boolean. whether fast periodic should be used
1950+ * @bond_params: bond parameters we will use
19471951 */
1948- static void ad_initialize_port (struct port * port , int lacp_fast )
1952+ static void ad_initialize_port (struct port * port , const struct bond_params * bond_params )
19491953{
19501954 static const struct port_params tmpl = {
19511955 .system_priority = 0xffff ,
19521956 .key = 1 ,
19531957 .port_number = 1 ,
19541958 .port_priority = 0xff ,
1955- .port_state = 1 ,
1959+ .port_state = 0 ,
19561960 };
19571961 static const struct lacpdu lacpdu = {
19581962 .subtype = 0x01 ,
@@ -1970,12 +1974,14 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
19701974 port -> actor_port_priority = 0xff ;
19711975 port -> actor_port_aggregator_identifier = 0 ;
19721976 port -> ntt = false;
1973- port -> actor_admin_port_state = LACP_STATE_AGGREGATION |
1974- LACP_STATE_LACP_ACTIVITY ;
1975- port -> actor_oper_port_state = LACP_STATE_AGGREGATION |
1976- LACP_STATE_LACP_ACTIVITY ;
1977+ port -> actor_admin_port_state = LACP_STATE_AGGREGATION ;
1978+ port -> actor_oper_port_state = LACP_STATE_AGGREGATION ;
1979+ if (bond_params -> lacp_active ) {
1980+ port -> actor_admin_port_state |= LACP_STATE_LACP_ACTIVITY ;
1981+ port -> actor_oper_port_state |= LACP_STATE_LACP_ACTIVITY ;
1982+ }
19771983
1978- if (lacp_fast )
1984+ if (bond_params -> lacp_fast )
19791985 port -> actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT ;
19801986
19811987 memcpy (& port -> partner_admin , & tmpl , sizeof (tmpl ));
@@ -2187,7 +2193,7 @@ void bond_3ad_bind_slave(struct slave *slave)
21872193 /* port initialization */
21882194 port = & (SLAVE_AD_INFO (slave )-> port );
21892195
2190- ad_initialize_port (port , bond -> params . lacp_fast );
2196+ ad_initialize_port (port , & bond -> params );
21912197
21922198 port -> slave = slave ;
21932199 port -> actor_port_number = SLAVE_AD_INFO (slave )-> id ;
@@ -2499,7 +2505,7 @@ void bond_3ad_state_machine_handler(struct work_struct *work)
24992505 }
25002506
25012507 ad_rx_machine (NULL , port );
2502- ad_periodic_machine (port , & bond -> params );
2508+ ad_periodic_machine (port );
25032509 ad_port_selection_logic (port , & update_slave_arr );
25042510 ad_mux_machine (port , & update_slave_arr );
25052511 ad_tx_machine (port );
@@ -2869,6 +2875,31 @@ void bond_3ad_update_lacp_rate(struct bonding *bond)
28692875 spin_unlock_bh (& bond -> mode_lock );
28702876}
28712877
2878+ /**
2879+ * bond_3ad_update_lacp_active - change the lacp active
2880+ * @bond: bonding struct
2881+ *
2882+ * Update actor_oper_port_state when lacp_active is modified.
2883+ */
2884+ void bond_3ad_update_lacp_active (struct bonding * bond )
2885+ {
2886+ struct port * port = NULL ;
2887+ struct list_head * iter ;
2888+ struct slave * slave ;
2889+ int lacp_active ;
2890+
2891+ lacp_active = bond -> params .lacp_active ;
2892+ spin_lock_bh (& bond -> mode_lock );
2893+ bond_for_each_slave (bond , slave , iter ) {
2894+ port = & (SLAVE_AD_INFO (slave )-> port );
2895+ if (lacp_active )
2896+ port -> actor_oper_port_state |= LACP_STATE_LACP_ACTIVITY ;
2897+ else
2898+ port -> actor_oper_port_state &= ~LACP_STATE_LACP_ACTIVITY ;
2899+ }
2900+ spin_unlock_bh (& bond -> mode_lock );
2901+ }
2902+
28722903size_t bond_3ad_stats_size (void )
28732904{
28742905 return nla_total_size_64bit (sizeof (u64 )) + /* BOND_3AD_STAT_LACPDU_RX */
0 commit comments