|
@@ -442,6 +442,42 @@ out:
|
|
|
return neigh_ifinfo;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * batadv_neigh_node_get - retrieve a neighbour from the list
|
|
|
+ * @orig_node: originator which the neighbour belongs to
|
|
|
+ * @hard_iface: the interface where this neighbour is connected to
|
|
|
+ * @addr: the address of the neighbour
|
|
|
+ *
|
|
|
+ * Looks for and possibly returns a neighbour belonging to this originator list
|
|
|
+ * which is connected through the provided hard interface.
|
|
|
+ * Returns NULL if the neighbour is not found.
|
|
|
+ */
|
|
|
+static struct batadv_neigh_node *
|
|
|
+batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
|
|
|
+ const struct batadv_hard_iface *hard_iface,
|
|
|
+ const u8 *addr)
|
|
|
+{
|
|
|
+ struct batadv_neigh_node *tmp_neigh_node, *res = NULL;
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) {
|
|
|
+ if (!batadv_compare_eth(tmp_neigh_node->addr, addr))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (tmp_neigh_node->if_incoming != hard_iface)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ res = tmp_neigh_node;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ rcu_read_unlock();
|
|
|
+
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* batadv_neigh_node_new - create and init a new neigh_node object
|
|
|
* @orig_node: originator object representing the neighbour
|
|
@@ -495,42 +531,6 @@ out:
|
|
|
return neigh_node;
|
|
|
}
|
|
|
|
|
|
-/**
|
|
|
- * batadv_neigh_node_get - retrieve a neighbour from the list
|
|
|
- * @orig_node: originator which the neighbour belongs to
|
|
|
- * @hard_iface: the interface where this neighbour is connected to
|
|
|
- * @addr: the address of the neighbour
|
|
|
- *
|
|
|
- * Looks for and possibly returns a neighbour belonging to this originator list
|
|
|
- * which is connected through the provided hard interface.
|
|
|
- * Returns NULL if the neighbour is not found.
|
|
|
- */
|
|
|
-struct batadv_neigh_node *
|
|
|
-batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
|
|
|
- const struct batadv_hard_iface *hard_iface,
|
|
|
- const u8 *addr)
|
|
|
-{
|
|
|
- struct batadv_neigh_node *tmp_neigh_node, *res = NULL;
|
|
|
-
|
|
|
- rcu_read_lock();
|
|
|
- hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) {
|
|
|
- if (!batadv_compare_eth(tmp_neigh_node->addr, addr))
|
|
|
- continue;
|
|
|
-
|
|
|
- if (tmp_neigh_node->if_incoming != hard_iface)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
|
|
|
- continue;
|
|
|
-
|
|
|
- res = tmp_neigh_node;
|
|
|
- break;
|
|
|
- }
|
|
|
- rcu_read_unlock();
|
|
|
-
|
|
|
- return res;
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object
|
|
|
* @rcu: rcu pointer of the orig_ifinfo object
|