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