diff options
Diffstat (limited to 'net/batman-adv/originator.c')
| -rw-r--r-- | net/batman-adv/originator.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 6df12a2e3605..853941629dc1 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c | |||
| @@ -458,6 +458,42 @@ out: | |||
| 458 | } | 458 | } |
| 459 | 459 | ||
| 460 | /** | 460 | /** |
| 461 | * batadv_neigh_node_get - retrieve a neighbour from the list | ||
| 462 | * @orig_node: originator which the neighbour belongs to | ||
| 463 | * @hard_iface: the interface where this neighbour is connected to | ||
| 464 | * @addr: the address of the neighbour | ||
| 465 | * | ||
| 466 | * Looks for and possibly returns a neighbour belonging to this originator list | ||
| 467 | * which is connected through the provided hard interface. | ||
| 468 | * Returns NULL if the neighbour is not found. | ||
| 469 | */ | ||
| 470 | struct batadv_neigh_node * | ||
| 471 | batadv_neigh_node_get(const struct batadv_orig_node *orig_node, | ||
| 472 | const struct batadv_hard_iface *hard_iface, | ||
| 473 | const uint8_t *addr) | ||
| 474 | { | ||
| 475 | struct batadv_neigh_node *tmp_neigh_node, *res = NULL; | ||
| 476 | |||
| 477 | rcu_read_lock(); | ||
| 478 | hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) { | ||
| 479 | if (!batadv_compare_eth(tmp_neigh_node->addr, addr)) | ||
| 480 | continue; | ||
| 481 | |||
| 482 | if (tmp_neigh_node->if_incoming != hard_iface) | ||
| 483 | continue; | ||
| 484 | |||
| 485 | if (!atomic_inc_not_zero(&tmp_neigh_node->refcount)) | ||
| 486 | continue; | ||
| 487 | |||
| 488 | res = tmp_neigh_node; | ||
| 489 | break; | ||
| 490 | } | ||
| 491 | rcu_read_unlock(); | ||
| 492 | |||
| 493 | return res; | ||
| 494 | } | ||
| 495 | |||
| 496 | /** | ||
| 461 | * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object | 497 | * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object |
| 462 | * @rcu: rcu pointer of the orig_ifinfo object | 498 | * @rcu: rcu pointer of the orig_ifinfo object |
| 463 | */ | 499 | */ |
