hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/net/bonding/bond_3ad.c
....@@ -1,23 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * 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
- *
214 */
225
236 #include <linux/skbuff.h>
....@@ -31,6 +14,7 @@
3114 #include <net/net_namespace.h>
3215 #include <net/bonding.h>
3316 #include <net/bond_3ad.h>
17
+#include <net/netlink.h>
3418
3519 /* General definitions */
3620 #define AD_SHORT_TIMEOUT 1
....@@ -46,16 +30,6 @@
4630 #define AD_LONG_TIMEOUT_TIME (3*AD_SLOW_PERIODIC_TIME)
4731 #define AD_CHURN_DETECTION_TIME 60
4832 #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
5933
6034 /* Port Variables definitions used by the State Machines (43.4.7 in the
6135 * 802.3ad standard)
....@@ -111,8 +85,9 @@
11185 static u16 ad_ticks_per_sec;
11286 static const int ad_delta_in_ticks = (AD_TIMER_INTERVAL * HZ) / 1000;
11387
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
+};
11691
11792 /* ================= main 802.3ad protocol functions ================== */
11893 static int ad_lacpdu_send(struct port *port);
....@@ -156,7 +131,7 @@
156131
157132 /**
158133 * __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
160135 *
161136 * Return the aggregator of the first slave in @bond, or %NULL if it can't be
162137 * found.
....@@ -341,17 +316,17 @@
341316 default:
342317 /* unknown speed value from ethtool. shouldn't happen */
343318 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",
345320 slave->bond->dev->name,
346
- slave->speed,
321
+ slave->dev->name, slave->speed,
347322 port->actor_port_number);
348323 speed = 0;
349324 break;
350325 }
351326 }
352327
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);
355330 return speed;
356331 }
357332
....@@ -375,14 +350,14 @@
375350 switch (slave->duplex) {
376351 case DUPLEX_FULL:
377352 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);
380355 break;
381356 case DUPLEX_HALF:
382357 default:
383358 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);
386361 break;
387362 }
388363 }
....@@ -473,8 +448,8 @@
473448 MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) &&
474449 (ntohs(lacpdu->partner_system_priority) == port->actor_system_priority) &&
475450 (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)
478453 ) {
479454 port->sm_vars |= AD_PORT_MATCHED;
480455 } else {
....@@ -508,18 +483,20 @@
508483 partner->port_state = lacpdu->actor_state;
509484
510485 /* 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;
512487
513488 /* set the partner sync. to on if the partner is sync,
514489 * and the port is matched
515490 */
516491 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");
520496 } 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");
523500 }
524501 }
525502 }
....@@ -540,7 +517,7 @@
540517 sizeof(struct port_params));
541518
542519 /* 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;
544521 }
545522 }
546523
....@@ -570,7 +547,7 @@
570547 !MAC_ADDRESS_EQUAL(&lacpdu->actor_system, &partner->system) ||
571548 ntohs(lacpdu->actor_system_priority) != partner->system_priority ||
572549 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)) {
574551 port->sm_vars &= ~AD_PORT_SELECTED;
575552 }
576553 }
....@@ -602,8 +579,8 @@
602579 !MAC_ADDRESS_EQUAL(&admin->system, &oper->system) ||
603580 admin->system_priority != oper->system_priority ||
604581 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)) {
607584 port->sm_vars &= ~AD_PORT_SELECTED;
608585 }
609586 }
....@@ -633,10 +610,10 @@
633610 !MAC_ADDRESS_EQUAL(&(lacpdu->partner_system), &(port->actor_system)) ||
634611 (ntohs(lacpdu->partner_system_priority) != port->actor_system_priority) ||
635612 (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))
640617 ) {
641618 port->ntt = true;
642619 }
....@@ -805,8 +782,9 @@
805782 lacpdu->actor_port_priority = htons(port->actor_port_priority);
806783 lacpdu->actor_port = htons(port->actor_port_number);
807784 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);
810788
811789 /* lacpdu->reserved_3_1 initialized
812790 * lacpdu->tlv_type_partner_info initialized
....@@ -851,6 +829,9 @@
851829 if (!skb)
852830 return -ENOMEM;
853831
832
+ atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_tx);
833
+ atomic64_inc(&BOND_AD_INFO(slave->bond).stats.lacpdu_tx);
834
+
854835 skb->dev = slave->dev;
855836 skb_reset_mac_header(skb);
856837 skb->network_header = skb->mac_header + ETH_HLEN;
....@@ -891,6 +872,17 @@
891872 skb = dev_alloc_skb(length + 16);
892873 if (!skb)
893874 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
+ }
894886
895887 skb_reserve(skb, 16);
896888
....@@ -977,7 +969,7 @@
977969 * edable port will take place only after this timer)
978970 */
979971 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) &&
981973 !__check_agg_selection_timer(port)) {
982974 if (port->aggregator->is_active)
983975 port->sm_mux_state =
....@@ -995,14 +987,14 @@
995987 port->sm_mux_state = AD_MUX_DETACHED;
996988 } else if (port->aggregator->is_active) {
997989 port->actor_oper_port_state |=
998
- AD_STATE_SYNCHRONIZATION;
990
+ LACP_STATE_SYNCHRONIZATION;
999991 }
1000992 break;
1001993 case AD_MUX_COLLECTING_DISTRIBUTING:
1002994 if (!(port->sm_vars & AD_PORT_SELECTED) ||
1003995 (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)) {
1006998 port->sm_mux_state = AD_MUX_ATTACHED;
1007999 } else {
10081000 /* if port state hasn't changed make
....@@ -1024,18 +1016,18 @@
10241016
10251017 /* check if the state machine was changed */
10261018 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);
10321024 switch (port->sm_mux_state) {
10331025 case AD_MUX_DETACHED:
1034
- port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
1026
+ port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
10351027 ad_disable_collecting_distributing(port,
10361028 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;
10391031 port->ntt = true;
10401032 break;
10411033 case AD_MUX_WAITING:
....@@ -1044,20 +1036,20 @@
10441036 case AD_MUX_ATTACHED:
10451037 if (port->aggregator->is_active)
10461038 port->actor_oper_port_state |=
1047
- AD_STATE_SYNCHRONIZATION;
1039
+ LACP_STATE_SYNCHRONIZATION;
10481040 else
10491041 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;
10531045 ad_disable_collecting_distributing(port,
10541046 update_slave_arr);
10551047 port->ntt = true;
10561048 break;
10571049 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;
10611053 ad_enable_collecting_distributing(port,
10621054 update_slave_arr);
10631055 port->ntt = true;
....@@ -1086,6 +1078,10 @@
10861078 */
10871079 last_state = port->sm_rx_state;
10881080
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
+ }
10891085 /* check if state machine should change state */
10901086
10911087 /* first, check if port was reinitialized */
....@@ -1138,11 +1134,11 @@
11381134
11391135 /* check if the State machine was changed or new lacpdu arrived */
11401136 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);
11461142 switch (port->sm_rx_state) {
11471143 case AD_RX_INITIALIZE:
11481144 if (!(port->actor_oper_port_key & AD_DUPLEX_KEY_MASKS))
....@@ -1151,19 +1147,19 @@
11511147 port->sm_vars |= AD_PORT_LACP_ENABLED;
11521148 port->sm_vars &= ~AD_PORT_SELECTED;
11531149 __record_default(port);
1154
- port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1150
+ port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
11551151 port->sm_rx_state = AD_RX_PORT_DISABLED;
11561152
1157
- /* Fall Through */
1153
+ fallthrough;
11581154 case AD_RX_PORT_DISABLED:
11591155 port->sm_vars &= ~AD_PORT_MATCHED;
11601156 break;
11611157 case AD_RX_LACP_DISABLED:
11621158 port->sm_vars &= ~AD_PORT_SELECTED;
11631159 __record_default(port);
1164
- port->partner_oper.port_state &= ~AD_STATE_AGGREGATION;
1160
+ port->partner_oper.port_state &= ~LACP_STATE_AGGREGATION;
11651161 port->sm_vars |= AD_PORT_MATCHED;
1166
- port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1162
+ port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
11671163 break;
11681164 case AD_RX_EXPIRED:
11691165 /* Reset of the Synchronization flag (Standard 43.4.12)
....@@ -1172,34 +1168,33 @@
11721168 * case of EXPIRED even if LINK_DOWN didn't arrive for
11731169 * the port.
11741170 */
1175
- port->partner_oper.port_state &= ~AD_STATE_SYNCHRONIZATION;
1171
+ port->partner_oper.port_state &= ~LACP_STATE_SYNCHRONIZATION;
11761172 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;
11791175 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;
11811177 port->sm_vars |= AD_PORT_CHURNED;
11821178 break;
11831179 case AD_RX_DEFAULTED:
11841180 __update_default_selected(port);
11851181 __record_default(port);
11861182 port->sm_vars |= AD_PORT_MATCHED;
1187
- port->actor_oper_port_state &= ~AD_STATE_EXPIRED;
1183
+ port->actor_oper_port_state &= ~LACP_STATE_EXPIRED;
11881184 break;
11891185 case AD_RX_CURRENT:
11901186 /* detect loopback situation */
11911187 if (MAC_ADDRESS_EQUAL(&(lacpdu->actor_system),
11921188 &(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");
11961191 return;
11971192 }
11981193 __update_selected(lacpdu, port);
11991194 __update_ntt(lacpdu, port);
12001195 __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;
12031198 break;
12041199 default:
12051200 break;
....@@ -1220,14 +1215,14 @@
12201215 port->sm_churn_partner_state = AD_CHURN_MONITOR;
12211216 port->sm_churn_actor_timer_counter =
12221217 __ad_timer_to_ticks(AD_ACTOR_CHURN_TIMER, 0);
1223
- port->sm_churn_partner_timer_counter =
1218
+ port->sm_churn_partner_timer_counter =
12241219 __ad_timer_to_ticks(AD_PARTNER_CHURN_TIMER, 0);
12251220 return;
12261221 }
12271222 if (port->sm_churn_actor_timer_counter &&
12281223 !(--port->sm_churn_actor_timer_counter) &&
12291224 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) {
12311226 port->sm_churn_actor_state = AD_NO_CHURN;
12321227 } else {
12331228 port->churn_actor_count++;
....@@ -1237,7 +1232,7 @@
12371232 if (port->sm_churn_partner_timer_counter &&
12381233 !(--port->sm_churn_partner_timer_counter) &&
12391234 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) {
12411236 port->sm_churn_partner_state = AD_NO_CHURN;
12421237 } else {
12431238 port->churn_partner_count++;
....@@ -1261,8 +1256,10 @@
12611256 __update_lacpdu_from_port(port);
12621257
12631258 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);
12661263
12671264 /* mark ntt as false, so it will not be sent
12681265 * again until demanded
....@@ -1292,7 +1289,7 @@
12921289
12931290 /* check if port was reinitialized */
12941291 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))
12961293 ) {
12971294 port->sm_periodic_state = AD_NO_PERIODIC;
12981295 }
....@@ -1309,11 +1306,11 @@
13091306 switch (port->sm_periodic_state) {
13101307 case AD_FAST_PERIODIC:
13111308 if (!(port->partner_oper.port_state
1312
- & AD_STATE_LACP_TIMEOUT))
1309
+ & LACP_STATE_LACP_TIMEOUT))
13131310 port->sm_periodic_state = AD_SLOW_PERIODIC;
13141311 break;
13151312 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)) {
13171314 port->sm_periodic_timer_counter = 0;
13181315 port->sm_periodic_state = AD_PERIODIC_TX;
13191316 }
....@@ -1329,7 +1326,7 @@
13291326 break;
13301327 case AD_PERIODIC_TX:
13311328 if (!(port->partner_oper.port_state &
1332
- AD_STATE_LACP_TIMEOUT))
1329
+ LACP_STATE_LACP_TIMEOUT))
13331330 port->sm_periodic_state = AD_SLOW_PERIODIC;
13341331 else
13351332 port->sm_periodic_state = AD_FAST_PERIODIC;
....@@ -1341,9 +1338,10 @@
13411338
13421339 /* check if the state machine was changed */
13431340 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);
13471345 switch (port->sm_periodic_state) {
13481346 case AD_NO_PERIODIC:
13491347 port->sm_periodic_timer_counter = 0;
....@@ -1419,9 +1417,9 @@
14191417 port->next_port_in_aggregator = NULL;
14201418 port->actor_port_aggregator_identifier = 0;
14211419
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);
14251423 /* if the aggregator is empty, clear its
14261424 * parameters, and set it ready to be attached
14271425 */
....@@ -1434,10 +1432,10 @@
14341432 /* meaning: the port was related to an aggregator
14351433 * but was not on the aggregator port list
14361434 */
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",
14381436 port->slave->bond->dev->name,
1439
- port->actor_port_number,
14401437 port->slave->dev->name,
1438
+ port->actor_port_number,
14411439 port->aggregator->aggregator_identifier);
14421440 }
14431441 }
....@@ -1468,9 +1466,9 @@
14681466 port->next_port_in_aggregator = aggregator->lag_ports;
14691467 port->aggregator->num_of_ports++;
14701468 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);
14741472
14751473 /* mark this port as selected */
14761474 port->sm_vars |= AD_PORT_SELECTED;
....@@ -1515,12 +1513,13 @@
15151513 /* mark this port as selected */
15161514 port->sm_vars |= AD_PORT_SELECTED;
15171515
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);
15211519 } 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);
15241523 }
15251524 }
15261525 /* if all aggregator's ports are READY_N == TRUE, set ready=TRUE
....@@ -1534,7 +1533,7 @@
15341533 ad_agg_selection_logic(aggregator, update_slave_arr);
15351534
15361535 if (!port->aggregator->is_active)
1537
- port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
1536
+ port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
15381537 }
15391538
15401539 /* Decide if "agg" is a better choice for the new active aggregator that
....@@ -1590,7 +1589,7 @@
15901589 if (__agg_active_ports(curr) < __agg_active_ports(best))
15911590 return best;
15921591
1593
- /*FALLTHROUGH*/
1592
+ fallthrough;
15941593 case BOND_AD_STABLE:
15951594 case BOND_AD_BANDWIDTH:
15961595 if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best))
....@@ -1599,8 +1598,9 @@
15991598 break;
16001599
16011600 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",
16031602 curr->slave->bond->dev->name,
1603
+ curr->slave->dev->name,
16041604 __get_agg_selection_mode(curr->lag_ports));
16051605 break;
16061606 }
....@@ -1627,7 +1627,7 @@
16271627
16281628 /**
16291629 * 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
16311631 * @update_slave_arr: Does slave array need update?
16321632 *
16331633 * It is assumed that only one aggregator may be selected for a team.
....@@ -1701,36 +1701,37 @@
17011701
17021702 /* if there is new best aggregator, activate it */
17031703 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",
17051706 best->aggregator_identifier, best->num_of_ports,
17061707 best->actor_oper_aggregator_key,
17071708 best->partner_oper_aggregator_key,
17081709 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);
17121713
17131714 bond_for_each_slave_rcu(bond, slave, iter) {
17141715 agg = &(SLAVE_AD_INFO(slave)->aggregator);
17151716
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);
17211722 }
17221723
1723
- /* check if any partner replys */
1724
- if (best->is_individual) {
1724
+ /* check if any partner replies */
1725
+ if (best->is_individual)
17251726 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);
17291728
17301729 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",
17321732 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",
17341735 best->aggregator_identifier, best->num_of_ports,
17351736 best->actor_oper_aggregator_key,
17361737 best->partner_oper_aggregator_key,
....@@ -1787,7 +1788,9 @@
17871788 aggregator->lag_ports = NULL;
17881789 aggregator->is_active = 0;
17891790 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",
17911794 aggregator->aggregator_identifier);
17921795 }
17931796 }
....@@ -1809,7 +1812,7 @@
18091812
18101813 /**
18111814 * 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
18131816 * @lacp_fast: boolean. whether fast periodic should be used
18141817 */
18151818 static void ad_initialize_port(struct port *port, int lacp_fast)
....@@ -1837,13 +1840,13 @@
18371840 port->actor_port_priority = 0xff;
18381841 port->actor_port_aggregator_identifier = 0;
18391842 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;
18441847
18451848 if (lacp_fast)
1846
- port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
1849
+ port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
18471850
18481851 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
18491852 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
....@@ -1884,9 +1887,10 @@
18841887 bool *update_slave_arr)
18851888 {
18861889 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);
18901894 __enable_port(port);
18911895 /* Slave array needs update */
18921896 *update_slave_arr = true;
....@@ -1904,9 +1908,10 @@
19041908 if (port->aggregator &&
19051909 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system),
19061910 &(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);
19101915 __disable_port(port);
19111916 /* Slave array needs an update */
19121917 *update_slave_arr = true;
....@@ -1919,9 +1924,12 @@
19191924 * @port: the port we're looking at
19201925 */
19211926 static void ad_marker_info_received(struct bond_marker *marker_info,
1922
- struct port *port)
1927
+ struct port *port)
19231928 {
19241929 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);
19251933
19261934 /* copy the received marker data to the response marker */
19271935 memcpy(&marker, marker_info, sizeof(struct bond_marker));
....@@ -1929,10 +1937,10 @@
19291937 marker.tlv_type = AD_MARKER_RESPONSE_SUBTYPE;
19301938
19311939 /* 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);
19361944 }
19371945
19381946 /**
....@@ -1947,6 +1955,9 @@
19471955 static void ad_marker_response_received(struct bond_marker *marker,
19481956 struct port *port)
19491957 {
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
+
19501961 /* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */
19511962 }
19521963
....@@ -1958,6 +1969,7 @@
19581969 /**
19591970 * bond_3ad_initiate_agg_selection - initate aggregator selection
19601971 * @bond: bonding struct
1972
+ * @timeout: timeout value to set
19611973 *
19621974 * Set the aggregation selection timer, to initiate an agg selection in
19631975 * the very near future. Called during first initialization, and during
....@@ -1977,30 +1989,24 @@
19771989 */
19781990 void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution)
19791991 {
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);
19832001
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;
19852006
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);
20042010 }
20052011
20062012 /**
....@@ -2078,19 +2084,18 @@
20782084
20792085 /* if slave is null, the whole port is not initialized */
20802086 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");
20832088 goto out;
20842089 }
20852090
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);
20882093
20892094 /* 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;
20942099 __update_lacpdu_from_port(port);
20952100 ad_lacpdu_send(port);
20962101
....@@ -2122,14 +2127,14 @@
21222127 * new aggregator
21232128 */
21242129 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);
21282133
21292134 if ((new_aggregator->lag_ports == port) &&
21302135 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;
21332138 }
21342139
21352140 new_aggregator->is_individual = aggregator->is_individual;
....@@ -2159,7 +2164,7 @@
21592164 ad_agg_selection_logic(__get_first_agg(port),
21602165 &dummy_slave_update);
21612166 } 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");
21632168 }
21642169 } else {
21652170 /* in case that the only port related to this
....@@ -2168,7 +2173,7 @@
21682173 select_new_active_agg = aggregator->is_active;
21692174 ad_clear_agg(aggregator);
21702175 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");
21722177 /* select new active aggregator */
21732178 temp_aggregator = __get_first_agg(port);
21742179 if (temp_aggregator)
....@@ -2178,7 +2183,7 @@
21782183 }
21792184 }
21802185
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);
21822187
21832188 /* find the aggregator that this port is connected to */
21842189 bond_for_each_slave(bond, slave_iter, iter) {
....@@ -2199,9 +2204,10 @@
21992204 temp_aggregator->num_of_ports--;
22002205 if (__agg_active_ports(temp_aggregator) == 0) {
22012206 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);
22032209 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");
22052211 /* select new active aggregator */
22062212 ad_agg_selection_logic(__get_first_agg(port),
22072213 &dummy_slave_update);
....@@ -2273,7 +2279,7 @@
22732279
22742280 /**
22752281 * 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
22772283 *
22782284 * The state machine handling concept in this module is to check every tick
22792285 * which state machine should operate any function. The execution order is
....@@ -2369,66 +2375,68 @@
23692375 * bond_3ad_rx_indication - handle a received frame
23702376 * @lacpdu: received lacpdu
23712377 * @slave: slave struct to work on
2372
- * @length: length of the data received
23732378 *
23742379 * It is assumed that frames that were sent on this NIC don't returned as new
23752380 * received frames (loopback). Since only the payload is given to this
23762381 * function, it check for loopback.
23772382 */
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)
23802384 {
2381
- struct port *port;
2385
+ struct bonding *bond = slave->bond;
23822386 int ret = RX_HANDLER_ANOTHER;
2387
+ struct bond_marker *marker;
2388
+ struct port *port;
2389
+ atomic64_t *stat;
23832390
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;
24312396 }
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
+
24322440 return ret;
24332441 }
24342442
....@@ -2467,9 +2475,10 @@
24672475
24682476 if (!reset) {
24692477 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);
24732482 } else if (duplex && ospeed != speed) {
24742483 /* Speed change restarts LACP state-machine */
24752484 port->sm_vars |= AD_PORT_BEGIN;
....@@ -2494,23 +2503,22 @@
24942503
24952504 /* if slave is null, the whole port is not initialized */
24962505 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");
25002508 return;
25012509 }
25022510
25032511 spin_lock_bh(&slave->bond->mode_lock);
25042512 ad_update_actor_keys(port, false);
25052513 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);
25082516 }
25092517
25102518 /**
25112519 * bond_3ad_handle_link_change - handle a slave's link status change indication
25122520 * @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
25142522 *
25152523 * Handle reselection of aggregator (if needed) for this port.
25162524 */
....@@ -2524,8 +2532,7 @@
25242532
25252533 /* if slave is null, the whole port is not initialized */
25262534 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");
25292536 return;
25302537 }
25312538
....@@ -2550,9 +2557,9 @@
25502557
25512558 spin_unlock_bh(&slave->bond->mode_lock);
25522559
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");
25562563
25572564 /* RTNL is held and mode_lock is released so it's safe
25582565 * to update slave_array here.
....@@ -2562,7 +2569,7 @@
25622569
25632570 /**
25642571 * bond_3ad_set_carrier - set link state for bonding master
2565
- * @bond - bonding structure
2572
+ * @bond: bonding structure
25662573 *
25672574 * if we have an active aggregator, we're up, if not, we're down.
25682575 * Presumes that we cannot have an active aggregator if there are
....@@ -2664,15 +2671,18 @@
26642671 return RX_HANDLER_ANOTHER;
26652672
26662673 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);
26682677 return RX_HANDLER_ANOTHER;
2678
+ }
26692679
2670
- return bond_3ad_rx_indication(lacpdu, slave, skb->len);
2680
+ return bond_3ad_rx_indication(lacpdu, slave);
26712681 }
26722682
26732683 /**
26742684 * bond_3ad_update_lacp_rate - change the lacp rate
2675
- * @bond - bonding struct
2685
+ * @bond: bonding struct
26762686 *
26772687 * When modify lacp_rate parameter via sysfs,
26782688 * update actor_oper_port_state of each port.
....@@ -2693,9 +2703,67 @@
26932703 bond_for_each_slave(bond, slave, iter) {
26942704 port = &(SLAVE_AD_INFO(slave)->port);
26952705 if (lacp_fast)
2696
- port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
2706
+ port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
26972707 else
2698
- port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT;
2708
+ port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT;
26992709 }
27002710 spin_unlock_bh(&bond->mode_lock);
27012711 }
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
+}