Blame view

net/batman-adv/main.h 13.2 KB
e19f9759e   Simon Wunderlich   batman-adv: updat...
1
  /* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
2
3
4
5
6
7
8
9
10
11
12
13
14
   *
   * Marek Lindner, Simon Wunderlich
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of version 2 of the GNU General Public
   * License as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
ebf38fb7a   Antonio Quartulli   batman-adv: remov...
15
   * along with this program; if not, see <http://www.gnu.org/licenses/>.
c6c8fea29   Sven Eckelmann   net: Add batman-a...
16
17
18
19
   */
  
  #ifndef _NET_BATMAN_ADV_MAIN_H_
  #define _NET_BATMAN_ADV_MAIN_H_
bc58eeef7   Marek Lindner   batman-adv: updat...
20
  #define BATADV_DRIVER_AUTHOR "Marek Lindner <mareklindner@neomailbox.ch>, " \
c679ff8fb   Simon Wunderlich   batman-adv: updat...
21
  			     "Simon Wunderlich <sw@simonwunderlich.de>"
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
22
23
  #define BATADV_DRIVER_DESC   "B.A.T.M.A.N. advanced"
  #define BATADV_DRIVER_DEVICE "batman-adv"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
24

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
25
  #ifndef BATADV_SOURCE_VERSION
8d90d775c   Simon Wunderlich   batman-adv: Start...
26
  #define BATADV_SOURCE_VERSION "2014.1.0"
44c4349a2   Sven Eckelmann   batman-adv: Repla...
27
  #endif
c6c8fea29   Sven Eckelmann   net: Add batman-a...
28
29
  
  /* B.A.T.M.A.N. parameters */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
30
31
  #define BATADV_TQ_MAX_VALUE 255
  #define BATADV_JITTER 20
c6c8fea29   Sven Eckelmann   net: Add batman-a...
32

9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
33
  /* Time To Live of broadcast messages */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
34
  #define BATADV_TTL 50
6e215fd8e   Sven Eckelmann   batman-adv: Remov...
35
36
  
  /* purge originators after time in seconds if no valid packet comes in
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
37
   * -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
38
   */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
39
  #define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
7cf4d520f   Antonio Quartulli   batman-adv: reduc...
40
  #define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */
a51fb9b2a   Antonio Quartulli   batman-adv: fix t...
41
  #define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */
30cfd02b6   Antonio Quartulli   batman-adv: detec...
42
  #define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */
724144420   Antonio Quartulli   batman-adv: a del...
43
44
  #define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */
  #define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */
2f1dfbe18   Antonio Quartulli   batman-adv: Distr...
45
  #define BATADV_DAT_ENTRY_TIMEOUT (5*60000) /* 5 mins in milliseconds */
015758d00   Antonio Quartulli   batman-adv: corre...
46
  /* sliding packet range of received originator messages in sequence numbers
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
47
48
   * (should be a multiple of our word size)
   */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
49
  #define BATADV_TQ_LOCAL_WINDOW_SIZE 64
a51fb9b2a   Antonio Quartulli   batman-adv: fix t...
50
  /* milliseconds we have to keep pending tt_req */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
51
  #define BATADV_TT_REQUEST_TIMEOUT 3000
a73105b8d   Antonio Quartulli   batman-adv: impro...
52

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
53
54
55
56
  #define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
  #define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
  #define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
  #define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
c6c8fea29   Sven Eckelmann   net: Add batman-a...
57

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
58
59
  /* number of OGMs sent with the last tt diff */
  #define BATADV_TT_OGM_APPEND_MAX 3
a73105b8d   Antonio Quartulli   batman-adv: impro...
60

9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
61
  /* Time in which a client can roam at most ROAMING_MAX_COUNT times in
a51fb9b2a   Antonio Quartulli   batman-adv: fix t...
62
   * milliseconds
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
63
   */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
64
65
  #define BATADV_ROAMING_MAX_TIME 20000
  #define BATADV_ROAMING_MAX_COUNT 5
cc47f66e6   Antonio Quartulli   batman-adv: impro...
66

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
67
  #define BATADV_NO_FLAGS 0
ecbd53210   Marek Lindner   batman-adv: use N...
68

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
69
  #define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
