batman-adv: protect softif_neigh by rcu
[pandora-kernel.git] / net / batman-adv / types.h
1 /*
2  * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
3  *
4  * Marek Lindner, Simon Wunderlich
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA
19  *
20  */
21
22
23
24 #ifndef _NET_BATMAN_ADV_TYPES_H_
25 #define _NET_BATMAN_ADV_TYPES_H_
26
27 #include "packet.h"
28 #include "bitarray.h"
29
30 #define BAT_HEADER_LEN (sizeof(struct ethhdr) + \
31         ((sizeof(struct unicast_packet) > sizeof(struct bcast_packet) ? \
32          sizeof(struct unicast_packet) : \
33          sizeof(struct bcast_packet))))
34
35
36 struct hard_iface {
37         struct list_head list;
38         int16_t if_num;
39         char if_status;
40         struct net_device *net_dev;
41         atomic_t seqno;
42         atomic_t frag_seqno;
43         unsigned char *packet_buff;
44         int packet_len;
45         struct kobject *hardif_obj;
46         atomic_t refcount;
47         struct packet_type batman_adv_ptype;
48         struct net_device *soft_iface;
49         struct rcu_head rcu;
50 };
51
52 /**
53  *      orig_node - structure for orig_list maintaining nodes of mesh
54  *      @primary_addr: hosts primary interface address
55  *      @last_valid: when last packet from this node was received
56  *      @bcast_seqno_reset: time when the broadcast seqno window was reset
57  *      @batman_seqno_reset: time when the batman seqno window was reset
58  *      @gw_flags: flags related to gateway class
59  *      @flags: for now only VIS_SERVER flag
60  *      @last_real_seqno: last and best known squence number
61  *      @last_ttl: ttl of last received packet
62  *      @last_bcast_seqno: last broadcast sequence number received by this host
63  *
64  *      @candidates: how many candidates are available
65  *      @selected: next bonding candidate
66  */
67 struct orig_node {
68         uint8_t orig[ETH_ALEN];
69         uint8_t primary_addr[ETH_ALEN];
70         struct neigh_node __rcu *router; /* rcu protected pointer */
71         unsigned long *bcast_own;
72         uint8_t *bcast_own_sum;
73         unsigned long last_valid;
74         unsigned long bcast_seqno_reset;
75         unsigned long batman_seqno_reset;
76         uint8_t gw_flags;
77         uint8_t flags;
78         unsigned char *hna_buff;
79         int16_t hna_buff_len;
80         uint32_t last_real_seqno;
81         uint8_t last_ttl;
82         unsigned long bcast_bits[NUM_WORDS];
83         uint32_t last_bcast_seqno;
84         struct hlist_head neigh_list;
85         struct list_head frag_list;
86         spinlock_t neigh_list_lock; /* protects neigh_list and router */
87         atomic_t refcount;
88         struct rcu_head rcu;
89         struct hlist_node hash_entry;
90         struct bat_priv *bat_priv;
91         unsigned long last_frag_packet;
92         spinlock_t ogm_cnt_lock; /* protects: bcast_own, bcast_own_sum,
93                                   * neigh_node->real_bits,
94                                   * neigh_node->real_packet_count */
95         spinlock_t bcast_seqno_lock; /* protects bcast_bits,
96                                       *  last_bcast_seqno */
97         atomic_t bond_candidates;
98         struct list_head bond_list;
99 };
100
101 struct gw_node {
102         struct hlist_node list;
103         struct orig_node *orig_node;
104         unsigned long deleted;
105         atomic_t refcount;
106         struct rcu_head rcu;
107 };
108
109 /**
110  *      neigh_node
111  *      @last_valid: when last packet via this neighbor was received
112  */
113 struct neigh_node {
114         struct hlist_node list;
115         uint8_t addr[ETH_ALEN];
116         uint8_t real_packet_count;
117         uint8_t tq_recv[TQ_GLOBAL_WINDOW_SIZE];
118         uint8_t tq_index;
119         uint8_t tq_avg;
120         uint8_t last_ttl;
121         struct list_head bonding_list;
122         unsigned long last_valid;
123         unsigned long real_bits[NUM_WORDS];
124         atomic_t refcount;
125         struct rcu_head rcu;
126         struct orig_node *orig_node;
127         struct hard_iface *if_incoming;
128         spinlock_t tq_lock;     /* protects: tq_recv, tq_index */
129 };
130
131
132 struct bat_priv {
133         atomic_t mesh_state;
134         struct net_device_stats stats;
135         atomic_t aggregated_ogms;       /* boolean */
136         atomic_t bonding;               /* boolean */
137         atomic_t fragmentation;         /* boolean */
138         atomic_t vis_mode;              /* VIS_TYPE_* */
139         atomic_t gw_mode;               /* GW_MODE_* */
140         atomic_t gw_sel_class;          /* uint */
141         atomic_t gw_bandwidth;          /* gw bandwidth */
142         atomic_t orig_interval;         /* uint */
143         atomic_t hop_penalty;           /* uint */
144         atomic_t log_level;             /* uint */
145         atomic_t bcast_seqno;
146         atomic_t bcast_queue_left;
147         atomic_t batman_queue_left;
148         char num_ifaces;
149         struct hlist_head softif_neigh_list;
150         struct softif_neigh __rcu *softif_neigh;
151         struct debug_log *debug_log;
152         struct hard_iface *primary_if;
153         struct kobject *mesh_obj;
154         struct dentry *debug_dir;
155         struct hlist_head forw_bat_list;
156         struct hlist_head forw_bcast_list;
157         struct hlist_head gw_list;
158         struct list_head vis_send_list;
159         struct hashtable_t *orig_hash;
160         struct hashtable_t *hna_local_hash;
161         struct hashtable_t *hna_global_hash;
162         struct hashtable_t *vis_hash;
163         spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
164         spinlock_t forw_bcast_list_lock; /* protects  */
165         spinlock_t hna_lhash_lock; /* protects hna_local_hash */
166         spinlock_t hna_ghash_lock; /* protects hna_global_hash */
167         spinlock_t gw_list_lock; /* protects gw_list and curr_gw */
168         spinlock_t vis_hash_lock; /* protects vis_hash */
169         spinlock_t vis_list_lock; /* protects vis_info::recv_list */
170         spinlock_t softif_neigh_lock; /* protects soft-interface neigh list */
171         int16_t num_local_hna;
172         atomic_t hna_local_changed;
173         struct delayed_work hna_work;
174         struct delayed_work orig_work;
175         struct delayed_work vis_work;
176         struct gw_node __rcu *curr_gw;  /* rcu protected pointer */
177         struct vis_info *my_vis_info;
178 };
179
180 struct socket_client {
181         struct list_head queue_list;
182         unsigned int queue_len;
183         unsigned char index;
184         spinlock_t lock; /* protects queue_list, queue_len, index */
185         wait_queue_head_t queue_wait;
186         struct bat_priv *bat_priv;
187 };
188
189 struct socket_packet {
190         struct list_head list;
191         size_t icmp_len;
192         struct icmp_packet_rr icmp_packet;
193 };
194
195 struct hna_local_entry {
196         uint8_t addr[ETH_ALEN];
197         unsigned long last_seen;
198         char never_purge;
199         struct hlist_node hash_entry;
200 };
201
202 struct hna_global_entry {
203         uint8_t addr[ETH_ALEN];
204         struct orig_node *orig_node;
205         struct hlist_node hash_entry;
206 };
207
208 /**
209  *      forw_packet - structure for forw_list maintaining packets to be
210  *                    send/forwarded
211  */
212 struct forw_packet {
213         struct hlist_node list;
214         unsigned long send_time;
215         uint8_t own;
216         struct sk_buff *skb;
217         uint16_t packet_len;
218         uint32_t direct_link_flags;
219         uint8_t num_packets;
220         struct delayed_work delayed_work;
221         struct hard_iface *if_incoming;
222 };
223
224 /* While scanning for vis-entries of a particular vis-originator
225  * this list collects its interfaces to create a subgraph/cluster
226  * out of them later
227  */
228 struct if_list_entry {
229         uint8_t addr[ETH_ALEN];
230         bool primary;
231         struct hlist_node list;
232 };
233
234 struct debug_log {
235         char log_buff[LOG_BUF_LEN];
236         unsigned long log_start;
237         unsigned long log_end;
238         spinlock_t lock; /* protects log_buff, log_start and log_end */
239         wait_queue_head_t queue_wait;
240 };
241
242 struct frag_packet_list_entry {
243         struct list_head list;
244         uint16_t seqno;
245         struct sk_buff *skb;
246 };
247
248 struct vis_info {
249         unsigned long       first_seen;
250         struct list_head    recv_list;
251                             /* list of server-neighbors we received a vis-packet
252                              * from.  we should not reply to them. */
253         struct list_head send_list;
254         struct kref refcount;
255         struct hlist_node hash_entry;
256         struct bat_priv *bat_priv;
257         /* this packet might be part of the vis send queue. */
258         struct sk_buff *skb_packet;
259         /* vis_info may follow here*/
260 } __packed;
261
262 struct vis_info_entry {
263         uint8_t  src[ETH_ALEN];
264         uint8_t  dest[ETH_ALEN];
265         uint8_t  quality;       /* quality = 0 means HNA */
266 } __packed;
267
268 struct recvlist_node {
269         struct list_head list;
270         uint8_t mac[ETH_ALEN];
271 };
272
273 struct softif_neigh {
274         struct hlist_node list;
275         uint8_t addr[ETH_ALEN];
276         unsigned long last_seen;
277         short vid;
278         atomic_t refcount;
279         struct rcu_head rcu;
280 };
281
282 #endif /* _NET_BATMAN_ADV_TYPES_H_ */