Blame view

net/batman-adv/originator.h 4.47 KB
ac79cbb96   Sven Eckelmann   batman-adv: updat...
1
  /* Copyright (C) 2007-2017  B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
2
3
4
5
6
7
8
9
10
11
12
13
14
   *
   * 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
ebf38fb7a   Antonio Quartulli   batman-adv: remov...
15
   * along with this program; if not, see <http://www.gnu.org/licenses/>.
c6c8fea29   Sven Eckelmann   net: Add batman-a...
16
17
18
19
   */
  
  #ifndef _NET_BATMAN_ADV_ORIGINATOR_H_
  #define _NET_BATMAN_ADV_ORIGINATOR_H_
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
20
  #include "main.h"
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
21
22
23
  #include <linux/compiler.h>
  #include <linux/if_ether.h>
  #include <linux/jhash.h>
7c1243911   Sven Eckelmann   batman-adv: Conve...
24
  #include <linux/kref.h>
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
25
26
27
28
  #include <linux/rculist.h>
  #include <linux/rcupdate.h>
  #include <linux/stddef.h>
  #include <linux/types.h>
7aadf889e   Marek Lindner   batman-adv: remov...
29
  #include "hash.h"
85cf8c859   Matthias Schiffer   batman-adv: netli...
30
  struct netlink_callback;
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
31
  struct seq_file;
85cf8c859   Matthias Schiffer   batman-adv: netli...
32
  struct sk_buff;
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
33

4b426b108   Sven Eckelmann   batman-adv: Use b...
34
  bool batadv_compare_orig(const struct hlist_node *node, const void *data2);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
35
36
37
  int batadv_originator_init(struct batadv_priv *bat_priv);
  void batadv_originator_free(struct batadv_priv *bat_priv);
  void batadv_purge_orig_ref(struct batadv_priv *bat_priv);
5d9673109   Sven Eckelmann   batman-adv: Renam...
38
  void batadv_orig_node_put(struct batadv_orig_node *orig_node);
bbad0a5e3   Antonio Quartulli   batman-adv: make ...
39
  struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
40
  					      const u8 *addr);
cef63419f   Marek Lindner   batman-adv: add l...
41
42
43
44
  struct batadv_hardif_neigh_node *
  batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
  			const u8 *neigh_addr);
  void
accadc35a   Sven Eckelmann   batman-adv: Renam...
45
  batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
46
  struct batadv_neigh_node *
6f0a6b5ee   Marek Lindner   batman-adv: refac...
47
48
49
  batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
  				struct batadv_hard_iface *hard_iface,
  				const u8 *neigh_addr);
25bb25099   Sven Eckelmann   batman-adv: Renam...
50
  void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
51
  struct batadv_neigh_node *
7351a4822   Simon Wunderlich   batman-adv: split...
52
53
  batadv_orig_router_get(struct batadv_orig_node *orig_node,
  		       const struct batadv_hard_iface *if_outgoing);
89652331c   Simon Wunderlich   batman-adv: split...
54
55
56
57
58
59
  struct batadv_neigh_ifinfo *
  batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
  			struct batadv_hard_iface *if_outgoing);
  struct batadv_neigh_ifinfo *
  batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
  			struct batadv_hard_iface *if_outgoing);
044fa3ae1   Sven Eckelmann   batman-adv: Renam...
60
  void batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo);
7351a4822   Simon Wunderlich   batman-adv: split...
61

85cf8c859   Matthias Schiffer   batman-adv: netli...
62
  int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb);
7587405ab   Marek Lindner   batman-adv: expor...
63
  int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset);
7351a4822   Simon Wunderlich   batman-adv: split...
64
65
66
67
68
69
  struct batadv_orig_ifinfo *
  batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
  		       struct batadv_hard_iface *if_outgoing);
  struct batadv_orig_ifinfo *
  batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
  		       struct batadv_hard_iface *if_outgoing);
35f94779c   Sven Eckelmann   batman-adv: Renam...
70
  void batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo);
7351a4822   Simon Wunderlich   batman-adv: split...
71

7d211efc5   Sven Eckelmann   batman-adv: Prefi...
72
  int batadv_orig_seq_print_text(struct seq_file *seq, void *offset);
85cf8c859   Matthias Schiffer   batman-adv: netli...
73
  int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb);
cb1c92ec3   Simon Wunderlich   batman-adv: add d...
74
  int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
75
76
77
78
  int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
  			    int max_if_num);
  int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
  			    int max_if_num);
7ea7b4a14   Antonio Quartulli   batman-adv: make ...
79
80
81
82
83
84
  struct batadv_orig_node_vlan *
  batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
  			  unsigned short vid);
  struct batadv_orig_node_vlan *
  batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
  			  unsigned short vid);
21754e250   Sven Eckelmann   batman-adv: Renam...
85
  void batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
86

9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
87
88
89
  /* hashfunction to choose an entry in a hash table of given size
   * hash algorithm from http://en.wikipedia.org/wiki/Hash_table
   */
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
90
  static inline u32 batadv_choose_orig(const void *data, u32 size)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
91
  {
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
92
  	u32 hash = 0;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
93

36fd61cb8   Sven Eckelmann   batman-adv: Use c...
94
  	hash = jhash(data, ETH_ALEN, hash);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
95
96
  	return hash % size;
  }
56303d34a   Sven Eckelmann   batman-adv: Prefi...
97
98
  static inline struct batadv_orig_node *
  batadv_orig_hash_find(struct batadv_priv *bat_priv, const void *data)
7aadf889e   Marek Lindner   batman-adv: remov...
99
  {
5bf74e9ca   Sven Eckelmann   batman-adv: Prefi...
100
  	struct batadv_hashtable *hash = bat_priv->orig_hash;
7aadf889e   Marek Lindner   batman-adv: remov...
101
  	struct hlist_head *head;
56303d34a   Sven Eckelmann   batman-adv: Prefi...
102
  	struct batadv_orig_node *orig_node, *orig_node_tmp = NULL;
7aadf889e   Marek Lindner   batman-adv: remov...
103
104
105
106
  	int index;
  
  	if (!hash)
  		return NULL;
da641193d   Sven Eckelmann   batman-adv: Prefi...
107
  	index = batadv_choose_orig(data, hash->size);
7aadf889e   Marek Lindner   batman-adv: remov...
108
109
110
  	head = &hash->table[index];
  
  	rcu_read_lock();
b67bfe0d4   Sasha Levin   hlist: drop the n...
111
  	hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
112
  		if (!batadv_compare_eth(orig_node, data))
7aadf889e   Marek Lindner   batman-adv: remov...
113
  			continue;
7c1243911   Sven Eckelmann   batman-adv: Conve...
114
  		if (!kref_get_unless_zero(&orig_node->refcount))
7b36e8eef   Marek Lindner   batman-adv: Corre...
115
  			continue;
7aadf889e   Marek Lindner   batman-adv: remov...
116
  		orig_node_tmp = orig_node;
7aadf889e   Marek Lindner   batman-adv: remov...
117
118
119
120
121
122
  		break;
  	}
  	rcu_read_unlock();
  
  	return orig_node_tmp;
  }
c6c8fea29   Sven Eckelmann   net: Add batman-a...
123
  #endif /* _NET_BATMAN_ADV_ORIGINATOR_H_ */