bc2790808   Antonio Quartulli   batman-adv: detec...
70

9464d0718   Antonio Quartulli   batman-adv: mark ...
71
  #define BATADV_NO_MARK 0
89652331c   Simon Wunderlich   batman-adv: split...
72
73
74
75
76
  /* default interface for multi interface operation. The default interface is
   * used for communication which originated locally (i.e. is not forwarded)
   * or where special forwarding is not desired/necessary.
   */
  #define BATADV_IF_DEFAULT	((struct batadv_hard_iface *)NULL)
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
77
  #define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
78

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
79
  #define BATADV_LOG_BUF_LEN 8192	  /* has to be a power of 2 */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
80

caf65bfcc   Matthias Schiffer   batman-adv: send ...
81
82
83
84
  /* number of packets to send for broadcasts on different interface types */
  #define BATADV_NUM_BCASTS_DEFAULT 1
  #define BATADV_NUM_BCASTS_WIRELESS 3
  #define BATADV_NUM_BCASTS_MAX 3
c384ea3ec   Antonio Quartulli   batman-adv: Distr...
85
86
  /* msecs after which an ARP_REQUEST is sent in broadcast as fallback */
  #define ARP_REQ_DELAY 250
785ea1144   Antonio Quartulli   batman-adv: Distr...
87
88
  /* numbers of originator to contact for any PUT/GET DHT operation */
  #define BATADV_DAT_CANDIDATES_NUM 3
c43c981e5   Antonio Quartulli   batman-adv: add b...
89
90
91
92
93
  /**
   * BATADV_TQ_SIMILARITY_THRESHOLD - TQ points that a secondary metric can differ
   *  at most from the primary one in order to be still considered acceptable
   */
  #define BATADV_TQ_SIMILARITY_THRESHOLD 50
6e215fd8e   Sven Eckelmann   batman-adv: Remov...
94
  /* how much worse secondary interfaces may be to be considered as bonding
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
95
96
   * candidates
   */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
97
  #define BATADV_BONDING_TQ_THRESHOLD	50
c6c8fea29   Sven Eckelmann   net: Add batman-a...
98

6e215fd8e   Sven Eckelmann   batman-adv: Remov...
99
  /* should not be bigger than 512 bytes or change the size of
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
100
101
   * forw_packet->direct_link_flags
   */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
102
103
  #define BATADV_MAX_AGGREGATION_BYTES 512
  #define BATADV_MAX_AGGREGATION_MS 100
c6c8fea29   Sven Eckelmann   net: Add batman-a...
104

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
105
106
107
  #define BATADV_BLA_PERIOD_LENGTH	10000	/* 10 seconds */
  #define BATADV_BLA_BACKBONE_TIMEOUT	(BATADV_BLA_PERIOD_LENGTH * 3)
  #define BATADV_BLA_CLAIM_TIMEOUT	(BATADV_BLA_PERIOD_LENGTH * 10)
28709878b   Simon Wunderlich   batman-adv: wait ...
108
  #define BATADV_BLA_WAIT_PERIODS		3
fe2da6ff2   Simon Wunderlich   batman-adv: add b...
109

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
110
111
  #define BATADV_DUPLIST_SIZE		16
  #define BATADV_DUPLIST_TIMEOUT		500	/* 500 ms */
6e215fd8e   Sven Eckelmann   batman-adv: Remov...
112
  /* don't reset again within 30 seconds */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
113
114
  #define BATADV_RESET_PROTECTION_MS 30000
  #define BATADV_EXPECTED_SEQNO_RANGE	65536
c6c8fea29   Sven Eckelmann   net: Add batman-a...
115

d56b1705e   Martin Hundebøll   batman-adv: netwo...
116
  #define BATADV_NC_NODE_TIMEOUT 10000 /* Milliseconds */
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
117
118
119
120
  enum batadv_mesh_state {
  	BATADV_MESH_INACTIVE,
  	BATADV_MESH_ACTIVE,
  	BATADV_MESH_DEACTIVATING,
e8958dbf0   Sven Eckelmann   batman-adv: Use e...
121
  };
c6c8fea29   Sven Eckelmann   net: Add batman-a...
122

42d0b044b   Sven Eckelmann   batman-adv: Prefi...
123
124
  #define BATADV_BCAST_QUEUE_LEN		256
  #define BATADV_BATMAN_QUEUE_LEN	256
