Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
batman-adv
main.h
Go to the documentation of this file.
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_MAIN_H_
21
#define _NET_BATMAN_ADV_MAIN_H_
22
23
#define BATADV_DRIVER_AUTHOR "Marek Lindner <
[email protected]
>, " \
24
"Simon Wunderlich <
[email protected]
>"
25
#define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
26
#define BATADV_DRIVER_DEVICE "batman-adv"
27
28
#ifndef BATADV_SOURCE_VERSION
29
#define BATADV_SOURCE_VERSION "2012.4.0"
30
#endif
31
32
/* B.A.T.M.A.N. parameters */
33
34
#define BATADV_TQ_MAX_VALUE 255
35
#define BATADV_JITTER 20
36
37
/* Time To Live of broadcast messages */
38
#define BATADV_TTL 50
39
40
/* purge originators after time in seconds if no valid packet comes in
41
* -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
42
*/
43
#define BATADV_PURGE_TIMEOUT 200000
/* 200 seconds */
44
#define BATADV_TT_LOCAL_TIMEOUT 3600000
/* in milliseconds */
45
#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000
/* in milliseconds */
46
#define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000
/* in milliseconds */
47
/* sliding packet range of received originator messages in sequence numbers
48
* (should be a multiple of our word size)
49
*/
50
#define BATADV_TQ_LOCAL_WINDOW_SIZE 64
51
/* milliseconds we have to keep pending tt_req */
52
#define BATADV_TT_REQUEST_TIMEOUT 3000
53
54
#define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
55
#define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
56
#define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
57
#define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
58
59
/* number of OGMs sent with the last tt diff */
60
#define BATADV_TT_OGM_APPEND_MAX 3
61
62
/* Time in which a client can roam at most ROAMING_MAX_COUNT times in
63
* milliseconds
64
*/
65
#define BATADV_ROAMING_MAX_TIME 20000
66
#define BATADV_ROAMING_MAX_COUNT 5
67
68
#define BATADV_NO_FLAGS 0
69
70
#define BATADV_NULL_IFINDEX 0
/* dummy ifindex used to avoid iface checks */
71
72
#define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
73
74
#define BATADV_LOG_BUF_LEN 8192
/* has to be a power of 2 */
75
76
#define BATADV_VIS_INTERVAL 5000
/* 5 seconds */
77
78
/* how much worse secondary interfaces may be to be considered as bonding
79
* candidates
80
*/
81
#define BATADV_BONDING_TQ_THRESHOLD 50
82
83
/* should not be bigger than 512 bytes or change the size of
84
* forw_packet->direct_link_flags
85
*/
86
#define BATADV_MAX_AGGREGATION_BYTES 512
87
#define BATADV_MAX_AGGREGATION_MS 100
88
89
#define BATADV_BLA_PERIOD_LENGTH 10000
/* 10 seconds */
90
#define BATADV_BLA_BACKBONE_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 3)
91
#define BATADV_BLA_CLAIM_TIMEOUT (BATADV_BLA_PERIOD_LENGTH * 10)
92
93
#define BATADV_DUPLIST_SIZE 16
94
#define BATADV_DUPLIST_TIMEOUT 500
/* 500 ms */
95
/* don't reset again within 30 seconds */
96
#define BATADV_RESET_PROTECTION_MS 30000
97
#define BATADV_EXPECTED_SEQNO_RANGE 65536
98
99
enum
batadv_mesh_state
{
100
BATADV_MESH_INACTIVE
,
101
BATADV_MESH_ACTIVE
,
102
BATADV_MESH_DEACTIVATING
,
103
};
104
105
#define BATADV_BCAST_QUEUE_LEN 256
106
#define BATADV_BATMAN_QUEUE_LEN 256
107
108
enum
batadv_uev_action
{
109
BATADV_UEV_ADD
= 0,
110
BATADV_UEV_DEL
,
111
BATADV_UEV_CHANGE
,
112
};
113
114
enum
batadv_uev_type
{
115
BATADV_UEV_GW
= 0,
116
};
117
118
#define BATADV_GW_THRESHOLD 50
119
120
/* Debug Messages */
121
#ifdef pr_fmt
122
#undef pr_fmt
123
#endif
124
/* Append 'batman-adv: ' before kernel messages */
125
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
126
127
/* Kernel headers */
128
129
#include <
linux/mutex.h
>
/* mutex */
130
#include <linux/module.h>
/* needed by all modules */
131
#include <linux/netdevice.h>
/* netdevice */
132
#include <
linux/etherdevice.h
>
/* ethernet address classification */
133
#include <linux/if_ether.h>
/* ethernet header */
134
#include <linux/poll.h>
/* poll_table */
135
#include <
linux/kthread.h
>
/* kernel threads */
136
#include <
linux/pkt_sched.h
>
/* schedule types */
137
#include <
linux/workqueue.h
>
/* workqueue */
138
#include <
linux/percpu.h
>
139
#include <linux/slab.h>
140
#include <
net/sock.h
>
/* struct sock */
141
#include <
linux/jiffies.h
>
142
#include <
linux/seq_file.h
>
143
#include "
types.h
"
144
145
extern
char
batadv_routing_algo
[];
146
extern
struct
list_head
batadv_hardif_list
;
147
148
extern
unsigned
char
batadv_broadcast_addr
[];
149
extern
struct
workqueue_struct
*
batadv_event_workqueue
;
150
151
int
batadv_mesh_init
(
struct
net_device
*soft_iface);
152
void
batadv_mesh_free
(
struct
net_device
*soft_iface);
153
void
batadv_inc_module_count
(
void
);
154
void
batadv_dec_module_count
(
void
);
155
int
batadv_is_my_mac
(
const
uint8_t
*
addr
);
156
int
batadv_batman_skb_recv
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
,
157
struct
packet_type
*ptype,
158
struct
net_device
*orig_dev);
159
int
160
batadv_recv_handler_register
(
uint8_t
packet_type
,
161
int
(*recv_handler)(
struct
sk_buff
*,
162
struct
batadv_hard_iface
*));
163
void
batadv_recv_handler_unregister
(
uint8_t
packet_type);
164
int
batadv_algo_register
(
struct
batadv_algo_ops
*bat_algo_ops);
165
int
batadv_algo_select
(
struct
batadv_priv
*bat_priv,
char
*
name
);
166
int
batadv_algo_seq_print_text
(
struct
seq_file
*seq,
void
*
offset
);
167
168
/* all messages related to routing / flooding / broadcasting / etc */
169
enum
batadv_dbg_level
{
170
BATADV_DBG_BATMAN
=
BIT
(0),
171
BATADV_DBG_ROUTES
=
BIT
(1),
/* route added / changed / deleted */
172
BATADV_DBG_TT
=
BIT
(2),
/* translation table operations */
173
BATADV_DBG_BLA
=
BIT
(3),
/* bridge loop avoidance */
174
BATADV_DBG_ALL
= 15,
175
};
176
177
#ifdef CONFIG_BATMAN_ADV_DEBUG
178
int
batadv_debug_log
(
struct
batadv_priv
*bat_priv,
const
char
*
fmt
, ...)
179
__printf
(2, 3);
180
181
#define batadv_dbg(type, bat_priv, fmt, arg...) \
182
do { \
183
if (atomic_read(&bat_priv->log_level) & type) \
184
batadv_debug_log(bat_priv, fmt, ## arg);\
185
} \
186
while (0)
187
#else
/* !CONFIG_BATMAN_ADV_DEBUG */
188
__printf
(3, 4)
189
static
inline
void
batadv_dbg(
int
type
__always_unused
,
190
struct
batadv_priv
*bat_priv __always_unused,
191
const
char
*fmt __always_unused, ...)
192
{
193
}
194
#endif
195
196
#define batadv_info(net_dev, fmt, arg...) \
197
do { \
198
struct net_device *_netdev = (net_dev); \
199
struct batadv_priv *_batpriv = netdev_priv(_netdev); \
200
batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \
201
pr_info("%s: " fmt, _netdev->name, ## arg); \
202
} while (0)
203
#define batadv_err(net_dev, fmt, arg...) \
204
do { \
205
struct net_device *_netdev = (net_dev); \
206
struct batadv_priv *_batpriv = netdev_priv(_netdev); \
207
batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg); \
208
pr_err("%s: " fmt, _netdev->name, ## arg); \
209
} while (0)
210
211
/* returns 1 if they are the same ethernet addr
212
*
213
* note: can't use compare_ether_addr() as it requires aligned memory
214
*/
215
static
inline
int
batadv_compare_eth(
const
void
*
data1
,
const
void
*
data2
)
216
{
217
return
(
memcmp
(data1, data2,
ETH_ALEN
) == 0 ? 1 : 0);
218
}
219
227
static
inline
bool
batadv_has_timed_out(
unsigned
long
timestamp
,
228
unsigned
int
timeout)
229
{
230
return
time_is_before_jiffies
(timestamp +
msecs_to_jiffies
(timeout));
231
}
232
233
#define batadv_atomic_dec_not_zero(v) atomic_add_unless((v), -1, 0)
234
235
/* Returns the smallest signed integer in two's complement with the sizeof x */
236
#define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
237
238
/* Checks if a sequence number x is a predecessor/successor of y.
239
* they handle overflows/underflows and can correctly check for a
240
* predecessor/successor unless the variable sequence number has grown by
241
* more then 2**(bitwidth(x)-1)-1.
242
* This means that for a uint8_t with the maximum value 255, it would think:
243
* - when adding nothing - it is neither a predecessor nor a successor
244
* - before adding more than 127 to the starting value - it is a predecessor,
245
* - when adding 128 - it is neither a predecessor nor a successor,
246
* - after adding more than 127 to the starting value - it is a successor
247
*/
248
#define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \
249
typeof(y) _d2 = (y); \
250
typeof(x) _dummy = (_d1 - _d2); \
251
(void) (&_d1 == &_d2); \
252
_dummy > batadv_smallest_signed_int(_dummy); })
253
#define batadv_seq_after(x, y) batadv_seq_before(y, x)
254
255
/* Stop preemption on local cpu while incrementing the counter */
256
static
inline
void
batadv_add_counter(
struct
batadv_priv
*bat_priv,
size_t
idx
,
257
size_t
count
)
258
{
259
int
cpu
=
get_cpu
();
260
per_cpu_ptr
(bat_priv->
bat_counters
, cpu)[
idx
] +=
count
;
261
put_cpu
();
262
}
263
264
#define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
265
266
/* Sum and return the cpu-local counters for index 'idx' */
267
static
inline
uint64_t
batadv_sum_counter(
struct
batadv_priv
*bat_priv,
268
size_t
idx
)
269
{
270
uint64_t
*counters,
sum
= 0;
271
int
cpu
;
272
273
for_each_possible_cpu
(cpu) {
274
counters =
per_cpu_ptr
(bat_priv->
bat_counters
, cpu);
275
sum += counters[
idx
];
276
}
277
278
return
sum
;
279
}
280
281
#endif
/* _NET_BATMAN_ADV_MAIN_H_ */
Generated on Thu Jan 10 2013 14:09:42 for Linux Kernel by
1.8.2