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