xref: /linux/drivers/net/bonding/bond_3ad.c (revision 06bc7ff0a1e0f2b0102e1314e3527a7ec0997851)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright(c) 1999 - 2004 Intel Corporation. All rights reserved.
4  */
5 
6 #include <linux/skbuff.h>
7 #include <linux/if_ether.h>
8 #include <linux/netdevice.h>
9 #include <linux/spinlock.h>
10 #include <linux/ethtool.h>
11 #include <linux/etherdevice.h>
12 #include <linux/if_bonding.h>
13 #include <linux/pkt_sched.h>
14 #include <net/net_namespace.h>
15 #include <net/bonding.h>
16 #include <net/bond_3ad.h>
17 #include <net/netlink.h>
18 
19 /* General definitions */
20 #define AD_SHORT_TIMEOUT           1
21 #define AD_LONG_TIMEOUT            0
22 #define AD_STANDBY                 0x2
23 #define AD_MAX_TX_IN_SECOND        3
24 #define AD_COLLECTOR_MAX_DELAY     0
25 
26 /* Timer definitions (43.4.4 in the 802.3ad standard) */
27 #define AD_FAST_PERIODIC_TIME      1
28 #define AD_SLOW_PERIODIC_TIME      30
29 #define AD_SHORT_TIMEOUT_TIME      (3*AD_FAST_PERIODIC_TIME)
30 #define AD_LONG_TIMEOUT_TIME       (3*AD_SLOW_PERIODIC_TIME)
31 #define AD_CHURN_DETECTION_TIME    60
32 #define AD_AGGREGATE_WAIT_TIME     2
33 
34 /* Port Variables definitions used by the State Machines (43.4.7 in the
35  * 802.3ad standard)
36  */
37 #define AD_PORT_BEGIN           0x1
38 #define AD_PORT_LACP_ENABLED    0x2
39 #define AD_PORT_ACTOR_CHURN     0x4
40 #define AD_PORT_PARTNER_CHURN   0x8
41 #define AD_PORT_READY           0x10
42 #define AD_PORT_READY_N         0x20
43 #define AD_PORT_MATCHED         0x40
44 #define AD_PORT_STANDBY         0x80
45 #define AD_PORT_SELECTED        0x100
46 #define AD_PORT_MOVED           0x200
47 #define AD_PORT_CHURNED         (AD_PORT_ACTOR_CHURN | AD_PORT_PARTNER_CHURN)
48 
49 /* Port Key definitions
50  * key is determined according to the link speed, duplex and
51  * user key (which is yet not supported)
52  *           --------------------------------------------------------------
53  * Port key  | User key (10 bits)           | Speed (5 bits)      | Duplex|
54  *           --------------------------------------------------------------
55  *           |15                           6|5                   1|0
56  */
57 #define  AD_DUPLEX_KEY_MASKS    0x1
58 #define  AD_SPEED_KEY_MASKS     0x3E
59 #define  AD_USER_KEY_MASKS      0xFFC0
60 
61 enum ad_link_speed_type {
62 	AD_LINK_SPEED_1MBPS = 1,
63 	AD_LINK_SPEED_10MBPS,
64 	AD_LINK_SPEED_100MBPS,
65 	AD_LINK_SPEED_1000MBPS,
66 	AD_LINK_SPEED_2500MBPS,
67 	AD_LINK_SPEED_5000MBPS,
68 	AD_LINK_SPEED_10000MBPS,
69 	AD_LINK_SPEED_14000MBPS,
70 	AD_LINK_SPEED_20000MBPS,
71 	AD_LINK_SPEED_25000MBPS,
72 	AD_LINK_SPEED_40000MBPS,
73 	AD_LINK_SPEED_50000MBPS,
74 	AD_LINK_SPEED_56000MBPS,
75 	AD_LINK_SPEED_80000MBPS,
76 	AD_LINK_SPEED_100000MBPS,
77 	AD_LINK_SPEED_200000MBPS,
78 	AD_LINK_SPEED_400000MBPS,
79 	AD_LINK_SPEED_800000MBPS,
80 	AD_LINK_SPEED_1600000MBPS,
81 };
82 
83 /* compare MAC addresses */
84 #define MAC_ADDRESS_EQUAL(A, B)	\
85 	ether_addr_equal_64bits((const u8 *)A, (const u8 *)B)
86 
87 static const u16 ad_ticks_per_sec = 1000 / AD_TIMER_INTERVAL;
88 static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
89 
90 const u8 lacpdu_mcast_addr[ETH_ALEN + 2] __long_aligned = {
91 	0x01, 0x80, 0xC2, 0x00, 0x00, 0x02
92 };
93 
94 /* ================= main 802.3ad protocol functions ================== */
95 static int ad_lacpdu_send(struct port *port);
96 static int ad_marker_send(struct port *port, struct bond_marker *marker);
97 static void ad_mux_machine(struct port *port, bool *update_slave_arr);
98 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
99 static void ad_tx_machine(struct port *port);
100 static void ad_periodic_machine(struct port *port);
101 static void ad_port_selection_logic(struct port *port, bool *update_slave_arr);
102 static void ad_agg_selection_logic(struct aggregator *aggregator,
103 				   bool *update_slave_arr);
104 static void ad_clear_agg(struct aggregator *aggregator);
105 static void ad_initialize_agg(struct aggregator *aggregator);
106 static void ad_initialize_port(struct port *port, const struct bond_params *bond_params);
107 static void ad_enable_collecting(struct port *port);
108 static void ad_disable_distributing(struct port *port,
109 				    bool *update_slave_arr);
110 static void ad_enable_collecting_distributing(struct port *port,
111 					      bool *update_slave_arr);
112 static void ad_disable_collecting_distributing(struct port *port,
113 					       bool *update_slave_arr);
114 static void ad_marker_info_received(struct bond_marker *marker_info,
115 				    struct port *port);
116 static void ad_marker_response_received(struct bond_marker *marker,
117 					struct port *port);
118 static void ad_update_actor_keys(struct port *port, bool reset);
119 
120 
121 /* ================= api to bonding and kernel code ================== */
122 
123 /**
124  * __get_bond_by_port - get the port's bonding struct
125  * @port: the port we're looking at
126  *
127  * Return @port's bonding struct, or %NULL if it can't be found.
128  */
__get_bond_by_port(struct port * port)129 static inline struct bonding *__get_bond_by_port(struct port *port)
130 {
131 	if (port->slave == NULL)
132 		return NULL;
133 
134 	return bond_get_bond_by_slave(port->slave);
135 }
136 
137 /**
138  * __get_first_agg - get the first aggregator in the bond
139  * @port: the port we're looking at
140  *
141  * Return the aggregator of the first slave in @bond, or %NULL if it can't be
142  * found.
143  * The caller must hold RCU or RTNL lock.
144  */
__get_first_agg(struct port * port)145 static inline struct aggregator *__get_first_agg(struct port *port)
146 {
147 	struct bonding *bond = __get_bond_by_port(port);
148 	struct slave *first_slave;
149 	struct aggregator *agg;
150 
151 	/* If there's no bond for this port, or bond has no slaves */
152 	if (bond == NULL)
153 		return NULL;
154 
155 	rcu_read_lock();
156 	first_slave = bond_first_slave_rcu(bond);
157 	agg = first_slave ? &(SLAVE_AD_INFO(first_slave)->aggregator) : NULL;
158 	rcu_read_unlock();
159 
160 	return agg;
161 }
162 
163 /**
164  * __agg_has_partner - see if we have a partner
165  * @agg: the agregator we're looking at
166  *
167  * Return nonzero if aggregator has a partner (denoted by a non-zero ether
168  * address for the partner). Return 0 if not.
169  */
__agg_has_partner(struct aggregator * agg)170 static inline int __agg_has_partner(struct aggregator *agg)
171 {
172 	return !is_zero_ether_addr(agg->partner_system.mac_addr_value);
173 }
174 
175 /**
176  * __disable_distributing_port - disable the port's slave for distributing.
177  * Port will still be able to collect.
178  * @port: the port we're looking at
179  *
180  * This will disable only distributing on the port's slave.
181  */
__disable_distributing_port(struct port * port)182 static void __disable_distributing_port(struct port *port)
183 {
184 	bond_set_slave_tx_disabled_flags(port->slave, BOND_SLAVE_NOTIFY_LATER);
185 }
186 
187 /**
188  * __enable_collecting_port - enable the port's slave for collecting,
189  * if it's up
190  * @port: the port we're looking at
191  *
192  * This will enable only collecting on the port's slave.
193  */
__enable_collecting_port(struct port * port)194 static void __enable_collecting_port(struct port *port)
195 {
196 	struct slave *slave = port->slave;
197 
198 	if (slave->link == BOND_LINK_UP && bond_slave_is_up(slave))
199 		bond_set_slave_rx_enabled_flags(slave, BOND_SLAVE_NOTIFY_LATER);
200 }
201 
202 /**
203  * __disable_port - disable the port's slave
204  * @port: the port we're looking at
205  *
206  * This will disable both collecting and distributing on the port's slave.
207  */
__disable_port(struct port * port)208 static inline void __disable_port(struct port *port)
209 {
210 	bond_set_slave_inactive_flags(port->slave, BOND_SLAVE_NOTIFY_LATER);
211 }
212 
213 /**
214  * __enable_port - enable the port's slave, if it's up
215  * @port: the port we're looking at
216  *
217  * This will enable both collecting and distributing on the port's slave.
218  */
__enable_port(struct port * port)219 static inline void __enable_port(struct port *port)
220 {
221 	struct slave *slave = port->slave;
222 
223 	if ((slave->link == BOND_LINK_UP) && bond_slave_is_up(slave))
224 		bond_set_slave_active_flags(slave, BOND_SLAVE_NOTIFY_LATER);
225 }
226 
227 /**
228  * __port_move_to_attached_state - check if port should transition back to attached
229  * state.
230  * @port: the port we're looking at
231  */
__port_move_to_attached_state(struct port * port)232 static bool __port_move_to_attached_state(struct port *port)
233 {
234 	if (!(port->sm_vars & AD_PORT_SELECTED) ||
235 	    (port->sm_vars & AD_PORT_STANDBY) ||
236 	    !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) ||
237 	    !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION))
238 		port->sm_mux_state = AD_MUX_ATTACHED;
239 
240 	return port->sm_mux_state == AD_MUX_ATTACHED;
241 }
242 
243 /**
244  * __port_is_collecting_distributing - check if the port's slave is in the
245  * combined collecting/distributing state
246  * @port: the port we're looking at
247  */
__port_is_collecting_distributing(struct port * port)248 static int __port_is_collecting_distributing(struct port *port)
249 {
250 	return bond_is_active_slave(port->slave);
251 }
252 
253 /**
254  * __get_agg_selection_mode - get the aggregator selection mode
255  * @port: the port we're looking at
256  *
257  * Get the aggregator selection mode. Can be %STABLE, %BANDWIDTH or %COUNT.
258  */
__get_agg_selection_mode(struct port * port)259 static inline u32 __get_agg_selection_mode(struct port *port)
260 {
261 	struct bonding *bond = __get_bond_by_port(port);
262 
263 	if (bond == NULL)
264 		return BOND_AD_STABLE;
265 
266 	return bond->params.ad_select;
267 }
268 
269 /**
270  * __check_agg_selection_timer - check if the selection timer has expired
271  * @port: the port we're looking at
272  */
__check_agg_selection_timer(struct port * port)273 static inline int __check_agg_selection_timer(struct port *port)
274 {
275 	struct bonding *bond = __get_bond_by_port(port);
276 
277 	if (bond == NULL)
278 		return 0;
279 
280 	return atomic_read(&BOND_AD_INFO(bond).agg_select_timer) ? 1 : 0;
281 }
282 
283 /**
284  * __get_link_speed - get a port's speed
285  * @port: the port we're looking at
286  *
287  * Return @port's speed in 802.3ad enum format. i.e. one of:
288  *     0,
289  *     %AD_LINK_SPEED_10MBPS,
290  *     %AD_LINK_SPEED_100MBPS,
291  *     %AD_LINK_SPEED_1000MBPS,
292  *     %AD_LINK_SPEED_2500MBPS,
293  *     %AD_LINK_SPEED_5000MBPS,
294  *     %AD_LINK_SPEED_10000MBPS
295  *     %AD_LINK_SPEED_14000MBPS,
296  *     %AD_LINK_SPEED_20000MBPS
297  *     %AD_LINK_SPEED_25000MBPS
298  *     %AD_LINK_SPEED_40000MBPS
299  *     %AD_LINK_SPEED_50000MBPS
300  *     %AD_LINK_SPEED_56000MBPS
301  *     %AD_LINK_SPEED_80000MBPS
302  *     %AD_LINK_SPEED_100000MBPS
303  *     %AD_LINK_SPEED_200000MBPS
304  *     %AD_LINK_SPEED_400000MBPS
305  *     %AD_LINK_SPEED_800000MBPS
306  *     %AD_LINK_SPEED_1600000MBPS
307  */
__get_link_speed(struct port * port)308 static u16 __get_link_speed(struct port *port)
309 {
310 	struct slave *slave = port->slave;
311 	u16 speed;
312 
313 	/* this if covers only a special case: when the configuration starts
314 	 * with link down, it sets the speed to 0.
315 	 * This is done in spite of the fact that the e100 driver reports 0
316 	 * to be compatible with MVT in the future.
317 	 */
318 	if (slave->link != BOND_LINK_UP)
319 		speed = 0;
320 	else {
321 		switch (slave->speed) {
322 		case SPEED_10:
323 			speed = AD_LINK_SPEED_10MBPS;
324 			break;
325 
326 		case SPEED_100:
327 			speed = AD_LINK_SPEED_100MBPS;
328 			break;
329 
330 		case SPEED_1000:
331 			speed = AD_LINK_SPEED_1000MBPS;
332 			break;
333 
334 		case SPEED_2500:
335 			speed = AD_LINK_SPEED_2500MBPS;
336 			break;
337 
338 		case SPEED_5000:
339 			speed = AD_LINK_SPEED_5000MBPS;
340 			break;
341 
342 		case SPEED_10000:
343 			speed = AD_LINK_SPEED_10000MBPS;
344 			break;
345 
346 		case SPEED_14000:
347 			speed = AD_LINK_SPEED_14000MBPS;
348 			break;
349 
350 		case SPEED_20000:
351 			speed = AD_LINK_SPEED_20000MBPS;
352 			break;
353 
354 		case SPEED_25000:
355 			speed = AD_LINK_SPEED_25000MBPS;
356 			break;
357 
358 		case SPEED_40000:
359 			speed = AD_LINK_SPEED_40000MBPS;
360 			break;
361 
362 		case SPEED_50000:
363 			speed = AD_LINK_SPEED_50000MBPS;
364 			break;
365 
366 		case SPEED_56000:
367 			speed = AD_LINK_SPEED_56000MBPS;
368 			break;
369 
370 		case SPEED_80000:
371 			speed = AD_LINK_SPEED_80000MBPS;
372 			break;
373 
374 		case SPEED_100000:
375 			speed = AD_LINK_SPEED_100000MBPS;
376 			break;
377 
378 		case SPEED_200000:
379 			speed = AD_LINK_SPEED_200000MBPS;
380 			break;
381 
382 		case SPEED_400000:
383 			speed = AD_LINK_SPEED_400000MBPS;
384 			break;
385 
386 		case SPEED_800000:
387 			speed = AD_LINK_SPEED_800000MBPS;
388 			break;
389 
390 		case SPEED_1600000:
391 			speed = AD_LINK_SPEED_1600000MBPS;
392 			break;
393 
394 		default:
395 			/* unknown speed value from ethtool. shouldn't happen */
396 			if (slave->speed != SPEED_UNKNOWN)
397 				pr_err_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n",
398 					    slave->bond->dev->name,
399 					    slave->dev->name, slave->speed,
400 					    port->actor_port_number);
401 			speed = 0;
402 			break;
403 		}
404 	}
405 
406 	slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n",
407 		  port->actor_port_number, speed);
408 	return speed;
409 }
410 
411 /**
412  * __get_duplex - get a port's duplex
413  * @port: the port we're looking at
414  *
415  * Return @port's duplex in 802.3ad bitmask format. i.e.:
416  *     0x01 if in full duplex
417  *     0x00 otherwise
418  */
__get_duplex(struct port * port)419 static u8 __get_duplex(struct port *port)
420 {
421 	struct slave *slave = port->slave;
422 	u8 retval = 0x0;
423 
424 	/* handling a special case: when the configuration starts with
425 	 * link down, it sets the duplex to 0.
426 	 */
427 	if (slave->link == BOND_LINK_UP) {
428 		switch (slave->duplex) {
429 		case DUPLEX_FULL:
430 			retval = 0x1;
431 			slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n",
432 				  port->actor_port_number);
433 			break;
434 		case DUPLEX_HALF:
435 		default:
436 			retval = 0x0;
437 			slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapter\n",
438 				  port->actor_port_number);
439 			break;
440 		}
441 	}
442 	return retval;
443 }
444 
__ad_actor_update_port(struct port * port)445 static void __ad_actor_update_port(struct port *port)
446 {
447 	const struct bonding *bond = bond_get_bond_by_slave(port->slave);
448 
449 	port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr;
450 	port->actor_system_priority = BOND_AD_INFO(bond).system.sys_priority;
451 	port->actor_port_priority = SLAVE_AD_INFO(port->slave)->port_priority;
452 }
453 
454 /* Conversions */
455 
456 /**
457  * __ad_timer_to_ticks - convert a given timer type to AD module ticks
458  * @timer_type:	which timer to operate
459  * @par: timer parameter. see below
460  *
461  * If @timer_type is %current_while_timer, @par indicates long/short timer.
462  * If @timer_type is %periodic_timer, @par is one of %FAST_PERIODIC_TIME,
463  *						     %SLOW_PERIODIC_TIME.
464  */
__ad_timer_to_ticks(u16 timer_type,u16 par)465 static u16 __ad_timer_to_ticks(u16 timer_type, u16 par)
466 {
467 	u16 retval = 0; /* to silence the compiler */
468 
469 	switch (timer_type) {
470 	case AD_CURRENT_WHILE_TIMER:	/* for rx machine usage */
471 		if (par)
472 			retval = (AD_SHORT_TIMEOUT_TIME*ad_ticks_per_sec);
473 		else
474 			retval = (AD_LONG_TIMEOUT_TIME*ad_ticks_per_sec);
475 		break;
476 	case AD_ACTOR_CHURN_TIMER:	/* for local churn machine */
477 		retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
478 		break;
479 	case AD_PERIODIC_TIMER:		/* for periodic machine */
480 		retval = (par*ad_ticks_per_sec); /* long timeout */
481 		break;
482 	case AD_PARTNER_CHURN_TIMER:	/* for remote churn machine */
483 		retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
484 		break;
485 	case AD_WAIT_WHILE_TIMER:	/* for selection machine */
486 		retval = (AD_AGGREGATE_WAIT_TIME*ad_ticks_per_sec);
487 		break;
488 	}
489 
490 	return retval;
491 }
492 
493 
494 /* ================= ad_rx_machine helper functions ================== */
495 
496 /**
497  * __choose_matched - update a port's matched variable from a received lacpdu
498  * @lacpdu: the lacpdu we've received
499  * @port: the port we're looking at
500  *
501  * Update the value of the matched variable, using parameter values from a
502  * newly received lacpdu. Parameter values for the partner carried in the
503  * received PDU are compared with the corresponding operational parameter
504  * values for the actor. Matched is set to TRUE if all of these parameters
505  * match and the PDU parameter partner_state.aggregation has the same value as
506  * actor_oper_port_state.aggregation and lacp will actively maintain the link
507  * in the aggregation. Matched is also set to TRUE if the value of
508  * actor_state.aggregation in the received PDU is set to FALSE, i.e., indicates
509  * an individual link and lacp will actively maintain the link. Otherwise,
510  * matched is set to FALSE. LACP is considered to be actively maintaining the
511  * link if either the PDU's actor_state.lacp_activity variable is TRUE or both
512  * the actor's actor_oper_port_state.lacp_activity and the PDU's
513  * partner_state.lacp_activity variables are TRUE.
514  *
515  * Note: the AD_PORT_MATCHED "variable" is not specified by 802.3ad; it is
516  * used here to implement the language from 802.3ad 43.4.9 that requires
517  * recordPDU to "match" the LACPDU parameters to the stored values.
518  */
__choose_matched(struct lacpdu * lacpdu,struct port * port)519 static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
520 {
521 	/* check if all parameters are alike
522 	 * or this is individual link(aggregation == FALSE)
523 	 * then update the state machine Matched variable.
524 	 */
525 	if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
526 	     (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
527 	     MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) &&
528 	     (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
529 	     (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
530 	     ((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGGREGATION))) ||
531 	    ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0)
532 		) {
533 		port->sm_vars |= AD_PORT_MATCHED;
534 	} else {
535 		port->sm_vars &= ~AD_PORT_MATCHED;
536 	}
537 }
538 
539 /**
540  * __record_pdu - record parameters from a received lacpdu
541  * @lacpdu: the lacpdu we've received
542  * @port: the port we're looking at
543  *
544  * Record the parameter values for the Actor carried in a received lacpdu as
545  * the current partner operational parameter values and sets
546  * actor_oper_port_state.defaulted to FALSE.
547  */
__record_pdu(struct lacpdu * lacpdu,struct port * port)548 static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
549 {
550 	if (lacpdu && port) {
551 		struct port_params *partner = &port->partner_oper;
552 
553 		__choose_matched(lacpdu, port);
554 		/* record the new parameter values for the partner
555 		 * operational
556 		 */
557 		partner->port_number = ntohs(lacpdu->actor_port);
558 		partner->port_priority = ntohs(lacpdu->actor_port_priority);
559 		partner->system = lacpdu->actor_system;
560 		partner->system_priority = ntohs(lacpdu->actor_system_priority);
561 		partner->key = ntohs(lacpdu->actor_key);
562 		partner->port_state = lacpdu->actor_state;
563 
564 		/* set actor_oper_port_state.defaulted to FALSE */
565 		port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED;
566 
567 		/* set the partner sync. to on if the partner is sync,
568 		 * and the port is matched
569 		 */
570 		if ((port->sm_vars & AD_PORT_MATCHED) &&
571 		    (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) {
572 			partner->port_state |= LACP_STATE_SYNCHRONIZATION;
573 			slave_dbg(port->slave->bond->dev, port->slave->dev,
574 				  "partner sync=1\n");
575 		} else {
576 			partner->port_state &= ~LACP_STATE_SYNCHRONIZATION;
577 			slave_dbg(port->slave->bond->dev, port->slave->dev,
578 				  "partner sync=0\n");
579 		}
580 	}
581 }
582 
583 /**
584  * __record_default - record default parameters
585  * @port: the port we're looking at
586  *
587  * This function records the default parameter values for the partner carried
588  * in the Partner Admin parameters as the current partner operational parameter
589  * values and sets actor_oper_port_state.defaulted to TRUE.
590  */
__record_default(struct port * port)591 static void __record_default(struct port *port)
592 {
593 	if (port) {
594 		/* record the partner admin parameters */
595 		memcpy(&port->partner_oper, &port->partner_admin,
596 		       sizeof(struct port_params));
597 
598 		/* set actor_oper_port_state.defaulted to true */
599 		port->actor_oper_port_state |= LACP_STATE_DEFAULTED;
600 	}
601 }
602 
603 /**
604  * __update_selected - update a port's Selected variable from a received lacpdu
605  * @lacpdu: the lacpdu we've received
606  * @port: the port we're looking at
607  *
608  * Update the value of the selected variable, using parameter values from a
609  * newly received lacpdu. The parameter values for the Actor carried in the
610  * received PDU are compared with the corresponding operational parameter
611  * values for the ports partner. If one or more of the comparisons shows that
612  * the value(s) received in the PDU differ from the current operational values,
613  * then selected is set to FALSE and actor_oper_port_state.synchronization is
614  * set to out_of_sync. Otherwise, selected remains unchanged.
615  */
__update_selected(struct lacpdu * lacpdu,struct port * port)616 static void __update_selected(struct lacpdu *lacpdu, struct port *port)
617 {
618 	if (lacpdu && port) {
619 		const struct port_params *partner = &port->partner_oper;
620 
621 		/* check if any parameter is different then
622 		 * update the state machine selected variable.
623 		 */
624 		if (ntohs(lacpdu->actor_port) != partner->port_number ||
625 		    ntohs(lacpdu->actor_port_priority) != partner->port_priority ||
626 		    !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) ||
627 		    ntohs(lacpdu->actor_system_priority) != partner->system_priority ||
628 		    ntohs(lacpdu->actor_key) != partner->key ||
629 		    (lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) {
630 			port->sm_vars &= ~AD_PORT_SELECTED;
631 		}
632 	}
633 }
634 
635 /**
636  * __update_default_selected - update a port's Selected variable from Partner
637  * @port: the port we're looking at
638  *
639  * This function updates the value of the selected variable, using the partner
640  * administrative parameter values. The administrative values are compared with
641  * the corresponding operational parameter values for the partner. If one or
642  * more of the comparisons shows that the administrative value(s) differ from
643  * the current operational values, then Selected is set to FALSE and
644  * actor_oper_port_state.synchronization is set to OUT_OF_SYNC. Otherwise,
645  * Selected remains unchanged.
646  */
__update_default_selected(struct port * port)647 static void __update_default_selected(struct port *port)
648 {
649 	if (port) {
650 		const struct port_params *admin = &port->partner_admin;
651 		const struct port_params *oper = &port->partner_oper;
652 
653 		/* check if any parameter is different then
654 		 * update the state machine selected variable.
655 		 */
656 		if (admin->port_number != oper->port_number ||
657 		    admin->port_priority != oper->port_priority ||
658 		    !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) ||
659 		    admin->system_priority != oper->system_priority ||
660 		    admin->key != oper->key ||
661 		    (admin->port_state & LACP_STATE_AGGREGATION)
662 			!= (oper->port_state & LACP_STATE_AGGREGATION)) {
663 			port->sm_vars &= ~AD_PORT_SELECTED;
664 		}
665 	}
666 }
667 
668 /**
669  * __update_ntt - update a port's ntt variable from a received lacpdu
670  * @lacpdu: the lacpdu we've received
671  * @port: the port we're looking at
672  *
673  * Updates the value of the ntt variable, using parameter values from a newly
674  * received lacpdu. The parameter values for the partner carried in the
675  * received PDU are compared with the corresponding operational parameter
676  * values for the Actor. If one or more of the comparisons shows that the
677  * value(s) received in the PDU differ from the current operational values,
678  * then ntt is set to TRUE. Otherwise, ntt remains unchanged.
679  */
__update_ntt(struct lacpdu * lacpdu,struct port * port)680 static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
681 {
682 	/* validate lacpdu and port */
683 	if (lacpdu && port) {
684 		/* check if any parameter is different then
685 		 * update the port->ntt.
686 		 */
687 		if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
688 		    (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
689 		    !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) ||
690 		    (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
691 		    (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) ||
692 		    ((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY)) ||
693 		    ((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT)) ||
694 		    ((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) ||
695 		    ((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGGREGATION))
696 		   ) {
697 			port->ntt = true;
698 		}
699 	}
700 }
701 
702 /**
703  * __agg_ports_are_ready - check if all ports in an aggregator are ready
704  * @aggregator: the aggregator we're looking at
705  *
706  */
__agg_ports_are_ready(struct aggregator * aggregator)707 static int __agg_ports_are_ready(struct aggregator *aggregator)
708 {
709 	struct port *port;
710 	int retval = 1;
711 
712 	if (aggregator) {
713 		/* scan all ports in this aggregator to verfy if they are
714 		 * all ready.
715 		 */
716 		for (port = aggregator->lag_ports;
717 		     port;
718 		     port = port->next_port_in_aggregator) {
719 			if (!(port->sm_vars & AD_PORT_READY_N)) {
720 				retval = 0;
721 				break;
722 			}
723 		}
724 	}
725 
726 	return retval;
727 }
728 
729 /**
730  * __set_agg_ports_ready - set value of Ready bit in all ports of an aggregator
731  * @aggregator: the aggregator we're looking at
732  * @val: Should the ports' ready bit be set on or off
733  *
734  */
__set_agg_ports_ready(struct aggregator * aggregator,int val)735 static void __set_agg_ports_ready(struct aggregator *aggregator, int val)
736 {
737 	struct port *port;
738 
739 	for (port = aggregator->lag_ports; port;
740 	     port = port->next_port_in_aggregator) {
741 		if (val)
742 			port->sm_vars |= AD_PORT_READY;
743 		else
744 			port->sm_vars &= ~AD_PORT_READY;
745 	}
746 }
747 
__agg_active_ports(struct aggregator * agg)748 static int __agg_active_ports(struct aggregator *agg)
749 {
750 	struct port *port;
751 	int active = 0;
752 
753 	for (port = agg->lag_ports; port;
754 	     port = port->next_port_in_aggregator) {
755 		if (port->is_enabled)
756 			active++;
757 	}
758 
759 	return active;
760 }
761 
__agg_ports_priority(const struct aggregator * agg)762 static unsigned int __agg_ports_priority(const struct aggregator *agg)
763 {
764 	struct port *port = agg->lag_ports;
765 	unsigned int prio = 0;
766 
767 	for (; port; port = port->next_port_in_aggregator)
768 		if (port->is_enabled)
769 			prio += port->actor_port_priority;
770 
771 	return prio;
772 }
773 
774 /**
775  * __get_agg_bandwidth - get the total bandwidth of an aggregator
776  * @aggregator: the aggregator we're looking at
777  *
778  */
__get_agg_bandwidth(struct aggregator * aggregator)779 static u32 __get_agg_bandwidth(struct aggregator *aggregator)
780 {
781 	int nports = __agg_active_ports(aggregator);
782 	u32 bandwidth = 0;
783 
784 	if (nports) {
785 		switch (__get_link_speed(aggregator->lag_ports)) {
786 		case AD_LINK_SPEED_1MBPS:
787 			bandwidth = nports;
788 			break;
789 		case AD_LINK_SPEED_10MBPS:
790 			bandwidth = nports * 10;
791 			break;
792 		case AD_LINK_SPEED_100MBPS:
793 			bandwidth = nports * 100;
794 			break;
795 		case AD_LINK_SPEED_1000MBPS:
796 			bandwidth = nports * 1000;
797 			break;
798 		case AD_LINK_SPEED_2500MBPS:
799 			bandwidth = nports * 2500;
800 			break;
801 		case AD_LINK_SPEED_5000MBPS:
802 			bandwidth = nports * 5000;
803 			break;
804 		case AD_LINK_SPEED_10000MBPS:
805 			bandwidth = nports * 10000;
806 			break;
807 		case AD_LINK_SPEED_14000MBPS:
808 			bandwidth = nports * 14000;
809 			break;
810 		case AD_LINK_SPEED_20000MBPS:
811 			bandwidth = nports * 20000;
812 			break;
813 		case AD_LINK_SPEED_25000MBPS:
814 			bandwidth = nports * 25000;
815 			break;
816 		case AD_LINK_SPEED_40000MBPS:
817 			bandwidth = nports * 40000;
818 			break;
819 		case AD_LINK_SPEED_50000MBPS:
820 			bandwidth = nports * 50000;
821 			break;
822 		case AD_LINK_SPEED_56000MBPS:
823 			bandwidth = nports * 56000;
824 			break;
825 		case AD_LINK_SPEED_80000MBPS:
826 			bandwidth = nports * 80000;
827 			break;
828 		case AD_LINK_SPEED_100000MBPS:
829 			bandwidth = nports * 100000;
830 			break;
831 		case AD_LINK_SPEED_200000MBPS:
832 			bandwidth = nports * 200000;
833 			break;
834 		case AD_LINK_SPEED_400000MBPS:
835 			bandwidth = nports * 400000;
836 			break;
837 		case AD_LINK_SPEED_800000MBPS:
838 			bandwidth = nports * 800000;
839 			break;
840 		case AD_LINK_SPEED_1600000MBPS:
841 			bandwidth = nports * 1600000;
842 			break;
843 		default:
844 			bandwidth = 0; /* to silence the compiler */
845 		}
846 	}
847 	return bandwidth;
848 }
849 
850 /**
851  * __get_active_agg - get the current active aggregator
852  * @aggregator: the aggregator we're looking at
853  *
854  * Caller must hold RCU lock.
855  */
__get_active_agg(struct aggregator * aggregator)856 static struct aggregator *__get_active_agg(struct aggregator *aggregator)
857 {
858 	struct bonding *bond = aggregator->slave->bond;
859 	struct list_head *iter;
860 	struct slave *slave;
861 
862 	bond_for_each_slave_rcu(bond, slave, iter)
863 		if (SLAVE_AD_INFO(slave)->aggregator.is_active)
864 			return &(SLAVE_AD_INFO(slave)->aggregator);
865 
866 	return NULL;
867 }
868 
869 /**
870  * __update_lacpdu_from_port - update a port's lacpdu fields
871  * @port: the port we're looking at
872  */
__update_lacpdu_from_port(struct port * port)873 static inline void __update_lacpdu_from_port(struct port *port)
874 {
875 	struct lacpdu *lacpdu = &port->lacpdu;
876 	const struct port_params *partner = &port->partner_oper;
877 
878 	/* update current actual Actor parameters
879 	 * lacpdu->subtype                   initialized
880 	 * lacpdu->version_number            initialized
881 	 * lacpdu->tlv_type_actor_info       initialized
882 	 * lacpdu->actor_information_length  initialized
883 	 */
884 
885 	lacpdu->actor_system_priority = htons(port->actor_system_priority);
886 	lacpdu->actor_system = port->actor_system;
887 	lacpdu->actor_key = htons(port->actor_oper_port_key);
888 	lacpdu->actor_port_priority = htons(port->actor_port_priority);
889 	lacpdu->actor_port = htons(port->actor_port_number);
890 	lacpdu->actor_state = port->actor_oper_port_state;
891 	slave_dbg(port->slave->bond->dev, port->slave->dev,
892 		  "update lacpdu: actor port state %x\n",
893 		  port->actor_oper_port_state);
894 
895 	/* lacpdu->reserved_3_1              initialized
896 	 * lacpdu->tlv_type_partner_info     initialized
897 	 * lacpdu->partner_information_length initialized
898 	 */
899 
900 	lacpdu->partner_system_priority = htons(partner->system_priority);
901 	lacpdu->partner_system = partner->system;
902 	lacpdu->partner_key = htons(partner->key);
903 	lacpdu->partner_port_priority = htons(partner->port_priority);
904 	lacpdu->partner_port = htons(partner->port_number);
905 	lacpdu->partner_state = partner->port_state;
906 
907 	/* lacpdu->reserved_3_2              initialized
908 	 * lacpdu->tlv_type_collector_info   initialized
909 	 * lacpdu->collector_information_length initialized
910 	 * collector_max_delay                initialized
911 	 * reserved_12[12]                   initialized
912 	 * tlv_type_terminator               initialized
913 	 * terminator_length                 initialized
914 	 * reserved_50[50]                   initialized
915 	 */
916 }
917 
918 /* ================= main 802.3ad protocol code ========================= */
919 
920 /**
921  * ad_lacpdu_send - send out a lacpdu packet on a given port
922  * @port: the port we're looking at
923  *
924  * Returns:   0 on success
925  *          < 0 on error
926  */
ad_lacpdu_send(struct port * port)927 static int ad_lacpdu_send(struct port *port)
928 {
929 	struct slave *slave = port->slave;
930 	struct sk_buff *skb;
931 	struct lacpdu_header *lacpdu_header;
932 	int length = sizeof(struct lacpdu_header);
933 
934 	skb = dev_alloc_skb(length);
935 	if (!skb)
936 		return -ENOMEM;
937 
938 	atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx);
939 	atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx);
940 
941 	skb->dev = slave->dev;
942 	skb_reset_mac_header(skb);
943 	skb->network_header = skb->mac_header + ETH_HLEN;
944 	skb->protocol = PKT_TYPE_LACPDU;
945 	skb->priority = TC_PRIO_CONTROL;
946 
947 	lacpdu_header = skb_put(skb, length);
948 
949 	ether_addr_copy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr);
950 	/* Note: source address is set to be the member's PERMANENT address,
951 	 * because we use it to identify loopback lacpdus in receive.
952 	 */
953 	ether_addr_copy(lacpdu_header->hdr.h_source, slave->perm_hwaddr);
954 	lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU;
955 
956 	lacpdu_header->lacpdu = port->lacpdu;
957 
958 	dev_queue_xmit(skb);
959 
960 	return 0;
961 }
962 
963 /**
964  * ad_marker_send - send marker information/response on a given port
965  * @port: the port we're looking at
966  * @marker: marker data to send
967  *
968  * Returns:   0 on success
969  *          < 0 on error
970  */
ad_marker_send(struct port * port,struct bond_marker * marker)971 static int ad_marker_send(struct port *port, struct bond_marker *marker)
972 {
973 	struct slave *slave = port->slave;
974 	struct sk_buff *skb;
975 	struct bond_marker_header *marker_header;
976 	int length = sizeof(struct bond_marker_header);
977 
978 	skb = dev_alloc_skb(length + 16);
979 	if (!skb)
980 		return -ENOMEM;
981 
982 	switch (marker->tlv_type) {
983 	case AD_MARKER_INFORMATION_SUBTYPE:
984 		atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx);
985 		atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx);
986 		break;
987 	case AD_MARKER_RESPONSE_SUBTYPE:
988 		atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx);
989 		atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx);
990 		break;
991 	}
992 
993 	skb_reserve(skb, 16);
994 
995 	skb->dev = slave->dev;
996 	skb_reset_mac_header(skb);
997 	skb->network_header = skb->mac_header + ETH_HLEN;
998 	skb->protocol = PKT_TYPE_LACPDU;
999 
1000 	marker_header = skb_put(skb, length);
1001 
1002 	ether_addr_copy(marker_header->hdr.h_dest, lacpdu_mcast_addr);
1003 	/* Note: source address is set to be the member's PERMANENT address,
1004 	 * because we use it to identify loopback MARKERs in receive.
1005 	 */
1006 	ether_addr_copy(marker_header->hdr.h_source, slave->perm_hwaddr);
1007 	marker_header->hdr.h_proto = PKT_TYPE_LACPDU;
1008 
1009 	marker_header->marker = *marker;
1010 
1011 	dev_queue_xmit(skb);
1012 
1013 	return 0;
1014 }
1015 
ad_cond_set_peer_notif(struct port * port)1016 static void ad_cond_set_peer_notif(struct port *port)
1017 {
1018 	struct bonding *bond = port->slave->bond;
1019 
1020 	if (bond->params.broadcast_neighbor)
1021 		bond_peer_notify_work_rearm(bond, 0);
1022 }
1023 
1024 /**
1025  * ad_mux_machine - handle a port's mux state machine
1026  * @port: the port we're looking at
1027  * @update_slave_arr: Does slave array need update?
1028  */
ad_mux_machine(struct port * port,bool * update_slave_arr)1029 static void ad_mux_machine(struct port *port, bool *update_slave_arr)
1030 {
1031 	struct bonding *bond = __get_bond_by_port(port);
1032 	struct aggregator *aggregator;
1033 	mux_states_t last_state;
1034 
1035 	/* keep current State Machine state to compare later if it was
1036 	 * changed
1037 	 */
1038 	last_state = port->sm_mux_state;
1039 
1040 	aggregator = rcu_dereference(port->aggregator);
1041 	if (port->sm_vars & AD_PORT_BEGIN) {
1042 		port->sm_mux_state = AD_MUX_DETACHED;
1043 	} else {
1044 		switch (port->sm_mux_state) {
1045 		case AD_MUX_DETACHED:
1046 			if ((port->sm_vars & AD_PORT_SELECTED)
1047 			    || (port->sm_vars & AD_PORT_STANDBY))
1048 				/* if SELECTED or STANDBY */
1049 				port->sm_mux_state = AD_MUX_WAITING;
1050 			break;
1051 		case AD_MUX_WAITING:
1052 			/* if SELECTED == FALSE return to DETACH state */
1053 			if (!(port->sm_vars & AD_PORT_SELECTED)) {
1054 				port->sm_vars &= ~AD_PORT_READY_N;
1055 				/* in order to withhold the Selection Logic to
1056 				 * check all ports READY_N value every callback
1057 				 * cycle to update ready variable, we check
1058 				 * READY_N and update READY here
1059 				 */
1060 				__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
1061 				port->sm_mux_state = AD_MUX_DETACHED;
1062 				break;
1063 			}
1064 
1065 			/* check if the wait_while_timer expired */
1066 			if (port->sm_mux_timer_counter
1067 			    && !(--port->sm_mux_timer_counter))
1068 				port->sm_vars |= AD_PORT_READY_N;
1069 
1070 			/* in order to withhold the selection logic to check
1071 			 * all ports READY_N value every callback cycle to
1072 			 * update ready variable, we check READY_N and update
1073 			 * READY here
1074 			 */
1075 			__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
1076 
1077 			/* if the wait_while_timer expired, and the port is
1078 			 * in READY state, move to ATTACHED state
1079 			 */
1080 			if ((port->sm_vars & AD_PORT_READY)
1081 			    && !port->sm_mux_timer_counter)
1082 				port->sm_mux_state = AD_MUX_ATTACHED;
1083 			break;
1084 		case AD_MUX_ATTACHED:
1085 			/* check also if agg_select_timer expired (so the
1086 			 * edable port will take place only after this timer)
1087 			 */
1088 			if ((port->sm_vars & AD_PORT_SELECTED) &&
1089 			    (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) &&
1090 			    !__check_agg_selection_timer(port)) {
1091 				if (aggregator->is_active) {
1092 					int state = AD_MUX_COLLECTING_DISTRIBUTING;
1093 
1094 					if (!bond->params.coupled_control)
1095 						state = AD_MUX_COLLECTING;
1096 					port->sm_mux_state = state;
1097 				}
1098 			} else if (!(port->sm_vars & AD_PORT_SELECTED) ||
1099 				   (port->sm_vars & AD_PORT_STANDBY)) {
1100 				/* if UNSELECTED or STANDBY */
1101 				port->sm_vars &= ~AD_PORT_READY_N;
1102 				/* in order to withhold the selection logic to
1103 				 * check all ports READY_N value every callback
1104 				 * cycle to update ready variable, we check
1105 				 * READY_N and update READY here
1106 				 */
1107 				__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
1108 				port->sm_mux_state = AD_MUX_DETACHED;
1109 			} else if (aggregator->is_active) {
1110 				port->actor_oper_port_state |=
1111 				    LACP_STATE_SYNCHRONIZATION;
1112 			}
1113 			break;
1114 		case AD_MUX_COLLECTING_DISTRIBUTING:
1115 			if (!__port_move_to_attached_state(port)) {
1116 				/* if port state hasn't changed make
1117 				 * sure that a collecting distributing
1118 				 * port in an active aggregator is enabled
1119 				 */
1120 				if (aggregator->is_active &&
1121 				    !__port_is_collecting_distributing(port)) {
1122 					__enable_port(port);
1123 					*update_slave_arr = true;
1124 				}
1125 			}
1126 			break;
1127 		case AD_MUX_COLLECTING:
1128 			if (!__port_move_to_attached_state(port)) {
1129 				if ((port->sm_vars & AD_PORT_SELECTED) &&
1130 				    (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) &&
1131 				    (port->partner_oper.port_state & LACP_STATE_COLLECTING)) {
1132 					port->sm_mux_state = AD_MUX_DISTRIBUTING;
1133 				} else {
1134 					/* If port state hasn't changed, make sure that a collecting
1135 					 * port is enabled for an active aggregator.
1136 					 */
1137 					struct slave *slave = port->slave;
1138 
1139 					if (aggregator->is_active &&
1140 					    bond_is_slave_rx_disabled(slave)) {
1141 						ad_enable_collecting(port);
1142 						*update_slave_arr = true;
1143 					}
1144 				}
1145 			}
1146 			break;
1147 		case AD_MUX_DISTRIBUTING:
1148 			if (!(port->sm_vars & AD_PORT_SELECTED) ||
1149 			    (port->sm_vars & AD_PORT_STANDBY) ||
1150 			    !(port->partner_oper.port_state & LACP_STATE_COLLECTING) ||
1151 			    !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) ||
1152 			    !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) {
1153 				port->sm_mux_state = AD_MUX_COLLECTING;
1154 			} else {
1155 				/* if port state hasn't changed make
1156 				 * sure that a collecting distributing
1157 				 * port in an active aggregator is enabled
1158 				 */
1159 				if (aggregator &&
1160 				    aggregator->is_active &&
1161 				    !__port_is_collecting_distributing(port)) {
1162 					__enable_port(port);
1163 					*update_slave_arr = true;
1164 				}
1165 			}
1166 			break;
1167 		default:
1168 			break;
1169 		}
1170 	}
1171 
1172 	/* check if the state machine was changed */
1173 	if (port->sm_mux_state != last_state) {
1174 		slave_dbg(port->slave->bond->dev, port->slave->dev,
1175 			  "Mux Machine: Port=%d, Last State=%d, Curr State=%d\n",
1176 			  port->actor_port_number,
1177 			  last_state,
1178 			  port->sm_mux_state);
1179 		switch (port->sm_mux_state) {
1180 		case AD_MUX_DETACHED:
1181 			port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
1182 			ad_disable_collecting_distributing(port,
1183 							   update_slave_arr);
1184 			port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
1185 			port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
1186 			port->ntt = true;
1187 			break;
1188 		case AD_MUX_WAITING:
1189 			port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0);
1190 			break;
1191 		case AD_MUX_ATTACHED:
1192 			if (aggregator->is_active)
1193 				port->actor_oper_port_state |=
1194 				    LACP_STATE_SYNCHRONIZATION;
1195 			else
1196 				port->actor_oper_port_state &=
1197 				    ~LACP_STATE_SYNCHRONIZATION;
1198 			port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
1199 			port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
1200 			ad_disable_collecting_distributing(port,
1201 							   update_slave_arr);
1202 			port->ntt = true;
1203 			break;
1204 		case AD_MUX_COLLECTING_DISTRIBUTING:
1205 			port->actor_oper_port_state |= LACP_STATE_COLLECTING;
1206 			port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING;
1207 			port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION;
1208 			ad_enable_collecting_distributing(port,
1209 							  update_slave_arr);
1210 			port->ntt = true;
1211 			break;
1212 		case AD_MUX_COLLECTING:
1213 			port->actor_oper_port_state |= LACP_STATE_COLLECTING;
1214 			port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
1215 			port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION;
1216 			ad_enable_collecting(port);
1217 			ad_disable_distributing(port, update_slave_arr);
1218 			port->ntt = true;
1219 			break;
1220 		case AD_MUX_DISTRIBUTING:
1221 			port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING;
1222 			port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION;
1223 			ad_enable_collecting_distributing(port,
1224 							  update_slave_arr);
1225 			break;
1226 		default:
1227 			break;
1228 		}
1229 	}
1230 }
1231 
1232 /**
1233  * ad_rx_machine - handle a port's rx State Machine
1234  * @lacpdu: the lacpdu we've received
1235  * @port: the port we're looking at
1236  *
1237  * If lacpdu arrived, stop previous timer (if exists) and set the next state as
1238  * CURRENT. If timer expired set the state machine in the proper state.
1239  * In other cases, this function checks if we need to switch to other state.
1240  */
ad_rx_machine(struct lacpdu * lacpdu,struct port * port)1241 static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1242 {
1243 	rx_states_t last_state;
1244 
1245 	/* keep current State Machine state to compare later if it was
1246 	 * changed
1247 	 */
1248 	last_state = port->sm_rx_state;
1249 
1250 	if (lacpdu) {
1251 		atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx);
1252 		atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx);
1253 	}
1254 	/* check if state machine should change state */
1255 
1256 	/* first, check if port was reinitialized */
1257 	if (port->sm_vars & AD_PORT_BEGIN) {
1258 		port->sm_rx_state = AD_RX_INITIALIZE;
1259 		port->sm_vars |= AD_PORT_CHURNED;
1260 	/* check if port is not enabled */
1261 	} else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled)
1262 		port->sm_rx_state = AD_RX_PORT_DISABLED;
1263 	/* check if new lacpdu arrived */
1264 	else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) ||
1265 		 (port->sm_rx_state == AD_RX_DEFAULTED) ||
1266 		 (port->sm_rx_state == AD_RX_CURRENT))) {
1267 		if (port->sm_rx_state != AD_RX_CURRENT)
1268 			port->sm_vars |= AD_PORT_CHURNED;
1269 		port->sm_rx_timer_counter = 0;
1270 		port->sm_rx_state = AD_RX_CURRENT;
1271 	} else {
1272 		/* if timer is on, and if it is expired */
1273 		if (port->sm_rx_timer_counter &&
1274 		    !(--port->sm_rx_timer_counter)) {
1275 			switch (port->sm_rx_state) {
1276 			case AD_RX_EXPIRED:
1277 				port->sm_rx_state = AD_RX_DEFAULTED;
1278 				break;
1279 			case AD_RX_CURRENT:
1280 				port->sm_rx_state = AD_RX_EXPIRED;
1281 				break;
1282 			default:
1283 				break;
1284 			}
1285 		} else {
1286 			/* if no lacpdu arrived and no timer is on */
1287 			switch (port->sm_rx_state) {
1288 			case AD_RX_PORT_DISABLED:
1289 				if (port->is_enabled &&
1290 				    (port->sm_vars & AD_PORT_LACP_ENABLED))
1291 					port->sm_rx_state = AD_RX_EXPIRED;
1292 				else if (port->is_enabled
1293 					 && ((port->sm_vars
1294 					      & AD_PORT_LACP_ENABLED) == 0))
1295 					port->sm_rx_state = AD_RX_LACP_DISABLED;
1296 				break;
1297 			default:
1298 				break;
1299 
1300 			}
1301 		}
1302 	}
1303 
1304 	/* check if the State machine was changed or new lacpdu arrived */
1305 	if ((port->sm_rx_state != last_state) || (lacpdu)) {
1306 		slave_dbg(port->slave->bond->dev, port->slave->dev,
1307 			  "Rx Machine: Port=%d, Last State=%d, Curr State=%d\n",
1308 			  port->actor_port_number,
1309 			  last_state,
1310 			  port->sm_rx_state);
1311 		switch (port->sm_rx_state) {
1312 		case AD_RX_INITIALIZE:
1313 			if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS))
1314 				port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1315 			else
1316 				port->sm_vars |= AD_PORT_LACP_ENABLED;
1317 			port->sm_vars &= ~AD_PORT_SELECTED;
1318 			__record_default(port);
1319 			port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1320 			port->sm_rx_state = AD_RX_PORT_DISABLED;
1321 
1322 			fallthrough;
1323 		case AD_RX_PORT_DISABLED:
1324 			port->sm_vars &= ~AD_PORT_MATCHED;
1325 			break;
1326 		case AD_RX_LACP_DISABLED:
1327 			port->sm_vars &= ~AD_PORT_SELECTED;
1328 			__record_default(port);
1329 			port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION;
1330 			port->sm_vars |= AD_PORT_MATCHED;
1331 			port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1332 			break;
1333 		case AD_RX_EXPIRED:
1334 			/* Reset of the Synchronization flag (Standard 43.4.12)
1335 			 * This reset cause to disable this port in the
1336 			 * COLLECTING_DISTRIBUTING state of the mux machine in
1337 			 * case of EXPIRED even if LINK_DOWN didn't arrive for
1338 			 * the port.
1339 			 */
1340 			port->sm_vars &= ~AD_PORT_MATCHED;
1341 			/* Based on IEEE 8021AX-2014, Figure 6-18 - Receive
1342 			 * machine state diagram, the statue should be
1343 			 * Partner_Oper_Port_State.Synchronization = FALSE;
1344 			 * Partner_Oper_Port_State.LACP_Timeout = Short Timeout;
1345 			 * start current_while_timer(Short Timeout);
1346 			 * Actor_Oper_Port_State.Expired = TRUE;
1347 			 */
1348 			port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION;
1349 			port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT;
1350 			port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
1351 			port->actor_oper_port_state |= LACP_STATE_EXPIRED;
1352 			port->sm_vars |= AD_PORT_CHURNED;
1353 			break;
1354 		case AD_RX_DEFAULTED:
1355 			__update_default_selected(port);
1356 			__record_default(port);
1357 			port->sm_vars |= AD_PORT_MATCHED;
1358 			port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1359 			break;
1360 		case AD_RX_CURRENT:
1361 			/* detect loopback situation */
1362 			if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system),
1363 					      &(port->actor_system))) {
1364 				slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n"
1365 					  "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n");
1366 				return;
1367 			}
1368 			__update_selected(lacpdu, port);
1369 			__update_ntt(lacpdu, port);
1370 			__record_pdu(lacpdu, port);
1371 			port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT));
1372 			port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
1373 			break;
1374 		default:
1375 			break;
1376 		}
1377 	}
1378 }
1379 
1380 /**
1381  * ad_churn_machine - handle port churn's state machine
1382  * @port: the port we're looking at
1383  *
1384  */
ad_churn_machine(struct port * port)1385 static void ad_churn_machine(struct port *port)
1386 {
1387 	if (port->sm_vars & AD_PORT_CHURNED) {
1388 		port->sm_vars &= ~AD_PORT_CHURNED;
1389 		port->sm_churn_actor_state = AD_CHURN_MONITOR;
1390 		port->sm_churn_partner_state = AD_CHURN_MONITOR;
1391 		port->sm_churn_actor_timer_counter =
1392 			__ad_timer_to_ticks(AD_ACTOR_CHURN_TIMER, 0);
1393 		port->sm_churn_partner_timer_counter =
1394 			 __ad_timer_to_ticks(AD_PARTNER_CHURN_TIMER, 0);
1395 		return;
1396 	}
1397 	if (port->sm_churn_actor_timer_counter &&
1398 	    !(--port->sm_churn_actor_timer_counter) &&
1399 	    port->sm_churn_actor_state == AD_CHURN_MONITOR) {
1400 		if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) {
1401 			port->sm_churn_actor_state = AD_NO_CHURN;
1402 		} else {
1403 			port->churn_actor_count++;
1404 			port->sm_churn_actor_state = AD_CHURN;
1405 		}
1406 	}
1407 	if (port->sm_churn_partner_timer_counter &&
1408 	    !(--port->sm_churn_partner_timer_counter) &&
1409 	    port->sm_churn_partner_state == AD_CHURN_MONITOR) {
1410 		if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) {
1411 			port->sm_churn_partner_state = AD_NO_CHURN;
1412 		} else {
1413 			port->churn_partner_count++;
1414 			port->sm_churn_partner_state = AD_CHURN;
1415 		}
1416 	}
1417 }
1418 
1419 /**
1420  * ad_tx_machine - handle a port's tx state machine
1421  * @port: the port we're looking at
1422  */
ad_tx_machine(struct port * port)1423 static void ad_tx_machine(struct port *port)
1424 {
1425 	/* check if tx timer expired, to verify that we do not send more than
1426 	 * 3 packets per second
1427 	 */
1428 	if (!port->sm_tx_timer_counter || !(--port->sm_tx_timer_counter)) {
1429 		/* check if there is something to send */
1430 		if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) {
1431 			__update_lacpdu_from_port(port);
1432 
1433 			if (ad_lacpdu_send(port) >= 0) {
1434 				slave_dbg(port->slave->bond->dev,
1435 					  port->slave->dev,
1436 					  "Sent LACPDU on port %d\n",
1437 					  port->actor_port_number);
1438 
1439 				/* mark ntt as false, so it will not be sent
1440 				 * again until demanded
1441 				 */
1442 				port->ntt = false;
1443 
1444 				/* restart tx timer(to verify that we will not
1445 				 * exceed AD_MAX_TX_IN_SECOND
1446 				 */
1447 				port->sm_tx_timer_counter = ad_ticks_per_sec / AD_MAX_TX_IN_SECOND;
1448 			}
1449 		}
1450 	}
1451 }
1452 
1453 /**
1454  * ad_periodic_machine - handle a port's periodic state machine
1455  * @port: the port we're looking at
1456  *
1457  * Turn ntt flag on priodically to perform periodic transmission of lacpdu's.
1458  */
ad_periodic_machine(struct port * port)1459 static void ad_periodic_machine(struct port *port)
1460 {
1461 	periodic_states_t last_state;
1462 
1463 	/* keep current state machine state to compare later if it was changed */
1464 	last_state = port->sm_periodic_state;
1465 
1466 	/* check if port was reinitialized */
1467 	if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
1468 	    (!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LACP_STATE_LACP_ACTIVITY))) {
1469 		port->sm_periodic_state = AD_NO_PERIODIC;
1470 	}
1471 	/* check if state machine should change state */
1472 	else if (port->sm_periodic_timer_counter) {
1473 		/* check if periodic state machine expired */
1474 		if (!(--port->sm_periodic_timer_counter)) {
1475 			/* if expired then do tx */
1476 			port->sm_periodic_state = AD_PERIODIC_TX;
1477 		} else {
1478 			/* If not expired, check if there is some new timeout
1479 			 * parameter from the partner state
1480 			 */
1481 			switch (port->sm_periodic_state) {
1482 			case AD_FAST_PERIODIC:
1483 				if (!(port->partner_oper.port_state
1484 				      & LACP_STATE_LACP_TIMEOUT))
1485 					port->sm_periodic_state = AD_SLOW_PERIODIC;
1486 				break;
1487 			case AD_SLOW_PERIODIC:
1488 				if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) {
1489 					port->sm_periodic_timer_counter = 0;
1490 					port->sm_periodic_state = AD_PERIODIC_TX;
1491 				}
1492 				break;
1493 			default:
1494 				break;
1495 			}
1496 		}
1497 	} else {
1498 		switch (port->sm_periodic_state) {
1499 		case AD_NO_PERIODIC:
1500 			port->sm_periodic_state = AD_FAST_PERIODIC;
1501 			break;
1502 		case AD_PERIODIC_TX:
1503 			if (!(port->partner_oper.port_state &
1504 			    LACP_STATE_LACP_TIMEOUT))
1505 				port->sm_periodic_state = AD_SLOW_PERIODIC;
1506 			else
1507 				port->sm_periodic_state = AD_FAST_PERIODIC;
1508 			break;
1509 		default:
1510 			break;
1511 		}
1512 	}
1513 
1514 	/* check if the state machine was changed */
1515 	if (port->sm_periodic_state != last_state) {
1516 		slave_dbg(port->slave->bond->dev, port->slave->dev,
1517 			  "Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n",
1518 			  port->actor_port_number, last_state,
1519 			  port->sm_periodic_state);
1520 		switch (port->sm_periodic_state) {
1521 		case AD_NO_PERIODIC:
1522 			port->sm_periodic_timer_counter = 0;
1523 			break;
1524 		case AD_FAST_PERIODIC:
1525 			/* decrement 1 tick we lost in the PERIODIC_TX cycle */
1526 			port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TIME))-1;
1527 			break;
1528 		case AD_SLOW_PERIODIC:
1529 			/* decrement 1 tick we lost in the PERIODIC_TX cycle */
1530 			port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TIME))-1;
1531 			break;
1532 		case AD_PERIODIC_TX:
1533 			port->ntt = true;
1534 			break;
1535 		default:
1536 			break;
1537 		}
1538 	}
1539 }
1540 
1541 /**
1542  * ad_port_selection_logic - select aggregation groups
1543  * @port: the port we're looking at
1544  * @update_slave_arr: Does slave array need update?
1545  *
1546  * Select aggregation groups, and assign each port for it's aggregetor. The
1547  * selection logic is called in the inititalization (after all the handshkes),
1548  * and after every lacpdu receive (if selected is off).
1549  */
ad_port_selection_logic(struct port * port,bool * update_slave_arr)1550 static void ad_port_selection_logic(struct port *port, bool *update_slave_arr)
1551 {
1552 	struct aggregator *aggregator, *free_aggregator = NULL, *temp_aggregator;
1553 	struct port *last_port = NULL, *curr_port;
1554 	struct list_head *iter;
1555 	struct bonding *bond;
1556 	struct slave *slave;
1557 	int found = 0;
1558 
1559 	/* if the port is already Selected, do nothing */
1560 	if (port->sm_vars & AD_PORT_SELECTED)
1561 		return;
1562 
1563 	bond = __get_bond_by_port(port);
1564 
1565 	/* if the port is connected to other aggregator, detach it */
1566 	temp_aggregator = rcu_dereference(port->aggregator);
1567 	if (temp_aggregator) {
1568 		/* detach the port from its former aggregator */
1569 		for (curr_port = temp_aggregator->lag_ports; curr_port;
1570 		     last_port = curr_port,
1571 		     curr_port = curr_port->next_port_in_aggregator) {
1572 			if (curr_port == port) {
1573 				temp_aggregator->num_of_ports--;
1574 				/* if it is the first port attached to the
1575 				 * aggregator
1576 				 */
1577 				if (!last_port) {
1578 					temp_aggregator->lag_ports =
1579 						port->next_port_in_aggregator;
1580 				} else {
1581 					/* not the first port attached to the
1582 					 * aggregator
1583 					 */
1584 					last_port->next_port_in_aggregator =
1585 						port->next_port_in_aggregator;
1586 				}
1587 
1588 				/* clear the port's relations to this
1589 				 * aggregator
1590 				 */
1591 				RCU_INIT_POINTER(port->aggregator, NULL);
1592 				port->next_port_in_aggregator = NULL;
1593 				port->actor_port_aggregator_identifier = 0;
1594 
1595 				slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n",
1596 					  port->actor_port_number,
1597 					  temp_aggregator->aggregator_identifier);
1598 				/* if the aggregator is empty, clear its
1599 				 * parameters, and set it ready to be attached
1600 				 */
1601 				if (!temp_aggregator->lag_ports)
1602 					ad_clear_agg(temp_aggregator);
1603 				break;
1604 			}
1605 		}
1606 		if (!curr_port) {
1607 			/* meaning: the port was related to an aggregator
1608 			 * but was not on the aggregator port list
1609 			 */
1610 			net_warn_ratelimited("%s: (slave %s): Warning: Port %d was related to aggregator %d but was not on its port list\n",
1611 					     port->slave->bond->dev->name,
1612 					     port->slave->dev->name,
1613 					     port->actor_port_number,
1614 					     temp_aggregator->aggregator_identifier);
1615 		}
1616 	}
1617 	/* search on all aggregators for a suitable aggregator for this port */
1618 	bond_for_each_slave(bond, slave, iter) {
1619 		aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
1620 
1621 		/* keep a free aggregator for later use(if needed) */
1622 		if (!aggregator->lag_ports) {
1623 			if (!free_aggregator)
1624 				free_aggregator = aggregator;
1625 			continue;
1626 		}
1627 		/* check if current aggregator suits us */
1628 		if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) && /* if all parameters match AND */
1629 		     MAC_ADDRESS_EQUAL(&(aggregator->partner_system), &(port->partner_oper.system)) &&
1630 		     (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
1631 		     (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
1632 		    ) &&
1633 		    ((__agg_has_partner(aggregator) && /* partner answers */
1634 		      !aggregator->is_individual)  /* but is not individual OR */
1635 		    )
1636 		   ) {
1637 			/* attach to the founded aggregator */
1638 			rcu_assign_pointer(port->aggregator, aggregator);
1639 			port->actor_port_aggregator_identifier =
1640 				aggregator->aggregator_identifier;
1641 			port->next_port_in_aggregator = aggregator->lag_ports;
1642 			aggregator->num_of_ports++;
1643 			aggregator->lag_ports = port;
1644 			slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n",
1645 				  port->actor_port_number,
1646 				  aggregator->aggregator_identifier);
1647 
1648 			/* mark this port as selected */
1649 			port->sm_vars |= AD_PORT_SELECTED;
1650 			found = 1;
1651 			break;
1652 		}
1653 	}
1654 
1655 	/* the port couldn't find an aggregator - attach it to a new
1656 	 * aggregator
1657 	 */
1658 	if (!found) {
1659 		if (free_aggregator) {
1660 			/* assign port a new aggregator */
1661 			port->actor_port_aggregator_identifier =
1662 				free_aggregator->aggregator_identifier;
1663 
1664 			/* update the new aggregator's parameters
1665 			 * if port was responsed from the end-user
1666 			 */
1667 			if (port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)
1668 				/* if port is full duplex */
1669 				free_aggregator->is_individual = false;
1670 			else
1671 				free_aggregator->is_individual = true;
1672 
1673 			free_aggregator->actor_admin_aggregator_key =
1674 				port->actor_admin_port_key;
1675 			free_aggregator->actor_oper_aggregator_key =
1676 				port->actor_oper_port_key;
1677 			free_aggregator->partner_system =
1678 				port->partner_oper.system;
1679 			free_aggregator->partner_system_priority =
1680 				port->partner_oper.system_priority;
1681 			free_aggregator->partner_oper_aggregator_key = port->partner_oper.key;
1682 			free_aggregator->receive_state = 1;
1683 			free_aggregator->transmit_state = 1;
1684 			free_aggregator->lag_ports = port;
1685 			free_aggregator->num_of_ports++;
1686 
1687 			rcu_assign_pointer(port->aggregator, free_aggregator);
1688 
1689 			/* mark this port as selected */
1690 			port->sm_vars |= AD_PORT_SELECTED;
1691 
1692 			slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n",
1693 				  port->actor_port_number,
1694 				  free_aggregator->aggregator_identifier);
1695 		} else {
1696 			slave_err(bond->dev, port->slave->dev,
1697 				  "Port %d did not find a suitable aggregator\n",
1698 				  port->actor_port_number);
1699 			return;
1700 		}
1701 	}
1702 	/* if all aggregator's ports are READY_N == TRUE, set ready=TRUE
1703 	 * in all aggregator's ports, else set ready=FALSE in all
1704 	 * aggregator's ports
1705 	 */
1706 	aggregator = rcu_dereference(port->aggregator);
1707 	__set_agg_ports_ready(aggregator, __agg_ports_are_ready(aggregator));
1708 
1709 	ad_agg_selection_logic(__get_first_agg(port), update_slave_arr);
1710 
1711 	if (!aggregator->is_active)
1712 		port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
1713 }
1714 
1715 /* Decide if "agg" is a better choice for the new active aggregator that
1716  * the current best, according to the ad_select policy.
1717  */
ad_agg_selection_test(struct aggregator * best,struct aggregator * curr)1718 static struct aggregator *ad_agg_selection_test(struct aggregator *best,
1719 						struct aggregator *curr)
1720 {
1721 	/* 0. If no best, select current.
1722 	 *
1723 	 * 1. If the current agg is not individual, and the best is
1724 	 *    individual, select current.
1725 	 *
1726 	 * 2. If current agg is individual and the best is not, keep best.
1727 	 *
1728 	 * 3. Therefore, current and best are both individual or both not
1729 	 *    individual, so:
1730 	 *
1731 	 * 3a. If current agg partner replied, and best agg partner did not,
1732 	 *     select current.
1733 	 *
1734 	 * 3b. If current agg partner did not reply and best agg partner
1735 	 *     did reply, keep best.
1736 	 *
1737 	 * 4.  Therefore, current and best both have partner replies or
1738 	 *     both do not, so perform selection policy:
1739 	 *
1740 	 * BOND_AD_PRIO: Select by total priority of ports. If priority
1741 	 *     is equal, select by count.
1742 	 *
1743 	 * BOND_AD_COUNT: Select by count of ports.  If count is equal,
1744 	 *     select by bandwidth.
1745 	 *
1746 	 * BOND_AD_STABLE, BOND_AD_BANDWIDTH: Select by bandwidth.
1747 	 */
1748 	if (!best)
1749 		return curr;
1750 
1751 	if (!curr->is_individual && best->is_individual)
1752 		return curr;
1753 
1754 	if (curr->is_individual && !best->is_individual)
1755 		return best;
1756 
1757 	if (__agg_has_partner(curr) && !__agg_has_partner(best))
1758 		return curr;
1759 
1760 	if (!__agg_has_partner(curr) && __agg_has_partner(best))
1761 		return best;
1762 
1763 	switch (__get_agg_selection_mode(curr->lag_ports)) {
1764 	case BOND_AD_PRIO:
1765 		if (__agg_ports_priority(curr) > __agg_ports_priority(best))
1766 			return curr;
1767 
1768 		if (__agg_ports_priority(curr) < __agg_ports_priority(best))
1769 			return best;
1770 
1771 		fallthrough;
1772 	case BOND_AD_COUNT:
1773 		if (__agg_active_ports(curr) > __agg_active_ports(best))
1774 			return curr;
1775 
1776 		if (__agg_active_ports(curr) < __agg_active_ports(best))
1777 			return best;
1778 
1779 		fallthrough;
1780 	case BOND_AD_STABLE:
1781 	case BOND_AD_BANDWIDTH:
1782 		if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best))
1783 			return curr;
1784 
1785 		break;
1786 
1787 	default:
1788 		net_warn_ratelimited("%s: (slave %s): Impossible agg select mode %d\n",
1789 				     curr->slave->bond->dev->name,
1790 				     curr->slave->dev->name,
1791 				     __get_agg_selection_mode(curr->lag_ports));
1792 		break;
1793 	}
1794 
1795 	return best;
1796 }
1797 
agg_device_up(const struct aggregator * agg)1798 static int agg_device_up(const struct aggregator *agg)
1799 {
1800 	struct port *port = agg->lag_ports;
1801 
1802 	if (!port)
1803 		return 0;
1804 
1805 	for (port = agg->lag_ports; port;
1806 	     port = port->next_port_in_aggregator) {
1807 		if (netif_running(port->slave->dev) &&
1808 		    netif_carrier_ok(port->slave->dev))
1809 			return 1;
1810 	}
1811 
1812 	return 0;
1813 }
1814 
1815 /**
1816  * ad_agg_selection_logic - select an aggregation group for a team
1817  * @agg: the aggregator we're looking at
1818  * @update_slave_arr: Does slave array need update?
1819  *
1820  * It is assumed that only one aggregator may be selected for a team.
1821  *
1822  * The logic of this function is to select the aggregator according to
1823  * the ad_select policy:
1824  *
1825  * BOND_AD_STABLE: select the aggregator with the most ports attached to
1826  * it, and to reselect the active aggregator only if the previous
1827  * aggregator has no more ports related to it.
1828  *
1829  * BOND_AD_BANDWIDTH: select the aggregator with the highest total
1830  * bandwidth, and reselect whenever a link state change takes place or the
1831  * set of slaves in the bond changes.
1832  *
1833  * BOND_AD_COUNT: select the aggregator with largest number of ports
1834  * (slaves), and reselect whenever a link state change takes place or the
1835  * set of slaves in the bond changes.
1836  *
1837  * BOND_AD_PRIO: select the aggregator with highest total priority of ports
1838  * (slaves), and reselect whenever a link state change takes place or the
1839  * set of slaves in the bond changes.
1840  *
1841  * FIXME: this function MUST be called with the first agg in the bond, or
1842  * __get_active_agg() won't work correctly. This function should be better
1843  * called with the bond itself, and retrieve the first agg from it.
1844  */
ad_agg_selection_logic(struct aggregator * agg,bool * update_slave_arr)1845 static void ad_agg_selection_logic(struct aggregator *agg,
1846 				   bool *update_slave_arr)
1847 {
1848 	struct aggregator *best, *active, *origin;
1849 	struct bonding *bond = agg->slave->bond;
1850 	struct list_head *iter;
1851 	struct slave *slave;
1852 	struct port *port;
1853 
1854 	rcu_read_lock();
1855 	origin = agg;
1856 	active = __get_active_agg(agg);
1857 	best = (active && agg_device_up(active)) ? active : NULL;
1858 
1859 	bond_for_each_slave_rcu(bond, slave, iter) {
1860 		agg = &(SLAVE_AD_INFO(slave)->aggregator);
1861 
1862 		agg->is_active = 0;
1863 
1864 		if (__agg_active_ports(agg) && agg_device_up(agg))
1865 			best = ad_agg_selection_test(best, agg);
1866 	}
1867 
1868 	if (best &&
1869 	    __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) {
1870 		/* For the STABLE policy, don't replace the old active
1871 		 * aggregator if it's still active (it has an answering
1872 		 * partner) or if both the best and active don't have an
1873 		 * answering partner.
1874 		 */
1875 		if (active && active->lag_ports &&
1876 		    __agg_active_ports(active) &&
1877 		    (__agg_has_partner(active) ||
1878 		     (!__agg_has_partner(active) &&
1879 		     !__agg_has_partner(best)))) {
1880 			if (!(!active->actor_oper_aggregator_key &&
1881 			      best->actor_oper_aggregator_key)) {
1882 				best = NULL;
1883 				active->is_active = 1;
1884 			}
1885 		}
1886 	}
1887 
1888 	if (best && (best == active)) {
1889 		best = NULL;
1890 		active->is_active = 1;
1891 	}
1892 
1893 	/* if there is new best aggregator, activate it */
1894 	if (best) {
1895 		netdev_dbg(bond->dev, "(slave %s): best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1896 			   best->slave ? best->slave->dev->name : "NULL",
1897 			   best->aggregator_identifier, best->num_of_ports,
1898 			   best->actor_oper_aggregator_key,
1899 			   best->partner_oper_aggregator_key,
1900 			   best->is_individual, best->is_active);
1901 		netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n",
1902 			   best->slave ? best->slave->dev->name : "NULL",
1903 			   best->lag_ports, best->slave);
1904 
1905 		bond_for_each_slave_rcu(bond, slave, iter) {
1906 			agg = &(SLAVE_AD_INFO(slave)->aggregator);
1907 
1908 			slave_dbg(bond->dev, slave->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1909 				  agg->aggregator_identifier, agg->num_of_ports,
1910 				  agg->actor_oper_aggregator_key,
1911 				  agg->partner_oper_aggregator_key,
1912 				  agg->is_individual, agg->is_active);
1913 		}
1914 
1915 		/* check if any partner replies */
1916 		if (best->is_individual)
1917 			net_warn_ratelimited("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n",
1918 					     bond->dev->name);
1919 
1920 		best->is_active = 1;
1921 		netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n",
1922 			   best->slave ? best->slave->dev->name : "NULL",
1923 			   best->aggregator_identifier);
1924 		netdev_dbg(bond->dev, "(slave %s): Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1925 			   best->slave ? best->slave->dev->name : "NULL",
1926 			   best->aggregator_identifier, best->num_of_ports,
1927 			   best->actor_oper_aggregator_key,
1928 			   best->partner_oper_aggregator_key,
1929 			   best->is_individual, best->is_active);
1930 
1931 		/* disable the ports that were related to the former
1932 		 * active_aggregator
1933 		 */
1934 		if (active) {
1935 			for (port = active->lag_ports; port;
1936 			     port = port->next_port_in_aggregator) {
1937 				__disable_port(port);
1938 			}
1939 		}
1940 		/* Slave array needs update. */
1941 		*update_slave_arr = true;
1942 	}
1943 
1944 	/* if the selected aggregator is of join individuals
1945 	 * (partner_system is NULL), enable their ports
1946 	 */
1947 	active = __get_active_agg(origin);
1948 
1949 	if (active) {
1950 		if (!__agg_has_partner(active)) {
1951 			for (port = active->lag_ports; port;
1952 			     port = port->next_port_in_aggregator) {
1953 				__enable_port(port);
1954 			}
1955 			*update_slave_arr = true;
1956 		}
1957 	}
1958 
1959 	rcu_read_unlock();
1960 
1961 	bond_3ad_set_carrier(bond);
1962 }
1963 
1964 /**
1965  * ad_clear_agg - clear a given aggregator's parameters
1966  * @aggregator: the aggregator we're looking at
1967  */
ad_clear_agg(struct aggregator * aggregator)1968 static void ad_clear_agg(struct aggregator *aggregator)
1969 {
1970 	if (aggregator) {
1971 		aggregator->is_individual = false;
1972 		aggregator->actor_admin_aggregator_key = 0;
1973 		aggregator->actor_oper_aggregator_key = 0;
1974 		eth_zero_addr(aggregator->partner_system.mac_addr_value);
1975 		aggregator->partner_system_priority = 0;
1976 		aggregator->partner_oper_aggregator_key = 0;
1977 		aggregator->receive_state = 0;
1978 		aggregator->transmit_state = 0;
1979 		aggregator->lag_ports = NULL;
1980 		aggregator->is_active = 0;
1981 		aggregator->num_of_ports = 0;
1982 		pr_debug("%s: LAG %d was cleared\n",
1983 			 aggregator->slave ?
1984 			 aggregator->slave->dev->name : "NULL",
1985 			 aggregator->aggregator_identifier);
1986 	}
1987 }
1988 
1989 /**
1990  * ad_initialize_agg - initialize a given aggregator's parameters
1991  * @aggregator: the aggregator we're looking at
1992  */
ad_initialize_agg(struct aggregator * aggregator)1993 static void ad_initialize_agg(struct aggregator *aggregator)
1994 {
1995 	if (aggregator) {
1996 		ad_clear_agg(aggregator);
1997 
1998 		eth_zero_addr(aggregator->aggregator_mac_address.mac_addr_value);
1999 		aggregator->aggregator_identifier = 0;
2000 		aggregator->slave = NULL;
2001 	}
2002 }
2003 
2004 /**
2005  * ad_initialize_port - initialize a given port's parameters
2006  * @port: the port we're looking at
2007  * @bond_params: bond parameters we will use
2008  */
ad_initialize_port(struct port * port,const struct bond_params * bond_params)2009 static void ad_initialize_port(struct port *port, const struct bond_params *bond_params)
2010 {
2011 	static const struct port_params tmpl = {
2012 		.system_priority = 0xffff,
2013 		.key             = 1,
2014 		.port_number     = 1,
2015 		.port_priority   = 0xff,
2016 		.port_state      = 0,
2017 	};
2018 	static const struct lacpdu lacpdu = {
2019 		.subtype		= 0x01,
2020 		.version_number = 0x01,
2021 		.tlv_type_actor_info = 0x01,
2022 		.actor_information_length = 0x14,
2023 		.tlv_type_partner_info = 0x02,
2024 		.partner_information_length = 0x14,
2025 		.tlv_type_collector_info = 0x03,
2026 		.collector_information_length = 0x10,
2027 		.collector_max_delay = htons(AD_COLLECTOR_MAX_DELAY),
2028 	};
2029 
2030 	if (port) {
2031 		port->actor_port_priority = 0xff;
2032 		port->actor_port_aggregator_identifier = 0;
2033 		port->ntt = false;
2034 		port->actor_admin_port_state = LACP_STATE_AGGREGATION;
2035 		port->actor_oper_port_state  = LACP_STATE_AGGREGATION;
2036 		if (bond_params->lacp_active) {
2037 			port->actor_admin_port_state |= LACP_STATE_LACP_ACTIVITY;
2038 			port->actor_oper_port_state  |= LACP_STATE_LACP_ACTIVITY;
2039 		}
2040 
2041 		if (bond_params->lacp_fast)
2042 			port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
2043 
2044 		memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
2045 		memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
2046 
2047 		port->is_enabled = true;
2048 		/* private parameters */
2049 		port->sm_vars = AD_PORT_BEGIN | AD_PORT_LACP_ENABLED;
2050 		port->sm_rx_state = 0;
2051 		port->sm_rx_timer_counter = 0;
2052 		port->sm_periodic_state = 0;
2053 		port->sm_periodic_timer_counter = 0;
2054 		port->sm_mux_state = 0;
2055 		port->sm_mux_timer_counter = 0;
2056 		port->sm_tx_state = 0;
2057 		port->aggregator = NULL;
2058 		port->next_port_in_aggregator = NULL;
2059 		port->transaction_id = 0;
2060 
2061 		port->sm_churn_actor_timer_counter = 0;
2062 		port->sm_churn_actor_state = 0;
2063 		port->churn_actor_count = 0;
2064 		port->sm_churn_partner_timer_counter = 0;
2065 		port->sm_churn_partner_state = 0;
2066 		port->churn_partner_count = 0;
2067 
2068 		memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu));
2069 	}
2070 }
2071 
2072 /**
2073  * ad_enable_collecting - enable a port's receive
2074  * @port: the port we're looking at
2075  *
2076  * Enable @port if it's in an active aggregator
2077  */
ad_enable_collecting(struct port * port)2078 static void ad_enable_collecting(struct port *port)
2079 {
2080 	struct aggregator *aggregator = rcu_dereference(port->aggregator);
2081 
2082 	if (aggregator->is_active) {
2083 		struct slave *slave = port->slave;
2084 
2085 		slave_dbg(slave->bond->dev, slave->dev,
2086 			  "Enabling collecting on port %d (LAG %d)\n",
2087 			  port->actor_port_number,
2088 			  aggregator->aggregator_identifier);
2089 		__enable_collecting_port(port);
2090 	}
2091 }
2092 
2093 /**
2094  * ad_disable_distributing - disable a port's transmit
2095  * @port: the port we're looking at
2096  * @update_slave_arr: Does slave array need update?
2097  */
ad_disable_distributing(struct port * port,bool * update_slave_arr)2098 static void ad_disable_distributing(struct port *port, bool *update_slave_arr)
2099 {
2100 	struct aggregator *aggregator = rcu_dereference(port->aggregator);
2101 
2102 	if (aggregator && __agg_has_partner(aggregator)) {
2103 		slave_dbg(port->slave->bond->dev, port->slave->dev,
2104 			  "Disabling distributing on port %d (LAG %d)\n",
2105 			  port->actor_port_number,
2106 			  aggregator->aggregator_identifier);
2107 		__disable_distributing_port(port);
2108 		/* Slave array needs an update */
2109 		*update_slave_arr = true;
2110 	}
2111 }
2112 
2113 /**
2114  * ad_enable_collecting_distributing - enable a port's transmit/receive
2115  * @port: the port we're looking at
2116  * @update_slave_arr: Does slave array need update?
2117  *
2118  * Enable @port if it's in an active aggregator
2119  */
ad_enable_collecting_distributing(struct port * port,bool * update_slave_arr)2120 static void ad_enable_collecting_distributing(struct port *port,
2121 					      bool *update_slave_arr)
2122 {
2123 	struct aggregator *aggregator = rcu_dereference(port->aggregator);
2124 
2125 	if (aggregator->is_active) {
2126 		slave_dbg(port->slave->bond->dev, port->slave->dev,
2127 			  "Enabling port %d (LAG %d)\n",
2128 			  port->actor_port_number,
2129 			  aggregator->aggregator_identifier);
2130 		__enable_port(port);
2131 		/* Slave array needs update */
2132 		*update_slave_arr = true;
2133 		/* Should notify peers if possible */
2134 		ad_cond_set_peer_notif(port);
2135 	}
2136 }
2137 
2138 /**
2139  * ad_disable_collecting_distributing - disable a port's transmit/receive
2140  * @port: the port we're looking at
2141  * @update_slave_arr: Does slave array need update?
2142  */
ad_disable_collecting_distributing(struct port * port,bool * update_slave_arr)2143 static void ad_disable_collecting_distributing(struct port *port,
2144 					       bool *update_slave_arr)
2145 {
2146 	struct aggregator *aggregator = rcu_dereference(port->aggregator);
2147 
2148 	if (aggregator && __agg_has_partner(aggregator)) {
2149 		slave_dbg(port->slave->bond->dev, port->slave->dev,
2150 			  "Disabling port %d (LAG %d)\n",
2151 			  port->actor_port_number,
2152 			  aggregator->aggregator_identifier);
2153 		__disable_port(port);
2154 		/* Slave array needs an update */
2155 		*update_slave_arr = true;
2156 	}
2157 }
2158 
2159 /**
2160  * ad_marker_info_received - handle receive of a Marker information frame
2161  * @marker_info: Marker info received
2162  * @port: the port we're looking at
2163  */
ad_marker_info_received(struct bond_marker * marker_info,struct port * port)2164 static void ad_marker_info_received(struct bond_marker *marker_info,
2165 				    struct port *port)
2166 {
2167 	struct bond_marker marker;
2168 
2169 	atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx);
2170 	atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx);
2171 
2172 	/* copy the received marker data to the response marker */
2173 	memcpy(&marker, marker_info, sizeof(struct bond_marker));
2174 	/* change the marker subtype to marker response */
2175 	marker.tlv_type = AD_MARKER_RESPONSE_SUBTYPE;
2176 
2177 	/* send the marker response */
2178 	if (ad_marker_send(port, &marker) >= 0)
2179 		slave_dbg(port->slave->bond->dev, port->slave->dev,
2180 			  "Sent Marker Response on port %d\n",
2181 			  port->actor_port_number);
2182 }
2183 
2184 /**
2185  * ad_marker_response_received - handle receive of a marker response frame
2186  * @marker: marker PDU received
2187  * @port: the port we're looking at
2188  *
2189  * This function does nothing since we decided not to implement send and handle
2190  * response for marker PDU's, in this stage, but only to respond to marker
2191  * information.
2192  */
ad_marker_response_received(struct bond_marker * marker,struct port * port)2193 static void ad_marker_response_received(struct bond_marker *marker,
2194 					struct port *port)
2195 {
2196 	atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx);
2197 	atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx);
2198 
2199 	/* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */
2200 }
2201 
2202 /* ========= AD exported functions to the main bonding code ========= */
2203 
2204 /* Check aggregators status in team every T seconds */
2205 #define AD_AGGREGATOR_SELECTION_TIMER  8
2206 
2207 /**
2208  * bond_3ad_initiate_agg_selection - initate aggregator selection
2209  * @bond: bonding struct
2210  * @timeout: timeout value to set
2211  *
2212  * Set the aggregation selection timer, to initiate an agg selection in
2213  * the very near future.  Called during first initialization, and during
2214  * any down to up transitions of the bond.
2215  */
bond_3ad_initiate_agg_selection(struct bonding * bond,int timeout)2216 void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
2217 {
2218 	atomic_set(&BOND_AD_INFO(bond).agg_select_timer, timeout);
2219 }
2220 
2221 /**
2222  * bond_3ad_initialize - initialize a bond's 802.3ad parameters and structures
2223  * @bond: bonding struct to work on
2224  *
2225  * Can be called only after the mac address of the bond is set.
2226  */
bond_3ad_initialize(struct bonding * bond)2227 void bond_3ad_initialize(struct bonding *bond)
2228 {
2229 	BOND_AD_INFO(bond).aggregator_identifier = 0;
2230 	BOND_AD_INFO(bond).system.sys_priority =
2231 		bond->params.ad_actor_sys_prio;
2232 	if (is_zero_ether_addr(bond->params.ad_actor_system))
2233 		BOND_AD_INFO(bond).system.sys_mac_addr =
2234 		    *((struct mac_addr *)bond->dev->dev_addr);
2235 	else
2236 		BOND_AD_INFO(bond).system.sys_mac_addr =
2237 		    *((struct mac_addr *)bond->params.ad_actor_system);
2238 
2239 	bond_3ad_initiate_agg_selection(bond,
2240 					AD_AGGREGATOR_SELECTION_TIMER *
2241 					ad_ticks_per_sec);
2242 }
2243 
2244 /**
2245  * bond_3ad_bind_slave - initialize a slave's port
2246  * @slave: slave struct to work on
2247  *
2248  * Returns:   0 on success
2249  *          < 0 on error
2250  */
bond_3ad_bind_slave(struct slave * slave)2251 void bond_3ad_bind_slave(struct slave *slave)
2252 {
2253 	struct bonding *bond = bond_get_bond_by_slave(slave);
2254 	struct port *port;
2255 	struct aggregator *aggregator;
2256 
2257 	/* check that the slave has not been initialized yet. */
2258 	if (SLAVE_AD_INFO(slave)->port.slave != slave) {
2259 
2260 		/* port initialization */
2261 		port = &(SLAVE_AD_INFO(slave)->port);
2262 
2263 		ad_initialize_port(port, &bond->params);
2264 
2265 		/* Port priority is initialized. Update it to slave's ad info */
2266 		SLAVE_AD_INFO(slave)->port_priority = port->actor_port_priority;
2267 
2268 		port->slave = slave;
2269 		port->actor_port_number = SLAVE_AD_INFO(slave)->id;
2270 		/* key is determined according to the link speed, duplex and
2271 		 * user key
2272 		 */
2273 		port->actor_admin_port_key = bond->params.ad_user_port_key << 6;
2274 		ad_update_actor_keys(port, false);
2275 		/* actor system is the bond's system */
2276 		__ad_actor_update_port(port);
2277 		/* tx timer(to verify that no more than MAX_TX_IN_SECOND
2278 		 * lacpdu's are sent in one second)
2279 		 */
2280 		port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND;
2281 
2282 		__disable_port(port);
2283 
2284 		/* aggregator initialization */
2285 		aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
2286 
2287 		ad_initialize_agg(aggregator);
2288 
2289 		aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr);
2290 		aggregator->aggregator_identifier = ++BOND_AD_INFO(bond).aggregator_identifier;
2291 		aggregator->slave = slave;
2292 		aggregator->is_active = 0;
2293 		aggregator->num_of_ports = 0;
2294 	}
2295 }
2296 
2297 /**
2298  * bond_3ad_unbind_slave - deinitialize a slave's port
2299  * @slave: slave struct to work on
2300  *
2301  * Search for the aggregator that is related to this port, remove the
2302  * aggregator and assign another aggregator for other port related to it
2303  * (if any), and remove the port.
2304  */
bond_3ad_unbind_slave(struct slave * slave)2305 void bond_3ad_unbind_slave(struct slave *slave)
2306 {
2307 	struct port *port, *prev_port, *temp_port;
2308 	struct aggregator *aggregator, *new_aggregator, *temp_aggregator;
2309 	int select_new_active_agg = 0;
2310 	struct bonding *bond = slave->bond;
2311 	struct slave *slave_iter;
2312 	struct list_head *iter;
2313 	bool dummy_slave_update; /* Ignore this value as caller updates array */
2314 
2315 	/* Sync against bond_3ad_state_machine_handler() */
2316 	spin_lock_bh(&bond->mode_lock);
2317 	aggregator = &(SLAVE_AD_INFO(slave)->aggregator);
2318 	port = &(SLAVE_AD_INFO(slave)->port);
2319 
2320 	/* if slave is null, the whole port is not initialized */
2321 	if (!port->slave) {
2322 		slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n");
2323 		goto out;
2324 	}
2325 
2326 	slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n",
2327 		  aggregator->aggregator_identifier);
2328 
2329 	/* Tell the partner that this port is not suitable for aggregation */
2330 	port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
2331 	port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
2332 	port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
2333 	port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION;
2334 	__update_lacpdu_from_port(port);
2335 	ad_lacpdu_send(port);
2336 
2337 	/* check if this aggregator is occupied */
2338 	if (aggregator->lag_ports) {
2339 		/* check if there are other ports related to this aggregator
2340 		 * except the port related to this slave(thats ensure us that
2341 		 * there is a reason to search for new aggregator, and that we
2342 		 * will find one
2343 		 */
2344 		if ((aggregator->lag_ports != port) ||
2345 		    (aggregator->lag_ports->next_port_in_aggregator)) {
2346 			/* find new aggregator for the related port(s) */
2347 			bond_for_each_slave(bond, slave_iter, iter) {
2348 				new_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
2349 				/* if the new aggregator is empty, or it is
2350 				 * connected to our port only
2351 				 */
2352 				if (!new_aggregator->lag_ports ||
2353 				    ((new_aggregator->lag_ports == port) &&
2354 				     !new_aggregator->lag_ports->next_port_in_aggregator))
2355 					break;
2356 			}
2357 			if (!slave_iter)
2358 				new_aggregator = NULL;
2359 
2360 			/* if new aggregator found, copy the aggregator's
2361 			 * parameters and connect the related lag_ports to the
2362 			 * new aggregator
2363 			 */
2364 			if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) {
2365 				slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n",
2366 					  aggregator->aggregator_identifier,
2367 					  new_aggregator->aggregator_identifier);
2368 
2369 				if ((new_aggregator->lag_ports == port) &&
2370 				    new_aggregator->is_active) {
2371 					slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2372 					select_new_active_agg = 1;
2373 				}
2374 
2375 				new_aggregator->is_individual = aggregator->is_individual;
2376 				new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key;
2377 				new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key;
2378 				new_aggregator->partner_system = aggregator->partner_system;
2379 				new_aggregator->partner_system_priority = aggregator->partner_system_priority;
2380 				new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key;
2381 				new_aggregator->receive_state = aggregator->receive_state;
2382 				new_aggregator->transmit_state = aggregator->transmit_state;
2383 				new_aggregator->lag_ports = aggregator->lag_ports;
2384 				new_aggregator->is_active = aggregator->is_active;
2385 				new_aggregator->num_of_ports = aggregator->num_of_ports;
2386 
2387 				/* update the information that is written on
2388 				 * the ports about the aggregator
2389 				 */
2390 				for (temp_port = aggregator->lag_ports; temp_port;
2391 				     temp_port = temp_port->next_port_in_aggregator) {
2392 					rcu_assign_pointer(temp_port->aggregator, new_aggregator);
2393 					temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier;
2394 				}
2395 
2396 				ad_clear_agg(aggregator);
2397 
2398 				if (select_new_active_agg)
2399 					ad_agg_selection_logic(__get_first_agg(port),
2400 							       &dummy_slave_update);
2401 			} else {
2402 				slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n");
2403 			}
2404 		} else {
2405 			/* in case that the only port related to this
2406 			 * aggregator is the one we want to remove
2407 			 */
2408 			select_new_active_agg = aggregator->is_active;
2409 			ad_clear_agg(aggregator);
2410 			if (select_new_active_agg) {
2411 				slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2412 				/* select new active aggregator */
2413 				temp_aggregator = __get_first_agg(port);
2414 				if (temp_aggregator)
2415 					ad_agg_selection_logic(temp_aggregator,
2416 							       &dummy_slave_update);
2417 			}
2418 		}
2419 	}
2420 
2421 	slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number);
2422 
2423 	/* find the aggregator that this port is connected to */
2424 	bond_for_each_slave(bond, slave_iter, iter) {
2425 		temp_aggregator = &(SLAVE_AD_INFO(slave_iter)->aggregator);
2426 		prev_port = NULL;
2427 		/* search the port in the aggregator's related ports */
2428 		for (temp_port = temp_aggregator->lag_ports; temp_port;
2429 		     prev_port = temp_port,
2430 		     temp_port = temp_port->next_port_in_aggregator) {
2431 			if (temp_port == port) {
2432 				/* the aggregator found - detach the port from
2433 				 * this aggregator
2434 				 */
2435 				if (prev_port)
2436 					prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator;
2437 				else
2438 					temp_aggregator->lag_ports = temp_port->next_port_in_aggregator;
2439 				temp_aggregator->num_of_ports--;
2440 				if (__agg_active_ports(temp_aggregator) == 0) {
2441 					select_new_active_agg = temp_aggregator->is_active;
2442 					if (temp_aggregator->num_of_ports == 0)
2443 						ad_clear_agg(temp_aggregator);
2444 					if (select_new_active_agg) {
2445 						slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2446 						/* select new active aggregator */
2447 						ad_agg_selection_logic(__get_first_agg(port),
2448 							               &dummy_slave_update);
2449 					}
2450 				}
2451 				break;
2452 			}
2453 		}
2454 	}
2455 	port->slave = NULL;
2456 
2457 out:
2458 	spin_unlock_bh(&bond->mode_lock);
2459 }
2460 
2461 /**
2462  * bond_3ad_update_ad_actor_settings - reflect change of actor settings to ports
2463  * @bond: bonding struct to work on
2464  *
2465  * If an ad_actor setting gets changed we need to update the individual port
2466  * settings so the bond device will use the new values when it gets upped.
2467  */
bond_3ad_update_ad_actor_settings(struct bonding * bond)2468 void bond_3ad_update_ad_actor_settings(struct bonding *bond)
2469 {
2470 	struct list_head *iter;
2471 	struct slave *slave;
2472 
2473 	ASSERT_RTNL();
2474 
2475 	BOND_AD_INFO(bond).system.sys_priority = bond->params.ad_actor_sys_prio;
2476 	if (is_zero_ether_addr(bond->params.ad_actor_system))
2477 		BOND_AD_INFO(bond).system.sys_mac_addr =
2478 		    *((struct mac_addr *)bond->dev->dev_addr);
2479 	else
2480 		BOND_AD_INFO(bond).system.sys_mac_addr =
2481 		    *((struct mac_addr *)bond->params.ad_actor_system);
2482 
2483 	spin_lock_bh(&bond->mode_lock);
2484 	bond_for_each_slave(bond, slave, iter) {
2485 		struct port *port = &(SLAVE_AD_INFO(slave))->port;
2486 
2487 		__ad_actor_update_port(port);
2488 		port->ntt = true;
2489 	}
2490 	spin_unlock_bh(&bond->mode_lock);
2491 }
2492 
2493 /**
2494  * bond_agg_timer_advance - advance agg_select_timer
2495  * @bond:  bonding structure
2496  *
2497  * Return true when agg_select_timer reaches 0.
2498  */
bond_agg_timer_advance(struct bonding * bond)2499 static bool bond_agg_timer_advance(struct bonding *bond)
2500 {
2501 	int val, nval;
2502 
2503 	while (1) {
2504 		val = atomic_read(&BOND_AD_INFO(bond).agg_select_timer);
2505 		if (!val)
2506 			return false;
2507 		nval = val - 1;
2508 		if (atomic_cmpxchg(&BOND_AD_INFO(bond).agg_select_timer,
2509 				   val, nval) == val)
2510 			break;
2511 	}
2512 	return nval == 0;
2513 }
2514 
2515 /**
2516  * bond_3ad_state_machine_handler - handle state machines timeout
2517  * @work: work context to fetch bonding struct to work on from
2518  *
2519  * The state machine handling concept in this module is to check every tick
2520  * which state machine should operate any function. The execution order is
2521  * round robin, so when we have an interaction between state machines, the
2522  * reply of one to each other might be delayed until next tick.
2523  *
2524  * This function also complete the initialization when the agg_select_timer
2525  * times out, and it selects an aggregator for the ports that are yet not
2526  * related to any aggregator, and selects the active aggregator for a bond.
2527  */
bond_3ad_state_machine_handler(struct work_struct * work)2528 void bond_3ad_state_machine_handler(struct work_struct *work)
2529 {
2530 	struct bonding *bond = container_of(work, struct bonding,
2531 					    ad_work.work);
2532 	struct aggregator *aggregator;
2533 	struct list_head *iter;
2534 	struct slave *slave;
2535 	struct port *port;
2536 	bool should_notify_rtnl = BOND_SLAVE_NOTIFY_LATER;
2537 	bool update_slave_arr = false;
2538 
2539 	/* Lock to protect data accessed by all (e.g., port->sm_vars) and
2540 	 * against running with bond_3ad_unbind_slave. ad_rx_machine may run
2541 	 * concurrently due to incoming LACPDU as well.
2542 	 */
2543 	spin_lock_bh(&bond->mode_lock);
2544 	rcu_read_lock();
2545 
2546 	/* check if there are any slaves */
2547 	if (!bond_has_slaves(bond))
2548 		goto re_arm;
2549 
2550 	if (bond_agg_timer_advance(bond)) {
2551 		slave = bond_first_slave_rcu(bond);
2552 		port = slave ? &(SLAVE_AD_INFO(slave)->port) : NULL;
2553 
2554 		/* select the active aggregator for the bond */
2555 		if (port) {
2556 			if (!port->slave) {
2557 				net_warn_ratelimited("%s: Warning: bond's first port is uninitialized\n",
2558 						     bond->dev->name);
2559 				goto re_arm;
2560 			}
2561 
2562 			aggregator = __get_first_agg(port);
2563 			ad_agg_selection_logic(aggregator, &update_slave_arr);
2564 		}
2565 		bond_3ad_set_carrier(bond);
2566 	}
2567 
2568 	/* for each port run the state machines */
2569 	bond_for_each_slave_rcu(bond, slave, iter) {
2570 		port = &(SLAVE_AD_INFO(slave)->port);
2571 		if (!port->slave) {
2572 			net_warn_ratelimited("%s: Warning: Found an uninitialized port\n",
2573 					    bond->dev->name);
2574 			goto re_arm;
2575 		}
2576 
2577 		ad_rx_machine(NULL, port);
2578 		ad_periodic_machine(port);
2579 		ad_port_selection_logic(port, &update_slave_arr);
2580 		ad_mux_machine(port, &update_slave_arr);
2581 		ad_tx_machine(port);
2582 		ad_churn_machine(port);
2583 
2584 		/* turn off the BEGIN bit, since we already handled it */
2585 		if (port->sm_vars & AD_PORT_BEGIN)
2586 			port->sm_vars &= ~AD_PORT_BEGIN;
2587 	}
2588 
2589 re_arm:
2590 	bond_for_each_slave_rcu(bond, slave, iter) {
2591 		if (slave->should_notify) {
2592 			should_notify_rtnl = BOND_SLAVE_NOTIFY_NOW;
2593 			break;
2594 		}
2595 	}
2596 	rcu_read_unlock();
2597 	spin_unlock_bh(&bond->mode_lock);
2598 
2599 	if (update_slave_arr)
2600 		bond_slave_arr_work_rearm(bond, 0);
2601 
2602 	if (should_notify_rtnl && rtnl_trylock()) {
2603 		bond_slave_state_notify(bond);
2604 		rtnl_unlock();
2605 	}
2606 	queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
2607 }
2608 
2609 /**
2610  * bond_3ad_rx_indication - handle a received frame
2611  * @lacpdu: received lacpdu
2612  * @slave: slave struct to work on
2613  *
2614  * It is assumed that frames that were sent on this NIC don't returned as new
2615  * received frames (loopback). Since only the payload is given to this
2616  * function, it check for loopback.
2617  */
bond_3ad_rx_indication(struct lacpdu * lacpdu,struct slave * slave)2618 static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave)
2619 {
2620 	struct bonding *bond = slave->bond;
2621 	int ret = RX_HANDLER_ANOTHER;
2622 	struct bond_marker *marker;
2623 	struct port *port;
2624 	atomic64_t *stat;
2625 
2626 	port = &(SLAVE_AD_INFO(slave)->port);
2627 	if (!port->slave) {
2628 		net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n",
2629 				     slave->dev->name, slave->bond->dev->name);
2630 		return ret;
2631 	}
2632 
2633 	switch (lacpdu->subtype) {
2634 	case AD_TYPE_LACPDU:
2635 		ret = RX_HANDLER_CONSUMED;
2636 		slave_dbg(slave->bond->dev, slave->dev,
2637 			  "Received LACPDU on port %d\n",
2638 			  port->actor_port_number);
2639 		/* Protect against concurrent state machines */
2640 		spin_lock(&slave->bond->mode_lock);
2641 		ad_rx_machine(lacpdu, port);
2642 		spin_unlock(&slave->bond->mode_lock);
2643 		break;
2644 	case AD_TYPE_MARKER:
2645 		ret = RX_HANDLER_CONSUMED;
2646 		/* No need to convert fields to Little Endian since we
2647 		 * don't use the marker's fields.
2648 		 */
2649 		marker = (struct bond_marker *)lacpdu;
2650 		switch (marker->tlv_type) {
2651 		case AD_MARKER_INFORMATION_SUBTYPE:
2652 			slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n",
2653 				  port->actor_port_number);
2654 			ad_marker_info_received(marker, port);
2655 			break;
2656 		case AD_MARKER_RESPONSE_SUBTYPE:
2657 			slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n",
2658 				  port->actor_port_number);
2659 			ad_marker_response_received(marker, port);
2660 			break;
2661 		default:
2662 			slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n",
2663 				  port->actor_port_number);
2664 			stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx;
2665 			atomic64_inc(stat);
2666 			stat = &BOND_AD_INFO(bond).stats.marker_unknown_rx;
2667 			atomic64_inc(stat);
2668 		}
2669 		break;
2670 	default:
2671 		atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx);
2672 		atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_unknown_rx);
2673 	}
2674 
2675 	return ret;
2676 }
2677 
2678 /**
2679  * ad_update_actor_keys - Update the oper / admin keys for a port based on
2680  * its current speed and duplex settings.
2681  *
2682  * @port: the port we'are looking at
2683  * @reset: Boolean to just reset the speed and the duplex part of the key
2684  *
2685  * The logic to change the oper / admin keys is:
2686  * (a) A full duplex port can participate in LACP with partner.
2687  * (b) When the speed is changed, LACP need to be reinitiated.
2688  */
ad_update_actor_keys(struct port * port,bool reset)2689 static void ad_update_actor_keys(struct port *port, bool reset)
2690 {
2691 	u8 duplex = 0;
2692 	u16 ospeed = 0, speed = 0;
2693 	u16 old_oper_key = port->actor_oper_port_key;
2694 
2695 	port->actor_admin_port_key &= ~(AD_SPEED_KEY_MASKS|AD_DUPLEX_KEY_MASKS);
2696 	if (!reset) {
2697 		speed = __get_link_speed(port);
2698 		ospeed = (old_oper_key & AD_SPEED_KEY_MASKS) >> 1;
2699 		duplex = __get_duplex(port);
2700 		port->actor_admin_port_key |= (speed << 1) | duplex;
2701 	}
2702 	port->actor_oper_port_key = port->actor_admin_port_key;
2703 
2704 	if (old_oper_key != port->actor_oper_port_key) {
2705 		/* Only 'duplex' port participates in LACP */
2706 		if (duplex)
2707 			port->sm_vars |= AD_PORT_LACP_ENABLED;
2708 		else
2709 			port->sm_vars &= ~AD_PORT_LACP_ENABLED;
2710 
2711 		if (!reset) {
2712 			if (!speed) {
2713 				slave_err(port->slave->bond->dev,
2714 					  port->slave->dev,
2715 					  "speed changed to 0 on port %d\n",
2716 					  port->actor_port_number);
2717 			} else if (duplex && ospeed != speed) {
2718 				/* Speed change restarts LACP state-machine */
2719 				port->sm_vars |= AD_PORT_BEGIN;
2720 			}
2721 		}
2722 	}
2723 }
2724 
2725 /**
2726  * bond_3ad_adapter_speed_duplex_changed - handle a slave's speed / duplex
2727  * change indication
2728  *
2729  * @slave: slave struct to work on
2730  *
2731  * Handle reselection of aggregator (if needed) for this port.
2732  */
bond_3ad_adapter_speed_duplex_changed(struct slave * slave)2733 void bond_3ad_adapter_speed_duplex_changed(struct slave *slave)
2734 {
2735 	struct port *port;
2736 
2737 	port = &(SLAVE_AD_INFO(slave)->port);
2738 
2739 	/* if slave is null, the whole port is not initialized */
2740 	if (!port->slave) {
2741 		slave_warn(slave->bond->dev, slave->dev,
2742 			   "speed/duplex changed for uninitialized port\n");
2743 		return;
2744 	}
2745 
2746 	spin_lock_bh(&slave->bond->mode_lock);
2747 	ad_update_actor_keys(port, false);
2748 	spin_unlock_bh(&slave->bond->mode_lock);
2749 	slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n",
2750 		  port->actor_port_number);
2751 }
2752 
2753 /**
2754  * bond_3ad_handle_link_change - handle a slave's link status change indication
2755  * @slave: slave struct to work on
2756  * @link: whether the link is now up or down
2757  *
2758  * Handle reselection of aggregator (if needed) for this port.
2759  */
bond_3ad_handle_link_change(struct slave * slave,char link)2760 void bond_3ad_handle_link_change(struct slave *slave, char link)
2761 {
2762 	struct aggregator *agg;
2763 	struct port *port;
2764 	bool dummy;
2765 
2766 	port = &(SLAVE_AD_INFO(slave)->port);
2767 
2768 	/* if slave is null, the whole port is not initialized */
2769 	if (!port->slave) {
2770 		slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n");
2771 		return;
2772 	}
2773 
2774 	spin_lock_bh(&slave->bond->mode_lock);
2775 	/* on link down we are zeroing duplex and speed since
2776 	 * some of the adaptors(ce1000.lan) report full duplex/speed
2777 	 * instead of N/A(duplex) / 0(speed).
2778 	 *
2779 	 * on link up we are forcing recheck on the duplex and speed since
2780 	 * some of he adaptors(ce1000.lan) report.
2781 	 */
2782 	if (link == BOND_LINK_UP) {
2783 		port->is_enabled = true;
2784 		ad_update_actor_keys(port, false);
2785 	} else {
2786 		/* link has failed */
2787 		port->is_enabled = false;
2788 		ad_update_actor_keys(port, true);
2789 	}
2790 	agg = __get_first_agg(port);
2791 	ad_agg_selection_logic(agg, &dummy);
2792 
2793 	spin_unlock_bh(&slave->bond->mode_lock);
2794 
2795 	slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n",
2796 		  port->actor_port_number,
2797 		  link == BOND_LINK_UP ? "UP" : "DOWN");
2798 
2799 	/* RTNL is held and mode_lock is released so it's safe
2800 	 * to update slave_array here.
2801 	 */
2802 	bond_update_slave_arr(slave->bond, NULL);
2803 }
2804 
2805 /**
2806  * bond_3ad_set_carrier - set link state for bonding master
2807  * @bond: bonding structure
2808  *
2809  * if we have an active aggregator, we're up, if not, we're down.
2810  * Presumes that we cannot have an active aggregator if there are
2811  * no slaves with link up.
2812  *
2813  * This behavior complies with IEEE 802.3 section 43.3.9.
2814  *
2815  * Called by bond_set_carrier(). Return zero if carrier state does not
2816  * change, nonzero if it does.
2817  */
bond_3ad_set_carrier(struct bonding * bond)2818 int bond_3ad_set_carrier(struct bonding *bond)
2819 {
2820 	struct aggregator *active;
2821 	struct slave *first_slave;
2822 	int ret = 1;
2823 
2824 	rcu_read_lock();
2825 	first_slave = bond_first_slave_rcu(bond);
2826 	if (!first_slave) {
2827 		ret = 0;
2828 		goto out;
2829 	}
2830 	active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator));
2831 	if (active) {
2832 		/* are enough slaves available to consider link up? */
2833 		if (__agg_active_ports(active) < bond->params.min_links) {
2834 			if (netif_carrier_ok(bond->dev)) {
2835 				netif_carrier_off(bond->dev);
2836 				goto out;
2837 			}
2838 		} else if (!netif_carrier_ok(bond->dev)) {
2839 			netif_carrier_on(bond->dev);
2840 			goto out;
2841 		}
2842 	} else if (netif_carrier_ok(bond->dev)) {
2843 		netif_carrier_off(bond->dev);
2844 	}
2845 out:
2846 	rcu_read_unlock();
2847 	return ret;
2848 }
2849 
2850 /**
2851  * __bond_3ad_get_active_agg_info - get information of the active aggregator
2852  * @bond: bonding struct to work on
2853  * @ad_info: ad_info struct to fill with the bond's info
2854  *
2855  * Returns:   0 on success
2856  *          < 0 on error
2857  */
__bond_3ad_get_active_agg_info(struct bonding * bond,struct ad_info * ad_info)2858 int __bond_3ad_get_active_agg_info(struct bonding *bond,
2859 				   struct ad_info *ad_info)
2860 {
2861 	struct aggregator *aggregator = NULL, *tmp;
2862 	struct list_head *iter;
2863 	struct slave *slave;
2864 	struct port *port;
2865 
2866 	bond_for_each_slave_rcu(bond, slave, iter) {
2867 		port = &(SLAVE_AD_INFO(slave)->port);
2868 		tmp = rcu_dereference(port->aggregator);
2869 		if (tmp && tmp->is_active) {
2870 			aggregator = tmp;
2871 			break;
2872 		}
2873 	}
2874 
2875 	if (!aggregator)
2876 		return -1;
2877 
2878 	ad_info->aggregator_id = aggregator->aggregator_identifier;
2879 	ad_info->ports = __agg_active_ports(aggregator);
2880 	ad_info->actor_key = aggregator->actor_oper_aggregator_key;
2881 	ad_info->partner_key = aggregator->partner_oper_aggregator_key;
2882 	ether_addr_copy(ad_info->partner_system,
2883 			aggregator->partner_system.mac_addr_value);
2884 	return 0;
2885 }
2886 
bond_3ad_get_active_agg_info(struct bonding * bond,struct ad_info * ad_info)2887 int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
2888 {
2889 	int ret;
2890 
2891 	rcu_read_lock();
2892 	ret = __bond_3ad_get_active_agg_info(bond, ad_info);
2893 	rcu_read_unlock();
2894 
2895 	return ret;
2896 }
2897 
bond_3ad_lacpdu_recv(const struct sk_buff * skb,struct bonding * bond,struct slave * slave)2898 int bond_3ad_lacpdu_recv(const struct sk_buff *skb, struct bonding *bond,
2899 			 struct slave *slave)
2900 {
2901 	struct lacpdu *lacpdu, _lacpdu;
2902 
2903 	if (skb->protocol != PKT_TYPE_LACPDU)
2904 		return RX_HANDLER_ANOTHER;
2905 
2906 	if (!MAC_ADDRESS_EQUAL(eth_hdr(skb)->h_dest, lacpdu_mcast_addr))
2907 		return RX_HANDLER_ANOTHER;
2908 
2909 	lacpdu = skb_header_pointer(skb, 0, sizeof(_lacpdu), &_lacpdu);
2910 	if (!lacpdu) {
2911 		atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx);
2912 		atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_illegal_rx);
2913 		return RX_HANDLER_ANOTHER;
2914 	}
2915 
2916 	return bond_3ad_rx_indication(lacpdu, slave);
2917 }
2918 
2919 /**
2920  * bond_3ad_update_lacp_rate - change the lacp rate
2921  * @bond: bonding struct
2922  *
2923  * When modify lacp_rate parameter via sysfs,
2924  * update actor_oper_port_state of each port.
2925  *
2926  * Hold bond->mode_lock,
2927  * so we can modify port->actor_oper_port_state,
2928  * no matter bond is up or down.
2929  */
bond_3ad_update_lacp_rate(struct bonding * bond)2930 void bond_3ad_update_lacp_rate(struct bonding *bond)
2931 {
2932 	struct port *port = NULL;
2933 	struct list_head *iter;
2934 	struct slave *slave;
2935 	int lacp_fast;
2936 
2937 	lacp_fast = bond->params.lacp_fast;
2938 	spin_lock_bh(&bond->mode_lock);
2939 	bond_for_each_slave(bond, slave, iter) {
2940 		port = &(SLAVE_AD_INFO(slave)->port);
2941 		if (lacp_fast)
2942 			port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
2943 		else
2944 			port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT;
2945 	}
2946 	spin_unlock_bh(&bond->mode_lock);
2947 }
2948 
2949 /**
2950  * bond_3ad_update_lacp_active - change the lacp active
2951  * @bond: bonding struct
2952  *
2953  * Update actor_oper_port_state when lacp_active is modified.
2954  */
bond_3ad_update_lacp_active(struct bonding * bond)2955 void bond_3ad_update_lacp_active(struct bonding *bond)
2956 {
2957 	struct port *port = NULL;
2958 	struct list_head *iter;
2959 	struct slave *slave;
2960 	int lacp_active;
2961 
2962 	lacp_active = bond->params.lacp_active;
2963 	spin_lock_bh(&bond->mode_lock);
2964 	bond_for_each_slave(bond, slave, iter) {
2965 		port = &(SLAVE_AD_INFO(slave)->port);
2966 		if (lacp_active)
2967 			port->actor_oper_port_state |= LACP_STATE_LACP_ACTIVITY;
2968 		else
2969 			port->actor_oper_port_state &= ~LACP_STATE_LACP_ACTIVITY;
2970 	}
2971 	spin_unlock_bh(&bond->mode_lock);
2972 }
2973 
bond_3ad_stats_size(void)2974 size_t bond_3ad_stats_size(void)
2975 {
2976 	return nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_RX */
2977 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_TX */
2978 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_UNKNOWN_RX */
2979 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_ILLEGAL_RX */
2980 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RX */
2981 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_TX */
2982 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_RX */
2983 	       nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_TX */
2984 	       nla_total_size_64bit(sizeof(u64)); /* BOND_3AD_STAT_MARKER_UNKNOWN_RX */
2985 }
2986 
bond_3ad_stats_fill(struct sk_buff * skb,struct bond_3ad_stats * stats)2987 int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats)
2988 {
2989 	u64 val;
2990 
2991 	val = atomic64_read(&stats->lacpdu_rx);
2992 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_RX, val,
2993 			      BOND_3AD_STAT_PAD))
2994 		return -EMSGSIZE;
2995 	val = atomic64_read(&stats->lacpdu_tx);
2996 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_TX, val,
2997 			      BOND_3AD_STAT_PAD))
2998 		return -EMSGSIZE;
2999 	val = atomic64_read(&stats->lacpdu_unknown_rx);
3000 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_UNKNOWN_RX, val,
3001 			      BOND_3AD_STAT_PAD))
3002 		return -EMSGSIZE;
3003 	val = atomic64_read(&stats->lacpdu_illegal_rx);
3004 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_ILLEGAL_RX, val,
3005 			      BOND_3AD_STAT_PAD))
3006 		return -EMSGSIZE;
3007 
3008 	val = atomic64_read(&stats->marker_rx);
3009 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RX, val,
3010 			      BOND_3AD_STAT_PAD))
3011 		return -EMSGSIZE;
3012 	val = atomic64_read(&stats->marker_tx);
3013 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_TX, val,
3014 			      BOND_3AD_STAT_PAD))
3015 		return -EMSGSIZE;
3016 	val = atomic64_read(&stats->marker_resp_rx);
3017 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_RX, val,
3018 			      BOND_3AD_STAT_PAD))
3019 		return -EMSGSIZE;
3020 	val = atomic64_read(&stats->marker_resp_tx);
3021 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_TX, val,
3022 			      BOND_3AD_STAT_PAD))
3023 		return -EMSGSIZE;
3024 	val = atomic64_read(&stats->marker_unknown_rx);
3025 	if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_UNKNOWN_RX, val,
3026 			      BOND_3AD_STAT_PAD))
3027 		return -EMSGSIZE;
3028 
3029 	return 0;
3030 }
3031