mirror of
https://git.openwrt.org/feed/routing.git
synced 2025-01-08 11:47:51 +08:00
Merge pull request #1092 from ecsv/batadv-for-23.05
openwrt-23.05: batman-adv: Merge bugfixes from 2024.4
This commit is contained in:
commit
be6e1a4458
@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=batman-adv
|
PKG_NAME:=batman-adv
|
||||||
PKG_VERSION:=2023.1
|
PKG_VERSION:=2023.1
|
||||||
PKG_RELEASE:=8
|
PKG_RELEASE:=9
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||||
|
@ -0,0 +1,64 @@
|
|||||||
|
From: Remi Pommarel <repk@triplefau.lt>
|
||||||
|
Date: Fri, 22 Nov 2024 16:52:48 +0100
|
||||||
|
Subject: batman-adv: Do not send uninitialized TT changes
|
||||||
|
|
||||||
|
The number of TT changes can be less than initially expected in
|
||||||
|
batadv_tt_tvlv_container_update() (changes can be removed by
|
||||||
|
batadv_tt_local_event() in ADD+DEL sequence between reading
|
||||||
|
tt_diff_entries_num and actually iterating the change list under lock).
|
||||||
|
|
||||||
|
Thus tt_diff_len could be bigger than the actual changes size that need
|
||||||
|
to be sent. Because batadv_send_my_tt_response sends the whole
|
||||||
|
packet, uninitialized data can be interpreted as TT changes on other
|
||||||
|
nodes leading to weird TT global entries on those nodes such as:
|
||||||
|
|
||||||
|
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
|
||||||
|
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
|
||||||
|
|
||||||
|
All of the above also applies to OGM tvlv container buffer's tvlv_len.
|
||||||
|
|
||||||
|
Remove the extra allocated space to avoid sending uninitialized TT
|
||||||
|
changes in batadv_send_my_tt_response() and batadv_v_ogm_send_softif().
|
||||||
|
|
||||||
|
Fixes: 8405301b9794 ("batman-adv: tvlv - convert tt data sent within OGMs")
|
||||||
|
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
||||||
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/5fe3a7a48ea6374280dc855db7b802d70b1870c6
|
||||||
|
|
||||||
|
--- 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;
|
||||||
|
+ size_t tt_extra_len = 0;
|
||||||
|
u16 tvlv_len;
|
||||||
|
|
||||||
|
tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
|
||||||
|
@@ -1027,6 +1028,9 @@ static void batadv_tt_tvlv_container_upd
|
||||||
|
}
|
||||||
|
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
|
||||||
|
|
||||||
|
+ tt_extra_len = batadv_tt_len(tt_diff_entries_num -
|
||||||
|
+ tt_diff_entries_count);
|
||||||
|
+
|
||||||
|
/* Keep the buffer for possible tt_request */
|
||||||
|
spin_lock_bh(&bat_priv->tt.last_changeset_lock);
|
||||||
|
kfree(bat_priv->tt.last_changeset);
|
||||||
|
@@ -1035,6 +1039,7 @@ static void batadv_tt_tvlv_container_upd
|
||||||
|
tt_change_len = batadv_tt_len(tt_diff_entries_count);
|
||||||
|
/* check whether this new OGM has no changes due to size problems */
|
||||||
|
if (tt_diff_entries_count > 0) {
|
||||||
|
+ tt_diff_len -= tt_extra_len;
|
||||||
|
/* if kmalloc() fails we will reply with the full table
|
||||||
|
* instead of providing the diff
|
||||||
|
*/
|
||||||
|
@@ -1047,6 +1052,8 @@ static void batadv_tt_tvlv_container_upd
|
||||||
|
}
|
||||||
|
spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
|
||||||
|
|
||||||
|
+ /* Remove extra packet space for OGM */
|
||||||
|
+ tvlv_len -= tt_extra_len;
|
||||||
|
container_register:
|
||||||
|
batadv_tvlv_container_register(bat_priv, BATADV_TVLV_TT, 1, tt_data,
|
||||||
|
tvlv_len);
|
@ -0,0 +1,101 @@
|
|||||||
|
From: Remi Pommarel <repk@triplefau.lt>
|
||||||
|
Date: Fri, 22 Nov 2024 16:52:49 +0100
|
||||||
|
Subject: batman-adv: Remove uninitialized data in full table TT response
|
||||||
|
|
||||||
|
The number of entries filled by batadv_tt_tvlv_generate() can be less
|
||||||
|
than initially expected in batadv_tt_prepare_tvlv_{global,local}_data()
|
||||||
|
(changes can be removed by batadv_tt_local_event() in ADD+DEL sequence
|
||||||
|
in the meantime as the lock held during the whole tvlv global/local data
|
||||||
|
generation).
|
||||||
|
|
||||||
|
Thus tvlv_len could be bigger than the actual TT entry size that need
|
||||||
|
to be sent so full table TT_RESPONSE could hold invalid TT entries such
|
||||||
|
as below.
|
||||||
|
|
||||||
|
* 00:00:00:00:00:00 -1 [....] ( 0) 88:12:4e:ad:7e:ba (179) (0x45845380)
|
||||||
|
* 00:00:00:00:78:79 4092 [.W..] ( 0) 88:12:4e:ad:7e:3c (145) (0x8ebadb8b)
|
||||||
|
|
||||||
|
Remove the extra allocated space to avoid sending uninitialized entries
|
||||||
|
for full table TT_RESPONSE in both batadv_send_other_tt_response() and
|
||||||
|
batadv_send_my_tt_response().
|
||||||
|
|
||||||
|
Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||||
|
Signed-off-by: Remi Pommarel <repk@triplefau.lt>
|
||||||
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/095c3965bdc29e43546a9cdd21f179f952e01f48
|
||||||
|
|
||||||
|
--- a/net/batman-adv/translation-table.c
|
||||||
|
+++ b/net/batman-adv/translation-table.c
|
||||||
|
@@ -2754,14 +2754,16 @@ static bool batadv_tt_global_valid(const
|
||||||
|
*
|
||||||
|
* Fills the tvlv buff with the tt entries from the specified hash. If valid_cb
|
||||||
|
* is not provided then this becomes a no-op.
|
||||||
|
+ *
|
||||||
|
+ * Return: Remaining unused length in tvlv_buff.
|
||||||
|
*/
|
||||||
|
-static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||||
|
- struct batadv_hashtable *hash,
|
||||||
|
- void *tvlv_buff, u16 tt_len,
|
||||||
|
- bool (*valid_cb)(const void *,
|
||||||
|
- const void *,
|
||||||
|
- u8 *flags),
|
||||||
|
- void *cb_data)
|
||||||
|
+static u16 batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
|
||||||
|
+ struct batadv_hashtable *hash,
|
||||||
|
+ void *tvlv_buff, u16 tt_len,
|
||||||
|
+ bool (*valid_cb)(const void *,
|
||||||
|
+ const void *,
|
||||||
|
+ u8 *flags),
|
||||||
|
+ void *cb_data)
|
||||||
|
{
|
||||||
|
struct batadv_tt_common_entry *tt_common_entry;
|
||||||
|
struct batadv_tvlv_tt_change *tt_change;
|
||||||
|
@@ -2775,7 +2777,7 @@ static void batadv_tt_tvlv_generate(stru
|
||||||
|
tt_change = tvlv_buff;
|
||||||
|
|
||||||
|
if (!valid_cb)
|
||||||
|
- return;
|
||||||
|
+ return tt_len;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
for (i = 0; i < hash->size; i++) {
|
||||||
|
@@ -2801,6 +2803,8 @@ static void batadv_tt_tvlv_generate(stru
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
+
|
||||||
|
+ return batadv_tt_len(tt_tot - tt_num_entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -3076,10 +3080,11 @@ static bool batadv_send_other_tt_respons
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* fill the rest of the tvlv with the real TT entries */
|
||||||
|
- batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.global_hash,
|
||||||
|
- tt_change, tt_len,
|
||||||
|
- batadv_tt_global_valid,
|
||||||
|
- req_dst_orig_node);
|
||||||
|
+ tvlv_len -= batadv_tt_tvlv_generate(bat_priv,
|
||||||
|
+ bat_priv->tt.global_hash,
|
||||||
|
+ tt_change, tt_len,
|
||||||
|
+ batadv_tt_global_valid,
|
||||||
|
+ req_dst_orig_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Don't send the response, if larger than fragmented packet. */
|
||||||
|
@@ -3203,9 +3208,11 @@ static bool batadv_send_my_tt_response(s
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* fill the rest of the tvlv with the real TT entries */
|
||||||
|
- batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.local_hash,
|
||||||
|
- tt_change, tt_len,
|
||||||
|
- batadv_tt_local_valid, NULL);
|
||||||
|
+ tvlv_len -= batadv_tt_tvlv_generate(bat_priv,
|
||||||
|
+ bat_priv->tt.local_hash,
|
||||||
|
+ tt_change, tt_len,
|
||||||
|
+ batadv_tt_local_valid,
|
||||||
|
+ NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
tvlv_tt_data->flags = BATADV_TT_RESPONSE;
|
@ -0,0 +1,63 @@
|
|||||||
|
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);
|
Loading…
Reference in New Issue
Block a user