]> git.karo-electronics.de Git - karo-tx-linux.git/blob - net/batman-adv/types.h
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[karo-tx-linux.git] / net / batman-adv / types.h
1 /* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner, Simon Wunderlich
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA
18  */
19
20 #ifndef _NET_BATMAN_ADV_TYPES_H_
21 #define _NET_BATMAN_ADV_TYPES_H_
22
23 #include "packet.h"
24 #include "bitarray.h"
25 #include <linux/kernel.h>
26
27 #define BATADV_HEADER_LEN \
28         (ETH_HLEN + max(sizeof(struct unicast_packet), \
29                         sizeof(struct bcast_packet)))
30
31 struct hard_iface {
32         struct list_head list;
33         int16_t if_num;
34         char if_status;
35         struct net_device *net_dev;
36         atomic_t seqno;
37         atomic_t frag_seqno;
38         unsigned char *packet_buff;
39         int packet_len;
40         struct kobject *hardif_obj;
41         atomic_t refcount;
42         struct packet_type batman_adv_ptype;
43         struct net_device *soft_iface;
44         struct rcu_head rcu;
45 };
46
47 /*      orig_node - structure for orig_list maintaining nodes of mesh
48  *      @primary_addr: hosts primary interface address
49  *      @last_seen: when last packet from this node was received
50  *      @bcast_seqno_reset: time when the broadcast seqno window was reset
51  *      @batman_seqno_reset: time when the batman seqno window was reset
52  *      @gw_flags: flags related to gateway class
53  *      @flags: for now only VIS_SERVER flag
54  *      @last_real_seqno: last and best known sequence number
55  *      @last_ttl: ttl of last received packet
56  *      @last_bcast_seqno: last broadcast sequence number received by this host
57  *
58  *      @candidates: how many candidates are available
59  *      @selected: next bonding candidate
60  */
61 struct orig_node {
62         uint8_t orig[ETH_ALEN];
63         uint8_t primary_addr[ETH_ALEN];
64         struct neigh_node __rcu *router; /* rcu protected pointer */
65         unsigned long *bcast_own;
66         uint8_t *bcast_own_sum;
67         unsigned long last_seen;
68         unsigned long bcast_seqno_reset;
69         unsigned long batman_seqno_reset;
70         uint8_t gw_flags;
71         uint8_t flags;
72         atomic_t last_ttvn; /* last seen translation table version number */
73         uint16_t tt_crc;
74         unsigned char *tt_buff;
75         int16_t tt_buff_len;
76         spinlock_t tt_buff_lock; /* protects tt_buff */
77         atomic_t tt_size;
78         bool tt_initialised;
79         /* The tt_poss_change flag is used to detect an ongoing roaming phase.
80          * If true, then I sent a Roaming_adv to this orig_node and I have to
81          * inspect every packet directed to it to check whether it is still
82          * the true destination or not. This flag will be reset to false as
83          * soon as I receive a new TTVN from this orig_node
84          */
85         bool tt_poss_change;
86         uint32_t last_real_seqno;
87         uint8_t last_ttl;
88         DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
89         uint32_t last_bcast_seqno;
90         struct hlist_head neigh_list;
91         struct list_head frag_list;
92         spinlock_t neigh_list_lock; /* protects neigh_list and router */
93         atomic_t refcount;
94         struct rcu_head rcu;
95         struct hlist_node hash_entry;
96         struct bat_priv *bat_priv;
97         unsigned long last_frag_packet;
98         /* ogm_cnt_lock protects: bcast_own, bcast_own_sum,
99          * neigh_node->real_bits, neigh_node->real_packet_count
100          */
101         spinlock_t ogm_cnt_lock;
102         /* bcast_seqno_lock protects bcast_bits, last_bcast_seqno */
103         spinlock_t bcast_seqno_lock;
104         spinlock_t tt_list_lock; /* protects tt_list */
105         atomic_t bond_candidates;
106         struct list_head bond_list;
107 };
108
109 struct gw_node {
110         struct hlist_node list;
111         struct orig_node *orig_node;
112         unsigned long deleted;
113         atomic_t refcount;
114         struct rcu_head rcu;
115 };
116
117 /*      neigh_node
118  *      @last_seen: when last packet via this neighbor was received
119  */
120 struct neigh_node {
121         struct hlist_node list;
122         uint8_t addr[ETH_ALEN];
123         uint8_t real_packet_count;
124         uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
125         uint8_t tq_index;
126         uint8_t tq_avg;
127         uint8_t last_ttl;
128         struct list_head bonding_list;
129         unsigned long last_seen;
130         DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
131         atomic_t refcount;
132         struct rcu_head rcu;
133         struct orig_node *orig_node;
134         struct hard_iface *if_incoming;
135         spinlock_t lq_update_lock;      /* protects: tq_recv, tq_index */
136 };
137
138 #ifdef CONFIG_BATMAN_ADV_BLA
139 struct bcast_duplist_entry {
140         uint8_t orig[ETH_ALEN];
141         uint16_t crc;
142         unsigned long entrytime;
143 };
144 #endif
145
146 enum bat_counters {
147         BAT_CNT_FORWARD,
148         BAT_CNT_FORWARD_BYTES,
149         BAT_CNT_MGMT_TX,
150         BAT_CNT_MGMT_TX_BYTES,
151         BAT_CNT_MGMT_RX,
152         BAT_CNT_MGMT_RX_BYTES,
153         BAT_CNT_TT_REQUEST_TX,
154         BAT_CNT_TT_REQUEST_RX,
155         BAT_CNT_TT_RESPONSE_TX,
156         BAT_CNT_TT_RESPONSE_RX,
157         BAT_CNT_TT_ROAM_ADV_TX,
158         BAT_CNT_TT_ROAM_ADV_RX,
159         BAT_CNT_NUM,
160 };
161
162 struct bat_priv {
163         atomic_t mesh_state;
164         struct net_device_stats stats;
165         uint64_t __percpu *bat_counters; /* Per cpu counters */
166         atomic_t aggregated_ogms;       /* boolean */
167         atomic_t bonding;               /* boolean */
168         atomic_t fragmentation;         /* boolean */
169         atomic_t ap_isolation;          /* boolean */
170         atomic_t bridge_loop_avoidance; /* boolean */
171         atomic_t vis_mode;              /* VIS_TYPE_* */
172         atomic_t gw_mode;               /* GW_MODE_* */
173         atomic_t gw_sel_class;          /* uint */
174         atomic_t gw_bandwidth;          /* gw bandwidth */
175         atomic_t orig_interval;         /* uint */
176         atomic_t hop_penalty;           /* uint */
177         atomic_t log_level;             /* uint */
178         atomic_t bcast_seqno;
179         atomic_t bcast_queue_left;
180         atomic_t batman_queue_left;
181         atomic_t ttvn; /* translation table version number */
182         atomic_t tt_ogm_append_cnt;
183         atomic_t tt_local_changes; /* changes registered in a OGM interval */
184         atomic_t bla_num_requests; /* number of bla requests in flight */
185         /* The tt_poss_change flag is used to detect an ongoing roaming phase.
186          * If true, then I received a Roaming_adv and I have to inspect every
187          * packet directed to me to check whether I am still the true
188          * destination or not. This flag will be reset to false as soon as I
189          * increase my TTVN
190          */
191         bool tt_poss_change;
192         char num_ifaces;
193         struct debug_log *debug_log;
194         struct kobject *mesh_obj;
195         struct dentry *debug_dir;
196         struct hlist_head forw_bat_list;
197         struct hlist_head forw_bcast_list;
198         struct hlist_head gw_list;
199         struct list_head tt_changes_list; /* tracks changes in a OGM int */
200         struct list_head vis_send_list;
201         struct hashtable_t *orig_hash;
202         struct hashtable_t *tt_local_hash;
203         struct hashtable_t *tt_global_hash;
204 #ifdef CONFIG_BATMAN_ADV_BLA
205         struct hashtable_t *claim_hash;
206         struct hashtable_t *backbone_hash;
207 #endif
208         struct list_head tt_req_list; /* list of pending tt_requests */
209         struct list_head tt_roam_list;
210         struct hashtable_t *vis_hash;
211 #ifdef CONFIG_BATMAN_ADV_BLA
212         struct bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
213         int bcast_duplist_curr;
214         struct bla_claim_dst claim_dest;
215 #endif
216         spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
217         spinlock_t forw_bcast_list_lock; /* protects  */
218         spinlock_t tt_changes_list_lock; /* protects tt_changes */
219         spinlock_t tt_req_list_lock; /* protects tt_req_list */
220         spinlock_t tt_roam_list_lock; /* protects tt_roam_list */
221         spinlock_t gw_list_lock; /* protects gw_list and curr_gw */
222         spinlock_t vis_hash_lock; /* protects vis_hash */
223         spinlock_t vis_list_lock; /* protects vis_info::recv_list */
224         atomic_t num_local_tt;
225         /* Checksum of the local table, recomputed before sending a new OGM */
226         uint16_t tt_crc;
227         unsigned char *tt_buff;
228         int16_t tt_buff_len;
229         spinlock_t tt_buff_lock; /* protects tt_buff */
230         struct delayed_work tt_work;
231         struct delayed_work orig_work;
232         struct delayed_work vis_work;
233         struct delayed_work bla_work;
234         struct gw_node __rcu *curr_gw;  /* rcu protected pointer */
235         atomic_t gw_reselect;
236         struct hard_iface __rcu *primary_if;  /* rcu protected pointer */
237         struct vis_info *my_vis_info;
238         struct bat_algo_ops *bat_algo_ops;
239 };
240
241 struct socket_client {
242         struct list_head queue_list;
243         unsigned int queue_len;
244         unsigned char index;
245         spinlock_t lock; /* protects queue_list, queue_len, index */
246         wait_queue_head_t queue_wait;
247         struct bat_priv *bat_priv;
248 };
249
250 struct socket_packet {
251         struct list_head list;
252         size_t icmp_len;
253         struct icmp_packet_rr icmp_packet;
254 };
255
256 struct tt_common_entry {
257         uint8_t addr[ETH_ALEN];
258         struct hlist_node hash_entry;
259         uint16_t flags;
260         atomic_t refcount;
261         struct rcu_head rcu;
262 };
263
264 struct tt_local_entry {
265         struct tt_common_entry common;
266         unsigned long last_seen;
267 };
268
269 struct tt_global_entry {
270         struct tt_common_entry common;
271         struct hlist_head orig_list;
272         spinlock_t list_lock;   /* protects the list */
273         unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
274 };
275
276 struct tt_orig_list_entry {
277         struct orig_node *orig_node;
278         uint8_t ttvn;
279         struct rcu_head rcu;
280         struct hlist_node list;
281 };
282
283 #ifdef CONFIG_BATMAN_ADV_BLA
284 struct backbone_gw {
285         uint8_t orig[ETH_ALEN];
286         short vid;              /* used VLAN ID */
287         struct hlist_node hash_entry;
288         struct bat_priv *bat_priv;
289         unsigned long lasttime; /* last time we heard of this backbone gw */
290         atomic_t request_sent;
291         atomic_t refcount;
292         struct rcu_head rcu;
293         uint16_t crc;           /* crc checksum over all claims */
294 };
295
296 struct claim {
297         uint8_t addr[ETH_ALEN];
298         short vid;
299         struct backbone_gw *backbone_gw;
300         unsigned long lasttime; /* last time we heard of claim (locals only) */
301         struct rcu_head rcu;
302         atomic_t refcount;
303         struct hlist_node hash_entry;
304 };
305 #endif
306
307 struct tt_change_node {
308         struct list_head list;
309         struct tt_change change;
310 };
311
312 struct tt_req_node {
313         uint8_t addr[ETH_ALEN];
314         unsigned long issued_at;
315         struct list_head list;
316 };
317
318 struct tt_roam_node {
319         uint8_t addr[ETH_ALEN];
320         atomic_t counter;
321         unsigned long first_time;
322         struct list_head list;
323 };
324
325 /*      forw_packet - structure for forw_list maintaining packets to be
326  *                    send/forwarded
327  */
328 struct forw_packet {
329         struct hlist_node list;
330         unsigned long send_time;
331         uint8_t own;
332         struct sk_buff *skb;
333         uint16_t packet_len;
334         uint32_t direct_link_flags;
335         uint8_t num_packets;
336         struct delayed_work delayed_work;
337         struct hard_iface *if_incoming;
338 };
339
340 /* While scanning for vis-entries of a particular vis-originator
341  * this list collects its interfaces to create a subgraph/cluster
342  * out of them later
343  */
344 struct if_list_entry {
345         uint8_t addr[ETH_ALEN];
346         bool primary;
347         struct hlist_node list;
348 };
349
350 struct debug_log {
351         char log_buff[BATADV_LOG_BUF_LEN];
352         unsigned long log_start;
353         unsigned long log_end;
354         spinlock_t lock; /* protects log_buff, log_start and log_end */
355         wait_queue_head_t queue_wait;
356 };
357
358 struct frag_packet_list_entry {
359         struct list_head list;
360         uint16_t seqno;
361         struct sk_buff *skb;
362 };
363
364 struct vis_info {
365         unsigned long first_seen;
366         /* list of server-neighbors we received a vis-packet
367          * from.  we should not reply to them.
368          */
369         struct list_head recv_list;
370         struct list_head send_list;
371         struct kref refcount;
372         struct hlist_node hash_entry;
373         struct bat_priv *bat_priv;
374         /* this packet might be part of the vis send queue. */
375         struct sk_buff *skb_packet;
376         /* vis_info may follow here */
377 } __packed;
378
379 struct vis_info_entry {
380         uint8_t  src[ETH_ALEN];
381         uint8_t  dest[ETH_ALEN];
382         uint8_t  quality;       /* quality = 0 client */
383 } __packed;
384
385 struct recvlist_node {
386         struct list_head list;
387         uint8_t mac[ETH_ALEN];
388 };
389
390 struct bat_algo_ops {
391         struct hlist_node list;
392         char *name;
393         /* init routing info when hard-interface is enabled */
394         int (*bat_iface_enable)(struct hard_iface *hard_iface);
395         /* de-init routing info when hard-interface is disabled */
396         void (*bat_iface_disable)(struct hard_iface *hard_iface);
397         /* (re-)init mac addresses of the protocol information
398          * belonging to this hard-interface
399          */
400         void (*bat_iface_update_mac)(struct hard_iface *hard_iface);
401         /* called when primary interface is selected / changed */
402         void (*bat_primary_iface_set)(struct hard_iface *hard_iface);
403         /* prepare a new outgoing OGM for the send queue */
404         void (*bat_ogm_schedule)(struct hard_iface *hard_iface);
405         /* send scheduled OGM */
406         void (*bat_ogm_emit)(struct forw_packet *forw_packet);
407 };
408
409 #endif /* _NET_BATMAN_ADV_TYPES_H_ */