]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/batman-adv/originator.c
batman-adv: remove obsolete deleted attribute for gateway node
[karo-tx-linux.git] / net / batman-adv / originator.c
index 610620aa8d261e1733921248570a4b831db16a3e..d6d9809fee661591c3bcbe077b4ed60ebebf2319 100644 (file)
@@ -457,10 +457,20 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,
 {
        struct batadv_neigh_node *neigh_node;
 
+       neigh_node = batadv_neigh_node_get(orig_node, hard_iface, neigh_addr);
+       if (neigh_node)
+               goto out;
+
        neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC);
        if (!neigh_node)
                goto out;
 
+       if (!atomic_inc_not_zero(&hard_iface->refcount)) {
+               kfree(neigh_node);
+               neigh_node = NULL;
+               goto out;
+       }
+
        INIT_HLIST_NODE(&neigh_node->list);
        INIT_HLIST_HEAD(&neigh_node->ifinfo_list);
        spin_lock_init(&neigh_node->ifinfo_lock);
@@ -472,6 +482,14 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,
        /* extra reference for return */
        atomic_set(&neigh_node->refcount, 2);
 
+       spin_lock_bh(&orig_node->neigh_list_lock);
+       hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
+       spin_unlock_bh(&orig_node->neigh_list_lock);
+
+       batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv,
+                  "Creating new neighbor %pM for orig_node %pM on interface %s\n",
+                  neigh_addr, orig_node->orig, hard_iface->net_dev->name);
+
 out:
        return neigh_node;
 }
@@ -1010,7 +1028,6 @@ static void _batadv_purge_orig(struct batadv_priv *bat_priv)
                spin_unlock_bh(list_lock);
        }
 
-       batadv_gw_node_purge(bat_priv);
        batadv_gw_election(bat_priv);
 }