.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * 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 | 4 | */ |
---|
22 | 5 | |
---|
23 | 6 | #include <linux/skbuff.h> |
---|
.. | .. |
---|
31 | 14 | #include <net/net_namespace.h> |
---|
32 | 15 | #include <net/bonding.h> |
---|
33 | 16 | #include <net/bond_3ad.h> |
---|
| 17 | +#include <net/netlink.h> |
---|
34 | 18 | |
---|
35 | 19 | /* General definitions */ |
---|
36 | 20 | #define AD_SHORT_TIMEOUT 1 |
---|
.. | .. |
---|
46 | 30 | #define AD_LONG_TIMEOUT_TIME (3*AD_SLOW_PERIODIC_TIME) |
---|
47 | 31 | #define AD_CHURN_DETECTION_TIME 60 |
---|
48 | 32 | #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 | 33 | |
---|
60 | 34 | /* Port Variables definitions used by the State Machines (43.4.7 in the |
---|
61 | 35 | * 802.3ad standard) |
---|
.. | .. |
---|
111 | 85 | static u16 ad_ticks_per_sec; |
---|
112 | 86 | static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000; |
---|
113 | 87 | |
---|
114 | | -static const u8 lacpdu_mcast_addr[ETH_ALEN + 2] __long_aligned = |
---|
115 | | - MULTICAST_LACPDU_ADDR; |
---|
| 88 | +const u8 lacpdu_mcast_addr[ETH_ALEN + 2] __long_aligned = { |
---|
| 89 | + 0x01, 0x80, 0xC2, 0x00, 0x00, 0x02 |
---|
| 90 | +}; |
---|
116 | 91 | |
---|
117 | 92 | /* ================= main 802.3ad protocol functions ================== */ |
---|
118 | 93 | static int ad_lacpdu_send(struct port *port); |
---|
.. | .. |
---|
156 | 131 | |
---|
157 | 132 | /** |
---|
158 | 133 | * __get_first_agg - get the first aggregator in the bond |
---|
159 | | - * @bond: the bond we're looking at |
---|
| 134 | + * @port: the port we're looking at |
---|
160 | 135 | * |
---|
161 | 136 | * Return the aggregator of the first slave in @bond, or %NULL if it can't be |
---|
162 | 137 | * found. |
---|
.. | .. |
---|
341 | 316 | default: |
---|
342 | 317 | /* unknown speed value from ethtool. shouldn't happen */ |
---|
343 | 318 | if (slave->speed != SPEED_UNKNOWN) |
---|
344 | | - pr_warn_once("%s: unknown ethtool speed (%d) for port %d (set it to 0)\n", |
---|
| 319 | + pr_warn_once("%s: (slave %s): unknown ethtool speed (%d) for port %d (set it to 0)\n", |
---|
345 | 320 | slave->bond->dev->name, |
---|
346 | | - slave->speed, |
---|
| 321 | + slave->dev->name, slave->speed, |
---|
347 | 322 | port->actor_port_number); |
---|
348 | 323 | speed = 0; |
---|
349 | 324 | break; |
---|
350 | 325 | } |
---|
351 | 326 | } |
---|
352 | 327 | |
---|
353 | | - netdev_dbg(slave->bond->dev, "Port %d Received link speed %d update from adapter\n", |
---|
354 | | - port->actor_port_number, speed); |
---|
| 328 | + slave_dbg(slave->bond->dev, slave->dev, "Port %d Received link speed %d update from adapter\n", |
---|
| 329 | + port->actor_port_number, speed); |
---|
355 | 330 | return speed; |
---|
356 | 331 | } |
---|
357 | 332 | |
---|
.. | .. |
---|
375 | 350 | switch (slave->duplex) { |
---|
376 | 351 | case DUPLEX_FULL: |
---|
377 | 352 | retval = 0x1; |
---|
378 | | - netdev_dbg(slave->bond->dev, "Port %d Received status full duplex update from adapter\n", |
---|
379 | | - port->actor_port_number); |
---|
| 353 | + slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status full duplex update from adapter\n", |
---|
| 354 | + port->actor_port_number); |
---|
380 | 355 | break; |
---|
381 | 356 | case DUPLEX_HALF: |
---|
382 | 357 | default: |
---|
383 | 358 | retval = 0x0; |
---|
384 | | - netdev_dbg(slave->bond->dev, "Port %d Received status NOT full duplex update from adapter\n", |
---|
385 | | - port->actor_port_number); |
---|
| 359 | + slave_dbg(slave->bond->dev, slave->dev, "Port %d Received status NOT full duplex update from adapter\n", |
---|
| 360 | + port->actor_port_number); |
---|
386 | 361 | break; |
---|
387 | 362 | } |
---|
388 | 363 | } |
---|
.. | .. |
---|
473 | 448 | MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) && |
---|
474 | 449 | (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) && |
---|
475 | 450 | (ntohs(lacpdu->partner_key) == port->actor_oper_port_key) && |
---|
476 | | - ((lacpdu->partner_state & AD_STATE_AGGREGATION) == (port->actor_oper_port_state & AD_STATE_AGGREGATION))) || |
---|
477 | | - ((lacpdu->actor_state & AD_STATE_AGGREGATION) == 0) |
---|
| 451 | + ((lacpdu->partner_state & LACP_STATE_AGGREGATION) == (port->actor_oper_port_state & LACP_STATE_AGGREGATION))) || |
---|
| 452 | + ((lacpdu->actor_state & LACP_STATE_AGGREGATION) == 0) |
---|
478 | 453 | ) { |
---|
479 | 454 | port->sm_vars |= AD_PORT_MATCHED; |
---|
480 | 455 | } else { |
---|
.. | .. |
---|
508 | 483 | partner->port_state = lacpdu->actor_state; |
---|
509 | 484 | |
---|
510 | 485 | /* set actor_oper_port_state.defaulted to FALSE */ |
---|
511 | | - port->actor_oper_port_state &= ~AD_STATE_DEFAULTED; |
---|
| 486 | + port->actor_oper_port_state &= ~LACP_STATE_DEFAULTED; |
---|
512 | 487 | |
---|
513 | 488 | /* set the partner sync. to on if the partner is sync, |
---|
514 | 489 | * and the port is matched |
---|
515 | 490 | */ |
---|
516 | 491 | if ((port->sm_vars & AD_PORT_MATCHED) && |
---|
517 | | - (lacpdu->actor_state & AD_STATE_SYNCHRONIZATION)) { |
---|
518 | | - partner->port_state |= AD_STATE_SYNCHRONIZATION; |
---|
519 | | - pr_debug("%s partner sync=1\n", port->slave->dev->name); |
---|
| 492 | + (lacpdu->actor_state & LACP_STATE_SYNCHRONIZATION)) { |
---|
| 493 | + partner->port_state |= LACP_STATE_SYNCHRONIZATION; |
---|
| 494 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 495 | + "partner sync=1\n"); |
---|
520 | 496 | } else { |
---|
521 | | - partner->port_state &= ~AD_STATE_SYNCHRONIZATION; |
---|
522 | | - pr_debug("%s partner sync=0\n", port->slave->dev->name); |
---|
| 497 | + partner->port_state &= ~LACP_STATE_SYNCHRONIZATION; |
---|
| 498 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 499 | + "partner sync=0\n"); |
---|
523 | 500 | } |
---|
524 | 501 | } |
---|
525 | 502 | } |
---|
.. | .. |
---|
540 | 517 | sizeof(struct port_params)); |
---|
541 | 518 | |
---|
542 | 519 | /* set actor_oper_port_state.defaulted to true */ |
---|
543 | | - port->actor_oper_port_state |= AD_STATE_DEFAULTED; |
---|
| 520 | + port->actor_oper_port_state |= LACP_STATE_DEFAULTED; |
---|
544 | 521 | } |
---|
545 | 522 | } |
---|
546 | 523 | |
---|
.. | .. |
---|
570 | 547 | !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) || |
---|
571 | 548 | ntohs(lacpdu->actor_system_priority) != partner->system_priority || |
---|
572 | 549 | ntohs(lacpdu->actor_key) != partner->key || |
---|
573 | | - (lacpdu->actor_state & AD_STATE_AGGREGATION) != (partner->port_state & AD_STATE_AGGREGATION)) { |
---|
| 550 | + (lacpdu->actor_state & LACP_STATE_AGGREGATION) != (partner->port_state & LACP_STATE_AGGREGATION)) { |
---|
574 | 551 | port->sm_vars &= ~AD_PORT_SELECTED; |
---|
575 | 552 | } |
---|
576 | 553 | } |
---|
.. | .. |
---|
602 | 579 | !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) || |
---|
603 | 580 | admin->system_priority != oper->system_priority || |
---|
604 | 581 | admin->key != oper->key || |
---|
605 | | - (admin->port_state & AD_STATE_AGGREGATION) |
---|
606 | | - != (oper->port_state & AD_STATE_AGGREGATION)) { |
---|
| 582 | + (admin->port_state & LACP_STATE_AGGREGATION) |
---|
| 583 | + != (oper->port_state & LACP_STATE_AGGREGATION)) { |
---|
607 | 584 | port->sm_vars &= ~AD_PORT_SELECTED; |
---|
608 | 585 | } |
---|
609 | 586 | } |
---|
.. | .. |
---|
633 | 610 | !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) || |
---|
634 | 611 | (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) || |
---|
635 | 612 | (ntohs(lacpdu->partner_key) != port->actor_oper_port_key) || |
---|
636 | | - ((lacpdu->partner_state & AD_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY)) || |
---|
637 | | - ((lacpdu->partner_state & AD_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT)) || |
---|
638 | | - ((lacpdu->partner_state & AD_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) || |
---|
639 | | - ((lacpdu->partner_state & AD_STATE_AGGREGATION) != (port->actor_oper_port_state & AD_STATE_AGGREGATION)) |
---|
| 613 | + ((lacpdu->partner_state & LACP_STATE_LACP_ACTIVITY) != (port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY)) || |
---|
| 614 | + ((lacpdu->partner_state & LACP_STATE_LACP_TIMEOUT) != (port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT)) || |
---|
| 615 | + ((lacpdu->partner_state & LACP_STATE_SYNCHRONIZATION) != (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) || |
---|
| 616 | + ((lacpdu->partner_state & LACP_STATE_AGGREGATION) != (port->actor_oper_port_state & LACP_STATE_AGGREGATION)) |
---|
640 | 617 | ) { |
---|
641 | 618 | port->ntt = true; |
---|
642 | 619 | } |
---|
.. | .. |
---|
805 | 782 | lacpdu->actor_port_priority = htons(port->actor_port_priority); |
---|
806 | 783 | lacpdu->actor_port = htons(port->actor_port_number); |
---|
807 | 784 | lacpdu->actor_state = port->actor_oper_port_state; |
---|
808 | | - pr_debug("update lacpdu: %s, actor port state %x\n", |
---|
809 | | - port->slave->dev->name, port->actor_oper_port_state); |
---|
| 785 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 786 | + "update lacpdu: actor port state %x\n", |
---|
| 787 | + port->actor_oper_port_state); |
---|
810 | 788 | |
---|
811 | 789 | /* lacpdu->reserved_3_1 initialized |
---|
812 | 790 | * lacpdu->tlv_type_partner_info initialized |
---|
.. | .. |
---|
851 | 829 | if (!skb) |
---|
852 | 830 | return -ENOMEM; |
---|
853 | 831 | |
---|
| 832 | + atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx); |
---|
| 833 | + atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx); |
---|
| 834 | + |
---|
854 | 835 | skb->dev = slave->dev; |
---|
855 | 836 | skb_reset_mac_header(skb); |
---|
856 | 837 | skb->network_header = skb->mac_header + ETH_HLEN; |
---|
.. | .. |
---|
891 | 872 | skb = dev_alloc_skb(length + 16); |
---|
892 | 873 | if (!skb) |
---|
893 | 874 | return -ENOMEM; |
---|
| 875 | + |
---|
| 876 | + switch (marker->tlv_type) { |
---|
| 877 | + case AD_MARKER_INFORMATION_SUBTYPE: |
---|
| 878 | + atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_tx); |
---|
| 879 | + atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_tx); |
---|
| 880 | + break; |
---|
| 881 | + case AD_MARKER_RESPONSE_SUBTYPE: |
---|
| 882 | + atomic64_inc(&SLAVE_AD_INFO(slave)->stats.marker_resp_tx); |
---|
| 883 | + atomic64_inc(&BOND_AD_INFO(slave->bond).stats.marker_resp_tx); |
---|
| 884 | + break; |
---|
| 885 | + } |
---|
894 | 886 | |
---|
895 | 887 | skb_reserve(skb, 16); |
---|
896 | 888 | |
---|
.. | .. |
---|
977 | 969 | * edable port will take place only after this timer) |
---|
978 | 970 | */ |
---|
979 | 971 | if ((port->sm_vars & AD_PORT_SELECTED) && |
---|
980 | | - (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) && |
---|
| 972 | + (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) && |
---|
981 | 973 | !__check_agg_selection_timer(port)) { |
---|
982 | 974 | if (port->aggregator->is_active) |
---|
983 | 975 | port->sm_mux_state = |
---|
.. | .. |
---|
995 | 987 | port->sm_mux_state = AD_MUX_DETACHED; |
---|
996 | 988 | } else if (port->aggregator->is_active) { |
---|
997 | 989 | port->actor_oper_port_state |= |
---|
998 | | - AD_STATE_SYNCHRONIZATION; |
---|
| 990 | + LACP_STATE_SYNCHRONIZATION; |
---|
999 | 991 | } |
---|
1000 | 992 | break; |
---|
1001 | 993 | case AD_MUX_COLLECTING_DISTRIBUTING: |
---|
1002 | 994 | if (!(port->sm_vars & AD_PORT_SELECTED) || |
---|
1003 | 995 | (port->sm_vars & AD_PORT_STANDBY) || |
---|
1004 | | - !(port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) || |
---|
1005 | | - !(port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION)) { |
---|
| 996 | + !(port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) || |
---|
| 997 | + !(port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION)) { |
---|
1006 | 998 | port->sm_mux_state = AD_MUX_ATTACHED; |
---|
1007 | 999 | } else { |
---|
1008 | 1000 | /* if port state hasn't changed make |
---|
.. | .. |
---|
1024 | 1016 | |
---|
1025 | 1017 | /* check if the state machine was changed */ |
---|
1026 | 1018 | if (port->sm_mux_state != last_state) { |
---|
1027 | | - pr_debug("Mux Machine: Port=%d (%s), Last State=%d, Curr State=%d\n", |
---|
1028 | | - port->actor_port_number, |
---|
1029 | | - port->slave->dev->name, |
---|
1030 | | - last_state, |
---|
1031 | | - port->sm_mux_state); |
---|
| 1019 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1020 | + "Mux Machine: Port=%d, Last State=%d, Curr State=%d\n", |
---|
| 1021 | + port->actor_port_number, |
---|
| 1022 | + last_state, |
---|
| 1023 | + port->sm_mux_state); |
---|
1032 | 1024 | switch (port->sm_mux_state) { |
---|
1033 | 1025 | case AD_MUX_DETACHED: |
---|
1034 | | - port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; |
---|
| 1026 | + port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; |
---|
1035 | 1027 | ad_disable_collecting_distributing(port, |
---|
1036 | 1028 | update_slave_arr); |
---|
1037 | | - port->actor_oper_port_state &= ~AD_STATE_COLLECTING; |
---|
1038 | | - port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; |
---|
| 1029 | + port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; |
---|
| 1030 | + port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; |
---|
1039 | 1031 | port->ntt = true; |
---|
1040 | 1032 | break; |
---|
1041 | 1033 | case AD_MUX_WAITING: |
---|
.. | .. |
---|
1044 | 1036 | case AD_MUX_ATTACHED: |
---|
1045 | 1037 | if (port->aggregator->is_active) |
---|
1046 | 1038 | port->actor_oper_port_state |= |
---|
1047 | | - AD_STATE_SYNCHRONIZATION; |
---|
| 1039 | + LACP_STATE_SYNCHRONIZATION; |
---|
1048 | 1040 | else |
---|
1049 | 1041 | port->actor_oper_port_state &= |
---|
1050 | | - ~AD_STATE_SYNCHRONIZATION; |
---|
1051 | | - port->actor_oper_port_state &= ~AD_STATE_COLLECTING; |
---|
1052 | | - port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; |
---|
| 1042 | + ~LACP_STATE_SYNCHRONIZATION; |
---|
| 1043 | + port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; |
---|
| 1044 | + port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; |
---|
1053 | 1045 | ad_disable_collecting_distributing(port, |
---|
1054 | 1046 | update_slave_arr); |
---|
1055 | 1047 | port->ntt = true; |
---|
1056 | 1048 | break; |
---|
1057 | 1049 | case AD_MUX_COLLECTING_DISTRIBUTING: |
---|
1058 | | - port->actor_oper_port_state |= AD_STATE_COLLECTING; |
---|
1059 | | - port->actor_oper_port_state |= AD_STATE_DISTRIBUTING; |
---|
1060 | | - port->actor_oper_port_state |= AD_STATE_SYNCHRONIZATION; |
---|
| 1050 | + port->actor_oper_port_state |= LACP_STATE_COLLECTING; |
---|
| 1051 | + port->actor_oper_port_state |= LACP_STATE_DISTRIBUTING; |
---|
| 1052 | + port->actor_oper_port_state |= LACP_STATE_SYNCHRONIZATION; |
---|
1061 | 1053 | ad_enable_collecting_distributing(port, |
---|
1062 | 1054 | update_slave_arr); |
---|
1063 | 1055 | port->ntt = true; |
---|
.. | .. |
---|
1086 | 1078 | */ |
---|
1087 | 1079 | last_state = port->sm_rx_state; |
---|
1088 | 1080 | |
---|
| 1081 | + if (lacpdu) { |
---|
| 1082 | + atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.lacpdu_rx); |
---|
| 1083 | + atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.lacpdu_rx); |
---|
| 1084 | + } |
---|
1089 | 1085 | /* check if state machine should change state */ |
---|
1090 | 1086 | |
---|
1091 | 1087 | /* first, check if port was reinitialized */ |
---|
.. | .. |
---|
1138 | 1134 | |
---|
1139 | 1135 | /* check if the State machine was changed or new lacpdu arrived */ |
---|
1140 | 1136 | if ((port->sm_rx_state != last_state) || (lacpdu)) { |
---|
1141 | | - pr_debug("Rx Machine: Port=%d (%s), Last State=%d, Curr State=%d\n", |
---|
1142 | | - port->actor_port_number, |
---|
1143 | | - port->slave->dev->name, |
---|
1144 | | - last_state, |
---|
1145 | | - port->sm_rx_state); |
---|
| 1137 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1138 | + "Rx Machine: Port=%d, Last State=%d, Curr State=%d\n", |
---|
| 1139 | + port->actor_port_number, |
---|
| 1140 | + last_state, |
---|
| 1141 | + port->sm_rx_state); |
---|
1146 | 1142 | switch (port->sm_rx_state) { |
---|
1147 | 1143 | case AD_RX_INITIALIZE: |
---|
1148 | 1144 | if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS)) |
---|
.. | .. |
---|
1151 | 1147 | port->sm_vars |= AD_PORT_LACP_ENABLED; |
---|
1152 | 1148 | port->sm_vars &= ~AD_PORT_SELECTED; |
---|
1153 | 1149 | __record_default(port); |
---|
1154 | | - port->actor_oper_port_state &= ~AD_STATE_EXPIRED; |
---|
| 1150 | + port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; |
---|
1155 | 1151 | port->sm_rx_state = AD_RX_PORT_DISABLED; |
---|
1156 | 1152 | |
---|
1157 | | - /* Fall Through */ |
---|
| 1153 | + fallthrough; |
---|
1158 | 1154 | case AD_RX_PORT_DISABLED: |
---|
1159 | 1155 | port->sm_vars &= ~AD_PORT_MATCHED; |
---|
1160 | 1156 | break; |
---|
1161 | 1157 | case AD_RX_LACP_DISABLED: |
---|
1162 | 1158 | port->sm_vars &= ~AD_PORT_SELECTED; |
---|
1163 | 1159 | __record_default(port); |
---|
1164 | | - port->partner_oper.port_state &= ~AD_STATE_AGGREGATION; |
---|
| 1160 | + port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION; |
---|
1165 | 1161 | port->sm_vars |= AD_PORT_MATCHED; |
---|
1166 | | - port->actor_oper_port_state &= ~AD_STATE_EXPIRED; |
---|
| 1162 | + port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; |
---|
1167 | 1163 | break; |
---|
1168 | 1164 | case AD_RX_EXPIRED: |
---|
1169 | 1165 | /* Reset of the Synchronization flag (Standard 43.4.12) |
---|
.. | .. |
---|
1172 | 1168 | * case of EXPIRED even if LINK_DOWN didn't arrive for |
---|
1173 | 1169 | * the port. |
---|
1174 | 1170 | */ |
---|
1175 | | - port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION; |
---|
| 1171 | + port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION; |
---|
1176 | 1172 | port->sm_vars &= ~AD_PORT_MATCHED; |
---|
1177 | | - port->partner_oper.port_state |= AD_STATE_LACP_TIMEOUT; |
---|
1178 | | - port->partner_oper.port_state |= AD_STATE_LACP_ACTIVITY; |
---|
| 1173 | + port->partner_oper.port_state |= LACP_STATE_LACP_TIMEOUT; |
---|
| 1174 | + port->partner_oper.port_state |= LACP_STATE_LACP_ACTIVITY; |
---|
1179 | 1175 | port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(AD_SHORT_TIMEOUT)); |
---|
1180 | | - port->actor_oper_port_state |= AD_STATE_EXPIRED; |
---|
| 1176 | + port->actor_oper_port_state |= LACP_STATE_EXPIRED; |
---|
1181 | 1177 | port->sm_vars |= AD_PORT_CHURNED; |
---|
1182 | 1178 | break; |
---|
1183 | 1179 | case AD_RX_DEFAULTED: |
---|
1184 | 1180 | __update_default_selected(port); |
---|
1185 | 1181 | __record_default(port); |
---|
1186 | 1182 | port->sm_vars |= AD_PORT_MATCHED; |
---|
1187 | | - port->actor_oper_port_state &= ~AD_STATE_EXPIRED; |
---|
| 1183 | + port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; |
---|
1188 | 1184 | break; |
---|
1189 | 1185 | case AD_RX_CURRENT: |
---|
1190 | 1186 | /* detect loopback situation */ |
---|
1191 | 1187 | if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system), |
---|
1192 | 1188 | &(port->actor_system))) { |
---|
1193 | | - netdev_err(port->slave->bond->dev, "An illegal loopback occurred on adapter (%s)\n" |
---|
1194 | | - "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n", |
---|
1195 | | - port->slave->dev->name); |
---|
| 1189 | + slave_err(port->slave->bond->dev, port->slave->dev, "An illegal loopback occurred on slave\n" |
---|
| 1190 | + "Check the configuration to verify that all adapters are connected to 802.3ad compliant switch ports\n"); |
---|
1196 | 1191 | return; |
---|
1197 | 1192 | } |
---|
1198 | 1193 | __update_selected(lacpdu, port); |
---|
1199 | 1194 | __update_ntt(lacpdu, port); |
---|
1200 | 1195 | __record_pdu(lacpdu, port); |
---|
1201 | | - port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & AD_STATE_LACP_TIMEOUT)); |
---|
1202 | | - port->actor_oper_port_state &= ~AD_STATE_EXPIRED; |
---|
| 1196 | + port->sm_rx_timer_counter = __ad_timer_to_ticks(AD_CURRENT_WHILE_TIMER, (u16)(port->actor_oper_port_state & LACP_STATE_LACP_TIMEOUT)); |
---|
| 1197 | + port->actor_oper_port_state &= ~LACP_STATE_EXPIRED; |
---|
1203 | 1198 | break; |
---|
1204 | 1199 | default: |
---|
1205 | 1200 | break; |
---|
.. | .. |
---|
1220 | 1215 | port->sm_churn_partner_state = AD_CHURN_MONITOR; |
---|
1221 | 1216 | port->sm_churn_actor_timer_counter = |
---|
1222 | 1217 | __ad_timer_to_ticks(AD_ACTOR_CHURN_TIMER, 0); |
---|
1223 | | - port->sm_churn_partner_timer_counter = |
---|
| 1218 | + port->sm_churn_partner_timer_counter = |
---|
1224 | 1219 | __ad_timer_to_ticks(AD_PARTNER_CHURN_TIMER, 0); |
---|
1225 | 1220 | return; |
---|
1226 | 1221 | } |
---|
1227 | 1222 | if (port->sm_churn_actor_timer_counter && |
---|
1228 | 1223 | !(--port->sm_churn_actor_timer_counter) && |
---|
1229 | 1224 | port->sm_churn_actor_state == AD_CHURN_MONITOR) { |
---|
1230 | | - if (port->actor_oper_port_state & AD_STATE_SYNCHRONIZATION) { |
---|
| 1225 | + if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) { |
---|
1231 | 1226 | port->sm_churn_actor_state = AD_NO_CHURN; |
---|
1232 | 1227 | } else { |
---|
1233 | 1228 | port->churn_actor_count++; |
---|
.. | .. |
---|
1237 | 1232 | if (port->sm_churn_partner_timer_counter && |
---|
1238 | 1233 | !(--port->sm_churn_partner_timer_counter) && |
---|
1239 | 1234 | port->sm_churn_partner_state == AD_CHURN_MONITOR) { |
---|
1240 | | - if (port->partner_oper.port_state & AD_STATE_SYNCHRONIZATION) { |
---|
| 1235 | + if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) { |
---|
1241 | 1236 | port->sm_churn_partner_state = AD_NO_CHURN; |
---|
1242 | 1237 | } else { |
---|
1243 | 1238 | port->churn_partner_count++; |
---|
.. | .. |
---|
1261 | 1256 | __update_lacpdu_from_port(port); |
---|
1262 | 1257 | |
---|
1263 | 1258 | if (ad_lacpdu_send(port) >= 0) { |
---|
1264 | | - pr_debug("Sent LACPDU on port %d\n", |
---|
1265 | | - port->actor_port_number); |
---|
| 1259 | + slave_dbg(port->slave->bond->dev, |
---|
| 1260 | + port->slave->dev, |
---|
| 1261 | + "Sent LACPDU on port %d\n", |
---|
| 1262 | + port->actor_port_number); |
---|
1266 | 1263 | |
---|
1267 | 1264 | /* mark ntt as false, so it will not be sent |
---|
1268 | 1265 | * again until demanded |
---|
.. | .. |
---|
1292 | 1289 | |
---|
1293 | 1290 | /* check if port was reinitialized */ |
---|
1294 | 1291 | if (((port->sm_vars & AD_PORT_BEGIN) || !(port->sm_vars & AD_PORT_LACP_ENABLED) || !port->is_enabled) || |
---|
1295 | | - (!(port->actor_oper_port_state & AD_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & AD_STATE_LACP_ACTIVITY)) |
---|
| 1292 | + (!(port->actor_oper_port_state & LACP_STATE_LACP_ACTIVITY) && !(port->partner_oper.port_state & LACP_STATE_LACP_ACTIVITY)) |
---|
1296 | 1293 | ) { |
---|
1297 | 1294 | port->sm_periodic_state = AD_NO_PERIODIC; |
---|
1298 | 1295 | } |
---|
.. | .. |
---|
1309 | 1306 | switch (port->sm_periodic_state) { |
---|
1310 | 1307 | case AD_FAST_PERIODIC: |
---|
1311 | 1308 | if (!(port->partner_oper.port_state |
---|
1312 | | - & AD_STATE_LACP_TIMEOUT)) |
---|
| 1309 | + & LACP_STATE_LACP_TIMEOUT)) |
---|
1313 | 1310 | port->sm_periodic_state = AD_SLOW_PERIODIC; |
---|
1314 | 1311 | break; |
---|
1315 | 1312 | case AD_SLOW_PERIODIC: |
---|
1316 | | - if ((port->partner_oper.port_state & AD_STATE_LACP_TIMEOUT)) { |
---|
| 1313 | + if ((port->partner_oper.port_state & LACP_STATE_LACP_TIMEOUT)) { |
---|
1317 | 1314 | port->sm_periodic_timer_counter = 0; |
---|
1318 | 1315 | port->sm_periodic_state = AD_PERIODIC_TX; |
---|
1319 | 1316 | } |
---|
.. | .. |
---|
1329 | 1326 | break; |
---|
1330 | 1327 | case AD_PERIODIC_TX: |
---|
1331 | 1328 | if (!(port->partner_oper.port_state & |
---|
1332 | | - AD_STATE_LACP_TIMEOUT)) |
---|
| 1329 | + LACP_STATE_LACP_TIMEOUT)) |
---|
1333 | 1330 | port->sm_periodic_state = AD_SLOW_PERIODIC; |
---|
1334 | 1331 | else |
---|
1335 | 1332 | port->sm_periodic_state = AD_FAST_PERIODIC; |
---|
.. | .. |
---|
1341 | 1338 | |
---|
1342 | 1339 | /* check if the state machine was changed */ |
---|
1343 | 1340 | if (port->sm_periodic_state != last_state) { |
---|
1344 | | - pr_debug("Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", |
---|
1345 | | - port->actor_port_number, last_state, |
---|
1346 | | - port->sm_periodic_state); |
---|
| 1341 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1342 | + "Periodic Machine: Port=%d, Last State=%d, Curr State=%d\n", |
---|
| 1343 | + port->actor_port_number, last_state, |
---|
| 1344 | + port->sm_periodic_state); |
---|
1347 | 1345 | switch (port->sm_periodic_state) { |
---|
1348 | 1346 | case AD_NO_PERIODIC: |
---|
1349 | 1347 | port->sm_periodic_timer_counter = 0; |
---|
.. | .. |
---|
1419 | 1417 | port->next_port_in_aggregator = NULL; |
---|
1420 | 1418 | port->actor_port_aggregator_identifier = 0; |
---|
1421 | 1419 | |
---|
1422 | | - netdev_dbg(bond->dev, "Port %d left LAG %d\n", |
---|
1423 | | - port->actor_port_number, |
---|
1424 | | - temp_aggregator->aggregator_identifier); |
---|
| 1420 | + slave_dbg(bond->dev, port->slave->dev, "Port %d left LAG %d\n", |
---|
| 1421 | + port->actor_port_number, |
---|
| 1422 | + temp_aggregator->aggregator_identifier); |
---|
1425 | 1423 | /* if the aggregator is empty, clear its |
---|
1426 | 1424 | * parameters, and set it ready to be attached |
---|
1427 | 1425 | */ |
---|
.. | .. |
---|
1434 | 1432 | /* meaning: the port was related to an aggregator |
---|
1435 | 1433 | * but was not on the aggregator port list |
---|
1436 | 1434 | */ |
---|
1437 | | - net_warn_ratelimited("%s: Warning: Port %d (on %s) was related to aggregator %d but was not on its port list\n", |
---|
| 1435 | + net_warn_ratelimited("%s: (slave %s): Warning: Port %d was related to aggregator %d but was not on its port list\n", |
---|
1438 | 1436 | port->slave->bond->dev->name, |
---|
1439 | | - port->actor_port_number, |
---|
1440 | 1437 | port->slave->dev->name, |
---|
| 1438 | + port->actor_port_number, |
---|
1441 | 1439 | port->aggregator->aggregator_identifier); |
---|
1442 | 1440 | } |
---|
1443 | 1441 | } |
---|
.. | .. |
---|
1468 | 1466 | port->next_port_in_aggregator = aggregator->lag_ports; |
---|
1469 | 1467 | port->aggregator->num_of_ports++; |
---|
1470 | 1468 | aggregator->lag_ports = port; |
---|
1471 | | - netdev_dbg(bond->dev, "Port %d joined LAG %d(existing LAG)\n", |
---|
1472 | | - port->actor_port_number, |
---|
1473 | | - port->aggregator->aggregator_identifier); |
---|
| 1469 | + slave_dbg(bond->dev, slave->dev, "Port %d joined LAG %d (existing LAG)\n", |
---|
| 1470 | + port->actor_port_number, |
---|
| 1471 | + port->aggregator->aggregator_identifier); |
---|
1474 | 1472 | |
---|
1475 | 1473 | /* mark this port as selected */ |
---|
1476 | 1474 | port->sm_vars |= AD_PORT_SELECTED; |
---|
.. | .. |
---|
1515 | 1513 | /* mark this port as selected */ |
---|
1516 | 1514 | port->sm_vars |= AD_PORT_SELECTED; |
---|
1517 | 1515 | |
---|
1518 | | - netdev_dbg(bond->dev, "Port %d joined LAG %d(new LAG)\n", |
---|
1519 | | - port->actor_port_number, |
---|
1520 | | - port->aggregator->aggregator_identifier); |
---|
| 1516 | + slave_dbg(bond->dev, port->slave->dev, "Port %d joined LAG %d (new LAG)\n", |
---|
| 1517 | + port->actor_port_number, |
---|
| 1518 | + port->aggregator->aggregator_identifier); |
---|
1521 | 1519 | } else { |
---|
1522 | | - netdev_err(bond->dev, "Port %d (on %s) did not find a suitable aggregator\n", |
---|
1523 | | - port->actor_port_number, port->slave->dev->name); |
---|
| 1520 | + slave_err(bond->dev, port->slave->dev, |
---|
| 1521 | + "Port %d did not find a suitable aggregator\n", |
---|
| 1522 | + port->actor_port_number); |
---|
1524 | 1523 | } |
---|
1525 | 1524 | } |
---|
1526 | 1525 | /* if all aggregator's ports are READY_N == TRUE, set ready=TRUE |
---|
.. | .. |
---|
1534 | 1533 | ad_agg_selection_logic(aggregator, update_slave_arr); |
---|
1535 | 1534 | |
---|
1536 | 1535 | if (!port->aggregator->is_active) |
---|
1537 | | - port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; |
---|
| 1536 | + port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; |
---|
1538 | 1537 | } |
---|
1539 | 1538 | |
---|
1540 | 1539 | /* Decide if "agg" is a better choice for the new active aggregator that |
---|
.. | .. |
---|
1590 | 1589 | if (__agg_active_ports(curr) < __agg_active_ports(best)) |
---|
1591 | 1590 | return best; |
---|
1592 | 1591 | |
---|
1593 | | - /*FALLTHROUGH*/ |
---|
| 1592 | + fallthrough; |
---|
1594 | 1593 | case BOND_AD_STABLE: |
---|
1595 | 1594 | case BOND_AD_BANDWIDTH: |
---|
1596 | 1595 | if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best)) |
---|
.. | .. |
---|
1599 | 1598 | break; |
---|
1600 | 1599 | |
---|
1601 | 1600 | default: |
---|
1602 | | - net_warn_ratelimited("%s: Impossible agg select mode %d\n", |
---|
| 1601 | + net_warn_ratelimited("%s: (slave %s): Impossible agg select mode %d\n", |
---|
1603 | 1602 | curr->slave->bond->dev->name, |
---|
| 1603 | + curr->slave->dev->name, |
---|
1604 | 1604 | __get_agg_selection_mode(curr->lag_ports)); |
---|
1605 | 1605 | break; |
---|
1606 | 1606 | } |
---|
.. | .. |
---|
1627 | 1627 | |
---|
1628 | 1628 | /** |
---|
1629 | 1629 | * ad_agg_selection_logic - select an aggregation group for a team |
---|
1630 | | - * @aggregator: the aggregator we're looking at |
---|
| 1630 | + * @agg: the aggregator we're looking at |
---|
1631 | 1631 | * @update_slave_arr: Does slave array need update? |
---|
1632 | 1632 | * |
---|
1633 | 1633 | * It is assumed that only one aggregator may be selected for a team. |
---|
.. | .. |
---|
1701 | 1701 | |
---|
1702 | 1702 | /* if there is new best aggregator, activate it */ |
---|
1703 | 1703 | if (best) { |
---|
1704 | | - netdev_dbg(bond->dev, "best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
| 1704 | + netdev_dbg(bond->dev, "(slave %s): best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
| 1705 | + best->slave ? best->slave->dev->name : "NULL", |
---|
1705 | 1706 | best->aggregator_identifier, best->num_of_ports, |
---|
1706 | 1707 | best->actor_oper_aggregator_key, |
---|
1707 | 1708 | best->partner_oper_aggregator_key, |
---|
1708 | 1709 | best->is_individual, best->is_active); |
---|
1709 | | - netdev_dbg(bond->dev, "best ports %p slave %p %s\n", |
---|
1710 | | - best->lag_ports, best->slave, |
---|
1711 | | - best->slave ? best->slave->dev->name : "NULL"); |
---|
| 1710 | + netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n", |
---|
| 1711 | + best->slave ? best->slave->dev->name : "NULL", |
---|
| 1712 | + best->lag_ports, best->slave); |
---|
1712 | 1713 | |
---|
1713 | 1714 | bond_for_each_slave_rcu(bond, slave, iter) { |
---|
1714 | 1715 | agg = &(SLAVE_AD_INFO(slave)->aggregator); |
---|
1715 | 1716 | |
---|
1716 | | - netdev_dbg(bond->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
1717 | | - agg->aggregator_identifier, agg->num_of_ports, |
---|
1718 | | - agg->actor_oper_aggregator_key, |
---|
1719 | | - agg->partner_oper_aggregator_key, |
---|
1720 | | - agg->is_individual, agg->is_active); |
---|
| 1717 | + slave_dbg(bond->dev, slave->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
| 1718 | + agg->aggregator_identifier, agg->num_of_ports, |
---|
| 1719 | + agg->actor_oper_aggregator_key, |
---|
| 1720 | + agg->partner_oper_aggregator_key, |
---|
| 1721 | + agg->is_individual, agg->is_active); |
---|
1721 | 1722 | } |
---|
1722 | 1723 | |
---|
1723 | | - /* check if any partner replys */ |
---|
1724 | | - if (best->is_individual) { |
---|
| 1724 | + /* check if any partner replies */ |
---|
| 1725 | + if (best->is_individual) |
---|
1725 | 1726 | net_warn_ratelimited("%s: Warning: No 802.3ad response from the link partner for any adapters in the bond\n", |
---|
1726 | | - best->slave ? |
---|
1727 | | - best->slave->bond->dev->name : "NULL"); |
---|
1728 | | - } |
---|
| 1727 | + bond->dev->name); |
---|
1729 | 1728 | |
---|
1730 | 1729 | best->is_active = 1; |
---|
1731 | | - netdev_dbg(bond->dev, "LAG %d chosen as the active LAG\n", |
---|
| 1730 | + netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n", |
---|
| 1731 | + best->slave ? best->slave->dev->name : "NULL", |
---|
1732 | 1732 | best->aggregator_identifier); |
---|
1733 | | - netdev_dbg(bond->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
| 1733 | + netdev_dbg(bond->dev, "(slave %s): Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n", |
---|
| 1734 | + best->slave ? best->slave->dev->name : "NULL", |
---|
1734 | 1735 | best->aggregator_identifier, best->num_of_ports, |
---|
1735 | 1736 | best->actor_oper_aggregator_key, |
---|
1736 | 1737 | best->partner_oper_aggregator_key, |
---|
.. | .. |
---|
1787 | 1788 | aggregator->lag_ports = NULL; |
---|
1788 | 1789 | aggregator->is_active = 0; |
---|
1789 | 1790 | aggregator->num_of_ports = 0; |
---|
1790 | | - pr_debug("LAG %d was cleared\n", |
---|
| 1791 | + pr_debug("%s: LAG %d was cleared\n", |
---|
| 1792 | + aggregator->slave ? |
---|
| 1793 | + aggregator->slave->dev->name : "NULL", |
---|
1791 | 1794 | aggregator->aggregator_identifier); |
---|
1792 | 1795 | } |
---|
1793 | 1796 | } |
---|
.. | .. |
---|
1809 | 1812 | |
---|
1810 | 1813 | /** |
---|
1811 | 1814 | * ad_initialize_port - initialize a given port's parameters |
---|
1812 | | - * @aggregator: the aggregator we're looking at |
---|
| 1815 | + * @port: the port we're looking at |
---|
1813 | 1816 | * @lacp_fast: boolean. whether fast periodic should be used |
---|
1814 | 1817 | */ |
---|
1815 | 1818 | static void ad_initialize_port(struct port *port, int lacp_fast) |
---|
.. | .. |
---|
1837 | 1840 | port->actor_port_priority = 0xff; |
---|
1838 | 1841 | port->actor_port_aggregator_identifier = 0; |
---|
1839 | 1842 | port->ntt = false; |
---|
1840 | | - port->actor_admin_port_state = AD_STATE_AGGREGATION | |
---|
1841 | | - AD_STATE_LACP_ACTIVITY; |
---|
1842 | | - port->actor_oper_port_state = AD_STATE_AGGREGATION | |
---|
1843 | | - AD_STATE_LACP_ACTIVITY; |
---|
| 1843 | + port->actor_admin_port_state = LACP_STATE_AGGREGATION | |
---|
| 1844 | + LACP_STATE_LACP_ACTIVITY; |
---|
| 1845 | + port->actor_oper_port_state = LACP_STATE_AGGREGATION | |
---|
| 1846 | + LACP_STATE_LACP_ACTIVITY; |
---|
1844 | 1847 | |
---|
1845 | 1848 | if (lacp_fast) |
---|
1846 | | - port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; |
---|
| 1849 | + port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; |
---|
1847 | 1850 | |
---|
1848 | 1851 | memcpy(&port->partner_admin, &tmpl, sizeof(tmpl)); |
---|
1849 | 1852 | memcpy(&port->partner_oper, &tmpl, sizeof(tmpl)); |
---|
.. | .. |
---|
1884 | 1887 | bool *update_slave_arr) |
---|
1885 | 1888 | { |
---|
1886 | 1889 | if (port->aggregator->is_active) { |
---|
1887 | | - pr_debug("Enabling port %d(LAG %d)\n", |
---|
1888 | | - port->actor_port_number, |
---|
1889 | | - port->aggregator->aggregator_identifier); |
---|
| 1890 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1891 | + "Enabling port %d (LAG %d)\n", |
---|
| 1892 | + port->actor_port_number, |
---|
| 1893 | + port->aggregator->aggregator_identifier); |
---|
1890 | 1894 | __enable_port(port); |
---|
1891 | 1895 | /* Slave array needs update */ |
---|
1892 | 1896 | *update_slave_arr = true; |
---|
.. | .. |
---|
1904 | 1908 | if (port->aggregator && |
---|
1905 | 1909 | !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system), |
---|
1906 | 1910 | &(null_mac_addr))) { |
---|
1907 | | - pr_debug("Disabling port %d(LAG %d)\n", |
---|
1908 | | - port->actor_port_number, |
---|
1909 | | - port->aggregator->aggregator_identifier); |
---|
| 1911 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1912 | + "Disabling port %d (LAG %d)\n", |
---|
| 1913 | + port->actor_port_number, |
---|
| 1914 | + port->aggregator->aggregator_identifier); |
---|
1910 | 1915 | __disable_port(port); |
---|
1911 | 1916 | /* Slave array needs an update */ |
---|
1912 | 1917 | *update_slave_arr = true; |
---|
.. | .. |
---|
1919 | 1924 | * @port: the port we're looking at |
---|
1920 | 1925 | */ |
---|
1921 | 1926 | static void ad_marker_info_received(struct bond_marker *marker_info, |
---|
1922 | | - struct port *port) |
---|
| 1927 | + struct port *port) |
---|
1923 | 1928 | { |
---|
1924 | 1929 | struct bond_marker marker; |
---|
| 1930 | + |
---|
| 1931 | + atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx); |
---|
| 1932 | + atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx); |
---|
1925 | 1933 | |
---|
1926 | 1934 | /* copy the received marker data to the response marker */ |
---|
1927 | 1935 | memcpy(&marker, marker_info, sizeof(struct bond_marker)); |
---|
.. | .. |
---|
1929 | 1937 | marker.tlv_type = AD_MARKER_RESPONSE_SUBTYPE; |
---|
1930 | 1938 | |
---|
1931 | 1939 | /* send the marker response */ |
---|
1932 | | - if (ad_marker_send(port, &marker) >= 0) { |
---|
1933 | | - pr_debug("Sent Marker Response on port %d\n", |
---|
1934 | | - port->actor_port_number); |
---|
1935 | | - } |
---|
| 1940 | + if (ad_marker_send(port, &marker) >= 0) |
---|
| 1941 | + slave_dbg(port->slave->bond->dev, port->slave->dev, |
---|
| 1942 | + "Sent Marker Response on port %d\n", |
---|
| 1943 | + port->actor_port_number); |
---|
1936 | 1944 | } |
---|
1937 | 1945 | |
---|
1938 | 1946 | /** |
---|
.. | .. |
---|
1947 | 1955 | static void ad_marker_response_received(struct bond_marker *marker, |
---|
1948 | 1956 | struct port *port) |
---|
1949 | 1957 | { |
---|
| 1958 | + atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx); |
---|
| 1959 | + atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx); |
---|
| 1960 | + |
---|
1950 | 1961 | /* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */ |
---|
1951 | 1962 | } |
---|
1952 | 1963 | |
---|
.. | .. |
---|
1958 | 1969 | /** |
---|
1959 | 1970 | * bond_3ad_initiate_agg_selection - initate aggregator selection |
---|
1960 | 1971 | * @bond: bonding struct |
---|
| 1972 | + * @timeout: timeout value to set |
---|
1961 | 1973 | * |
---|
1962 | 1974 | * Set the aggregation selection timer, to initiate an agg selection in |
---|
1963 | 1975 | * the very near future. Called during first initialization, and during |
---|
.. | .. |
---|
1977 | 1989 | */ |
---|
1978 | 1990 | void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution) |
---|
1979 | 1991 | { |
---|
1980 | | - /* check that the bond is not initialized yet */ |
---|
1981 | | - if (!MAC_ADDRESS_EQUAL(&(BOND_AD_INFO(bond).system.sys_mac_addr), |
---|
1982 | | - bond->dev->dev_addr)) { |
---|
| 1992 | + BOND_AD_INFO(bond).aggregator_identifier = 0; |
---|
| 1993 | + BOND_AD_INFO(bond).system.sys_priority = |
---|
| 1994 | + bond->params.ad_actor_sys_prio; |
---|
| 1995 | + if (is_zero_ether_addr(bond->params.ad_actor_system)) |
---|
| 1996 | + BOND_AD_INFO(bond).system.sys_mac_addr = |
---|
| 1997 | + *((struct mac_addr *)bond->dev->dev_addr); |
---|
| 1998 | + else |
---|
| 1999 | + BOND_AD_INFO(bond).system.sys_mac_addr = |
---|
| 2000 | + *((struct mac_addr *)bond->params.ad_actor_system); |
---|
1983 | 2001 | |
---|
1984 | | - BOND_AD_INFO(bond).aggregator_identifier = 0; |
---|
| 2002 | + /* initialize how many times this module is called in one |
---|
| 2003 | + * second (should be about every 100ms) |
---|
| 2004 | + */ |
---|
| 2005 | + ad_ticks_per_sec = tick_resolution; |
---|
1985 | 2006 | |
---|
1986 | | - BOND_AD_INFO(bond).system.sys_priority = |
---|
1987 | | - bond->params.ad_actor_sys_prio; |
---|
1988 | | - if (is_zero_ether_addr(bond->params.ad_actor_system)) |
---|
1989 | | - BOND_AD_INFO(bond).system.sys_mac_addr = |
---|
1990 | | - *((struct mac_addr *)bond->dev->dev_addr); |
---|
1991 | | - else |
---|
1992 | | - BOND_AD_INFO(bond).system.sys_mac_addr = |
---|
1993 | | - *((struct mac_addr *)bond->params.ad_actor_system); |
---|
1994 | | - |
---|
1995 | | - /* initialize how many times this module is called in one |
---|
1996 | | - * second (should be about every 100ms) |
---|
1997 | | - */ |
---|
1998 | | - ad_ticks_per_sec = tick_resolution; |
---|
1999 | | - |
---|
2000 | | - bond_3ad_initiate_agg_selection(bond, |
---|
2001 | | - AD_AGGREGATOR_SELECTION_TIMER * |
---|
2002 | | - ad_ticks_per_sec); |
---|
2003 | | - } |
---|
| 2007 | + bond_3ad_initiate_agg_selection(bond, |
---|
| 2008 | + AD_AGGREGATOR_SELECTION_TIMER * |
---|
| 2009 | + ad_ticks_per_sec); |
---|
2004 | 2010 | } |
---|
2005 | 2011 | |
---|
2006 | 2012 | /** |
---|
.. | .. |
---|
2078 | 2084 | |
---|
2079 | 2085 | /* if slave is null, the whole port is not initialized */ |
---|
2080 | 2086 | if (!port->slave) { |
---|
2081 | | - netdev_warn(bond->dev, "Trying to unbind an uninitialized port on %s\n", |
---|
2082 | | - slave->dev->name); |
---|
| 2087 | + slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n"); |
---|
2083 | 2088 | goto out; |
---|
2084 | 2089 | } |
---|
2085 | 2090 | |
---|
2086 | | - netdev_dbg(bond->dev, "Unbinding Link Aggregation Group %d\n", |
---|
2087 | | - aggregator->aggregator_identifier); |
---|
| 2091 | + slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n", |
---|
| 2092 | + aggregator->aggregator_identifier); |
---|
2088 | 2093 | |
---|
2089 | 2094 | /* Tell the partner that this port is not suitable for aggregation */ |
---|
2090 | | - port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION; |
---|
2091 | | - port->actor_oper_port_state &= ~AD_STATE_COLLECTING; |
---|
2092 | | - port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING; |
---|
2093 | | - port->actor_oper_port_state &= ~AD_STATE_AGGREGATION; |
---|
| 2095 | + port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION; |
---|
| 2096 | + port->actor_oper_port_state &= ~LACP_STATE_COLLECTING; |
---|
| 2097 | + port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING; |
---|
| 2098 | + port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION; |
---|
2094 | 2099 | __update_lacpdu_from_port(port); |
---|
2095 | 2100 | ad_lacpdu_send(port); |
---|
2096 | 2101 | |
---|
.. | .. |
---|
2122 | 2127 | * new aggregator |
---|
2123 | 2128 | */ |
---|
2124 | 2129 | if ((new_aggregator) && ((!new_aggregator->lag_ports) || ((new_aggregator->lag_ports == port) && !new_aggregator->lag_ports->next_port_in_aggregator))) { |
---|
2125 | | - netdev_dbg(bond->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n", |
---|
2126 | | - aggregator->aggregator_identifier, |
---|
2127 | | - new_aggregator->aggregator_identifier); |
---|
| 2130 | + slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n", |
---|
| 2131 | + aggregator->aggregator_identifier, |
---|
| 2132 | + new_aggregator->aggregator_identifier); |
---|
2128 | 2133 | |
---|
2129 | 2134 | if ((new_aggregator->lag_ports == port) && |
---|
2130 | 2135 | new_aggregator->is_active) { |
---|
2131 | | - netdev_info(bond->dev, "Removing an active aggregator\n"); |
---|
2132 | | - select_new_active_agg = 1; |
---|
| 2136 | + slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); |
---|
| 2137 | + select_new_active_agg = 1; |
---|
2133 | 2138 | } |
---|
2134 | 2139 | |
---|
2135 | 2140 | new_aggregator->is_individual = aggregator->is_individual; |
---|
.. | .. |
---|
2159 | 2164 | ad_agg_selection_logic(__get_first_agg(port), |
---|
2160 | 2165 | &dummy_slave_update); |
---|
2161 | 2166 | } else { |
---|
2162 | | - netdev_warn(bond->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n"); |
---|
| 2167 | + slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n"); |
---|
2163 | 2168 | } |
---|
2164 | 2169 | } else { |
---|
2165 | 2170 | /* in case that the only port related to this |
---|
.. | .. |
---|
2168 | 2173 | select_new_active_agg = aggregator->is_active; |
---|
2169 | 2174 | ad_clear_agg(aggregator); |
---|
2170 | 2175 | if (select_new_active_agg) { |
---|
2171 | | - netdev_info(bond->dev, "Removing an active aggregator\n"); |
---|
| 2176 | + slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); |
---|
2172 | 2177 | /* select new active aggregator */ |
---|
2173 | 2178 | temp_aggregator = __get_first_agg(port); |
---|
2174 | 2179 | if (temp_aggregator) |
---|
.. | .. |
---|
2178 | 2183 | } |
---|
2179 | 2184 | } |
---|
2180 | 2185 | |
---|
2181 | | - netdev_dbg(bond->dev, "Unbinding port %d\n", port->actor_port_number); |
---|
| 2186 | + slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number); |
---|
2182 | 2187 | |
---|
2183 | 2188 | /* find the aggregator that this port is connected to */ |
---|
2184 | 2189 | bond_for_each_slave(bond, slave_iter, iter) { |
---|
.. | .. |
---|
2199 | 2204 | temp_aggregator->num_of_ports--; |
---|
2200 | 2205 | if (__agg_active_ports(temp_aggregator) == 0) { |
---|
2201 | 2206 | select_new_active_agg = temp_aggregator->is_active; |
---|
2202 | | - ad_clear_agg(temp_aggregator); |
---|
| 2207 | + if (temp_aggregator->num_of_ports == 0) |
---|
| 2208 | + ad_clear_agg(temp_aggregator); |
---|
2203 | 2209 | if (select_new_active_agg) { |
---|
2204 | | - netdev_info(bond->dev, "Removing an active aggregator\n"); |
---|
| 2210 | + slave_info(bond->dev, slave->dev, "Removing an active aggregator\n"); |
---|
2205 | 2211 | /* select new active aggregator */ |
---|
2206 | 2212 | ad_agg_selection_logic(__get_first_agg(port), |
---|
2207 | 2213 | &dummy_slave_update); |
---|
.. | .. |
---|
2273 | 2279 | |
---|
2274 | 2280 | /** |
---|
2275 | 2281 | * bond_3ad_state_machine_handler - handle state machines timeout |
---|
2276 | | - * @bond: bonding struct to work on |
---|
| 2282 | + * @work: work context to fetch bonding struct to work on from |
---|
2277 | 2283 | * |
---|
2278 | 2284 | * The state machine handling concept in this module is to check every tick |
---|
2279 | 2285 | * which state machine should operate any function. The execution order is |
---|
.. | .. |
---|
2369 | 2375 | * bond_3ad_rx_indication - handle a received frame |
---|
2370 | 2376 | * @lacpdu: received lacpdu |
---|
2371 | 2377 | * @slave: slave struct to work on |
---|
2372 | | - * @length: length of the data received |
---|
2373 | 2378 | * |
---|
2374 | 2379 | * It is assumed that frames that were sent on this NIC don't returned as new |
---|
2375 | 2380 | * received frames (loopback). Since only the payload is given to this |
---|
2376 | 2381 | * function, it check for loopback. |
---|
2377 | 2382 | */ |
---|
2378 | | -static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave, |
---|
2379 | | - u16 length) |
---|
| 2383 | +static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave) |
---|
2380 | 2384 | { |
---|
2381 | | - struct port *port; |
---|
| 2385 | + struct bonding *bond = slave->bond; |
---|
2382 | 2386 | int ret = RX_HANDLER_ANOTHER; |
---|
| 2387 | + struct bond_marker *marker; |
---|
| 2388 | + struct port *port; |
---|
| 2389 | + atomic64_t *stat; |
---|
2383 | 2390 | |
---|
2384 | | - if (length >= sizeof(struct lacpdu)) { |
---|
2385 | | - |
---|
2386 | | - port = &(SLAVE_AD_INFO(slave)->port); |
---|
2387 | | - |
---|
2388 | | - if (!port->slave) { |
---|
2389 | | - net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n", |
---|
2390 | | - slave->dev->name, slave->bond->dev->name); |
---|
2391 | | - return ret; |
---|
2392 | | - } |
---|
2393 | | - |
---|
2394 | | - switch (lacpdu->subtype) { |
---|
2395 | | - case AD_TYPE_LACPDU: |
---|
2396 | | - ret = RX_HANDLER_CONSUMED; |
---|
2397 | | - netdev_dbg(slave->bond->dev, |
---|
2398 | | - "Received LACPDU on port %d slave %s\n", |
---|
2399 | | - port->actor_port_number, |
---|
2400 | | - slave->dev->name); |
---|
2401 | | - /* Protect against concurrent state machines */ |
---|
2402 | | - spin_lock(&slave->bond->mode_lock); |
---|
2403 | | - ad_rx_machine(lacpdu, port); |
---|
2404 | | - spin_unlock(&slave->bond->mode_lock); |
---|
2405 | | - break; |
---|
2406 | | - |
---|
2407 | | - case AD_TYPE_MARKER: |
---|
2408 | | - ret = RX_HANDLER_CONSUMED; |
---|
2409 | | - /* No need to convert fields to Little Endian since we |
---|
2410 | | - * don't use the marker's fields. |
---|
2411 | | - */ |
---|
2412 | | - |
---|
2413 | | - switch (((struct bond_marker *)lacpdu)->tlv_type) { |
---|
2414 | | - case AD_MARKER_INFORMATION_SUBTYPE: |
---|
2415 | | - netdev_dbg(slave->bond->dev, "Received Marker Information on port %d\n", |
---|
2416 | | - port->actor_port_number); |
---|
2417 | | - ad_marker_info_received((struct bond_marker *)lacpdu, port); |
---|
2418 | | - break; |
---|
2419 | | - |
---|
2420 | | - case AD_MARKER_RESPONSE_SUBTYPE: |
---|
2421 | | - netdev_dbg(slave->bond->dev, "Received Marker Response on port %d\n", |
---|
2422 | | - port->actor_port_number); |
---|
2423 | | - ad_marker_response_received((struct bond_marker *)lacpdu, port); |
---|
2424 | | - break; |
---|
2425 | | - |
---|
2426 | | - default: |
---|
2427 | | - netdev_dbg(slave->bond->dev, "Received an unknown Marker subtype on slot %d\n", |
---|
2428 | | - port->actor_port_number); |
---|
2429 | | - } |
---|
2430 | | - } |
---|
| 2391 | + port = &(SLAVE_AD_INFO(slave)->port); |
---|
| 2392 | + if (!port->slave) { |
---|
| 2393 | + net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n", |
---|
| 2394 | + slave->dev->name, slave->bond->dev->name); |
---|
| 2395 | + return ret; |
---|
2431 | 2396 | } |
---|
| 2397 | + |
---|
| 2398 | + switch (lacpdu->subtype) { |
---|
| 2399 | + case AD_TYPE_LACPDU: |
---|
| 2400 | + ret = RX_HANDLER_CONSUMED; |
---|
| 2401 | + slave_dbg(slave->bond->dev, slave->dev, |
---|
| 2402 | + "Received LACPDU on port %d\n", |
---|
| 2403 | + port->actor_port_number); |
---|
| 2404 | + /* Protect against concurrent state machines */ |
---|
| 2405 | + spin_lock(&slave->bond->mode_lock); |
---|
| 2406 | + ad_rx_machine(lacpdu, port); |
---|
| 2407 | + spin_unlock(&slave->bond->mode_lock); |
---|
| 2408 | + break; |
---|
| 2409 | + case AD_TYPE_MARKER: |
---|
| 2410 | + ret = RX_HANDLER_CONSUMED; |
---|
| 2411 | + /* No need to convert fields to Little Endian since we |
---|
| 2412 | + * don't use the marker's fields. |
---|
| 2413 | + */ |
---|
| 2414 | + marker = (struct bond_marker *)lacpdu; |
---|
| 2415 | + switch (marker->tlv_type) { |
---|
| 2416 | + case AD_MARKER_INFORMATION_SUBTYPE: |
---|
| 2417 | + slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n", |
---|
| 2418 | + port->actor_port_number); |
---|
| 2419 | + ad_marker_info_received(marker, port); |
---|
| 2420 | + break; |
---|
| 2421 | + case AD_MARKER_RESPONSE_SUBTYPE: |
---|
| 2422 | + slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n", |
---|
| 2423 | + port->actor_port_number); |
---|
| 2424 | + ad_marker_response_received(marker, port); |
---|
| 2425 | + break; |
---|
| 2426 | + default: |
---|
| 2427 | + slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n", |
---|
| 2428 | + port->actor_port_number); |
---|
| 2429 | + stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx; |
---|
| 2430 | + atomic64_inc(stat); |
---|
| 2431 | + stat = &BOND_AD_INFO(bond).stats.marker_unknown_rx; |
---|
| 2432 | + atomic64_inc(stat); |
---|
| 2433 | + } |
---|
| 2434 | + break; |
---|
| 2435 | + default: |
---|
| 2436 | + atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx); |
---|
| 2437 | + atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_unknown_rx); |
---|
| 2438 | + } |
---|
| 2439 | + |
---|
2432 | 2440 | return ret; |
---|
2433 | 2441 | } |
---|
2434 | 2442 | |
---|
.. | .. |
---|
2467 | 2475 | |
---|
2468 | 2476 | if (!reset) { |
---|
2469 | 2477 | if (!speed) { |
---|
2470 | | - netdev_err(port->slave->dev, |
---|
2471 | | - "speed changed to 0 for port %s", |
---|
2472 | | - port->slave->dev->name); |
---|
| 2478 | + slave_err(port->slave->bond->dev, |
---|
| 2479 | + port->slave->dev, |
---|
| 2480 | + "speed changed to 0 on port %d\n", |
---|
| 2481 | + port->actor_port_number); |
---|
2473 | 2482 | } else if (duplex && ospeed != speed) { |
---|
2474 | 2483 | /* Speed change restarts LACP state-machine */ |
---|
2475 | 2484 | port->sm_vars |= AD_PORT_BEGIN; |
---|
.. | .. |
---|
2494 | 2503 | |
---|
2495 | 2504 | /* if slave is null, the whole port is not initialized */ |
---|
2496 | 2505 | if (!port->slave) { |
---|
2497 | | - netdev_warn(slave->bond->dev, |
---|
2498 | | - "speed/duplex changed for uninitialized port %s\n", |
---|
2499 | | - slave->dev->name); |
---|
| 2506 | + slave_warn(slave->bond->dev, slave->dev, |
---|
| 2507 | + "speed/duplex changed for uninitialized port\n"); |
---|
2500 | 2508 | return; |
---|
2501 | 2509 | } |
---|
2502 | 2510 | |
---|
2503 | 2511 | spin_lock_bh(&slave->bond->mode_lock); |
---|
2504 | 2512 | ad_update_actor_keys(port, false); |
---|
2505 | 2513 | spin_unlock_bh(&slave->bond->mode_lock); |
---|
2506 | | - netdev_dbg(slave->bond->dev, "Port %d slave %s changed speed/duplex\n", |
---|
2507 | | - port->actor_port_number, slave->dev->name); |
---|
| 2514 | + slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n", |
---|
| 2515 | + port->actor_port_number); |
---|
2508 | 2516 | } |
---|
2509 | 2517 | |
---|
2510 | 2518 | /** |
---|
2511 | 2519 | * bond_3ad_handle_link_change - handle a slave's link status change indication |
---|
2512 | 2520 | * @slave: slave struct to work on |
---|
2513 | | - * @status: whether the link is now up or down |
---|
| 2521 | + * @link: whether the link is now up or down |
---|
2514 | 2522 | * |
---|
2515 | 2523 | * Handle reselection of aggregator (if needed) for this port. |
---|
2516 | 2524 | */ |
---|
.. | .. |
---|
2524 | 2532 | |
---|
2525 | 2533 | /* if slave is null, the whole port is not initialized */ |
---|
2526 | 2534 | if (!port->slave) { |
---|
2527 | | - netdev_warn(slave->bond->dev, "link status changed for uninitialized port on %s\n", |
---|
2528 | | - slave->dev->name); |
---|
| 2535 | + slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n"); |
---|
2529 | 2536 | return; |
---|
2530 | 2537 | } |
---|
2531 | 2538 | |
---|
.. | .. |
---|
2550 | 2557 | |
---|
2551 | 2558 | spin_unlock_bh(&slave->bond->mode_lock); |
---|
2552 | 2559 | |
---|
2553 | | - netdev_dbg(slave->bond->dev, "Port %d changed link status to %s\n", |
---|
2554 | | - port->actor_port_number, |
---|
2555 | | - link == BOND_LINK_UP ? "UP" : "DOWN"); |
---|
| 2560 | + slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n", |
---|
| 2561 | + port->actor_port_number, |
---|
| 2562 | + link == BOND_LINK_UP ? "UP" : "DOWN"); |
---|
2556 | 2563 | |
---|
2557 | 2564 | /* RTNL is held and mode_lock is released so it's safe |
---|
2558 | 2565 | * to update slave_array here. |
---|
.. | .. |
---|
2562 | 2569 | |
---|
2563 | 2570 | /** |
---|
2564 | 2571 | * bond_3ad_set_carrier - set link state for bonding master |
---|
2565 | | - * @bond - bonding structure |
---|
| 2572 | + * @bond: bonding structure |
---|
2566 | 2573 | * |
---|
2567 | 2574 | * if we have an active aggregator, we're up, if not, we're down. |
---|
2568 | 2575 | * Presumes that we cannot have an active aggregator if there are |
---|
.. | .. |
---|
2664 | 2671 | return RX_HANDLER_ANOTHER; |
---|
2665 | 2672 | |
---|
2666 | 2673 | lacpdu = skb_header_pointer(skb, 0, sizeof(_lacpdu), &_lacpdu); |
---|
2667 | | - if (!lacpdu) |
---|
| 2674 | + if (!lacpdu) { |
---|
| 2675 | + atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx); |
---|
| 2676 | + atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_illegal_rx); |
---|
2668 | 2677 | return RX_HANDLER_ANOTHER; |
---|
| 2678 | + } |
---|
2669 | 2679 | |
---|
2670 | | - return bond_3ad_rx_indication(lacpdu, slave, skb->len); |
---|
| 2680 | + return bond_3ad_rx_indication(lacpdu, slave); |
---|
2671 | 2681 | } |
---|
2672 | 2682 | |
---|
2673 | 2683 | /** |
---|
2674 | 2684 | * bond_3ad_update_lacp_rate - change the lacp rate |
---|
2675 | | - * @bond - bonding struct |
---|
| 2685 | + * @bond: bonding struct |
---|
2676 | 2686 | * |
---|
2677 | 2687 | * When modify lacp_rate parameter via sysfs, |
---|
2678 | 2688 | * update actor_oper_port_state of each port. |
---|
.. | .. |
---|
2693 | 2703 | bond_for_each_slave(bond, slave, iter) { |
---|
2694 | 2704 | port = &(SLAVE_AD_INFO(slave)->port); |
---|
2695 | 2705 | if (lacp_fast) |
---|
2696 | | - port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT; |
---|
| 2706 | + port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT; |
---|
2697 | 2707 | else |
---|
2698 | | - port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT; |
---|
| 2708 | + port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT; |
---|
2699 | 2709 | } |
---|
2700 | 2710 | spin_unlock_bh(&bond->mode_lock); |
---|
2701 | 2711 | } |
---|
| 2712 | + |
---|
| 2713 | +size_t bond_3ad_stats_size(void) |
---|
| 2714 | +{ |
---|
| 2715 | + return nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_RX */ |
---|
| 2716 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_TX */ |
---|
| 2717 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_UNKNOWN_RX */ |
---|
| 2718 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_ILLEGAL_RX */ |
---|
| 2719 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RX */ |
---|
| 2720 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_TX */ |
---|
| 2721 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_RX */ |
---|
| 2722 | + nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_TX */ |
---|
| 2723 | + nla_total_size_64bit(sizeof(u64)); /* BOND_3AD_STAT_MARKER_UNKNOWN_RX */ |
---|
| 2724 | +} |
---|
| 2725 | + |
---|
| 2726 | +int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats) |
---|
| 2727 | +{ |
---|
| 2728 | + u64 val; |
---|
| 2729 | + |
---|
| 2730 | + val = atomic64_read(&stats->lacpdu_rx); |
---|
| 2731 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_RX, val, |
---|
| 2732 | + BOND_3AD_STAT_PAD)) |
---|
| 2733 | + return -EMSGSIZE; |
---|
| 2734 | + val = atomic64_read(&stats->lacpdu_tx); |
---|
| 2735 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_TX, val, |
---|
| 2736 | + BOND_3AD_STAT_PAD)) |
---|
| 2737 | + return -EMSGSIZE; |
---|
| 2738 | + val = atomic64_read(&stats->lacpdu_unknown_rx); |
---|
| 2739 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_UNKNOWN_RX, val, |
---|
| 2740 | + BOND_3AD_STAT_PAD)) |
---|
| 2741 | + return -EMSGSIZE; |
---|
| 2742 | + val = atomic64_read(&stats->lacpdu_illegal_rx); |
---|
| 2743 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_ILLEGAL_RX, val, |
---|
| 2744 | + BOND_3AD_STAT_PAD)) |
---|
| 2745 | + return -EMSGSIZE; |
---|
| 2746 | + |
---|
| 2747 | + val = atomic64_read(&stats->marker_rx); |
---|
| 2748 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RX, val, |
---|
| 2749 | + BOND_3AD_STAT_PAD)) |
---|
| 2750 | + return -EMSGSIZE; |
---|
| 2751 | + val = atomic64_read(&stats->marker_tx); |
---|
| 2752 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_TX, val, |
---|
| 2753 | + BOND_3AD_STAT_PAD)) |
---|
| 2754 | + return -EMSGSIZE; |
---|
| 2755 | + val = atomic64_read(&stats->marker_resp_rx); |
---|
| 2756 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_RX, val, |
---|
| 2757 | + BOND_3AD_STAT_PAD)) |
---|
| 2758 | + return -EMSGSIZE; |
---|
| 2759 | + val = atomic64_read(&stats->marker_resp_tx); |
---|
| 2760 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_TX, val, |
---|
| 2761 | + BOND_3AD_STAT_PAD)) |
---|
| 2762 | + return -EMSGSIZE; |
---|
| 2763 | + val = atomic64_read(&stats->marker_unknown_rx); |
---|
| 2764 | + if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_UNKNOWN_RX, val, |
---|
| 2765 | + BOND_3AD_STAT_PAD)) |
---|
| 2766 | + return -EMSGSIZE; |
---|
| 2767 | + |
---|
| 2768 | + return 0; |
---|
| 2769 | +} |
---|