|
@@ -68,13 +68,15 @@ 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);
|
|
|
+ const struct batadv_tt_common_entry *tt1 = data1;
|
|
|
+ const struct batadv_tt_common_entry *tt2 = data2;
|
|
|
|
|
|
- return batadv_compare_eth(data1, data2);
|
|
|
+ return (tt1->vid == tt2->vid) && batadv_compare_eth(data1, data2);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1427,9 +1429,15 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
|
|
|
}
|
|
|
|
|
|
/* if the client was temporary added before receiving the first
|
|
|
- * OGM announcing it, we have to clear the TEMP flag
|
|
|
+ * OGM announcing it, we have to clear the TEMP flag. Also,
|
|
|
+ * remove the previous temporary orig node and re-add it
|
|
|
+ * if required. If the orig entry changed, the new one which
|
|
|
+ * is a non-temporary entry is preferred.
|
|
|
*/
|
|
|
- common->flags &= ~BATADV_TT_CLIENT_TEMP;
|
|
|
+ if (common->flags & BATADV_TT_CLIENT_TEMP) {
|
|
|
+ batadv_tt_global_del_orig_list(tt_global_entry);
|
|
|
+ common->flags &= ~BATADV_TT_CLIENT_TEMP;
|
|
|
+ }
|
|
|
|
|
|
/* the change can carry possible "attribute" flags like the
|
|
|
* TT_CLIENT_WIFI, therefore they have to be copied in the
|