1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 batadv_unicast_packet), \
29 sizeof(struct batadv_bcast_packet)))
30
31struct batadv_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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62struct batadv_orig_node {
63 uint8_t orig[ETH_ALEN];
64 uint8_t primary_addr[ETH_ALEN];
65 struct batadv_neigh_node __rcu *router;
66 unsigned long *bcast_own;
67 uint8_t *bcast_own_sum;
68 unsigned long last_seen;
69 unsigned long bcast_seqno_reset;
70 unsigned long batman_seqno_reset;
71 uint8_t gw_flags;
72 uint8_t flags;
73 atomic_t last_ttvn;
74 uint16_t tt_crc;
75 unsigned char *tt_buff;
76 int16_t tt_buff_len;
77 spinlock_t tt_buff_lock;
78 atomic_t tt_size;
79 bool tt_initialised;
80
81
82
83
84
85
86 bool tt_poss_change;
87 uint32_t last_real_seqno;
88 uint8_t last_ttl;
89 DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
90 uint32_t last_bcast_seqno;
91 struct hlist_head neigh_list;
92 struct list_head frag_list;
93 spinlock_t neigh_list_lock;
94 atomic_t refcount;
95 struct rcu_head rcu;
96 struct hlist_node hash_entry;
97 struct batadv_priv *bat_priv;
98 unsigned long last_frag_packet;
99
100
101
102 spinlock_t ogm_cnt_lock;
103
104 spinlock_t bcast_seqno_lock;
105 spinlock_t tt_list_lock;
106 atomic_t bond_candidates;
107 struct list_head bond_list;
108};
109
110struct batadv_gw_node {
111 struct hlist_node list;
112 struct batadv_orig_node *orig_node;
113 unsigned long deleted;
114 atomic_t refcount;
115 struct rcu_head rcu;
116};
117
118
119
120
121struct batadv_neigh_node {
122 struct hlist_node list;
123 uint8_t addr[ETH_ALEN];
124 uint8_t real_packet_count;
125 uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
126 uint8_t tq_index;
127 uint8_t tq_avg;
128 uint8_t last_ttl;
129 struct list_head bonding_list;
130 unsigned long last_seen;
131 DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
132 atomic_t refcount;
133 struct rcu_head rcu;
134 struct batadv_orig_node *orig_node;
135 struct batadv_hard_iface *if_incoming;
136 spinlock_t lq_update_lock;
137};
138
139#ifdef CONFIG_BATMAN_ADV_BLA
140struct batadv_bcast_duplist_entry {
141 uint8_t orig[ETH_ALEN];
142 uint16_t crc;
143 unsigned long entrytime;
144};
145#endif
146
147enum batadv_counters {
148 BATADV_CNT_FORWARD,
149 BATADV_CNT_FORWARD_BYTES,
150 BATADV_CNT_MGMT_TX,
151 BATADV_CNT_MGMT_TX_BYTES,
152 BATADV_CNT_MGMT_RX,
153 BATADV_CNT_MGMT_RX_BYTES,
154 BATADV_CNT_TT_REQUEST_TX,
155 BATADV_CNT_TT_REQUEST_RX,
156 BATADV_CNT_TT_RESPONSE_TX,
157 BATADV_CNT_TT_RESPONSE_RX,
158 BATADV_CNT_TT_ROAM_ADV_TX,
159 BATADV_CNT_TT_ROAM_ADV_RX,
160 BATADV_CNT_NUM,
161};
162
163struct batadv_priv {
164 atomic_t mesh_state;
165 struct net_device_stats stats;
166 uint64_t __percpu *bat_counters;
167 atomic_t aggregated_ogms;
168 atomic_t bonding;
169 atomic_t fragmentation;
170 atomic_t ap_isolation;
171 atomic_t bridge_loop_avoidance;
172 atomic_t vis_mode;
173 atomic_t gw_mode;
174 atomic_t gw_sel_class;
175 atomic_t gw_bandwidth;
176 atomic_t orig_interval;
177 atomic_t hop_penalty;
178 atomic_t log_level;
179 atomic_t bcast_seqno;
180 atomic_t bcast_queue_left;
181 atomic_t batman_queue_left;
182 atomic_t ttvn;
183 atomic_t tt_ogm_append_cnt;
184 atomic_t tt_local_changes;
185 atomic_t bla_num_requests;
186
187
188
189
190
191
192 bool tt_poss_change;
193 char num_ifaces;
194 struct batadv_debug_log *debug_log;
195 struct kobject *mesh_obj;
196 struct dentry *debug_dir;
197 struct hlist_head forw_bat_list;
198 struct hlist_head forw_bcast_list;
199 struct hlist_head gw_list;
200 struct list_head tt_changes_list;
201 struct list_head vis_send_list;
202 struct batadv_hashtable *orig_hash;
203 struct batadv_hashtable *tt_local_hash;
204 struct batadv_hashtable *tt_global_hash;
205#ifdef CONFIG_BATMAN_ADV_BLA
206 struct batadv_hashtable *claim_hash;
207 struct batadv_hashtable *backbone_hash;
208#endif
209 struct list_head tt_req_list;
210 struct list_head tt_roam_list;
211 struct batadv_hashtable *vis_hash;
212#ifdef CONFIG_BATMAN_ADV_BLA
213 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
214 int bcast_duplist_curr;
215 struct batadv_bla_claim_dst claim_dest;
216#endif
217 spinlock_t forw_bat_list_lock;
218 spinlock_t forw_bcast_list_lock;
219 spinlock_t tt_changes_list_lock;
220 spinlock_t tt_req_list_lock;
221 spinlock_t tt_roam_list_lock;
222 spinlock_t gw_list_lock;
223 spinlock_t vis_hash_lock;
224 spinlock_t vis_list_lock;
225 atomic_t num_local_tt;
226
227 uint16_t tt_crc;
228 unsigned char *tt_buff;
229 int16_t tt_buff_len;
230 spinlock_t tt_buff_lock;
231 struct delayed_work tt_work;
232 struct delayed_work orig_work;
233 struct delayed_work vis_work;
234 struct delayed_work bla_work;
235 struct batadv_gw_node __rcu *curr_gw;
236 atomic_t gw_reselect;
237 struct batadv_hard_iface __rcu *primary_if;
238 struct batadv_vis_info *my_vis_info;
239 struct batadv_algo_ops *bat_algo_ops;
240};
241
242struct batadv_socket_client {
243 struct list_head queue_list;
244 unsigned int queue_len;
245 unsigned char index;
246 spinlock_t lock;
247 wait_queue_head_t queue_wait;
248 struct batadv_priv *bat_priv;
249};
250
251struct batadv_socket_packet {
252 struct list_head list;
253 size_t icmp_len;
254 struct batadv_icmp_packet_rr icmp_packet;
255};
256
257struct batadv_tt_common_entry {
258 uint8_t addr[ETH_ALEN];
259 struct hlist_node hash_entry;
260 uint16_t flags;
261 atomic_t refcount;
262 struct rcu_head rcu;
263};
264
265struct batadv_tt_local_entry {
266 struct batadv_tt_common_entry common;
267 unsigned long last_seen;
268};
269
270struct batadv_tt_global_entry {
271 struct batadv_tt_common_entry common;
272 struct hlist_head orig_list;
273 spinlock_t list_lock;
274 unsigned long roam_at;
275};
276
277struct batadv_tt_orig_list_entry {
278 struct batadv_orig_node *orig_node;
279 uint8_t ttvn;
280 struct rcu_head rcu;
281 struct hlist_node list;
282};
283
284#ifdef CONFIG_BATMAN_ADV_BLA
285struct batadv_backbone_gw {
286 uint8_t orig[ETH_ALEN];
287 short vid;
288 struct hlist_node hash_entry;
289 struct batadv_priv *bat_priv;
290 unsigned long lasttime;
291 atomic_t request_sent;
292 atomic_t refcount;
293 struct rcu_head rcu;
294 uint16_t crc;
295};
296
297struct batadv_claim {
298 uint8_t addr[ETH_ALEN];
299 short vid;
300 struct batadv_backbone_gw *backbone_gw;
301 unsigned long lasttime;
302 struct rcu_head rcu;
303 atomic_t refcount;
304 struct hlist_node hash_entry;
305};
306#endif
307
308struct batadv_tt_change_node {
309 struct list_head list;
310 struct batadv_tt_change change;
311};
312
313struct batadv_tt_req_node {
314 uint8_t addr[ETH_ALEN];
315 unsigned long issued_at;
316 struct list_head list;
317};
318
319struct batadv_tt_roam_node {
320 uint8_t addr[ETH_ALEN];
321 atomic_t counter;
322 unsigned long first_time;
323 struct list_head list;
324};
325
326
327
328
329struct batadv_forw_packet {
330 struct hlist_node list;
331 unsigned long send_time;
332 uint8_t own;
333 struct sk_buff *skb;
334 uint16_t packet_len;
335 uint32_t direct_link_flags;
336 uint8_t num_packets;
337 struct delayed_work delayed_work;
338 struct batadv_hard_iface *if_incoming;
339};
340
341
342
343
344
345struct batadv_if_list_entry {
346 uint8_t addr[ETH_ALEN];
347 bool primary;
348 struct hlist_node list;
349};
350
351struct batadv_debug_log {
352 char log_buff[BATADV_LOG_BUF_LEN];
353 unsigned long log_start;
354 unsigned long log_end;
355 spinlock_t lock;
356 wait_queue_head_t queue_wait;
357};
358
359struct batadv_frag_packet_list_entry {
360 struct list_head list;
361 uint16_t seqno;
362 struct sk_buff *skb;
363};
364
365struct batadv_vis_info {
366 unsigned long first_seen;
367
368
369
370 struct list_head recv_list;
371 struct list_head send_list;
372 struct kref refcount;
373 struct hlist_node hash_entry;
374 struct batadv_priv *bat_priv;
375
376 struct sk_buff *skb_packet;
377
378} __packed;
379
380struct batadv_vis_info_entry {
381 uint8_t src[ETH_ALEN];
382 uint8_t dest[ETH_ALEN];
383 uint8_t quality;
384} __packed;
385
386struct batadv_recvlist_node {
387 struct list_head list;
388 uint8_t mac[ETH_ALEN];
389};
390
391struct batadv_algo_ops {
392 struct hlist_node list;
393 char *name;
394
395 int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
396
397 void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
398
399
400
401 void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
402
403 void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
404
405 void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
406
407 void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
408};
409
410#endif
411