mirror of
https://github.com/openwrt/routing.git
synced 2025-02-23 16:16:15 +00:00
* Do not send uninitialized TT changes * Remove uninitialized data in full table TT response * Do not let TT changes list grows indefinitely Signed-off-by: Sven Eckelmann <sven@narfation.org>
64 lines
2.5 KiB
Diff
64 lines
2.5 KiB
Diff
From: Remi Pommarel <repk@triplefau.lt>
|
|
Date: Fri, 22 Nov 2024 16:52:50 +0100
|
|
Subject: batman-adv: Do not let TT changes list grows indefinitely
|
|
|
|
When TT changes list is too big to fit in packet due to MTU size, an
|
|
empty OGM is sent expected other node to send TT request to get the
|
|
changes. The issue is that tt.last_changeset was not built thus the
|
|
originator was responding with previous changes to those TT requests
|
|
(see batadv_send_my_tt_response). Also the changes list was never
|
|
cleaned up effectively never ending growing from this point onwards,
|
|
repeatedly sending the same TT response changes over and over, and
|
|
creating a new empty OGM every OGM interval expecting for the local
|
|
changes to be purged.
|
|
|
|
When there is more TT changes that can fit in packet, drop all changes,
|
|
send empty OGM and wait for TT request so we can respond with a full
|
|
table instead.
|
|
|
|
Fixes: 8405301b9794 ("batman-adv: tvlv - convert tt data sent within OGMs")
|
|
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
|
Acked-by: Antonio Quartulli <Antonio@mandelbit.com>
|
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/4d49d6e9d60c41a6da727108518cb8fb33295537
|
|
|
|
--- a/net/batman-adv/translation-table.c
|
|
+++ b/net/batman-adv/translation-table.c
|
|
@@ -990,6 +990,7 @@ static void batadv_tt_tvlv_container_upd
|
|
int tt_diff_len, tt_change_len = 0;
|
|
int tt_diff_entries_num = 0;
|
|
int tt_diff_entries_count = 0;
|
|
+ bool drop_changes = false;
|
|
size_t tt_extra_len = 0;
|
|
u16 tvlv_len;
|
|
|
|
@@ -997,10 +998,17 @@ static void batadv_tt_tvlv_container_upd
|
|
tt_diff_len = batadv_tt_len(tt_diff_entries_num);
|
|
|
|
/* if we have too many changes for one packet don't send any
|
|
- * and wait for the tt table request which will be fragmented
|
|
+ * and wait for the tt table request so we can reply with the full
|
|
+ * (fragmented) table.
|
|
+ *
|
|
+ * The local change history should still be cleaned up so the next
|
|
+ * TT round can start again with a clean state.
|
|
*/
|
|
- if (tt_diff_len > bat_priv->soft_iface->mtu)
|
|
+ if (tt_diff_len > bat_priv->soft_iface->mtu) {
|
|
tt_diff_len = 0;
|
|
+ tt_diff_entries_num = 0;
|
|
+ drop_changes = true;
|
|
+ }
|
|
|
|
tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, &tt_data,
|
|
&tt_change, &tt_diff_len);
|
|
@@ -1009,7 +1017,7 @@ static void batadv_tt_tvlv_container_upd
|
|
|
|
tt_data->flags = BATADV_TT_OGM_DIFF;
|
|
|
|
- if (tt_diff_len == 0)
|
|
+ if (!drop_changes && tt_diff_len == 0)
|
|
goto container_register;
|
|
|
|
spin_lock_bh(&bat_priv->tt.changes_list_lock);
|