1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#ifndef _NET_BATMAN_ADV_MAIN_H_
19#define _NET_BATMAN_ADV_MAIN_H_
20
21#define BATADV_DRIVER_AUTHOR "Marek Lindner <mareklindner@neomailbox.ch>, " \
22 "Simon Wunderlich <sw@simonwunderlich.de>"
23#define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
24#define BATADV_DRIVER_DEVICE "batman-adv"
25
26#ifndef BATADV_SOURCE_VERSION
27#define BATADV_SOURCE_VERSION "2016.1"
28#endif
29
30
31
32#define BATADV_TQ_MAX_VALUE 255
33#define BATADV_THROUGHPUT_MAX_VALUE 0xFFFFFFFF
34#define BATADV_JITTER 20
35
36
37#define BATADV_TTL 50
38
39
40#define BATADV_BCAST_MAX_AGE 64
41
42
43
44
45#define BATADV_PURGE_TIMEOUT 200000
46#define BATADV_TT_LOCAL_TIMEOUT 600000
47#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000
48#define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000
49#define BATADV_TT_WORK_PERIOD 5000
50#define BATADV_ORIG_WORK_PERIOD 1000
51#define BATADV_DAT_ENTRY_TIMEOUT (5 * 60000)
52
53
54
55#define BATADV_TQ_LOCAL_WINDOW_SIZE 64
56
57#define BATADV_TT_REQUEST_TIMEOUT 3000
58
59#define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
60#define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
61#define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
62#define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
63
64
65#define BATADV_THROUGHPUT_DEFAULT_VALUE 10
66#define BATADV_ELP_PROBES_PER_NODE 2
67#define BATADV_ELP_MIN_PROBE_SIZE 200
68#define BATADV_ELP_PROBE_MAX_TX_DIFF 100
69#define BATADV_ELP_MAX_AGE 64
70#define BATADV_OGM_MAX_ORIGDIFF 5
71#define BATADV_OGM_MAX_AGE 64
72
73
74#define BATADV_TT_OGM_APPEND_MAX 3
75
76
77
78
79#define BATADV_ROAMING_MAX_TIME 20000
80#define BATADV_ROAMING_MAX_COUNT 5
81
82#define BATADV_NO_FLAGS 0
83
84#define BATADV_NULL_IFINDEX 0
85
86#define BATADV_NO_MARK 0
87
88
89
90
91
92#define BATADV_IF_DEFAULT ((struct batadv_hard_iface *)NULL)
93
94#define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
95
96#define BATADV_LOG_BUF_LEN 8192
97
98
99#define BATADV_NUM_BCASTS_DEFAULT 1
100#define BATADV_NUM_BCASTS_WIRELESS 3
101#define BATADV_NUM_BCASTS_MAX 3
102
103
104#define ARP_REQ_DELAY 250
105
106#define BATADV_DAT_CANDIDATES_NUM 3
107
108
109
110
111#define BATADV_TQ_SIMILARITY_THRESHOLD 50
112
113
114
115
116#define BATADV_MAX_AGGREGATION_BYTES 512
117#define BATADV_MAX_AGGREGATION_MS 100
118
119#define BATADV_BLA_PERIOD_LENGTH 10000
120#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 6)
121#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
122#define BATADV_BLA_WAIT_PERIODS 3
123
124#define BATADV_DUPLIST_SIZE 16
125#define BATADV_DUPLIST_TIMEOUT 500
126
127#define BATADV_RESET_PROTECTION_MS 30000
128#define BATADV_EXPECTED_SEQNO_RANGE 65536
129
130#define BATADV_NC_NODE_TIMEOUT 10000
131
132enum batadv_mesh_state {
133 BATADV_MESH_INACTIVE,
134 BATADV_MESH_ACTIVE,
135 BATADV_MESH_DEACTIVATING,
136};
137
138#define BATADV_BCAST_QUEUE_LEN 256
139#define BATADV_BATMAN_QUEUE_LEN 256
140
141enum batadv_uev_action {
142 BATADV_UEV_ADD = 0,
143 BATADV_UEV_DEL,
144 BATADV_UEV_CHANGE,
145};
146
147enum batadv_uev_type {
148 BATADV_UEV_GW = 0,
149};
150
151#define BATADV_GW_THRESHOLD 50
152
153
154#define BATADV_FRAG_BUFFER_COUNT 8
155
156#define BATADV_FRAG_MAX_FRAGMENTS 16
157
158#define BATADV_FRAG_MAX_FRAG_SIZE 1400
159
160#define BATADV_FRAG_TIMEOUT 10000
161
162#define BATADV_DAT_CANDIDATE_NOT_FOUND 0
163#define BATADV_DAT_CANDIDATE_ORIG 1
164
165
166#ifdef pr_fmt
167#undef pr_fmt
168#endif
169
170#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
171
172
173
174#include <linux/atomic.h>
175#include <linux/bitops.h>
176#include <linux/compiler.h>
177#include <linux/cpumask.h>
178#include <linux/etherdevice.h>
179#include <linux/if_ether.h>
180#include <linux/netdevice.h>
181#include <linux/printk.h>
182#include <linux/types.h>
183#include <linux/percpu.h>
184#include <linux/jiffies.h>
185#include <linux/if_vlan.h>
186
187#include "types.h"
188
189struct batadv_ogm_packet;
190struct seq_file;
191struct sk_buff;
192
193#define BATADV_PRINT_VID(vid) ((vid & BATADV_VLAN_HAS_TAG) ? \
194 (int)(vid & VLAN_VID_MASK) : -1)
195
196extern char batadv_routing_algo[];
197extern struct list_head batadv_hardif_list;
198
199extern unsigned char batadv_broadcast_addr[];
200extern struct workqueue_struct *batadv_event_workqueue;
201
202int batadv_mesh_init(struct net_device *soft_iface);
203void batadv_mesh_free(struct net_device *soft_iface);
204bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr);
205struct batadv_hard_iface *
206batadv_seq_print_text_primary_if_get(struct seq_file *seq);
207int batadv_max_header_len(void);
208void batadv_skb_set_priority(struct sk_buff *skb, int offset);
209int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
210 struct packet_type *ptype,
211 struct net_device *orig_dev);
212int
213batadv_recv_handler_register(u8 packet_type,
214 int (*recv_handler)(struct sk_buff *,
215 struct batadv_hard_iface *));
216void batadv_recv_handler_unregister(u8 packet_type);
217int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops);
218int batadv_algo_select(struct batadv_priv *bat_priv, char *name);
219int batadv_algo_seq_print_text(struct seq_file *seq, void *offset);
220__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr);
221
222
223
224
225
226
227
228
229
230
231
232enum batadv_dbg_level {
233 BATADV_DBG_BATMAN = BIT(0),
234 BATADV_DBG_ROUTES = BIT(1),
235 BATADV_DBG_TT = BIT(2),
236 BATADV_DBG_BLA = BIT(3),
237 BATADV_DBG_DAT = BIT(4),
238 BATADV_DBG_NC = BIT(5),
239 BATADV_DBG_ALL = 63,
240};
241
242#ifdef CONFIG_BATMAN_ADV_DEBUG
243int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
244__printf(2, 3);
245
246
247#define _batadv_dbg(type, bat_priv, ratelimited, fmt, arg...) \
248 do { \
249 if (atomic_read(&bat_priv->log_level) & type && \
250 (!ratelimited || net_ratelimit())) \
251 batadv_debug_log(bat_priv, fmt, ## arg);\
252 } \
253 while (0)
254#else
255__printf(4, 5)
256static inline void _batadv_dbg(int type __always_unused,
257 struct batadv_priv *bat_priv __always_unused,
258 int ratelimited __always_unused,
259 const char *fmt __always_unused, ...)
260{
261}
262#endif
263
264#define batadv_dbg(type, bat_priv, arg...) \
265 _batadv_dbg(type, bat_priv, 0, ## arg)
266#define batadv_dbg_ratelimited(type, bat_priv, arg...) \
267 _batadv_dbg(type, bat_priv, 1, ## arg)
268
269#define batadv_info(net_dev, fmt, arg...) \
270 do { \
271 struct net_device *_netdev = (net_dev); \
272 struct batadv_priv *_batpriv = netdev_priv(_netdev); \
273 batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \
274 pr_info("%s: " fmt, _netdev->name, ## arg); \
275 } while (0)
276#define batadv_err(net_dev, fmt, arg...) \
277 do { \
278 struct net_device *_netdev = (net_dev); \
279 struct batadv_priv *_batpriv = netdev_priv(_netdev); \
280 batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \
281 pr_err("%s: " fmt, _netdev->name, ## arg); \
282 } while (0)
283
284
285
286
287
288
289
290
291
292
293static inline bool batadv_compare_eth(const void *data1, const void *data2)
294{
295 return ether_addr_equal_unaligned(data1, data2);
296}
297
298
299
300
301
302
303
304
305static inline bool batadv_has_timed_out(unsigned long timestamp,
306 unsigned int timeout)
307{
308 return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
309}
310
311#define batadv_atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
312
313
314#define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
315
316
317
318
319
320
321
322
323
324
325
326#define batadv_seq_before(x, y) ({typeof(x)_d1 = (x); \
327 typeof(y)_d2 = (y); \
328 typeof(x)_dummy = (_d1 - _d2); \
329 (void)(&_d1 == &_d2); \
330 _dummy > batadv_smallest_signed_int(_dummy); })
331#define batadv_seq_after(x, y) batadv_seq_before(y, x)
332
333
334static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx,
335 size_t count)
336{
337 this_cpu_add(bat_priv->bat_counters[idx], count);
338}
339
340#define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
341
342
343
344
345
346
347
348
349static inline u64 batadv_sum_counter(struct batadv_priv *bat_priv, size_t idx)
350{
351 u64 *counters, sum = 0;
352 int cpu;
353
354 for_each_possible_cpu(cpu) {
355 counters = per_cpu_ptr(bat_priv->bat_counters, cpu);
356 sum += counters[idx];
357 }
358
359 return sum;
360}
361
362
363
364
365
366#define BATADV_SKB_CB(__skb) ((struct batadv_skb_cb *)&((__skb)->cb[0]))
367
368void batadv_tvlv_container_register(struct batadv_priv *bat_priv,
369 u8 type, u8 version,
370 void *tvlv_value, u16 tvlv_value_len);
371u16 batadv_tvlv_container_ogm_append(struct batadv_priv *bat_priv,
372 unsigned char **packet_buff,
373 int *packet_buff_len, int packet_min_len);
374void batadv_tvlv_ogm_receive(struct batadv_priv *bat_priv,
375 struct batadv_ogm_packet *batadv_ogm_packet,
376 struct batadv_orig_node *orig_node);
377void batadv_tvlv_container_unregister(struct batadv_priv *bat_priv,
378 u8 type, u8 version);
379
380void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
381 void (*optr)(struct batadv_priv *bat_priv,
382 struct batadv_orig_node *orig,
383 u8 flags,
384 void *tvlv_value,
385 u16 tvlv_value_len),
386 int (*uptr)(struct batadv_priv *bat_priv,
387 u8 *src, u8 *dst,
388 void *tvlv_value,
389 u16 tvlv_value_len),
390 u8 type, u8 version, u8 flags);
391void batadv_tvlv_handler_unregister(struct batadv_priv *bat_priv,
392 u8 type, u8 version);
393int batadv_tvlv_containers_process(struct batadv_priv *bat_priv,
394 bool ogm_source,
395 struct batadv_orig_node *orig_node,
396 u8 *src, u8 *dst,
397 void *tvlv_buff, u16 tvlv_buff_len);
398void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, u8 *src,
399 u8 *dst, u8 type, u8 version,
400 void *tvlv_value, u16 tvlv_value_len);
401unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len);
402bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid);
403
404#endif
405