blob: b1eecfbc0a09f72124c1cd6b56174e7c6d3059a8 [file] [log] [blame]
Lorenz Brun8bc82862024-04-30 11:47:09 +00001From dd369885e1c0e3a6eff97db6acc5c765ee5dd421 Mon Sep 17 00:00:00 2001
2From: Lorenz Brun <lorenz@monogon.tech>
3Date: Thu, 2 May 2024 10:17:14 +0200
4Subject: [PATCH] bonding: 3ad: fix carrier and tx with no active ports
5
6bond carrier state should not be be up when no ports are in
7aggregation. Ports should only be enabled when they are in aggregation.
8
9While in there, set the default template to fast mode to quickly recover
10links and shorten the non-standard aggregator selection timer.
11---
12 drivers/net/bonding/bond_3ad.c | 39 ++++++++++++++++++----------------
13 1 file changed, 21 insertions(+), 18 deletions(-)
14
15diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c
16index c99ffe6c683a..a310c27ea659 100644
17--- a/drivers/net/bonding/bond_3ad.c
18+++ b/drivers/net/bonding/bond_3ad.c
19@@ -699,6 +699,22 @@ static int __agg_active_ports(struct aggregator *agg)
20 return active;
21 }
22
23+// __agg_enabled_ports counts the number of ports which are currently in
24+// aggregation, different from __agg_active_ports which counts ports which
25+// are up (but not in aggregation because of LACP).
26+static int __agg_enabled_ports(struct aggregator *agg) {
27+ struct port *port;
28+ int en_count = 0;
29+
30+ for (port = agg->lag_ports; port;
31+ port = port->next_port_in_aggregator) {
32+ if (__port_is_enabled(port))
33+ en_count++;
34+ }
35+
36+ return en_count;
37+}
38+
39 /**
40 * __get_agg_bandwidth - get the total bandwidth of an aggregator
41 * @aggregator: the aggregator we're looking at
42@@ -1086,6 +1102,8 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
43 break;
44 }
45 }
46+ // Update carrier state as we might have enabled/disabled ports
47+ bond_3ad_set_carrier(__get_bond_by_port(port));
48 }
49
50 /**
51@@ -1780,21 +1798,6 @@ static void ad_agg_selection_logic(struct aggregator *agg,
52 *update_slave_arr = true;
53 }
54
55- /* if the selected aggregator is of join individuals
56- * (partner_system is NULL), enable their ports
57- */
58- active = __get_active_agg(origin);
59-
60- if (active) {
61- if (!__agg_has_partner(active)) {
62- for (port = active->lag_ports; port;
63- port = port->next_port_in_aggregator) {
64- __enable_port(port);
65- }
66- *update_slave_arr = true;
67- }
68- }
69-
70 rcu_read_unlock();
71
72 bond_3ad_set_carrier(bond);
73@@ -1852,7 +1855,7 @@ static void ad_initialize_port(struct port *port, int lacp_fast)
74 .key = 1,
75 .port_number = 1,
76 .port_priority = 0xff,
77- .port_state = 1,
78+ .port_state = LACP_STATE_LACP_ACTIVITY | LACP_STATE_LACP_TIMEOUT,
79 };
80 static const struct lacpdu lacpdu = {
81 .subtype = 0x01,
82@@ -1994,7 +1997,7 @@ static void ad_marker_response_received(struct bond_marker *marker,
83 /* ========= AD exported functions to the main bonding code ========= */
84
85 /* Check aggregators status in team every T seconds */
86-#define AD_AGGREGATOR_SELECTION_TIMER 8
87+#define AD_AGGREGATOR_SELECTION_TIMER 3
88
89 /**
90 * bond_3ad_initiate_agg_selection - initate aggregator selection
91@@ -2619,7 +2622,7 @@ int bond_3ad_set_carrier(struct bonding *bond)
92 active = __get_active_agg(&(SLAVE_AD_INFO(first_slave)->aggregator));
93 if (active) {
94 /* are enough slaves available to consider link up? */
95- if (__agg_active_ports(active) < bond->params.min_links) {
96+ if (__agg_enabled_ports(active) < bond->params.min_links) {
97 if (netif_carrier_ok(bond->dev)) {
98 netif_carrier_off(bond->dev);
99 goto out;
100--
1012.42.0
102