c6c8fea29   Sven Eckelmann   net: Add batman-a...
125

39c75a51e   Sven Eckelmann   batman-adv: Prefi...
126
127
128
129
  enum batadv_uev_action {
  	BATADV_UEV_ADD = 0,
  	BATADV_UEV_DEL,
  	BATADV_UEV_CHANGE,
c6bda689c   Antonio Quartulli   batman-adv: add w...
130
  };
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
131
132
  enum batadv_uev_type {
  	BATADV_UEV_GW = 0,
c6bda689c   Antonio Quartulli   batman-adv: add w...
133
  };
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
134
  #define BATADV_GW_THRESHOLD	50
43676ab59   Antonio Quartulli   batman-adv: impro...
135

610bfc6bc   Martin Hundebøll   batman-adv: Recei...
136
137
138
139
140
141
142
143
  /* Number of fragment chains for each orig_node */
  #define BATADV_FRAG_BUFFER_COUNT 8
  /* Maximum number of fragments for one packet */
  #define BATADV_FRAG_MAX_FRAGMENTS 16
  /* Maxumim size of each fragment */
  #define BATADV_FRAG_MAX_FRAG_SIZE 1400
  /* Time to keep fragments while waiting for rest of the fragments */
  #define BATADV_FRAG_TIMEOUT 10000
785ea1144   Antonio Quartulli   batman-adv: Distr...
144
145
  #define BATADV_DAT_CANDIDATE_NOT_FOUND	0
  #define BATADV_DAT_CANDIDATE_ORIG	1
21a1236bc   Sven Eckelmann   batman-adv: Don't...
146
  /* Debug Messages */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
147
148
149
  #ifdef pr_fmt
  #undef pr_fmt
  #endif
6e215fd8e   Sven Eckelmann   batman-adv: Remov...
150
151
  /* Append 'batman-adv: ' before kernel messages */
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
c6c8fea29   Sven Eckelmann   net: Add batman-a...
152

21a1236bc   Sven Eckelmann   batman-adv: Don't...
153
  /* Kernel headers */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
154
155
156
157
  
  #include <linux/mutex.h>	/* mutex */
  #include <linux/module.h>	/* needed by all modules */
  #include <linux/netdevice.h>	/* netdevice */
015758d00   Antonio Quartulli   batman-adv: corre...
158
  #include <linux/etherdevice.h>  /* ethernet address classification */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
159
160
161
162
163
  #include <linux/if_ether.h>	/* ethernet header */
  #include <linux/poll.h>		/* poll_table */
  #include <linux/kthread.h>	/* kernel threads */
  #include <linux/pkt_sched.h>	/* schedule types */
  #include <linux/workqueue.h>	/* workqueue */
f8214865a   Martin Hundebøll   batman-adv: Add g...
164
  #include <linux/percpu.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
165
166
  #include <linux/slab.h>
  #include <net/sock.h>		/* struct sock */
c5caf4ef3   Linus Lüssing   batman-adv: Multi...
167
  #include <net/addrconf.h>	/* ipv6 address stuff */
ab49886e3   Linus Lüssing   batman-adv: Add I...
168
  #include <linux/ip.h>
a4ac28c0d   Sven Eckelmann   batman-adv: Allow...
169
  #include <net/rtnetlink.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
170
171
  #include <linux/jiffies.h>
  #include <linux/seq_file.h>
160527890   Antonio Quartulli   batman-adv: print...
172
  #include <linux/if_vlan.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
173
  #include "types.h"
eb2deb6b3   Antonio Quartulli   batman-adv: chang...
174
175
  #define BATADV_PRINT_VID(vid) (vid & BATADV_VLAN_HAS_TAG ? \
  			       (int)(vid & VLAN_VID_MASK) : -1)
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
176
177
178
179
180
181
182
183
  extern char batadv_routing_algo[];
  extern struct list_head batadv_hardif_list;
  
  extern unsigned char batadv_broadcast_addr[];
  extern struct workqueue_struct *batadv_event_workqueue;
  
  int batadv_mesh_init(struct net_device *soft_iface);
  void batadv_mesh_free(struct net_device *soft_iface);
