batman-adv: make the TT global purge routine VLAN specific
authorAntonio Quartulli <antonio@open-mesh.com>
Wed, 7 Aug 2013 16:28:55 +0000 (18:28 +0200)
committerAntonio Quartulli <antonio@meshcoding.com>
Sat, 19 Oct 2013 21:25:37 +0000 (23:25 +0200)
Instead of unconditionally removing all the TT entries
served by a given originator, make tt_global_orig_del()
remove only entries matching a given VLAN identifier
provided as argument.

If such argument is negative all the global entries
served by the originator are removed.

This change is used into the BLA code to purge entries
served by a newly discovered Backbone node, but limiting
the operation only to those connected to the VLAN where the
backbone has been discovered.

Cc: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
net/batman-adv/bridge_loop_avoidance.c
net/batman-adv/originator.c
net/batman-adv/routing.c
net/batman-adv/translation-table.c
net/batman-adv/translation-table.h

index e8a6458081e89c6c5a2d88358e078bcb77120ecd..3b3867db88a74de68bab69c1df22ce08d27ebd93 100644 (file)
@@ -411,10 +411,10 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,
                return NULL;
        }
 
-       /* this is a gateway now, remove any tt entries */
+       /* this is a gateway now, remove any TT entry on this VLAN */
        orig_node = batadv_orig_hash_find(bat_priv, orig);
        if (orig_node) {
-               batadv_tt_global_del_orig(bat_priv, orig_node,
+               batadv_tt_global_del_orig(bat_priv, orig_node, vid,
                                          "became a backbone gateway");
                batadv_orig_node_free_ref(orig_node);
        }
index 7a499dad53d3808a972325fe12ff38ab6ad986cc..ee1d847242054d12f982c8ca92459b842863a52e 100644 (file)
@@ -230,7 +230,7 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu)
 
        batadv_frag_purge_orig(orig_node, NULL);
 
-       batadv_tt_global_del_orig(orig_node->bat_priv, orig_node,
+       batadv_tt_global_del_orig(orig_node->bat_priv, orig_node, -1,
                                  "originator timed out");
 
        kfree(orig_node->tt_buff);
index 149ef57e78c397ccab1c439b0a871853d052a235..4bcf22129ffec2a8eb437ab4fc2098d1d8199f3f 100644 (file)
@@ -47,7 +47,7 @@ static void _batadv_update_route(struct batadv_priv *bat_priv,
        if ((curr_router) && (!neigh_node)) {
                batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
                           "Deleting route towards: %pM\n", orig_node->orig);
-               batadv_tt_global_del_orig(bat_priv, orig_node,
+               batadv_tt_global_del_orig(bat_priv, orig_node, -1,
                                          "Deleted route towards originator");
 
        /* route added */
index 41a8387c5ef8450ecc1a0e280cb2ae01dcb4555b..4c313ff8b12f363840fc36b182faa71d5d38dba7 100644 (file)
@@ -1581,8 +1581,18 @@ out:
                batadv_tt_local_entry_free_ref(local_entry);
 }
 
+/**
+ * batadv_tt_global_del_orig - remove all the TT global entries belonging to the
+ *  given originator matching the provided vid
+ * @bat_priv: the bat priv with all the soft interface information
+ * @orig_node: the originator owning the entries to remove
+ * @match_vid: the VLAN identifier to match. If negative all the entries will be
+ *  removed
+ * @message: debug message to print as "reason"
+ */
 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                               struct batadv_orig_node *orig_node,
+                              int32_t match_vid,
                               const char *message)
 {
        struct batadv_tt_global_entry *tt_global;
@@ -1604,6 +1614,10 @@ void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                spin_lock_bh(list_lock);
                hlist_for_each_entry_safe(tt_common_entry, safe,
                                          head, hash_entry) {
+                       /* remove only matching entries */
+                       if (match_vid >= 0 && tt_common_entry->vid != match_vid)
+                               continue;
+
                        tt_global = container_of(tt_common_entry,
                                                 struct batadv_tt_global_entry,
                                                 common);
@@ -2570,7 +2584,8 @@ static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
                goto out;
 
        /* Purge the old table first.. */
-       batadv_tt_global_del_orig(bat_priv, orig_node, "Received full table");
+       batadv_tt_global_del_orig(bat_priv, orig_node, -1,
+                                 "Received full table");
 
        _batadv_tt_update_changes(bat_priv, orig_node, tt_change, num_entries,
                                  ttvn);
index c6bf33c0485579fbe7c338709126b505220862ec..dc6db4e00a43b06fee06361d7d066c52429ddecc 100644 (file)
@@ -30,7 +30,7 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset);
 int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset);
 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
                               struct batadv_orig_node *orig_node,
-                              const char *message);
+                              int32_t match_vid, const char *message);
 struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
                                                  const uint8_t *src,
                                                  const uint8_t *addr,