hc
2024-09-20 a36159eec6ca17402b0e146b86efaf76568dc353
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,14 @@
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);
1523
+ return;
15241524 }
15251525 }
15261526 /* if all aggregator's ports are READY_N == TRUE, set ready=TRUE
....@@ -1534,7 +1534,7 @@
15341534 ad_agg_selection_logic(aggregator, update_slave_arr);
15351535
15361536 if (!port->aggregator->is_active)
1537
- port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION;
1537
+ port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
15381538 }
15391539
15401540 /* Decide if "agg" is a better choice for the new active aggregator that
....@@ -1590,7 +1590,7 @@
15901590 if (__agg_active_ports(curr) < __agg_active_ports(best))
15911591 return best;
15921592
1593
- /*FALLTHROUGH*/
1593
+ fallthrough;
15941594 case BOND_AD_STABLE:
15951595 case BOND_AD_BANDWIDTH:
15961596 if (__get_agg_bandwidth(curr) > __get_agg_bandwidth(best))
....@@ -1599,8 +1599,9 @@
15991599 break;
16001600
16011601 default:
1602
- net_warn_ratelimited("%s: Impossible agg select mode %d\n",
1602
+ net_warn_ratelimited("%s: (slave %s): Impossible agg select mode %d\n",
16031603 curr->slave->bond->dev->name,
1604
+ curr->slave->dev->name,
16041605 __get_agg_selection_mode(curr->lag_ports));
16051606 break;
16061607 }
....@@ -1627,7 +1628,7 @@
16271628
16281629 /**
16291630 * ad_agg_selection_logic - select an aggregation group for a team
1630
- * @aggregator: the aggregator we're looking at
1631
+ * @agg: the aggregator we're looking at
16311632 * @update_slave_arr: Does slave array need update?
16321633 *
16331634 * It is assumed that only one aggregator may be selected for a team.
....@@ -1701,36 +1702,37 @@
17011702
17021703 /* if there is new best aggregator, activate it */
17031704 if (best) {
1704
- netdev_dbg(bond->dev, "best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1705
+ netdev_dbg(bond->dev, "(slave %s): best Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1706
+ best->slave ? best->slave->dev->name : "NULL",
17051707 best->aggregator_identifier, best->num_of_ports,
17061708 best->actor_oper_aggregator_key,
17071709 best->partner_oper_aggregator_key,
17081710 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");
1711
+ netdev_dbg(bond->dev, "(slave %s): best ports %p slave %p\n",
1712
+ best->slave ? best->slave->dev->name : "NULL",
1713
+ best->lag_ports, best->slave);
17121714
17131715 bond_for_each_slave_rcu(bond, slave, iter) {
17141716 agg = &(SLAVE_AD_INFO(slave)->aggregator);
17151717
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);
1718
+ slave_dbg(bond->dev, slave->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1719
+ agg->aggregator_identifier, agg->num_of_ports,
1720
+ agg->actor_oper_aggregator_key,
1721
+ agg->partner_oper_aggregator_key,
1722
+ agg->is_individual, agg->is_active);
17211723 }
17221724
1723
- /* check if any partner replys */
1724
- if (best->is_individual) {
1725
+ /* check if any partner replies */
1726
+ if (best->is_individual)
17251727 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
- }
1728
+ bond->dev->name);
17291729
17301730 best->is_active = 1;
1731
- netdev_dbg(bond->dev, "LAG %d chosen as the active LAG\n",
1731
+ netdev_dbg(bond->dev, "(slave %s): LAG %d chosen as the active LAG\n",
1732
+ best->slave ? best->slave->dev->name : "NULL",
17321733 best->aggregator_identifier);
1733
- netdev_dbg(bond->dev, "Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1734
+ netdev_dbg(bond->dev, "(slave %s): Agg=%d; P=%d; a k=%d; p k=%d; Ind=%d; Act=%d\n",
1735
+ best->slave ? best->slave->dev->name : "NULL",
17341736 best->aggregator_identifier, best->num_of_ports,
17351737 best->actor_oper_aggregator_key,
17361738 best->partner_oper_aggregator_key,
....@@ -1787,7 +1789,9 @@
17871789 aggregator->lag_ports = NULL;
17881790 aggregator->is_active = 0;
17891791 aggregator->num_of_ports = 0;
1790
- pr_debug("LAG %d was cleared\n",
1792
+ pr_debug("%s: LAG %d was cleared\n",
1793
+ aggregator->slave ?
1794
+ aggregator->slave->dev->name : "NULL",
17911795 aggregator->aggregator_identifier);
17921796 }
17931797 }
....@@ -1809,7 +1813,7 @@
18091813
18101814 /**
18111815 * ad_initialize_port - initialize a given port's parameters
1812
- * @aggregator: the aggregator we're looking at
1816
+ * @port: the port we're looking at
18131817 * @lacp_fast: boolean. whether fast periodic should be used
18141818 */
18151819 static void ad_initialize_port(struct port *port, int lacp_fast)
....@@ -1837,13 +1841,13 @@
18371841 port->actor_port_priority = 0xff;
18381842 port->actor_port_aggregator_identifier = 0;
18391843 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;
1844
+ port->actor_admin_port_state = LACP_STATE_AGGREGATION |
1845
+ LACP_STATE_LACP_ACTIVITY;
1846
+ port->actor_oper_port_state = LACP_STATE_AGGREGATION |
1847
+ LACP_STATE_LACP_ACTIVITY;
18441848
18451849 if (lacp_fast)
1846
- port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
1850
+ port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
18471851
18481852 memcpy(&port->partner_admin, &tmpl, sizeof(tmpl));
18491853 memcpy(&port->partner_oper, &tmpl, sizeof(tmpl));
....@@ -1884,9 +1888,10 @@
18841888 bool *update_slave_arr)
18851889 {
18861890 if (port->aggregator->is_active) {
1887
- pr_debug("Enabling port %d(LAG %d)\n",
1888
- port->actor_port_number,
1889
- port->aggregator->aggregator_identifier);
1891
+ slave_dbg(port->slave->bond->dev, port->slave->dev,
1892
+ "Enabling port %d (LAG %d)\n",
1893
+ port->actor_port_number,
1894
+ port->aggregator->aggregator_identifier);
18901895 __enable_port(port);
18911896 /* Slave array needs update */
18921897 *update_slave_arr = true;
....@@ -1904,9 +1909,10 @@
19041909 if (port->aggregator &&
19051910 !MAC_ADDRESS_EQUAL(&(port->aggregator->partner_system),
19061911 &(null_mac_addr))) {
1907
- pr_debug("Disabling port %d(LAG %d)\n",
1908
- port->actor_port_number,
1909
- port->aggregator->aggregator_identifier);
1912
+ slave_dbg(port->slave->bond->dev, port->slave->dev,
1913
+ "Disabling port %d (LAG %d)\n",
1914
+ port->actor_port_number,
1915
+ port->aggregator->aggregator_identifier);
19101916 __disable_port(port);
19111917 /* Slave array needs an update */
19121918 *update_slave_arr = true;
....@@ -1919,9 +1925,12 @@
19191925 * @port: the port we're looking at
19201926 */
19211927 static void ad_marker_info_received(struct bond_marker *marker_info,
1922
- struct port *port)
1928
+ struct port *port)
19231929 {
19241930 struct bond_marker marker;
1931
+
1932
+ atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_rx);
1933
+ atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_rx);
19251934
19261935 /* copy the received marker data to the response marker */
19271936 memcpy(&marker, marker_info, sizeof(struct bond_marker));
....@@ -1929,10 +1938,10 @@
19291938 marker.tlv_type = AD_MARKER_RESPONSE_SUBTYPE;
19301939
19311940 /* 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
- }
1941
+ if (ad_marker_send(port, &marker) >= 0)
1942
+ slave_dbg(port->slave->bond->dev, port->slave->dev,
1943
+ "Sent Marker Response on port %d\n",
1944
+ port->actor_port_number);
19361945 }
19371946
19381947 /**
....@@ -1947,6 +1956,9 @@
19471956 static void ad_marker_response_received(struct bond_marker *marker,
19481957 struct port *port)
19491958 {
1959
+ atomic64_inc(&SLAVE_AD_INFO(port->slave)->stats.marker_resp_rx);
1960
+ atomic64_inc(&BOND_AD_INFO(port->slave->bond).stats.marker_resp_rx);
1961
+
19501962 /* DO NOTHING, SINCE WE DECIDED NOT TO IMPLEMENT THIS FEATURE FOR NOW */
19511963 }
19521964
....@@ -1958,6 +1970,7 @@
19581970 /**
19591971 * bond_3ad_initiate_agg_selection - initate aggregator selection
19601972 * @bond: bonding struct
1973
+ * @timeout: timeout value to set
19611974 *
19621975 * Set the aggregation selection timer, to initiate an agg selection in
19631976 * the very near future. Called during first initialization, and during
....@@ -1977,30 +1990,24 @@
19771990 */
19781991 void bond_3ad_initialize(struct bonding *bond, u16 tick_resolution)
19791992 {
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)) {
1993
+ BOND_AD_INFO(bond).aggregator_identifier = 0;
1994
+ BOND_AD_INFO(bond).system.sys_priority =
1995
+ bond->params.ad_actor_sys_prio;
1996
+ if (is_zero_ether_addr(bond->params.ad_actor_system))
1997
+ BOND_AD_INFO(bond).system.sys_mac_addr =
1998
+ *((struct mac_addr *)bond->dev->dev_addr);
1999
+ else
2000
+ BOND_AD_INFO(bond).system.sys_mac_addr =
2001
+ *((struct mac_addr *)bond->params.ad_actor_system);
19832002
1984
- BOND_AD_INFO(bond).aggregator_identifier = 0;
2003
+ /* initialize how many times this module is called in one
2004
+ * second (should be about every 100ms)
2005
+ */
2006
+ ad_ticks_per_sec = tick_resolution;
19852007
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
- }
2008
+ bond_3ad_initiate_agg_selection(bond,
2009
+ AD_AGGREGATOR_SELECTION_TIMER *
2010
+ ad_ticks_per_sec);
20042011 }
20052012
20062013 /**
....@@ -2078,19 +2085,18 @@
20782085
20792086 /* if slave is null, the whole port is not initialized */
20802087 if (!port->slave) {
2081
- netdev_warn(bond->dev, "Trying to unbind an uninitialized port on %s\n",
2082
- slave->dev->name);
2088
+ slave_warn(bond->dev, slave->dev, "Trying to unbind an uninitialized port\n");
20832089 goto out;
20842090 }
20852091
2086
- netdev_dbg(bond->dev, "Unbinding Link Aggregation Group %d\n",
2087
- aggregator->aggregator_identifier);
2092
+ slave_dbg(bond->dev, slave->dev, "Unbinding Link Aggregation Group %d\n",
2093
+ aggregator->aggregator_identifier);
20882094
20892095 /* 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;
2096
+ port->actor_oper_port_state &= ~LACP_STATE_SYNCHRONIZATION;
2097
+ port->actor_oper_port_state &= ~LACP_STATE_COLLECTING;
2098
+ port->actor_oper_port_state &= ~LACP_STATE_DISTRIBUTING;
2099
+ port->actor_oper_port_state &= ~LACP_STATE_AGGREGATION;
20942100 __update_lacpdu_from_port(port);
20952101 ad_lacpdu_send(port);
20962102
....@@ -2122,14 +2128,14 @@
21222128 * new aggregator
21232129 */
21242130 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);
2131
+ slave_dbg(bond->dev, slave->dev, "Some port(s) related to LAG %d - replacing with LAG %d\n",
2132
+ aggregator->aggregator_identifier,
2133
+ new_aggregator->aggregator_identifier);
21282134
21292135 if ((new_aggregator->lag_ports == port) &&
21302136 new_aggregator->is_active) {
2131
- netdev_info(bond->dev, "Removing an active aggregator\n");
2132
- select_new_active_agg = 1;
2137
+ slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
2138
+ select_new_active_agg = 1;
21332139 }
21342140
21352141 new_aggregator->is_individual = aggregator->is_individual;
....@@ -2159,7 +2165,7 @@
21592165 ad_agg_selection_logic(__get_first_agg(port),
21602166 &dummy_slave_update);
21612167 } else {
2162
- netdev_warn(bond->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n");
2168
+ slave_warn(bond->dev, slave->dev, "unbinding aggregator, and could not find a new aggregator for its ports\n");
21632169 }
21642170 } else {
21652171 /* in case that the only port related to this
....@@ -2168,7 +2174,7 @@
21682174 select_new_active_agg = aggregator->is_active;
21692175 ad_clear_agg(aggregator);
21702176 if (select_new_active_agg) {
2171
- netdev_info(bond->dev, "Removing an active aggregator\n");
2177
+ slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
21722178 /* select new active aggregator */
21732179 temp_aggregator = __get_first_agg(port);
21742180 if (temp_aggregator)
....@@ -2178,7 +2184,7 @@
21782184 }
21792185 }
21802186
2181
- netdev_dbg(bond->dev, "Unbinding port %d\n", port->actor_port_number);
2187
+ slave_dbg(bond->dev, slave->dev, "Unbinding port %d\n", port->actor_port_number);
21822188
21832189 /* find the aggregator that this port is connected to */
21842190 bond_for_each_slave(bond, slave_iter, iter) {
....@@ -2199,9 +2205,10 @@
21992205 temp_aggregator->num_of_ports--;
22002206 if (__agg_active_ports(temp_aggregator) == 0) {
22012207 select_new_active_agg = temp_aggregator->is_active;
2202
- ad_clear_agg(temp_aggregator);
2208
+ if (temp_aggregator->num_of_ports == 0)
2209
+ ad_clear_agg(temp_aggregator);
22032210 if (select_new_active_agg) {
2204
- netdev_info(bond->dev, "Removing an active aggregator\n");
2211
+ slave_info(bond->dev, slave->dev, "Removing an active aggregator\n");
22052212 /* select new active aggregator */
22062213 ad_agg_selection_logic(__get_first_agg(port),
22072214 &dummy_slave_update);
....@@ -2273,7 +2280,7 @@
22732280
22742281 /**
22752282 * bond_3ad_state_machine_handler - handle state machines timeout
2276
- * @bond: bonding struct to work on
2283
+ * @work: work context to fetch bonding struct to work on from
22772284 *
22782285 * The state machine handling concept in this module is to check every tick
22792286 * which state machine should operate any function. The execution order is
....@@ -2369,66 +2376,68 @@
23692376 * bond_3ad_rx_indication - handle a received frame
23702377 * @lacpdu: received lacpdu
23712378 * @slave: slave struct to work on
2372
- * @length: length of the data received
23732379 *
23742380 * It is assumed that frames that were sent on this NIC don't returned as new
23752381 * received frames (loopback). Since only the payload is given to this
23762382 * function, it check for loopback.
23772383 */
2378
-static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave,
2379
- u16 length)
2384
+static int bond_3ad_rx_indication(struct lacpdu *lacpdu, struct slave *slave)
23802385 {
2381
- struct port *port;
2386
+ struct bonding *bond = slave->bond;
23822387 int ret = RX_HANDLER_ANOTHER;
2388
+ struct bond_marker *marker;
2389
+ struct port *port;
2390
+ atomic64_t *stat;
23832391
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
- }
2392
+ port = &(SLAVE_AD_INFO(slave)->port);
2393
+ if (!port->slave) {
2394
+ net_warn_ratelimited("%s: Warning: port of slave %s is uninitialized\n",
2395
+ slave->dev->name, slave->bond->dev->name);
2396
+ return ret;
24312397 }
2398
+
2399
+ switch (lacpdu->subtype) {
2400
+ case AD_TYPE_LACPDU:
2401
+ ret = RX_HANDLER_CONSUMED;
2402
+ slave_dbg(slave->bond->dev, slave->dev,
2403
+ "Received LACPDU on port %d\n",
2404
+ port->actor_port_number);
2405
+ /* Protect against concurrent state machines */
2406
+ spin_lock(&slave->bond->mode_lock);
2407
+ ad_rx_machine(lacpdu, port);
2408
+ spin_unlock(&slave->bond->mode_lock);
2409
+ break;
2410
+ case AD_TYPE_MARKER:
2411
+ ret = RX_HANDLER_CONSUMED;
2412
+ /* No need to convert fields to Little Endian since we
2413
+ * don't use the marker's fields.
2414
+ */
2415
+ marker = (struct bond_marker *)lacpdu;
2416
+ switch (marker->tlv_type) {
2417
+ case AD_MARKER_INFORMATION_SUBTYPE:
2418
+ slave_dbg(slave->bond->dev, slave->dev, "Received Marker Information on port %d\n",
2419
+ port->actor_port_number);
2420
+ ad_marker_info_received(marker, port);
2421
+ break;
2422
+ case AD_MARKER_RESPONSE_SUBTYPE:
2423
+ slave_dbg(slave->bond->dev, slave->dev, "Received Marker Response on port %d\n",
2424
+ port->actor_port_number);
2425
+ ad_marker_response_received(marker, port);
2426
+ break;
2427
+ default:
2428
+ slave_dbg(slave->bond->dev, slave->dev, "Received an unknown Marker subtype on port %d\n",
2429
+ port->actor_port_number);
2430
+ stat = &SLAVE_AD_INFO(slave)->stats.marker_unknown_rx;
2431
+ atomic64_inc(stat);
2432
+ stat = &BOND_AD_INFO(bond).stats.marker_unknown_rx;
2433
+ atomic64_inc(stat);
2434
+ }
2435
+ break;
2436
+ default:
2437
+ atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_unknown_rx);
2438
+ atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_unknown_rx);
2439
+ }
2440
+
24322441 return ret;
24332442 }
24342443
....@@ -2467,9 +2476,10 @@
24672476
24682477 if (!reset) {
24692478 if (!speed) {
2470
- netdev_err(port->slave->dev,
2471
- "speed changed to 0 for port %s",
2472
- port->slave->dev->name);
2479
+ slave_err(port->slave->bond->dev,
2480
+ port->slave->dev,
2481
+ "speed changed to 0 on port %d\n",
2482
+ port->actor_port_number);
24732483 } else if (duplex && ospeed != speed) {
24742484 /* Speed change restarts LACP state-machine */
24752485 port->sm_vars |= AD_PORT_BEGIN;
....@@ -2494,23 +2504,22 @@
24942504
24952505 /* if slave is null, the whole port is not initialized */
24962506 if (!port->slave) {
2497
- netdev_warn(slave->bond->dev,
2498
- "speed/duplex changed for uninitialized port %s\n",
2499
- slave->dev->name);
2507
+ slave_warn(slave->bond->dev, slave->dev,
2508
+ "speed/duplex changed for uninitialized port\n");
25002509 return;
25012510 }
25022511
25032512 spin_lock_bh(&slave->bond->mode_lock);
25042513 ad_update_actor_keys(port, false);
25052514 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);
2515
+ slave_dbg(slave->bond->dev, slave->dev, "Port %d changed speed/duplex\n",
2516
+ port->actor_port_number);
25082517 }
25092518
25102519 /**
25112520 * bond_3ad_handle_link_change - handle a slave's link status change indication
25122521 * @slave: slave struct to work on
2513
- * @status: whether the link is now up or down
2522
+ * @link: whether the link is now up or down
25142523 *
25152524 * Handle reselection of aggregator (if needed) for this port.
25162525 */
....@@ -2524,8 +2533,7 @@
25242533
25252534 /* if slave is null, the whole port is not initialized */
25262535 if (!port->slave) {
2527
- netdev_warn(slave->bond->dev, "link status changed for uninitialized port on %s\n",
2528
- slave->dev->name);
2536
+ slave_warn(slave->bond->dev, slave->dev, "link status changed for uninitialized port\n");
25292537 return;
25302538 }
25312539
....@@ -2550,9 +2558,9 @@
25502558
25512559 spin_unlock_bh(&slave->bond->mode_lock);
25522560
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");
2561
+ slave_dbg(slave->bond->dev, slave->dev, "Port %d changed link status to %s\n",
2562
+ port->actor_port_number,
2563
+ link == BOND_LINK_UP ? "UP" : "DOWN");
25562564
25572565 /* RTNL is held and mode_lock is released so it's safe
25582566 * to update slave_array here.
....@@ -2562,7 +2570,7 @@
25622570
25632571 /**
25642572 * bond_3ad_set_carrier - set link state for bonding master
2565
- * @bond - bonding structure
2573
+ * @bond: bonding structure
25662574 *
25672575 * if we have an active aggregator, we're up, if not, we're down.
25682576 * Presumes that we cannot have an active aggregator if there are
....@@ -2664,15 +2672,18 @@
26642672 return RX_HANDLER_ANOTHER;
26652673
26662674 lacpdu = skb_header_pointer(skb, 0, sizeof(_lacpdu), &_lacpdu);
2667
- if (!lacpdu)
2675
+ if (!lacpdu) {
2676
+ atomic64_inc(&SLAVE_AD_INFO(slave)->stats.lacpdu_illegal_rx);
2677
+ atomic64_inc(&BOND_AD_INFO(bond).stats.lacpdu_illegal_rx);
26682678 return RX_HANDLER_ANOTHER;
2679
+ }
26692680
2670
- return bond_3ad_rx_indication(lacpdu, slave, skb->len);
2681
+ return bond_3ad_rx_indication(lacpdu, slave);
26712682 }
26722683
26732684 /**
26742685 * bond_3ad_update_lacp_rate - change the lacp rate
2675
- * @bond - bonding struct
2686
+ * @bond: bonding struct
26762687 *
26772688 * When modify lacp_rate parameter via sysfs,
26782689 * update actor_oper_port_state of each port.
....@@ -2693,9 +2704,67 @@
26932704 bond_for_each_slave(bond, slave, iter) {
26942705 port = &(SLAVE_AD_INFO(slave)->port);
26952706 if (lacp_fast)
2696
- port->actor_oper_port_state |= AD_STATE_LACP_TIMEOUT;
2707
+ port->actor_oper_port_state |= LACP_STATE_LACP_TIMEOUT;
26972708 else
2698
- port->actor_oper_port_state &= ~AD_STATE_LACP_TIMEOUT;
2709
+ port->actor_oper_port_state &= ~LACP_STATE_LACP_TIMEOUT;
26992710 }
27002711 spin_unlock_bh(&bond->mode_lock);
27012712 }
2713
+
2714
+size_t bond_3ad_stats_size(void)
2715
+{
2716
+ return nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_RX */
2717
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_TX */
2718
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_UNKNOWN_RX */
2719
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_LACPDU_ILLEGAL_RX */
2720
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RX */
2721
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_TX */
2722
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_RX */
2723
+ nla_total_size_64bit(sizeof(u64)) + /* BOND_3AD_STAT_MARKER_RESP_TX */
2724
+ nla_total_size_64bit(sizeof(u64)); /* BOND_3AD_STAT_MARKER_UNKNOWN_RX */
2725
+}
2726
+
2727
+int bond_3ad_stats_fill(struct sk_buff *skb, struct bond_3ad_stats *stats)
2728
+{
2729
+ u64 val;
2730
+
2731
+ val = atomic64_read(&stats->lacpdu_rx);
2732
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_RX, val,
2733
+ BOND_3AD_STAT_PAD))
2734
+ return -EMSGSIZE;
2735
+ val = atomic64_read(&stats->lacpdu_tx);
2736
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_TX, val,
2737
+ BOND_3AD_STAT_PAD))
2738
+ return -EMSGSIZE;
2739
+ val = atomic64_read(&stats->lacpdu_unknown_rx);
2740
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_UNKNOWN_RX, val,
2741
+ BOND_3AD_STAT_PAD))
2742
+ return -EMSGSIZE;
2743
+ val = atomic64_read(&stats->lacpdu_illegal_rx);
2744
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_LACPDU_ILLEGAL_RX, val,
2745
+ BOND_3AD_STAT_PAD))
2746
+ return -EMSGSIZE;
2747
+
2748
+ val = atomic64_read(&stats->marker_rx);
2749
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RX, val,
2750
+ BOND_3AD_STAT_PAD))
2751
+ return -EMSGSIZE;
2752
+ val = atomic64_read(&stats->marker_tx);
2753
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_TX, val,
2754
+ BOND_3AD_STAT_PAD))
2755
+ return -EMSGSIZE;
2756
+ val = atomic64_read(&stats->marker_resp_rx);
2757
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_RX, val,
2758
+ BOND_3AD_STAT_PAD))
2759
+ return -EMSGSIZE;
2760
+ val = atomic64_read(&stats->marker_resp_tx);
2761
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_RESP_TX, val,
2762
+ BOND_3AD_STAT_PAD))
2763
+ return -EMSGSIZE;
2764
+ val = atomic64_read(&stats->marker_unknown_rx);
2765
+ if (nla_put_u64_64bit(skb, BOND_3AD_STAT_MARKER_UNKNOWN_RX, val,
2766
+ BOND_3AD_STAT_PAD))
2767
+ return -EMSGSIZE;
2768
+
2769
+ return 0;
2770
+}