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