Blame view
net/batman-adv/originator.h
2.73 KB
c6c8fea29 net: Add batman-a... |
1 |
/* |
64afe3539 batman-adv: Updat... |
2 |
* Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: |
c6c8fea29 net: Add batman-a... |
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
* * Marek Lindner, Simon Wunderlich * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA * */ #ifndef _NET_BATMAN_ADV_ORIGINATOR_H_ #define _NET_BATMAN_ADV_ORIGINATOR_H_ |
7aadf889e batman-adv: remov... |
24 |
#include "hash.h" |
c6c8fea29 net: Add batman-a... |
25 26 27 |
int originator_init(struct bat_priv *bat_priv); void originator_free(struct bat_priv *bat_priv); void purge_orig_ref(struct bat_priv *bat_priv); |
7b36e8eef batman-adv: Corre... |
28 |
void orig_node_free_ref(struct orig_node *orig_node); |
747e4221a batman-adv: Add c... |
29 |
struct orig_node *get_orig_node(struct bat_priv *bat_priv, const uint8_t *addr); |
a8e7f4bc3 batman-adv: prote... |
30 31 |
struct neigh_node *create_neighbor(struct orig_node *orig_node, struct orig_node *orig_neigh_node, |
747e4221a batman-adv: Add c... |
32 |
const uint8_t *neigh, |
e6c10f433 batman-adv: renam... |
33 |
struct hard_iface *if_incoming); |
44524fcdf batman-adv: Corre... |
34 |
void neigh_node_free_ref(struct neigh_node *neigh_node); |
e1a5382f9 batman-adv: Make ... |
35 |
struct neigh_node *orig_node_get_router(struct orig_node *orig_node); |
c6c8fea29 net: Add batman-a... |
36 |
int orig_seq_print_text(struct seq_file *seq, void *offset); |
e6c10f433 batman-adv: renam... |
37 38 |
int orig_hash_add_if(struct hard_iface *hard_iface, int max_if_num); int orig_hash_del_if(struct hard_iface *hard_iface, int max_if_num); |
c6c8fea29 net: Add batman-a... |
39 |
|
c6c8fea29 net: Add batman-a... |
40 41 |
/* hashfunction to choose an entry in a hash table of given size */ /* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */ |
c90681b85 batman-adv: fixed... |
42 |
static inline uint32_t choose_orig(const void *data, uint32_t size) |
c6c8fea29 net: Add batman-a... |
43 |
{ |
747e4221a batman-adv: Add c... |
44 |
const unsigned char *key = data; |
c6c8fea29 net: Add batman-a... |
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
uint32_t hash = 0; size_t i; for (i = 0; i < 6; i++) { hash += key[i]; hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash % size; } |
7aadf889e batman-adv: remov... |
60 |
static inline struct orig_node *orig_hash_find(struct bat_priv *bat_priv, |
747e4221a batman-adv: Add c... |
61 |
const void *data) |
7aadf889e batman-adv: remov... |
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
{ struct hashtable_t *hash = bat_priv->orig_hash; struct hlist_head *head; struct hlist_node *node; struct orig_node *orig_node, *orig_node_tmp = NULL; int index; if (!hash) return NULL; index = choose_orig(data, hash->size); head = &hash->table[index]; rcu_read_lock(); hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) { if (!compare_eth(orig_node, data)) continue; |
7b36e8eef batman-adv: Corre... |
79 80 |
if (!atomic_inc_not_zero(&orig_node->refcount)) continue; |
7aadf889e batman-adv: remov... |
81 |
orig_node_tmp = orig_node; |
7aadf889e batman-adv: remov... |
82 83 84 85 86 87 |
break; } rcu_read_unlock(); return orig_node_tmp; } |
c6c8fea29 net: Add batman-a... |
88 |
#endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */ |