batman-adv: keep global table consistency in case of roaming
authorAntonio Quartulli <ordex@autistici.org>
Wed, 6 Jul 2011 23:40:59 +0000 (01:40 +0200)
committerMarek Lindner <lindner_marek@yahoo.de>
Thu, 7 Jul 2011 16:49:26 +0000 (18:49 +0200)
To keep consistency of other originator tables, new clients detected as
roamed, are kept in the global table but are marked as TT_CLIENT_PENDING
They are purged only when the new ttvn is received by the corresponding
originator. Moreover they need to be considered as removed in case of global
transtable lookup.

Signed-off-by: Antonio Quartulli <ordex@autistici.org>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
net/batman-adv/translation-table.c

index 7cc67c0..fb6931d 100644 (file)
@@ -230,8 +230,9 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr)
        if (tt_global_entry) {
                /* This node is probably going to update its tt table */
                tt_global_entry->orig_node->tt_poss_change = true;
-               _tt_global_del(bat_priv, tt_global_entry,
-                              "local tt received");
+               /* The global entry has to be marked as PENDING and has to be
+                * kept for consistency purpose */
+               tt_global_entry->flags |= TT_CLIENT_PENDING;
                send_roam_adv(bat_priv, tt_global_entry->addr,
                              tt_global_entry->orig_node);
        }
@@ -787,6 +788,11 @@ struct orig_node *transtable_search(struct bat_priv *bat_priv,
        if (!atomic_inc_not_zero(&tt_global_entry->orig_node->refcount))
                goto free_tt;
 
+       /* A global client marked as PENDING has already moved from that
+        * originator */
+       if (tt_global_entry->flags & TT_CLIENT_PENDING)
+               goto free_tt;
+
        orig_node = tt_global_entry->orig_node;
 
 free_tt: