Into the tt hash table implementation, batadv_compare_tt is used
to compare two tt entries and deciding if they are the same
object.
batadv_compare_tt compare only mac addr.

On a batman network, each node using vlans declare the bat0 mac
addr on each vlan.

In case of adding a new tt entry, sharing the same hash of
another entry. If these two entries have the same MAC addr but
a different vid. The insert fail because the two different
object are considered identical.

batadv_compare_tt must check vid.

Signed-off-by: Def <[email protected]>
---
 translation-table.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/translation-table.c b/translation-table.c
index d73b103..d16433a 100644
--- a/translation-table.c
+++ b/translation-table.c
@@ -45,13 +45,16 @@ static void batadv_tt_global_del(struct batadv_priv 
*bat_priv,
                                 unsigned short vid, const char *message,
                                 bool roaming);
 
-/* returns 1 if they are the same mac addr */
+/* returns 1 if they are the same mac addr and vid */
 static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
 {
        const void *data1 = container_of(node, struct batadv_tt_common_entry,
                                         hash_entry);
 
-       return batadv_compare_eth(data1, data2);
+       struct batadv_tt_common_entry* tt1 = data1;
+       struct batadv_tt_common_entry* tt2 = data2;
+
+       return (tt1->vid == tt2->vid) && batadv_compare_eth(data1, data2);
 }
 
 /**
-- 
1.7.10.4

Reply via email to