1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 "bonding.h"
33#include "bond_3ad.h"
34
35
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
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
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
61#define AD_PORT_BEGIN 0x1
62#define AD_PORT_LACP_ENABLED 0x2
63#define AD_PORT_ACTOR_CHURN 0x4
64#define AD_PORT_PARTNER_CHURN 0x8
65#define AD_PORT_READY 0x10
66#define AD_PORT_READY_N 0x20
67#define AD_PORT_MATCHED 0x40
68#define AD_PORT_STANDBY 0x80
69#define AD_PORT_SELECTED 0x100
70#define AD_PORT_MOVED 0x200
71
72
73
74
75
76
77
78
79#define AD_DUPLEX_KEY_BITS 0x1
80#define AD_SPEED_KEY_BITS 0x3E
81#define AD_USER_KEY_BITS 0xFFC0
82
83
84#define AD_LINK_SPEED_BITMASK_1MBPS 0x1
85#define AD_LINK_SPEED_BITMASK_10MBPS 0x2
86#define AD_LINK_SPEED_BITMASK_100MBPS 0x4
87#define AD_LINK_SPEED_BITMASK_1000MBPS 0x8
88#define AD_LINK_SPEED_BITMASK_10000MBPS 0x10
89
90
91
92#define MAC_ADDRESS_COMPARE(A, B) memcmp(A, B, ETH_ALEN)
93
94static struct mac_addr null_mac_addr = {{0, 0, 0, 0, 0, 0}};
95static u16 ad_ticks_per_sec;
96static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
97
98static const u8 lacpdu_mcast_addr[ETH_ALEN] = MULTICAST_LACPDU_ADDR;
99
100
101static int ad_lacpdu_send(struct port *port);
102static int ad_marker_send(struct port *port, struct bond_marker *marker);
103static void ad_mux_machine(struct port *port);
104static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port);
105static void ad_tx_machine(struct port *port);
106static void ad_periodic_machine(struct port *port);
107static void ad_port_selection_logic(struct port *port);
108static void ad_agg_selection_logic(struct aggregator *aggregator);
109static void ad_clear_agg(struct aggregator *aggregator);
110static void ad_initialize_agg(struct aggregator *aggregator);
111static void ad_initialize_port(struct port *port, int lacp_fast);
112static void ad_enable_collecting_distributing(struct port *port);
113static void ad_disable_collecting_distributing(struct port *port);
114static void ad_marker_info_received(struct bond_marker *marker_info, struct port *port);
115static void ad_marker_response_received(struct bond_marker *marker, struct port *port);
116
117
118
119
120
121
122
123
124
125
126
127
128static inline struct bonding *__get_bond_by_port(struct port *port)
129{
130 if (port->slave == NULL) {
131 return NULL;
132 }
133
134 return bond_get_bond_by_slave(port->slave);
135}
136
137
138
139
140
141
142
143static inline struct port *__get_first_port(struct bonding *bond)
144{
145 if (bond->slave_cnt == 0) {
146 return NULL;
147 }
148
149 return &(SLAVE_AD_INFO(bond->first_slave).port);
150}
151
152
153
154
155
156
157
158
159static inline struct port *__get_next_port(struct port *port)
160{
161 struct bonding *bond = __get_bond_by_port(port);
162 struct slave *slave = port->slave;
163
164
165 if ((bond == NULL) || (slave->next == bond->first_slave)) {
166 return NULL;
167 }
168
169 return &(SLAVE_AD_INFO(slave->next).port);
170}
171
172
173
174
175
176
177
178
179static inline struct aggregator *__get_first_agg(struct port *port)
180{
181 struct bonding *bond = __get_bond_by_port(port);
182
183
184 if ((bond == NULL) || (bond->slave_cnt == 0)) {
185 return NULL;
186 }
187
188 return &(SLAVE_AD_INFO(bond->first_slave).aggregator);
189}
190
191
192
193
194
195
196
197
198static inline struct aggregator *__get_next_agg(struct aggregator *aggregator)
199{
200 struct slave *slave = aggregator->slave;
201 struct bonding *bond = bond_get_bond_by_slave(slave);
202
203
204 if ((bond == NULL) || (slave->next == bond->first_slave)) {
205 return NULL;
206 }
207
208 return &(SLAVE_AD_INFO(slave->next).aggregator);
209}
210
211
212
213
214
215
216
217static inline int __agg_has_partner(struct aggregator *agg)
218{
219 return !is_zero_ether_addr(agg->partner_system.mac_addr_value);
220}
221
222
223
224
225
226
227static inline void __disable_port(struct port *port)
228{
229 bond_set_slave_inactive_flags(port->slave);
230}
231
232
233
234
235
236
237static inline void __enable_port(struct port *port)
238{
239 struct slave *slave = port->slave;
240
241 if ((slave->link == BOND_LINK_UP) && IS_UP(slave->dev)) {
242 bond_set_slave_active_flags(slave);
243 }
244}
245
246
247
248
249
250
251static inline int __port_is_enabled(struct port *port)
252{
253 return(port->slave->state == BOND_STATE_ACTIVE);
254}
255
256
257
258
259
260
261
262static inline u32 __get_agg_selection_mode(struct port *port)
263{
264 struct bonding *bond = __get_bond_by_port(port);
265
266 if (bond == NULL) {
267 return BOND_AD_STABLE;
268 }
269
270 return BOND_AD_INFO(bond).agg_select_mode;
271}
272
273
274
275
276
277
278static inline int __check_agg_selection_timer(struct port *port)
279{
280 struct bonding *bond = __get_bond_by_port(port);
281
282 if (bond == NULL) {
283 return 0;
284 }
285
286 return BOND_AD_INFO(bond).agg_select_timer ? 1 : 0;
287}
288
289
290
291
292
293
294static inline void __get_rx_machine_lock(struct port *port)
295{
296 spin_lock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
297}
298
299
300
301
302
303
304static inline void __release_rx_machine_lock(struct port *port)
305{
306 spin_unlock_bh(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
307}
308
309
310
311
312
313
314
315
316
317
318
319
320static u16 __get_link_speed(struct port *port)
321{
322 struct slave *slave = port->slave;
323 u16 speed;
324
325
326
327
328
329 if (slave->link != BOND_LINK_UP) {
330 speed=0;
331 } else {
332 switch (slave->speed) {
333 case SPEED_10:
334 speed = AD_LINK_SPEED_BITMASK_10MBPS;
335 break;
336
337 case SPEED_100:
338 speed = AD_LINK_SPEED_BITMASK_100MBPS;
339 break;
340
341 case SPEED_1000:
342 speed = AD_LINK_SPEED_BITMASK_1000MBPS;
343 break;
344
345 case SPEED_10000:
346 speed = AD_LINK_SPEED_BITMASK_10000MBPS;
347 break;
348
349 default:
350 speed = 0;
351 break;
352 }
353 }
354
355 pr_debug("Port %d Received link speed %d update from adapter\n", port->actor_port_number, speed);
356 return speed;
357}
358
359
360
361
362
363
364
365
366
367static u8 __get_duplex(struct port *port)
368{
369 struct slave *slave = port->slave;
370
371 u8 retval;
372
373
374
375 if (slave->link != BOND_LINK_UP) {
376 retval=0x0;
377 } else {
378 switch (slave->duplex) {
379 case DUPLEX_FULL:
380 retval=0x1;
381 pr_debug("Port %d Received status full duplex update from adapter\n", port->actor_port_number);
382 break;
383 case DUPLEX_HALF:
384 default:
385 retval=0x0;
386 pr_debug("Port %d Received status NOT full duplex update from adapter\n", port->actor_port_number);
387 break;
388 }
389 }
390 return retval;
391}
392
393
394
395
396
397
398static inline void __initialize_port_locks(struct port *port)
399{
400
401 spin_lock_init(&(SLAVE_AD_INFO(port->slave).rx_machine_lock));
402}
403
404
405
406
407
408
409
410
411
412
413
414
415static u16 __ad_timer_to_ticks(u16 timer_type, u16 par)
416{
417 u16 retval=0;
418
419 switch (timer_type) {
420 case AD_CURRENT_WHILE_TIMER:
421 if (par) {
422 retval = (AD_SHORT_TIMEOUT_TIME*ad_ticks_per_sec);
423 } else {
424 retval = (AD_LONG_TIMEOUT_TIME*ad_ticks_per_sec);
425 }
426 break;
427 case AD_ACTOR_CHURN_TIMER:
428 retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
429 break;
430 case AD_PERIODIC_TIMER:
431 retval = (par*ad_ticks_per_sec);
432 break;
433 case AD_PARTNER_CHURN_TIMER:
434 retval = (AD_CHURN_DETECTION_TIME*ad_ticks_per_sec);
435 break;
436 case AD_WAIT_WHILE_TIMER:
437 retval = (AD_AGGREGATE_WAIT_TIME*ad_ticks_per_sec);
438 break;
439 }
440 return retval;
441}
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457static void __record_pdu(struct lacpdu *lacpdu, struct port *port)
458{
459 if (lacpdu && port) {
460 struct port_params *partner = &port->partner_oper;
461
462
463 partner->port_number = ntohs(lacpdu->actor_port);
464 partner->port_priority = ntohs(lacpdu->actor_port_priority);
465 partner->system = lacpdu->actor_system;
466 partner->system_priority = ntohs(lacpdu->actor_system_priority);
467 partner->key = ntohs(lacpdu->actor_key);
468 partner->port_state = lacpdu->actor_state;
469
470
471 port->actor_oper_port_state &= ~AD_STATE_DEFAULTED;
472
473
474 if ((port->sm_vars & AD_PORT_MATCHED) && (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) {
475 partner->port_state |= AD_STATE_SYNCHRONIZATION;
476 } else {
477 partner->port_state &= ~AD_STATE_SYNCHRONIZATION;
478 }
479 }
480}
481
482
483
484
485
486
487
488
489
490static void __record_default(struct port *port)
491{
492 if (port) {
493
494 memcpy(&port->partner_oper, &port->partner_admin,
495 sizeof(struct port_params));
496
497
498 port->actor_oper_port_state |= AD_STATE_DEFAULTED;
499 }
500}
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515static void __update_selected(struct lacpdu *lacpdu, struct port *port)
516{
517 if (lacpdu && port) {
518 const struct port_params *partner = &port->partner_oper;
519
520
521 if (ntohs(lacpdu->actor_port) != partner->port_number
522 || ntohs(lacpdu->actor_port_priority) != partner->port_priority
523 || MAC_ADDRESS_COMPARE(&lacpdu->actor_system, &partner->system)
524 || ntohs(lacpdu->actor_system_priority) != partner->system_priority
525 || ntohs(lacpdu->actor_key) != partner->key
526 || (lacpdu->actor_state & AD_STATE_AGGREGATION) != (partner->port_state & AD_STATE_AGGREGATION)) {
527
528 port->sm_vars &= ~AD_PORT_SELECTED;
529 }
530 }
531}
532
533
534
535
536
537
538
539
540
541
542
543
544
545static void __update_default_selected(struct port *port)
546{
547 if (port) {
548 const struct port_params *admin = &port->partner_admin;
549 const struct port_params *oper = &port->partner_oper;
550
551
552 if (admin->port_number != oper->port_number
553 || admin->port_priority != oper->port_priority
554 || MAC_ADDRESS_COMPARE(&admin->system, &oper->system)
555 || admin->system_priority != oper->system_priority
556 || admin->key != oper->key
557 || (admin->port_state & AD_STATE_AGGREGATION)
558 != (oper->port_state & AD_STATE_AGGREGATION)) {
559
560 port->sm_vars &= ~AD_PORT_SELECTED;
561 }
562 }
563}
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584static void __choose_matched(struct lacpdu *lacpdu, struct port *port)
585{
586
587 if (lacpdu && port) {
588
589 if (((ntohs(lacpdu->partner_port) == port->actor_port_number) &&
590 (ntohs(lacpdu->partner_port_priority) == port->actor_port_priority) &&
591 !MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) &&
592 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
593 (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) &&
594 ((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGATION))) ||
595
596 ((lacpdu->actor_state & AD_STATE_AGGREGATION) == 0)
597 ) {
598
599 port->sm_vars |= AD_PORT_MATCHED;
600 } else {
601 port->sm_vars &= ~AD_PORT_MATCHED;
602 }
603 }
604}
605
606
607
608
609
610
611
612
613
614
615
616
617
618static void __update_ntt(struct lacpdu *lacpdu, struct port *port)
619{
620
621 if (lacpdu && port) {
622
623 if ((ntohs(lacpdu->partner_port) != port->actor_port_number) ||
624 (ntohs(lacpdu->partner_port_priority) != port->actor_port_priority) ||
625 MAC_ADDRESS_COMPARE(&(lacpdu->partner_system), &(port->actor_system)) ||
626 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
627 (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) ||
628 ((lacpdu->partner_state & AD_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY)) ||
629 ((lacpdu->partner_state & AD_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT)) ||
630 ((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) ||
631 ((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGATION))
632 ) {
633
634 port->ntt = true;
635 }
636 }
637}
638
639
640
641
642
643
644
645
646
647static void __attach_bond_to_agg(struct port *port)
648{
649 port=NULL;
650
651
652}
653
654
655
656
657
658
659
660
661
662static void __detach_bond_from_agg(struct port *port)
663{
664 port=NULL;
665
666
667}
668
669
670
671
672
673
674static int __agg_ports_are_ready(struct aggregator *aggregator)
675{
676 struct port *port;
677 int retval = 1;
678
679 if (aggregator) {
680
681 for (port=aggregator->lag_ports; port; port=port->next_port_in_aggregator) {
682 if (!(port->sm_vars & AD_PORT_READY_N)) {
683 retval = 0;
684 break;
685 }
686 }
687 }
688
689 return retval;
690}
691
692
693
694
695
696
697
698static void __set_agg_ports_ready(struct aggregator *aggregator, int val)
699{
700 struct port *port;
701
702 for (port=aggregator->lag_ports; port; port=port->next_port_in_aggregator) {
703 if (val) {
704 port->sm_vars |= AD_PORT_READY;
705 } else {
706 port->sm_vars &= ~AD_PORT_READY;
707 }
708 }
709}
710
711
712
713
714
715
716static u32 __get_agg_bandwidth(struct aggregator *aggregator)
717{
718 u32 bandwidth=0;
719 u32 basic_speed;
720
721 if (aggregator->num_of_ports) {
722 basic_speed = __get_link_speed(aggregator->lag_ports);
723 switch (basic_speed) {
724 case AD_LINK_SPEED_BITMASK_1MBPS:
725 bandwidth = aggregator->num_of_ports;
726 break;
727 case AD_LINK_SPEED_BITMASK_10MBPS:
728 bandwidth = aggregator->num_of_ports * 10;
729 break;
730 case AD_LINK_SPEED_BITMASK_100MBPS:
731 bandwidth = aggregator->num_of_ports * 100;
732 break;
733 case AD_LINK_SPEED_BITMASK_1000MBPS:
734 bandwidth = aggregator->num_of_ports * 1000;
735 break;
736 case AD_LINK_SPEED_BITMASK_10000MBPS:
737 bandwidth = aggregator->num_of_ports * 10000;
738 break;
739 default:
740 bandwidth=0;
741 }
742 }
743 return bandwidth;
744}
745
746
747
748
749
750
751static struct aggregator *__get_active_agg(struct aggregator *aggregator)
752{
753 struct aggregator *retval = NULL;
754
755 for (; aggregator; aggregator = __get_next_agg(aggregator)) {
756 if (aggregator->is_active) {
757 retval = aggregator;
758 break;
759 }
760 }
761
762 return retval;
763}
764
765
766
767
768
769
770static inline void __update_lacpdu_from_port(struct port *port)
771{
772 struct lacpdu *lacpdu = &port->lacpdu;
773 const struct port_params *partner = &port->partner_oper;
774
775
776
777
778
779
780
781
782 lacpdu->actor_system_priority = htons(port->actor_system_priority);
783 lacpdu->actor_system = port->actor_system;
784 lacpdu->actor_key = htons(port->actor_oper_port_key);
785 lacpdu->actor_port_priority = htons(port->actor_port_priority);
786 lacpdu->actor_port = htons(port->actor_port_number);
787 lacpdu->actor_state = port->actor_oper_port_state;
788
789
790
791
792
793
794 lacpdu->partner_system_priority = htons(partner->system_priority);
795 lacpdu->partner_system = partner->system;
796 lacpdu->partner_key = htons(partner->key);
797 lacpdu->partner_port_priority = htons(partner->port_priority);
798 lacpdu->partner_port = htons(partner->port_number);
799 lacpdu->partner_state = partner->port_state;
800
801
802
803
804
805
806
807
808
809
810}
811
812
813
814
815
816
817
818
819
820
821
822
823static int ad_lacpdu_send(struct port *port)
824{
825 struct slave *slave = port->slave;
826 struct sk_buff *skb;
827 struct lacpdu_header *lacpdu_header;
828 int length = sizeof(struct lacpdu_header);
829
830 skb = dev_alloc_skb(length);
831 if (!skb) {
832 return -ENOMEM;
833 }
834
835 skb->dev = slave->dev;
836 skb_reset_mac_header(skb);
837 skb->network_header = skb->mac_header + ETH_HLEN;
838 skb->protocol = PKT_TYPE_LACPDU;
839 skb->priority = TC_PRIO_CONTROL;
840
841 lacpdu_header = (struct lacpdu_header *)skb_put(skb, length);
842
843 memcpy(lacpdu_header->hdr.h_dest, lacpdu_mcast_addr, ETH_ALEN);
844
845
846 memcpy(lacpdu_header->hdr.h_source, slave->perm_hwaddr, ETH_ALEN);
847 lacpdu_header->hdr.h_proto = PKT_TYPE_LACPDU;
848
849 lacpdu_header->lacpdu = port->lacpdu;
850
851 dev_queue_xmit(skb);
852
853 return 0;
854}
855
856
857
858
859
860
861
862
863
864static int ad_marker_send(struct port *port, struct bond_marker *marker)
865{
866 struct slave *slave = port->slave;
867 struct sk_buff *skb;
868 struct bond_marker_header *marker_header;
869 int length = sizeof(struct bond_marker_header);
870
871 skb = dev_alloc_skb(length + 16);
872 if (!skb) {
873 return -ENOMEM;
874 }
875
876 skb_reserve(skb, 16);
877
878 skb->dev = slave->dev;
879 skb_reset_mac_header(skb);
880 skb->network_header = skb->mac_header + ETH_HLEN;
881 skb->protocol = PKT_TYPE_LACPDU;
882
883 marker_header = (struct bond_marker_header *)skb_put(skb, length);
884
885 memcpy(marker_header->hdr.h_dest, lacpdu_mcast_addr, ETH_ALEN);
886
887
888 memcpy(marker_header->hdr.h_source, slave->perm_hwaddr, ETH_ALEN);
889 marker_header->hdr.h_proto = PKT_TYPE_LACPDU;
890
891 marker_header->marker = *marker;
892
893 dev_queue_xmit(skb);
894
895 return 0;
896}
897
898
899
900
901
902
903static void ad_mux_machine(struct port *port)
904{
905 mux_states_t last_state;
906
907
908 last_state = port->sm_mux_state;
909
910 if (port->sm_vars & AD_PORT_BEGIN) {
911 port->sm_mux_state = AD_MUX_DETACHED;
912 } else {
913 switch (port->sm_mux_state) {
914 case AD_MUX_DETACHED:
915 if ((port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) {
916 port->sm_mux_state = AD_MUX_WAITING;
917 }
918 break;
919 case AD_MUX_WAITING:
920
921 if (!(port->sm_vars & AD_PORT_SELECTED)) {
922 port->sm_vars &= ~AD_PORT_READY_N;
923
924
925 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
926 port->sm_mux_state = AD_MUX_DETACHED;
927 break;
928 }
929
930
931 if (port->sm_mux_timer_counter && !(--port->sm_mux_timer_counter)) {
932 port->sm_vars |= AD_PORT_READY_N;
933 }
934
935
936
937 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
938
939
940 if ((port->sm_vars & AD_PORT_READY) && !port->sm_mux_timer_counter) {
941 port->sm_mux_state = AD_MUX_ATTACHED;
942 }
943 break;
944 case AD_MUX_ATTACHED:
945
946 if ((port->sm_vars & AD_PORT_SELECTED) && (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && !__check_agg_selection_timer(port)) {
947 port->sm_mux_state = AD_MUX_COLLECTING_DISTRIBUTING;
948 } else if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY)) {
949 port->sm_vars &= ~AD_PORT_READY_N;
950
951
952 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
953 port->sm_mux_state = AD_MUX_DETACHED;
954 }
955 break;
956 case AD_MUX_COLLECTING_DISTRIBUTING:
957 if (!(port->sm_vars & AD_PORT_SELECTED) || (port->sm_vars & AD_PORT_STANDBY) ||
958 !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION)
959 ) {
960 port->sm_mux_state = AD_MUX_ATTACHED;
961
962 } else {
963
964
965
966 if (port->aggregator &&
967 port->aggregator->is_active &&
968 !__port_is_enabled(port)) {
969
970 __enable_port(port);
971 }
972 }
973 break;
974 default:
975 break;
976 }
977 }
978
979
980 if (port->sm_mux_state != last_state) {
981 pr_debug("Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_mux_state);
982 switch (port->sm_mux_state) {
983 case AD_MUX_DETACHED:
984 __detach_bond_from_agg(port);
985 port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
986 ad_disable_collecting_distributing(port);
987 port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
988 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
989 port->ntt = true;
990 break;
991 case AD_MUX_WAITING:
992 port->sm_mux_timer_counter = __ad_timer_to_ticks(AD_WAIT_WHILE_TIMER, 0);
993 break;
994 case AD_MUX_ATTACHED:
995 __attach_bond_to_agg(port);
996 port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION;
997 port->actor_oper_port_state &= ~AD_STATE_COLLECTING;
998 port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING;
999 ad_disable_collecting_distributing(port);
1000 port->ntt = true;
1001 break;
1002 case AD_MUX_COLLECTING_DISTRIBUTING:
1003 port->actor_oper_port_state |= AD_STATE_COLLECTING;
1004 port->actor_oper_port_state |= AD_STATE_DISTRIBUTING;
1005 ad_enable_collecting_distributing(port);
1006 port->ntt = true;
1007 break;
1008 default:
1009 break;
1010 }
1011 }
1012}
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023static void ad_rx_machine(struct lacpdu *lacpdu, struct port *port)
1024{
1025 rx_states_t last_state;
1026
1027
1028 __get_rx_machine_lock(port);
1029
1030
1031 last_state = port->sm_rx_state;
1032
1033
1034
1035 if (port->sm_vars & AD_PORT_BEGIN) {
1036 port->sm_rx_state = AD_RX_INITIALIZE;
1037 }
1038
1039 else if (!(port->sm_vars & AD_PORT_BEGIN) && !port->is_enabled && !(port->sm_vars & AD_PORT_MOVED)) {
1040 port->sm_rx_state = AD_RX_PORT_DISABLED;
1041 }
1042
1043 else if (lacpdu && ((port->sm_rx_state == AD_RX_EXPIRED) || (port->sm_rx_state == AD_RX_DEFAULTED) || (port->sm_rx_state == AD_RX_CURRENT))) {
1044 port->sm_rx_timer_counter = 0;
1045 port->sm_rx_state = AD_RX_CURRENT;
1046 } else {
1047
1048 if (port->sm_rx_timer_counter && !(--port->sm_rx_timer_counter)) {
1049 switch (port->sm_rx_state) {
1050 case AD_RX_EXPIRED:
1051 port->sm_rx_state = AD_RX_DEFAULTED;
1052 break;
1053 case AD_RX_CURRENT:
1054 port->sm_rx_state = AD_RX_EXPIRED;
1055 break;
1056 default:
1057 break;
1058 }
1059 } else {
1060
1061 switch (port->sm_rx_state) {
1062 case AD_RX_PORT_DISABLED:
1063 if (port->sm_vars & AD_PORT_MOVED) {
1064 port->sm_rx_state = AD_RX_INITIALIZE;
1065 } else if (port->is_enabled && (port->sm_vars & AD_PORT_LACP_ENABLED)) {
1066 port->sm_rx_state = AD_RX_EXPIRED;
1067 } else if (port->is_enabled && ((port->sm_vars & AD_PORT_LACP_ENABLED) == 0)) {
1068 port->sm_rx_state = AD_RX_LACP_DISABLED;
1069 }
1070 break;
1071 default:
1072 break;
1073
1074 }
1075 }
1076 }
1077
1078
1079 if ((port->sm_rx_state != last_state) || (lacpdu)) {
1080 pr_debug("Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_rx_state);
1081 switch (port->sm_rx_state) {
1082 case AD_RX_INITIALIZE:
1083 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) {
1084 port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1085 } else {
1086 port->sm_vars |= AD_PORT_LACP_ENABLED;
1087 }
1088 port->sm_vars &= ~AD_PORT_SELECTED;
1089 __record_default(port);
1090 port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1091 port->sm_vars &= ~AD_PORT_MOVED;
1092 port->sm_rx_state = AD_RX_PORT_DISABLED;
1093
1094
1095
1096 case AD_RX_PORT_DISABLED:
1097 port->sm_vars &= ~AD_PORT_MATCHED;
1098 break;
1099 case AD_RX_LACP_DISABLED:
1100 port->sm_vars &= ~AD_PORT_SELECTED;
1101 __record_default(port);
1102 port->partner_oper.port_state &= ~AD_STATE_AGGREGATION;
1103 port->sm_vars |= AD_PORT_MATCHED;
1104 port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1105 break;
1106 case AD_RX_EXPIRED:
1107
1108
1109
1110 port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION;
1111 port->sm_vars &= ~AD_PORT_MATCHED;
1112 port->partner_oper.port_state |=
1113 AD_STATE_LACP_ACTIVITY;
1114 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT));
1115 port->actor_oper_port_state |= AD_STATE_EXPIRED;
1116 break;
1117 case AD_RX_DEFAULTED:
1118 __update_default_selected(port);
1119 __record_default(port);
1120 port->sm_vars |= AD_PORT_MATCHED;
1121 port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1122 break;
1123 case AD_RX_CURRENT:
1124
1125 if (!MAC_ADDRESS_COMPARE(&(lacpdu->actor_system), &(port->actor_system))) {
1126
1127 pr_err(DRV_NAME ": %s: An illegal loopback occurred on "
1128 "adapter (%s). Check the configuration to verify that all "
1129 "Adapters are connected to 802.3ad compliant switch ports\n",
1130 port->slave->dev->master->name, port->slave->dev->name);
1131 __release_rx_machine_lock(port);
1132 return;
1133 }
1134 __update_selected(lacpdu, port);
1135 __update_ntt(lacpdu, port);
1136 __record_pdu(lacpdu, port);
1137 __choose_matched(lacpdu, port);
1138 port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT));
1139 port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1140
1141
1142
1143 if (port->aggregator && port->aggregator->is_active && !__port_is_enabled(port)) {
1144 __enable_port(port);
1145 }
1146 break;
1147 default:
1148 break;
1149 }
1150 }
1151 __release_rx_machine_lock(port);
1152}
1153
1154
1155
1156
1157
1158
1159static void ad_tx_machine(struct port *port)
1160{
1161
1162 if (port->sm_tx_timer_counter && !(--port->sm_tx_timer_counter)) {
1163
1164 if (port->ntt && (port->sm_vars & AD_PORT_LACP_ENABLED)) {
1165 __update_lacpdu_from_port(port);
1166
1167 if (ad_lacpdu_send(port) >= 0) {
1168 pr_debug("Sent LACPDU on port %d\n", port->actor_port_number);
1169
1170
1171
1172 port->ntt = false;
1173 }
1174 }
1175
1176 port->sm_tx_timer_counter=ad_ticks_per_sec/AD_MAX_TX_IN_SECOND;
1177 }
1178}
1179
1180
1181
1182
1183
1184
1185
1186static void ad_periodic_machine(struct port *port)
1187{
1188 periodic_states_t last_state;
1189
1190
1191 last_state = port->sm_periodic_state;
1192
1193
1194 if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) ||
1195 (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_STATE_LACP_ACTIVITY))
1196 ) {
1197 port->sm_periodic_state = AD_NO_PERIODIC;
1198 }
1199
1200 else if (port->sm_periodic_timer_counter) {
1201
1202 if (!(--port->sm_periodic_timer_counter)) {
1203
1204 port->sm_periodic_state = AD_PERIODIC_TX;
1205 } else {
1206
1207 switch (port->sm_periodic_state) {
1208 case AD_FAST_PERIODIC:
1209 if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1210 port->sm_periodic_state = AD_SLOW_PERIODIC;
1211 }
1212 break;
1213 case AD_SLOW_PERIODIC:
1214 if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1215
1216 port->sm_periodic_timer_counter = 0;
1217 port->sm_periodic_state = AD_PERIODIC_TX;
1218 }
1219 break;
1220 default:
1221 break;
1222 }
1223 }
1224 } else {
1225 switch (port->sm_periodic_state) {
1226 case AD_NO_PERIODIC:
1227 port->sm_periodic_state = AD_FAST_PERIODIC;
1228 break;
1229 case AD_PERIODIC_TX:
1230 if (!(port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) {
1231 port->sm_periodic_state = AD_SLOW_PERIODIC;
1232 } else {
1233 port->sm_periodic_state = AD_FAST_PERIODIC;
1234 }
1235 break;
1236 default:
1237 break;
1238 }
1239 }
1240
1241
1242 if (port->sm_periodic_state != last_state) {
1243 pr_debug("Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", port->actor_port_number, last_state, port->sm_periodic_state);
1244 switch (port->sm_periodic_state) {
1245 case AD_NO_PERIODIC:
1246 port->sm_periodic_timer_counter = 0;
1247 break;
1248 case AD_FAST_PERIODIC:
1249 port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_FAST_PERIODIC_TIME))-1;
1250 break;
1251 case AD_SLOW_PERIODIC:
1252 port->sm_periodic_timer_counter = __ad_timer_to_ticks(AD_PERIODIC_TIMER, (u16)(AD_SLOW_PERIODIC_TIME))-1;
1253 break;
1254 case AD_PERIODIC_TX:
1255 port->ntt = true;
1256 break;
1257 default:
1258 break;
1259 }
1260 }
1261}
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271static void ad_port_selection_logic(struct port *port)
1272{
1273 struct aggregator *aggregator, *free_aggregator = NULL, *temp_aggregator;
1274 struct port *last_port = NULL, *curr_port;
1275 int found = 0;
1276
1277
1278 if (port->sm_vars & AD_PORT_SELECTED) {
1279 return;
1280 }
1281
1282
1283 if (port->aggregator) {
1284
1285 temp_aggregator=port->aggregator;
1286 for (curr_port=temp_aggregator->lag_ports; curr_port; last_port=curr_port, curr_port=curr_port->next_port_in_aggregator) {
1287 if (curr_port == port) {
1288 temp_aggregator->num_of_ports--;
1289 if (!last_port) {
1290 temp_aggregator->lag_ports=port->next_port_in_aggregator;
1291 } else {
1292 last_port->next_port_in_aggregator=port->next_port_in_aggregator;
1293 }
1294
1295
1296 port->aggregator = NULL;
1297 port->next_port_in_aggregator=NULL;
1298 port->actor_port_aggregator_identifier=0;
1299
1300 pr_debug("Port %d left LAG %d\n", port->actor_port_number, temp_aggregator->aggregator_identifier);
1301
1302 if (!temp_aggregator->lag_ports) {
1303 ad_clear_agg(temp_aggregator);
1304 }
1305 break;
1306 }
1307 }
1308 if (!curr_port) {
1309 pr_warning(DRV_NAME ": %s: Warning: Port %d (on %s) "
1310 "was related to aggregator %d but was not "
1311 "on its port list\n",
1312 port->slave->dev->master->name,
1313 port->actor_port_number,
1314 port->slave->dev->name,
1315 port->aggregator->aggregator_identifier);
1316 }
1317 }
1318
1319 for (aggregator = __get_first_agg(port); aggregator;
1320 aggregator = __get_next_agg(aggregator)) {
1321
1322
1323 if (!aggregator->lag_ports) {
1324 if (!free_aggregator) {
1325 free_aggregator=aggregator;
1326 }
1327 continue;
1328 }
1329
1330 if (((aggregator->actor_oper_aggregator_key == port->actor_oper_port_key) &&
1331 !MAC_ADDRESS_COMPARE(&(aggregator->partner_system), &(port->partner_oper.system)) &&
1332 (aggregator->partner_system_priority == port->partner_oper.system_priority) &&
1333 (aggregator->partner_oper_aggregator_key == port->partner_oper.key)
1334 ) &&
1335 ((MAC_ADDRESS_COMPARE(&(port->partner_oper.system), &(null_mac_addr)) &&
1336 !aggregator->is_individual)
1337 )
1338 ) {
1339
1340 port->aggregator = aggregator;
1341 port->actor_port_aggregator_identifier=port->aggregator->aggregator_identifier;
1342 port->next_port_in_aggregator=aggregator->lag_ports;
1343 port->aggregator->num_of_ports++;
1344 aggregator->lag_ports=port;
1345 pr_debug("Port %d joined LAG %d(existing LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
1346
1347
1348 port->sm_vars |= AD_PORT_SELECTED;
1349 found = 1;
1350 break;
1351 }
1352 }
1353
1354
1355 if (!found) {
1356 if (free_aggregator) {
1357
1358 port->aggregator = free_aggregator;
1359 port->actor_port_aggregator_identifier=port->aggregator->aggregator_identifier;
1360
1361
1362
1363 if (port->actor_oper_port_key & AD_DUPLEX_KEY_BITS) {
1364 port->aggregator->is_individual = false;
1365 } else {
1366 port->aggregator->is_individual = true;
1367 }
1368
1369 port->aggregator->actor_admin_aggregator_key = port->actor_admin_port_key;
1370 port->aggregator->actor_oper_aggregator_key = port->actor_oper_port_key;
1371 port->aggregator->partner_system=port->partner_oper.system;
1372 port->aggregator->partner_system_priority = port->partner_oper.system_priority;
1373 port->aggregator->partner_oper_aggregator_key = port->partner_oper.key;
1374 port->aggregator->receive_state = 1;
1375 port->aggregator->transmit_state = 1;
1376 port->aggregator->lag_ports = port;
1377 port->aggregator->num_of_ports++;
1378
1379
1380 port->sm_vars |= AD_PORT_SELECTED;
1381
1382 pr_debug("Port %d joined LAG %d(new LAG)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
1383 } else {
1384 pr_err(DRV_NAME ": %s: Port %d (on %s) did not find "
1385 "a suitable aggregator\n",
1386 port->slave->dev->master->name,
1387 port->actor_port_number, port->slave->dev->name);
1388 }
1389 }
1390
1391
1392 __set_agg_ports_ready(port->aggregator, __agg_ports_are_ready(port->aggregator));
1393
1394 aggregator = __get_first_agg(port);
1395 ad_agg_selection_logic(aggregator);
1396}
1397
1398
1399
1400
1401
1402static struct aggregator *ad_agg_selection_test(struct aggregator *best,
1403 struct aggregator *curr)
1404{
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430 if (!best)
1431 return curr;
1432
1433 if (!curr->is_individual && best->is_individual)
1434 return curr;
1435
1436 if (curr->is_individual && !best->is_individual)
1437 return best;
1438
1439 if (__agg_has_partner(curr) && !__agg_has_partner(best))
1440 return curr;
1441
1442 if (!__agg_has_partner(curr) && __agg_has_partner(best))
1443 return best;
1444
1445 switch (__get_agg_selection_mode(curr->lag_ports)) {
1446 case BOND_AD_COUNT:
1447 if (curr->num_of_ports > best->num_of_ports)
1448 return curr;
1449
1450 if (curr->num_of_ports < best->num_of_ports)
1451 return best;
1452
1453
1454 case BOND_AD_STABLE:
1455 case BOND_AD_BANDWIDTH:
1456 if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best))
1457 return curr;
1458
1459 break;
1460
1461 default:
1462 pr_warning(DRV_NAME
1463 ": %s: Impossible agg select mode %d\n",
1464 curr->slave->dev->master->name,
1465 __get_agg_selection_mode(curr->lag_ports));
1466 break;
1467 }
1468
1469 return best;
1470}
1471
1472static int agg_device_up(const struct aggregator *agg)
1473{
1474 return (netif_running(agg->slave->dev) &&
1475 netif_carrier_ok(agg->slave->dev));
1476}
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503static void ad_agg_selection_logic(struct aggregator *agg)
1504{
1505 struct aggregator *best, *active, *origin;
1506 struct port *port;
1507
1508 origin = agg;
1509 active = __get_active_agg(agg);
1510 best = (active && agg_device_up(active)) ? active : NULL;
1511
1512 do {
1513 agg->is_active = 0;
1514
1515 if (agg->num_of_ports && agg_device_up(agg))
1516 best = ad_agg_selection_test(best, agg);
1517
1518 } while ((agg = __get_next_agg(agg)));
1519
1520 if (best &&
1521 __get_agg_selection_mode(best->lag_ports) == BOND_AD_STABLE) {
1522
1523
1524
1525
1526
1527
1528 if (active && active->lag_ports &&
1529 active->lag_ports->is_enabled &&
1530 (__agg_has_partner(active) ||
1531 (!__agg_has_partner(active) && !__agg_has_partner(best)))) {
1532 if (!(!active->actor_oper_aggregator_key &&
1533 best->actor_oper_aggregator_key)) {
1534 best = NULL;
1535 active->is_active = 1;
1536 }
1537 }
1538 }
1539
1540 if (best && (best == active)) {
1541 best = NULL;
1542 active->is_active = 1;
1543 }
1544
1545
1546 if (best) {
1547 pr_debug("best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1548 best->aggregator_identifier, best->num_of_ports,
1549 best->actor_oper_aggregator_key,
1550 best->partner_oper_aggregator_key,
1551 best->is_individual, best->is_active);
1552 pr_debug("best ports %p slave %p %s\n",
1553 best->lag_ports, best->slave,
1554 best->slave ? best->slave->dev->name : "NULL");
1555
1556 for (agg = __get_first_agg(best->lag_ports); agg;
1557 agg = __get_next_agg(agg)) {
1558
1559 pr_debug("Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1560 agg->aggregator_identifier, agg->num_of_ports,
1561 agg->actor_oper_aggregator_key,
1562 agg->partner_oper_aggregator_key,
1563 agg->is_individual, agg->is_active);
1564 }
1565
1566
1567 if (best->is_individual) {
1568 pr_warning(DRV_NAME ": %s: Warning: No 802.3ad"
1569 " response from the link partner for any"
1570 " adapters in the bond\n",
1571 best->slave->dev->master->name);
1572 }
1573
1574 best->is_active = 1;
1575 pr_debug("LAG %d chosen as the active LAG\n",
1576 best->aggregator_identifier);
1577 pr_debug("Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1578 best->aggregator_identifier, best->num_of_ports,
1579 best->actor_oper_aggregator_key,
1580 best->partner_oper_aggregator_key,
1581 best->is_individual, best->is_active);
1582
1583
1584 if (active) {
1585 for (port = active->lag_ports; port;
1586 port = port->next_port_in_aggregator) {
1587 __disable_port(port);
1588 }
1589 }
1590 }
1591
1592
1593
1594
1595
1596 active = __get_active_agg(origin);
1597
1598 if (active) {
1599 if (!__agg_has_partner(active)) {
1600 for (port = active->lag_ports; port;
1601 port = port->next_port_in_aggregator) {
1602 __enable_port(port);
1603 }
1604 }
1605 }
1606
1607 if (origin->slave) {
1608 struct bonding *bond;
1609
1610 bond = bond_get_bond_by_slave(origin->slave);
1611 if (bond)
1612 bond_3ad_set_carrier(bond);
1613 }
1614}
1615
1616
1617
1618
1619
1620
1621static void ad_clear_agg(struct aggregator *aggregator)
1622{
1623 if (aggregator) {
1624 aggregator->is_individual = false;
1625 aggregator->actor_admin_aggregator_key = 0;
1626 aggregator->actor_oper_aggregator_key = 0;
1627 aggregator->partner_system = null_mac_addr;
1628 aggregator->partner_system_priority = 0;
1629 aggregator->partner_oper_aggregator_key = 0;
1630 aggregator->receive_state = 0;
1631 aggregator->transmit_state = 0;
1632 aggregator->lag_ports = NULL;
1633 aggregator->is_active = 0;
1634 aggregator->num_of_ports = 0;
1635 pr_debug("LAG %d was cleared\n", aggregator->aggregator_identifier);
1636 }
1637}
1638
1639
1640
1641
1642
1643
1644static void ad_initialize_agg(struct aggregator *aggregator)
1645{
1646 if (aggregator) {
1647 ad_clear_agg(aggregator);
1648
1649 aggregator->aggregator_mac_address = null_mac_addr;
1650 aggregator->aggregator_identifier = 0;
1651 aggregator->slave = NULL;
1652 }
1653}
1654
1655
1656
1657
1658
1659
1660
1661static void ad_initialize_port(struct port *port, int lacp_fast)
1662{
1663 static const struct port_params tmpl = {
1664 .system_priority = 0xffff,
1665 .key = 1,
1666 .port_number = 1,
1667 .port_priority = 0xff,
1668 .port_state = 1,
1669 };
1670 static const struct lacpdu lacpdu = {
1671 .subtype = 0x01,
1672 .version_number = 0x01,
1673 .tlv_type_actor_info = 0x01,
1674 .actor_information_length = 0x14,
1675 .tlv_type_partner_info = 0x02,
1676 .partner_information_length = 0x14,
1677 .tlv_type_collector_info = 0x03,
1678 .collector_information_length = 0x10,
1679 .collector_max_delay = htons(AD_COLLECTOR_MAX_DELAY),
1680 };
1681
1682 if (port) {
1683 port->actor_port_number = 1;
1684 port->actor_port_priority = 0xff;
1685 port->actor_system = null_mac_addr;
1686 port->actor_system_priority = 0xffff;
1687 port->actor_port_aggregator_identifier = 0;
1688 port->ntt = false;
1689 port->actor_admin_port_key = 1;
1690 port->actor_oper_port_key = 1;
1691 port->actor_admin_port_state = AD_STATE_AGGREGATION | AD_STATE_LACP_ACTIVITY;
1692 port->actor_oper_port_state = AD_STATE_AGGREGATION | AD_STATE_LACP_ACTIVITY;
1693
1694 if (lacp_fast) {
1695 port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
1696 }
1697
1698 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
1699 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
1700
1701 port->is_enabled = true;
1702
1703 port->sm_vars = 0x3;
1704 port->sm_rx_state = 0;
1705 port->sm_rx_timer_counter = 0;
1706 port->sm_periodic_state = 0;
1707 port->sm_periodic_timer_counter = 0;
1708 port->sm_mux_state = 0;
1709 port->sm_mux_timer_counter = 0;
1710 port->sm_tx_state = 0;
1711 port->sm_tx_timer_counter = 0;
1712 port->slave = NULL;
1713 port->aggregator = NULL;
1714 port->next_port_in_aggregator = NULL;
1715 port->transaction_id = 0;
1716
1717 memcpy(&port->lacpdu, &lacpdu, sizeof(lacpdu));
1718 }
1719}
1720
1721
1722
1723
1724
1725
1726
1727static void ad_enable_collecting_distributing(struct port *port)
1728{
1729 if (port->aggregator->is_active) {
1730 pr_debug("Enabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
1731 __enable_port(port);
1732 }
1733}
1734
1735
1736
1737
1738
1739
1740static void ad_disable_collecting_distributing(struct port *port)
1741{
1742 if (port->aggregator && MAC_ADDRESS_COMPARE(&(port->aggregator->partner_system), &(null_mac_addr))) {
1743 pr_debug("Disabling port %d(LAG %d)\n", port->actor_port_number, port->aggregator->aggregator_identifier);
1744 __disable_port(port);
1745 }
1746}
1747
1748#if 0
1749
1750
1751
1752
1753
1754
1755
1756
1757static void ad_marker_info_send(struct port *port)
1758{
1759 struct bond_marker marker;
1760 u16 index;
1761
1762
1763 marker.subtype = 0x02;
1764 marker.version_number = 0x01;
1765 marker.tlv_type = AD_MARKER_INFORMATION_SUBTYPE;
1766 marker.marker_length = 0x16;
1767
1768 marker.requester_port = (((port->actor_port_number & 0xFF) << 8) |((u16)(port->actor_port_number & 0xFF00) >> 8));
1769 marker.requester_system = port->actor_system;
1770
1771 marker.requester_transaction_id = (((++port->transaction_id & 0xFF) << 24) |((port->transaction_id & 0xFF00) << 8) |((port->transaction_id & 0xFF0000) >> 8) |((port->transaction_id & 0xFF000000) >> 24));
1772 marker.pad = 0;
1773 marker.tlv_type_terminator = 0x00;
1774 marker.terminator_length = 0x00;
1775 for (index=0; index<90; index++) {
1776 marker.reserved_90[index]=0;
1777 }
1778
1779
1780 if (ad_marker_send(port, &marker) >= 0) {
1781 pr_debug("Sent Marker Information on port %d\n", port->actor_port_number);
1782 }
1783}
1784#endif
1785
1786
1787
1788
1789
1790
1791
1792static void ad_marker_info_received(struct bond_marker *marker_info,
1793 struct port *port)
1794{
1795 struct bond_marker marker;
1796
1797
1798
1799 memcpy(&marker, marker_info, sizeof(struct bond_marker));
1800
1801 marker.tlv_type=AD_MARKER_RESPONSE_SUBTYPE;
1802
1803
1804 if (ad_marker_send(port, &marker) >= 0) {
1805 pr_debug("Sent Marker Response on port %d\n", port->actor_port_number);
1806 }
1807}
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818static void ad_marker_response_received(struct bond_marker *marker,
1819 struct port *port)
1820{
1821 marker=NULL;
1822 port=NULL;
1823
1824}
1825
1826
1827
1828
1829
1830
1831#define AD_AGGREGATOR_SELECTION_TIMER 8
1832
1833
1834
1835
1836
1837
1838
1839
1840void bond_3ad_initiate_agg_selection(struct bonding *bond, int timeout)
1841{
1842 BOND_AD_INFO(bond).agg_select_timer = timeout;
1843 BOND_AD_INFO(bond).agg_select_mode = bond->params.ad_select;
1844}
1845
1846static u16 aggregator_identifier;
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution, int lacp_fast)
1857{
1858
1859 if (MAC_ADDRESS_COMPARE(&(BOND_AD_INFO(bond).system.sys_mac_addr),
1860 bond->dev->dev_addr)) {
1861
1862 aggregator_identifier = 0;
1863
1864 BOND_AD_INFO(bond).lacp_fast = lacp_fast;
1865 BOND_AD_INFO(bond).system.sys_priority = 0xFFFF;
1866 BOND_AD_INFO(bond).system.sys_mac_addr = *((struct mac_addr *)bond->dev->dev_addr);
1867
1868
1869 ad_ticks_per_sec = tick_resolution;
1870
1871 bond_3ad_initiate_agg_selection(bond,
1872 AD_AGGREGATOR_SELECTION_TIMER *
1873 ad_ticks_per_sec);
1874 }
1875}
1876
1877
1878
1879
1880
1881
1882
1883
1884int bond_3ad_bind_slave(struct slave *slave)
1885{
1886 struct bonding *bond = bond_get_bond_by_slave(slave);
1887 struct port *port;
1888 struct aggregator *aggregator;
1889
1890 if (bond == NULL) {
1891 pr_err(DRV_NAME ": %s: The slave %s is not attached to "
1892 "its bond\n",
1893 slave->dev->master->name, slave->dev->name);
1894 return -1;
1895 }
1896
1897
1898 if (SLAVE_AD_INFO(slave).port.slave != slave) {
1899
1900
1901 port = &(SLAVE_AD_INFO(slave).port);
1902
1903 ad_initialize_port(port, BOND_AD_INFO(bond).lacp_fast);
1904
1905 port->slave = slave;
1906 port->actor_port_number = SLAVE_AD_INFO(slave).id;
1907
1908
1909
1910
1911
1912 port->actor_admin_port_key = 0;
1913 port->actor_admin_port_key |= __get_duplex(port);
1914 port->actor_admin_port_key |= (__get_link_speed(port) << 1);
1915 port->actor_oper_port_key = port->actor_admin_port_key;
1916
1917 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_BITS)) {
1918 port->sm_vars &= ~AD_PORT_LACP_ENABLED;
1919 }
1920
1921 port->actor_system = BOND_AD_INFO(bond).system.sys_mac_addr;
1922
1923 port->sm_tx_timer_counter = ad_ticks_per_sec/AD_MAX_TX_IN_SECOND;
1924 port->aggregator = NULL;
1925 port->next_port_in_aggregator = NULL;
1926
1927 __disable_port(port);
1928 __initialize_port_locks(port);
1929
1930
1931
1932 aggregator = &(SLAVE_AD_INFO(slave).aggregator);
1933
1934 ad_initialize_agg(aggregator);
1935
1936 aggregator->aggregator_mac_address = *((struct mac_addr *)bond->dev->dev_addr);
1937 aggregator->aggregator_identifier = (++aggregator_identifier);
1938 aggregator->slave = slave;
1939 aggregator->is_active = 0;
1940 aggregator->num_of_ports = 0;
1941 }
1942
1943 return 0;
1944}
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954void bond_3ad_unbind_slave(struct slave *slave)
1955{
1956 struct port *port, *prev_port, *temp_port;
1957 struct aggregator *aggregator, *new_aggregator, *temp_aggregator;
1958 int select_new_active_agg = 0;
1959
1960
1961 aggregator = &(SLAVE_AD_INFO(slave).aggregator);
1962
1963
1964 port = &(SLAVE_AD_INFO(slave).port);
1965
1966
1967 if (!port->slave) {
1968 pr_warning(DRV_NAME ": Warning: %s: Trying to "
1969 "unbind an uninitialized port on %s\n",
1970 slave->dev->master->name, slave->dev->name);
1971 return;
1972 }
1973
1974 pr_debug("Unbinding Link Aggregation Group %d\n", aggregator->aggregator_identifier);
1975
1976
1977 port->actor_oper_port_state &= ~AD_STATE_AGGREGATION;
1978 __update_lacpdu_from_port(port);
1979 ad_lacpdu_send(port);
1980
1981
1982 if (aggregator->lag_ports) {
1983
1984
1985
1986 if ((aggregator->lag_ports != port) || (aggregator->lag_ports->next_port_in_aggregator)) {
1987
1988 new_aggregator = __get_first_agg(port);
1989 for (; new_aggregator; new_aggregator = __get_next_agg(new_aggregator)) {
1990
1991 if (!new_aggregator->lag_ports || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator)) {
1992 break;
1993 }
1994 }
1995
1996
1997 if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) {
1998 pr_debug("Some port(s) related to LAG %d - replaceing with LAG %d\n", aggregator->aggregator_identifier, new_aggregator->aggregator_identifier);
1999
2000 if ((new_aggregator->lag_ports == port) && new_aggregator->is_active) {
2001 pr_info(DRV_NAME ": %s: Removing an active aggregator\n",
2002 aggregator->slave->dev->master->name);
2003
2004 select_new_active_agg = 1;
2005 }
2006
2007 new_aggregator->is_individual = aggregator->is_individual;
2008 new_aggregator->actor_admin_aggregator_key = aggregator->actor_admin_aggregator_key;
2009 new_aggregator->actor_oper_aggregator_key = aggregator->actor_oper_aggregator_key;
2010 new_aggregator->partner_system = aggregator->partner_system;
2011 new_aggregator->partner_system_priority = aggregator->partner_system_priority;
2012 new_aggregator->partner_oper_aggregator_key = aggregator->partner_oper_aggregator_key;
2013 new_aggregator->receive_state = aggregator->receive_state;
2014 new_aggregator->transmit_state = aggregator->transmit_state;
2015 new_aggregator->lag_ports = aggregator->lag_ports;
2016 new_aggregator->is_active = aggregator->is_active;
2017 new_aggregator->num_of_ports = aggregator->num_of_ports;
2018
2019
2020 for (temp_port=aggregator->lag_ports; temp_port; temp_port=temp_port->next_port_in_aggregator) {
2021 temp_port->aggregator=new_aggregator;
2022 temp_port->actor_port_aggregator_identifier = new_aggregator->aggregator_identifier;
2023 }
2024
2025
2026 ad_clear_agg(aggregator);
2027
2028 if (select_new_active_agg) {
2029 ad_agg_selection_logic(__get_first_agg(port));
2030 }
2031 } else {
2032 pr_warning(DRV_NAME ": %s: Warning: unbinding aggregator, "
2033 "and could not find a new aggregator for its ports\n",
2034 slave->dev->master->name);
2035 }
2036 } else {
2037 select_new_active_agg = aggregator->is_active;
2038
2039 ad_clear_agg(aggregator);
2040 if (select_new_active_agg) {
2041 pr_info(DRV_NAME ": %s: Removing an active aggregator\n",
2042 slave->dev->master->name);
2043
2044 ad_agg_selection_logic(__get_first_agg(port));
2045 }
2046 }
2047 }
2048
2049 pr_debug("Unbinding port %d\n", port->actor_port_number);
2050
2051 temp_aggregator = __get_first_agg(port);
2052 for (; temp_aggregator; temp_aggregator = __get_next_agg(temp_aggregator)) {
2053 prev_port = NULL;
2054
2055 for (temp_port=temp_aggregator->lag_ports; temp_port; prev_port=temp_port, temp_port=temp_port->next_port_in_aggregator) {
2056 if (temp_port == port) {
2057 if (prev_port) {
2058 prev_port->next_port_in_aggregator = temp_port->next_port_in_aggregator;
2059 } else {
2060 temp_aggregator->lag_ports = temp_port->next_port_in_aggregator;
2061 }
2062 temp_aggregator->num_of_ports--;
2063 if (temp_aggregator->num_of_ports==0) {
2064 select_new_active_agg = temp_aggregator->is_active;
2065
2066 ad_clear_agg(temp_aggregator);
2067 if (select_new_active_agg) {
2068 pr_info(DRV_NAME ": %s: Removing an active aggregator\n",
2069 slave->dev->master->name);
2070
2071 ad_agg_selection_logic(__get_first_agg(port));
2072 }
2073 }
2074 break;
2075 }
2076 }
2077 }
2078 port->slave=NULL;
2079}
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094void bond_3ad_state_machine_handler(struct work_struct *work)
2095{
2096 struct bonding *bond = container_of(work, struct bonding,
2097 ad_work.work);
2098 struct port *port;
2099 struct aggregator *aggregator;
2100
2101 read_lock(&bond->lock);
2102
2103 if (bond->kill_timers) {
2104 goto out;
2105 }
2106
2107
2108 if (bond->slave_cnt == 0) {
2109 goto re_arm;
2110 }
2111
2112
2113 if (BOND_AD_INFO(bond).agg_select_timer && !(--BOND_AD_INFO(bond).agg_select_timer)) {
2114
2115 if ((port = __get_first_port(bond))) {
2116 if (!port->slave) {
2117 pr_warning(DRV_NAME ": %s: Warning: bond's first port is "
2118 "uninitialized\n", bond->dev->name);
2119 goto re_arm;
2120 }
2121
2122 aggregator = __get_first_agg(port);
2123 ad_agg_selection_logic(aggregator);
2124 }
2125 bond_3ad_set_carrier(bond);
2126 }
2127
2128
2129 for (port = __get_first_port(bond); port; port = __get_next_port(port)) {
2130 if (!port->slave) {
2131 pr_warning(DRV_NAME ": %s: Warning: Found an uninitialized "
2132 "port\n", bond->dev->name);
2133 goto re_arm;
2134 }
2135
2136 ad_rx_machine(NULL, port);
2137 ad_periodic_machine(port);
2138 ad_port_selection_logic(port);
2139 ad_mux_machine(port);
2140 ad_tx_machine(port);
2141
2142
2143 if (port->sm_vars & AD_PORT_BEGIN) {
2144 port->sm_vars &= ~AD_PORT_BEGIN;
2145 }
2146 }
2147
2148re_arm:
2149 queue_delayed_work(bond->wq, &bond->ad_work, ad_delta_in_ticks);
2150out:
2151 read_unlock(&bond->lock);
2152}
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164static void bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, u16 length)
2165{
2166 struct port *port;
2167
2168 if (length >= sizeof(struct lacpdu)) {
2169
2170 port = &(SLAVE_AD_INFO(slave).port);
2171
2172 if (!port->slave) {
2173 pr_warning(DRV_NAME ": %s: Warning: port of slave %s "
2174 "is uninitialized\n",
2175 slave->dev->name, slave->dev->master->name);
2176 return;
2177 }
2178
2179 switch (lacpdu->subtype) {
2180 case AD_TYPE_LACPDU:
2181 pr_debug("Received LACPDU on port %d\n", port->actor_port_number);
2182 ad_rx_machine(lacpdu, port);
2183 break;
2184
2185 case AD_TYPE_MARKER:
2186
2187
2188 switch (((struct bond_marker *)lacpdu)->tlv_type) {
2189 case AD_MARKER_INFORMATION_SUBTYPE:
2190 pr_debug("Received Marker Information on port %d\n", port->actor_port_number);
2191 ad_marker_info_received((struct bond_marker *)lacpdu, port);
2192 break;
2193
2194 case AD_MARKER_RESPONSE_SUBTYPE:
2195 pr_debug("Received Marker Response on port %d\n", port->actor_port_number);
2196 ad_marker_response_received((struct bond_marker *)lacpdu, port);
2197 break;
2198
2199 default:
2200 pr_debug("Received an unknown Marker subtype on slot %d\n", port->actor_port_number);
2201 }
2202 }
2203 }
2204}
2205
2206
2207
2208
2209
2210
2211
2212void bond_3ad_adapter_speed_changed(struct slave *slave)
2213{
2214 struct port *port;
2215
2216 port = &(SLAVE_AD_INFO(slave).port);
2217
2218
2219 if (!port->slave) {
2220 pr_warning(DRV_NAME ": Warning: %s: speed "
2221 "changed for uninitialized port on %s\n",
2222 slave->dev->master->name, slave->dev->name);
2223 return;
2224 }
2225
2226 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS;
2227 port->actor_oper_port_key=port->actor_admin_port_key |= (__get_link_speed(port) << 1);
2228 pr_debug("Port %d changed speed\n", port->actor_port_number);
2229
2230
2231 port->sm_vars |= AD_PORT_BEGIN;
2232}
2233
2234
2235
2236
2237
2238
2239
2240void bond_3ad_adapter_duplex_changed(struct slave *slave)
2241{
2242 struct port *port;
2243
2244 port=&(SLAVE_AD_INFO(slave).port);
2245
2246
2247 if (!port->slave) {
2248 pr_warning(DRV_NAME ": %s: Warning: duplex changed "
2249 "for uninitialized port on %s\n",
2250 slave->dev->master->name, slave->dev->name);
2251 return;
2252 }
2253
2254 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
2255 port->actor_oper_port_key=port->actor_admin_port_key |= __get_duplex(port);
2256 pr_debug("Port %d changed duplex\n", port->actor_port_number);
2257
2258
2259 port->sm_vars |= AD_PORT_BEGIN;
2260}
2261
2262
2263
2264
2265
2266
2267
2268
2269void bond_3ad_handle_link_change(struct slave *slave, char link)
2270{
2271 struct port *port;
2272
2273 port = &(SLAVE_AD_INFO(slave).port);
2274
2275
2276 if (!port->slave) {
2277 pr_warning(DRV_NAME ": Warning: %s: link status changed for "
2278 "uninitialized port on %s\n",
2279 slave->dev->master->name, slave->dev->name);
2280 return;
2281 }
2282
2283
2284
2285 if (link == BOND_LINK_UP) {
2286 port->is_enabled = true;
2287 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
2288 port->actor_oper_port_key=port->actor_admin_port_key |= __get_duplex(port);
2289 port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS;
2290 port->actor_oper_port_key=port->actor_admin_port_key |= (__get_link_speed(port) << 1);
2291 } else {
2292
2293 port->is_enabled = false;
2294 port->actor_admin_port_key &= ~AD_DUPLEX_KEY_BITS;
2295 port->actor_oper_port_key= (port->actor_admin_port_key &= ~AD_SPEED_KEY_BITS);
2296 }
2297
2298
2299
2300 port->sm_vars |= AD_PORT_BEGIN;
2301}
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313int bond_3ad_set_carrier(struct bonding *bond)
2314{
2315 if (__get_active_agg(&(SLAVE_AD_INFO(bond->first_slave).aggregator))) {
2316 if (!netif_carrier_ok(bond->dev)) {
2317 netif_carrier_on(bond->dev);
2318 return 1;
2319 }
2320 return 0;
2321 }
2322
2323 if (netif_carrier_ok(bond->dev)) {
2324 netif_carrier_off(bond->dev);
2325 return 1;
2326 }
2327 return 0;
2328}
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338int bond_3ad_get_active_agg_info(struct bonding *bond, struct ad_info *ad_info)
2339{
2340 struct aggregator *aggregator = NULL;
2341 struct port *port;
2342
2343 for (port = __get_first_port(bond); port; port = __get_next_port(port)) {
2344 if (port->aggregator && port->aggregator->is_active) {
2345 aggregator = port->aggregator;
2346 break;
2347 }
2348 }
2349
2350 if (aggregator) {
2351 ad_info->aggregator_id = aggregator->aggregator_identifier;
2352 ad_info->ports = aggregator->num_of_ports;
2353 ad_info->actor_key = aggregator->actor_oper_aggregator_key;
2354 ad_info->partner_key = aggregator->partner_oper_aggregator_key;
2355 memcpy(ad_info->partner_system, aggregator->partner_system.mac_addr_value, ETH_ALEN);
2356 return 0;
2357 }
2358
2359 return -1;
2360}
2361
2362int bond_3ad_xmit_xor(struct sk_buff *skb, struct net_device *dev)
2363{
2364 struct slave *slave, *start_at;
2365 struct bonding *bond = netdev_priv(dev);
2366 int slave_agg_no;
2367 int slaves_in_agg;
2368 int agg_id;
2369 int i;
2370 struct ad_info ad_info;
2371 int res = 1;
2372
2373
2374
2375
2376 read_lock(&bond->lock);
2377
2378 if (!BOND_IS_OK(bond)) {
2379 goto out;
2380 }
2381
2382 if (bond_3ad_get_active_agg_info(bond, &ad_info)) {
2383 pr_debug(DRV_NAME ": %s: Error: "
2384 "bond_3ad_get_active_agg_info failed\n", dev->name);
2385 goto out;
2386 }
2387
2388 slaves_in_agg = ad_info.ports;
2389 agg_id = ad_info.aggregator_id;
2390
2391 if (slaves_in_agg == 0) {
2392
2393 pr_debug(DRV_NAME ": %s: Error: active aggregator is empty\n",
2394 dev->name);
2395 goto out;
2396 }
2397
2398 slave_agg_no = bond->xmit_hash_policy(skb, dev, slaves_in_agg);
2399
2400 bond_for_each_slave(bond, slave, i) {
2401 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
2402
2403 if (agg && (agg->aggregator_identifier == agg_id)) {
2404 slave_agg_no--;
2405 if (slave_agg_no < 0) {
2406 break;
2407 }
2408 }
2409 }
2410
2411 if (slave_agg_no >= 0) {
2412 pr_err(DRV_NAME ": %s: Error: Couldn't find a slave to tx on "
2413 "for aggregator ID %d\n", dev->name, agg_id);
2414 goto out;
2415 }
2416
2417 start_at = slave;
2418
2419 bond_for_each_slave_from(bond, slave, i, start_at) {
2420 int slave_agg_id = 0;
2421 struct aggregator *agg = SLAVE_AD_INFO(slave).port.aggregator;
2422
2423 if (agg) {
2424 slave_agg_id = agg->aggregator_identifier;
2425 }
2426
2427 if (SLAVE_IS_OK(slave) && agg && (slave_agg_id == agg_id)) {
2428 res = bond_dev_queue_xmit(bond, skb, slave->dev);
2429 break;
2430 }
2431 }
2432
2433out:
2434 if (res) {
2435
2436 dev_kfree_skb(skb);
2437 }
2438 read_unlock(&bond->lock);
2439 return NETDEV_TX_OK;
2440}
2441
2442int bond_3ad_lacpdu_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type* ptype, struct net_device *orig_dev)
2443{
2444 struct bonding *bond = netdev_priv(dev);
2445 struct slave *slave = NULL;
2446 int ret = NET_RX_DROP;
2447
2448 if (dev_net(dev) != &init_net)
2449 goto out;
2450
2451 if (!(dev->flags & IFF_MASTER))
2452 goto out;
2453
2454 read_lock(&bond->lock);
2455 slave = bond_get_slave_by_dev((struct bonding *)netdev_priv(dev),
2456 orig_dev);
2457 if (!slave)
2458 goto out_unlock;
2459
2460 bond_3ad_rx_indication((struct lacpdu *) skb->data, slave, skb->len);
2461
2462 ret = NET_RX_SUCCESS;
2463
2464out_unlock:
2465 read_unlock(&bond->lock);
2466out:
2467 dev_kfree_skb(skb);
2468
2469 return ret;
2470}
2471
2472