fe8a93b95   Antonio Quartulli   batman-adv: make ...
184
  int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr);
30da63a6a   Marek Lindner   batman-adv: conso...
185
186
  struct batadv_hard_iface *
  batadv_seq_print_text_primary_if_get(struct seq_file *seq);
411d6ed93   Marek Lindner   batman-adv: consi...
187
  int batadv_max_header_len(void);
c54f38c9a   Simon Wunderlich   batman-adv: set s...
188
  void batadv_skb_set_priority(struct sk_buff *skb, int offset);
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
189
190
191
  int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
  			   struct packet_type *ptype,
  			   struct net_device *orig_dev);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
192
193
194
195
  int
  batadv_recv_handler_register(uint8_t packet_type,
  			     int (*recv_handler)(struct sk_buff *,
  						 struct batadv_hard_iface *));
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
196
  void batadv_recv_handler_unregister(uint8_t packet_type);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
197
198
  int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops);
  int batadv_algo_select(struct batadv_priv *bat_priv, char *name);
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
199
  int batadv_algo_seq_print_text(struct seq_file *seq, void *offset);
95a066d82   Sven Eckelmann   batman-adv: Add f...
200
  __be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
201

0aca86cd9   Antonio Quartulli   batman-adv: add k...
202
203
204
205
206
207
  /**
   * enum batadv_dbg_level - available log levels
   * @BATADV_DBG_BATMAN: OGM and TQ computations related messages
   * @BATADV_DBG_ROUTES: route added / changed / deleted
   * @BATADV_DBG_TT: translation table messages
   * @BATADV_DBG_BLA: bridge loop avoidance messages
0e861a3c4   Antonio Quartulli   batman-adv: Distr...
208
   * @BATADV_DBG_DAT: ARP snooping and DAT related messages
d353d8d4d   Martin Hundebøll   batman-adv: netwo...
209
   * @BATADV_DBG_NC: network coding related messages
0aca86cd9   Antonio Quartulli   batman-adv: add k...
210
211
   * @BATADV_DBG_ALL: the union of all the above log levels
   */
8de47de57   Sven Eckelmann   batman-adv: Use B...
212
213
  enum batadv_dbg_level {
  	BATADV_DBG_BATMAN = BIT(0),
0aca86cd9   Antonio Quartulli   batman-adv: add k...
214
215
216
  	BATADV_DBG_ROUTES = BIT(1),
  	BATADV_DBG_TT	  = BIT(2),
  	BATADV_DBG_BLA    = BIT(3),
0e861a3c4   Antonio Quartulli   batman-adv: Distr...
217
  	BATADV_DBG_DAT    = BIT(4),
d353d8d4d   Martin Hundebøll   batman-adv: netwo...
218
219
  	BATADV_DBG_NC	  = BIT(5),
  	BATADV_DBG_ALL    = 63,
8de47de57   Sven Eckelmann   batman-adv: Use B...
220
  };
c6c8fea29   Sven Eckelmann   net: Add batman-a...
221
  #ifdef CONFIG_BATMAN_ADV_DEBUG
56303d34a   Sven Eckelmann   batman-adv: Prefi...
222
  int batadv_debug_log(struct batadv_priv *bat_priv, const char *fmt, ...)
40a072d77   Sven Eckelmann   batman-adv: Prefi...
223
  __printf(2, 3);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
224

1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
225
  #define batadv_dbg(type, bat_priv, fmt, arg...)			\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
