| From 7e318090e7f41fd305d827d221dccd3285db2781 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 30 Apr 2025 21:10:42 +0200 |
| Subject: wifi: mac80211: do not offer a mesh path if forwarding is disabled |
| |
| From: Benjamin Berg <benjamin@sipsolutions.net> |
| |
| [ Upstream commit cf1b684a06170d253b47d6a5287821de976435bd ] |
| |
| When processing a PREQ the code would always check whether we have a |
| mesh path locally and reply accordingly. However, when forwarding is |
| disabled then we should not reply with this information as we will not |
| forward data packets down that path. |
| |
| Move the check for dot11MeshForwarding up in the function and skip the |
| mesh path lookup in that case. In the else block, set forward to false |
| so that the rest of the function becomes a no-op and the |
| dot11MeshForwarding check does not need to be duplicated. |
| |
| This explains an effect observed in the Freifunk community where mesh |
| forwarding is disabled. In that case a mesh with three STAs and only bad |
| links in between them, individual STAs would occionally have indirect |
| mpath entries. This should not have happened. |
| |
| Signed-off-by: Benjamin Berg <benjamin@sipsolutions.net> |
| Reviewed-by: Rouven Czerwinski <rouven@czerwinskis.de> |
| Link: https://patch.msgid.link/20250430191042.3287004-1-benjamin@sipsolutions.net |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/mac80211/mesh_hwmp.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c |
| index c94a9c7ca960e..91444301a84a4 100644 |
| --- a/net/mac80211/mesh_hwmp.c |
| +++ b/net/mac80211/mesh_hwmp.c |
| @@ -636,7 +636,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, |
| mesh_path_add_gate(mpath); |
| } |
| rcu_read_unlock(); |
| - } else { |
| + } else if (ifmsh->mshcfg.dot11MeshForwarding) { |
| rcu_read_lock(); |
| mpath = mesh_path_lookup(sdata, target_addr); |
| if (mpath) { |
| @@ -654,6 +654,8 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, |
| } |
| } |
| rcu_read_unlock(); |
| + } else { |
| + forward = false; |
| } |
| |
| if (reply) { |
| @@ -671,7 +673,7 @@ static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata, |
| } |
| } |
| |
| - if (forward && ifmsh->mshcfg.dot11MeshForwarding) { |
| + if (forward) { |
| u32 preq_id; |
| u8 hopcount; |
| |
| -- |
| 2.39.5 |
| |