8baa87df173841ea90e07895dbb0620d4abb0a8d
[deliverable/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 }
This page took 0.082452 seconds and 4 git commands to generate.