226
227
  	do {							\
  		if (atomic_read(&bat_priv->log_level) & type)	\
40a072d77   Sven Eckelmann   batman-adv: Prefi...
228
  			batadv_debug_log(bat_priv, fmt, ## arg);\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
229
230
231
  	}							\
  	while (0)
  #else /* !CONFIG_BATMAN_ADV_DEBUG */
d3a547be4   Sven Eckelmann   batman-adv: Annot...
232
  __printf(3, 4)
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
233
  static inline void batadv_dbg(int type __always_unused,
56303d34a   Sven Eckelmann   batman-adv: Prefi...
234
  			      struct batadv_priv *bat_priv __always_unused,
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
235
  			      const char *fmt __always_unused, ...)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
236
237
238
  {
  }
  #endif
3e34819e0   Sven Eckelmann   batman-adv: Prefi...
239
  #define batadv_info(net_dev, fmt, arg...)				\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
240
241
  	do {								\
  		struct net_device *_netdev = (net_dev);                 \
56303d34a   Sven Eckelmann   batman-adv: Prefi...
242
  		struct batadv_priv *_batpriv = netdev_priv(_netdev);    \
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
243
  		batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg);	\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
244
245
  		pr_info("%s: " fmt, _netdev->name, ## arg);		\
  	} while (0)
3e34819e0   Sven Eckelmann   batman-adv: Prefi...
246
  #define batadv_err(net_dev, fmt, arg...)				\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
247
248
  	do {								\
  		struct net_device *_netdev = (net_dev);                 \
56303d34a   Sven Eckelmann   batman-adv: Prefi...
249
  		struct batadv_priv *_batpriv = netdev_priv(_netdev);    \
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
250
  		batadv_dbg(BATADV_DBG_ALL, _batpriv, fmt, ## arg);	\
c6c8fea29   Sven Eckelmann   net: Add batman-a...
251
252
  		pr_err("%s: " fmt, _netdev->name, ## arg);		\
  	} while (0)
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
253
  /* returns 1 if they are the same ethernet addr
39901e716   Marek Lindner   batman-adv: separ...
254
   *
c3923b7a3   Joe Perches   batman: Remove re...
255
   * note: can't use ether_addr_equal() as it requires aligned memory
39901e716   Marek Lindner   batman-adv: separ...
256
   */
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
257
  static inline int batadv_compare_eth(const void *data1, const void *data2)
39901e716   Marek Lindner   batman-adv: separ...
258
  {
d9cd4fe5e   Joe Perches   batadv: Slight op...
259
  	return ether_addr_equal_unaligned(data1, data2);
39901e716   Marek Lindner   batman-adv: separ...
260
  }
2c53040f0   Ben Hutchings   net: Fix (nearly-...
261
262
  /**
   * has_timed_out - compares current time (jiffies) and timestamp + timeout
a04ccd597   Martin Hundebøll   batman-adv: Move ...
263
264
265
266
267
   * @timestamp:		base value to compare with (in jiffies)
   * @timeout:		added to base value before comparing (in milliseconds)
   *
   * Returns true if current time is after timestamp + timeout
   */
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
268
269
  static inline bool batadv_has_timed_out(unsigned long timestamp,
  					unsigned int timeout)
a04ccd597   Martin Hundebøll   batman-adv: Move ...
270
271
272
  {
  	return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
  }
747e4221a   Sven Eckelmann   batman-adv: Add c...
273

3e34819e0   Sven Eckelmann   batman-adv: Prefi...
274
  #define batadv_atomic_dec_not_zero(v)	atomic_add_unless((v), -1, 0)
5f657ec0d   Antonio Quartulli   batman-adv: Move ...
275

f5d33d377   Antonio Quartulli   batman-adv: move ...
276
  /* Returns the smallest signed integer in two's complement with the sizeof x */
3e34819e0   Sven Eckelmann   batman-adv: Prefi...
277
  #define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
f5d33d377   Antonio Quartulli   batman-adv: move ...
278
279
280
281
282
283
284
285
286
  
  /* Checks if a sequence number x is a predecessor/successor of y.
   * they handle overflows/underflows and can correctly check for a
   * predecessor/successor unless the variable sequence number has grown by
   * more then 2**(bitwidth(x)-1)-1.
   * This means that for a uint8_t with the maximum value 255, it would think:
   *  - when adding nothing - it is neither a predecessor nor a successor
   *  - before adding more than 127 to the starting value - it is a predecessor,
   *  - when adding 128 - it is neither a predecessor nor a successor,
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
287
288
   *  - after adding more than 127 to the starting value - it is a successor
   */
3e34819e0   Sven Eckelmann   batman-adv: Prefi...
289
290
291
292
293
294
  #define batadv_seq_before(x, y) ({typeof(x) _d1 = (x); \
  				 typeof(y) _d2 = (y); \
  				 typeof(x) _dummy = (_d1 - _d2); \
  				 (void) (&_d1 == &_d2); \
  				 _dummy > batadv_smallest_signed_int(_dummy); })
  #define batadv_seq_after(x, y) batadv_seq_before(y, x)
f5d33d377   Antonio Quartulli   batman-adv: move ...
295

f8214865a   Martin Hundebøll   batman-adv: Add g...
296
  /* Stop preemption on local cpu while incrementing the counter */
56303d34a   Sven Eckelmann   batman-adv: Prefi...
297
  static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx,
f8214865a   Martin Hundebøll   batman-adv: Add g...
298
299
  				      size_t count)
  {
569174433   Shan Wei   batman-adv: use p...
300
  	this_cpu_add(bat_priv->bat_counters[idx], count);
f8214865a   Martin Hundebøll   batman-adv: Add g...
301
302
303
304
305
  }
  
  #define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
  
  /* Sum and return the cpu-local counters for index 'idx' */
56303d34a   Sven Eckelmann   batman-adv: Prefi...
306
307
  static inline uint64_t batadv_sum_counter(struct batadv_priv *bat_priv,
  					  size_t idx)
f8214865a   Martin Hundebøll   batman-adv: Add g...
308
  {
0c5e45b63   Marek Lindner   batman-adv: fix c...
309
  	uint64_t *counters, sum = 0;
f8214865a   Martin Hundebøll   batman-adv: Add g...
310
  	int cpu;
f8214865a   Martin Hundebøll   batman-adv: Add g...
311
312
313
314
315
316
317
318
  
  	for_each_possible_cpu(cpu) {
  		counters = per_cpu_ptr(bat_priv->bat_counters, cpu);
  		sum += counters[idx];
  	}
  
  	return sum;
  }
3c12de9a5   Martin Hundebøll   batman-adv: netwo...
319
320
321
322
323
  /* Define a macro to reach the control buffer of the skb. The members of the
   * control buffer are defined in struct batadv_skb_cb in types.h.
   * The macro is inspired by the similar macro TCP_SKB_CB() in tcp.h.
   */
  #define BATADV_SKB_CB(__skb)       ((struct batadv_skb_cb *)&((__skb)->cb[0]))
ef2615774   Marek Lindner   batman-adv: tvlv ...
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
  void batadv_tvlv_container_register(struct batadv_priv *bat_priv,
  				    uint8_t type, uint8_t version,
  				    void *tvlv_value, uint16_t tvlv_value_len);
  uint16_t batadv_tvlv_container_ogm_append(struct batadv_priv *bat_priv,
  					  unsigned char **packet_buff,
  					  int *packet_buff_len,
  					  int packet_min_len);
  void batadv_tvlv_ogm_receive(struct batadv_priv *bat_priv,
  			     struct batadv_ogm_packet *batadv_ogm_packet,
  			     struct batadv_orig_node *orig_node);
  void batadv_tvlv_container_unregister(struct batadv_priv *bat_priv,
  				      uint8_t type, uint8_t version);
  
  void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
  				  void (*optr)(struct batadv_priv *bat_priv,
  					       struct batadv_orig_node *orig,
  					       uint8_t flags,
  					       void *tvlv_value,
  					       uint16_t tvlv_value_len),
  				  int (*uptr)(struct batadv_priv *bat_priv,
  					      uint8_t *src, uint8_t *dst,
  					      void *tvlv_value,
  					      uint16_t tvlv_value_len),
  				  uint8_t type, uint8_t version, uint8_t flags);
  void batadv_tvlv_handler_unregister(struct batadv_priv *bat_priv,
  				    uint8_t type, uint8_t version);
  int batadv_tvlv_containers_process(struct batadv_priv *bat_priv,
  				   bool ogm_source,
  				   struct batadv_orig_node *orig_node,
  				   uint8_t *src, uint8_t *dst,
  				   void *tvlv_buff, uint16_t tvlv_buff_len);
  void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, uint8_t *src,
  			      uint8_t *dst, uint8_t type, uint8_t version,
  			      void *tvlv_value, uint16_t tvlv_value_len);
c018ad3de   Antonio Quartulli   batman-adv: add t...
358
  unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len);
eceb22ae0   Antonio Quartulli   batman-adv: creat...
359
  bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid);
ef2615774   Marek Lindner   batman-adv: tvlv ...
360

c6c8fea29   Sven Eckelmann   net: Add batman-a...
361
  #endif /* _NET_BATMAN_ADV_MAIN_H_ */