Merge branch 'opp/linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/pm
[linux-block.git] / net / batman-adv / types.h
CommitLineData
7db7d9f3 1/* SPDX-License-Identifier: GPL-2.0 */
68e039f9 2/* Copyright (C) 2007-2020 B.A.T.M.A.N. contributors:
c6c8fea2
SE
3 *
4 * Marek Lindner, Simon Wunderlich
c6c8fea2
SE
5 */
6
c6c8fea2
SE
7#ifndef _NET_BATMAN_ADV_TYPES_H_
8#define _NET_BATMAN_ADV_TYPES_H_
9
1e2c2a4f
SE
10#ifndef _NET_BATMAN_ADV_MAIN_H_
11#error only "main.h" can be included directly
12#endif
13
162bd64c 14#include <linux/average.h>
1e2c2a4f
SE
15#include <linux/bitops.h>
16#include <linux/compiler.h>
68a600de 17#include <linux/if.h>
1e2c2a4f 18#include <linux/if_ether.h>
90f564df 19#include <linux/kref.h>
a8d23cbb 20#include <linux/mutex.h>
1e2c2a4f 21#include <linux/netdevice.h>
85cf8c85 22#include <linux/netlink.h>
1e2c2a4f 23#include <linux/sched.h> /* for linux/wait.h */
68a600de
SE
24#include <linux/seq_file.h>
25#include <linux/skbuff.h>
1e2c2a4f 26#include <linux/spinlock.h>
68a600de 27#include <linux/timer.h>
1e2c2a4f
SE
28#include <linux/types.h>
29#include <linux/wait.h>
30#include <linux/workqueue.h>
fec149f5 31#include <uapi/linux/batadv_packet.h>
33a3bb4a 32#include <uapi/linux/batman_adv.h>
1e2c2a4f 33
17224474
AQ
34#ifdef CONFIG_BATMAN_ADV_DAT
35
151dcb3c 36/**
993a4a5f
SE
37 * typedef batadv_dat_addr_t - type used for all DHT addresses
38 *
39 * If it is changed, BATADV_DAT_ADDR_MAX is changed as well.
785ea114
AQ
40 *
41 * *Please be careful: batadv_dat_addr_t must be UNSIGNED*
42 */
993a4a5f 43typedef u16 batadv_dat_addr_t;
785ea114 44
17224474
AQ
45#endif /* CONFIG_BATMAN_ADV_DAT */
46
6c413b1c
AQ
47/**
48 * enum batadv_dhcp_recipient - dhcp destination
6c413b1c
AQ
49 */
50enum batadv_dhcp_recipient {
8b84cc4f 51 /** @BATADV_DHCP_NO: packet is not a dhcp message */
6c413b1c 52 BATADV_DHCP_NO = 0,
8b84cc4f
SE
53
54 /** @BATADV_DHCP_TO_SERVER: dhcp message is directed to a server */
6c413b1c 55 BATADV_DHCP_TO_SERVER,
8b84cc4f
SE
56
57 /** @BATADV_DHCP_TO_CLIENT: dhcp message is directed to a client */
6c413b1c
AQ
58 BATADV_DHCP_TO_CLIENT,
59};
60
3c4f7ab6
AQ
61/**
62 * BATADV_TT_REMOTE_MASK - bitmask selecting the flags that are sent over the
63 * wire only
64 */
65#define BATADV_TT_REMOTE_MASK 0x00FF
66
0eb01568
AQ
67/**
68 * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
69 * among the nodes. These flags are used to compute the global/local CRC
70 */
71#define BATADV_TT_SYNC_MASK 0x00F0
72
14511519 73/**
d1f68250 74 * struct batadv_hard_iface_bat_iv - per hard-interface B.A.T.M.A.N. IV data
14511519
ML
75 */
76struct batadv_hard_iface_bat_iv {
8b84cc4f 77 /** @ogm_buff: buffer holding the OGM packet */
14511519 78 unsigned char *ogm_buff;
8b84cc4f
SE
79
80 /** @ogm_buff_len: length of the OGM packet buffer */
14511519 81 int ogm_buff_len;
8b84cc4f
SE
82
83 /** @ogm_seqno: OGM sequence number - used to identify each OGM */
14511519 84 atomic_t ogm_seqno;
40e220b4
SE
85
86 /** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */
87 struct mutex ogm_buff_mutex;
14511519
ML
88};
89
c833484e
AQ
90/**
91 * enum batadv_v_hard_iface_flags - interface flags useful to B.A.T.M.A.N. V
c833484e
AQ
92 */
93enum batadv_v_hard_iface_flags {
8b84cc4f
SE
94 /**
95 * @BATADV_FULL_DUPLEX: tells if the connection over this link is
96 * full-duplex
97 */
c833484e 98 BATADV_FULL_DUPLEX = BIT(0),
8b84cc4f
SE
99
100 /**
101 * @BATADV_WARNING_DEFAULT: tells whether we have warned the user that
102 * no throughput data is available for this interface and that default
103 * values are assumed.
104 */
c833484e
AQ
105 BATADV_WARNING_DEFAULT = BIT(1),
106};
107
d6f94d91
LL
108/**
109 * struct batadv_hard_iface_bat_v - per hard-interface B.A.T.M.A.N. V data
d6f94d91
LL
110 */
111struct batadv_hard_iface_bat_v {
8b84cc4f 112 /** @elp_interval: time interval between two ELP transmissions */
d6f94d91 113 atomic_t elp_interval;
8b84cc4f
SE
114
115 /** @elp_seqno: current ELP sequence number */
d6f94d91 116 atomic_t elp_seqno;
8b84cc4f
SE
117
118 /** @elp_skb: base skb containing the ELP message to send */
d6f94d91 119 struct sk_buff *elp_skb;
8b84cc4f
SE
120
121 /** @elp_wq: workqueue used to schedule ELP transmissions */
d6f94d91 122 struct delayed_work elp_wq;
8b84cc4f 123
f89255a0
LL
124 /** @aggr_wq: workqueue used to transmit queued OGM packets */
125 struct delayed_work aggr_wq;
126
127 /** @aggr_list: queue for to be aggregated OGM packets */
128 struct sk_buff_head aggr_list;
129
130 /** @aggr_len: size of the OGM aggregate (excluding ethernet header) */
131 unsigned int aggr_len;
132
8b84cc4f
SE
133 /**
134 * @throughput_override: throughput override to disable link
135 * auto-detection
136 */
0b5ecc68 137 atomic_t throughput_override;
8b84cc4f
SE
138
139 /** @flags: interface specific flags */
c833484e 140 u8 flags;
d6f94d91
LL
141};
142
10b1bbb4
SE
143/**
144 * enum batadv_hard_iface_wifi_flags - Flags describing the wifi configuration
145 * of a batadv_hard_iface
10b1bbb4
SE
146 */
147enum batadv_hard_iface_wifi_flags {
8b84cc4f 148 /** @BATADV_HARDIF_WIFI_WEXT_DIRECT: it is a wext wifi device */
10b1bbb4 149 BATADV_HARDIF_WIFI_WEXT_DIRECT = BIT(0),
8b84cc4f
SE
150
151 /** @BATADV_HARDIF_WIFI_CFG80211_DIRECT: it is a cfg80211 wifi device */
10b1bbb4 152 BATADV_HARDIF_WIFI_CFG80211_DIRECT = BIT(1),
8b84cc4f
SE
153
154 /**
155 * @BATADV_HARDIF_WIFI_WEXT_INDIRECT: link device is a wext wifi device
156 */
5ed4a460 157 BATADV_HARDIF_WIFI_WEXT_INDIRECT = BIT(2),
8b84cc4f
SE
158
159 /**
160 * @BATADV_HARDIF_WIFI_CFG80211_INDIRECT: link device is a cfg80211 wifi
161 * device
162 */
5ed4a460 163 BATADV_HARDIF_WIFI_CFG80211_INDIRECT = BIT(3),
10b1bbb4
SE
164};
165
88a32c9a
ML
166/**
167 * struct batadv_hard_iface - network device known to batman-adv
88a32c9a 168 */
56303d34 169struct batadv_hard_iface {
8b84cc4f 170 /** @list: list node for batadv_hardif_list */
c6c8fea2 171 struct list_head list;
8b84cc4f 172
8b84cc4f 173 /** @if_status: status of the interface for batman-adv */
c6c8fea2 174 char if_status;
8b84cc4f
SE
175
176 /**
177 * @num_bcasts: number of payload re-broadcasts on this interface (ARQ)
178 */
6b5e971a 179 u8 num_bcasts;
8b84cc4f
SE
180
181 /**
182 * @wifi_flags: flags whether this is (directly or indirectly) a wifi
183 * interface
184 */
10b1bbb4 185 u32 wifi_flags;
8b84cc4f
SE
186
187 /** @net_dev: pointer to the net_device */
75721643 188 struct net_device *net_dev;
8b84cc4f
SE
189
190 /** @hardif_obj: kobject of the per interface sysfs "mesh" directory */
c6c8fea2 191 struct kobject *hardif_obj;
8b84cc4f
SE
192
193 /** @refcount: number of contexts the object is used */
7a659d56 194 struct kref refcount;
8b84cc4f
SE
195
196 /**
197 * @batman_adv_ptype: packet type describing packets that should be
198 * processed by batman-adv for this interface
199 */
c6c8fea2 200 struct packet_type batman_adv_ptype;
8b84cc4f
SE
201
202 /**
203 * @soft_iface: the batman-adv interface which uses this network
204 * interface
205 */
c6c8fea2 206 struct net_device *soft_iface;
8b84cc4f
SE
207
208 /** @rcu: struct used for freeing in an RCU-safe manner */
c6c8fea2 209 struct rcu_head rcu;
8b84cc4f 210
3bda14d0
LL
211 /**
212 * @hop_penalty: penalty which will be applied to the tq-field
213 * of an OGM received via this interface
214 */
215 atomic_t hop_penalty;
216
8b84cc4f 217 /** @bat_iv: per hard-interface B.A.T.M.A.N. IV data */
14511519 218 struct batadv_hard_iface_bat_iv bat_iv;
8b84cc4f 219
d6f94d91 220#ifdef CONFIG_BATMAN_ADV_BATMAN_V
8b84cc4f 221 /** @bat_v: per hard-interface B.A.T.M.A.N. V data */
d6f94d91
LL
222 struct batadv_hard_iface_bat_v bat_v;
223#endif
8b84cc4f 224
dc06338d 225#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f
SE
226 /**
227 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
228 */
5bc7c1eb 229 struct dentry *debug_dir;
dc06338d 230#endif
8b84cc4f
SE
231
232 /**
233 * @neigh_list: list of unique single hop neighbors via this interface
234 */
cef63419 235 struct hlist_head neigh_list;
8b84cc4f
SE
236
237 /** @neigh_list_lock: lock protecting neigh_list */
cef63419 238 spinlock_t neigh_list_lock;
c6c8fea2
SE
239};
240
dee222c7
SE
241/**
242 * struct batadv_orig_ifinfo - B.A.T.M.A.N. IV private orig_ifinfo members
243 */
244struct batadv_orig_ifinfo_bat_iv {
245 /**
246 * @bcast_own: bitfield which counts the number of our OGMs this
247 * orig_node rebroadcasted "back" to us (relative to last_real_seqno)
248 */
249 DECLARE_BITMAP(bcast_own, BATADV_TQ_LOCAL_WINDOW_SIZE);
250
251 /** @bcast_own_sum: sum of bcast_own */
252 u8 bcast_own_sum;
253};
254
7351a482
SW
255/**
256 * struct batadv_orig_ifinfo - originator info per outgoing interface
7351a482
SW
257 */
258struct batadv_orig_ifinfo {
a07369d7 259 /** @list: list node for &batadv_orig_node.ifinfo_list */
7351a482 260 struct hlist_node list;
8b84cc4f
SE
261
262 /** @if_outgoing: pointer to outgoing hard-interface */
7351a482 263 struct batadv_hard_iface *if_outgoing;
8b84cc4f
SE
264
265 /** @router: router that should be used to reach this originator */
266 struct batadv_neigh_node __rcu *router;
267
268 /** @last_real_seqno: last and best known sequence number */
6b5e971a 269 u32 last_real_seqno;
8b84cc4f
SE
270
271 /** @last_ttl: ttl of last received packet */
6b5e971a 272 u8 last_ttl;
8b84cc4f
SE
273
274 /** @last_seqno_forwarded: seqno of the OGM which was forwarded last */
9323158e 275 u32 last_seqno_forwarded;
8b84cc4f
SE
276
277 /** @batman_seqno_reset: time when the batman seqno window was reset */
7351a482 278 unsigned long batman_seqno_reset;
8b84cc4f 279
dee222c7
SE
280 /** @bat_iv: B.A.T.M.A.N. IV private structure */
281 struct batadv_orig_ifinfo_bat_iv bat_iv;
282
8b84cc4f 283 /** @refcount: number of contexts the object is used */
a6ba0d34 284 struct kref refcount;
8b84cc4f
SE
285
286 /** @rcu: struct used for freeing in an RCU-safe manner */
7351a482
SW
287 struct rcu_head rcu;
288};
289
610bfc6b
MH
290/**
291 * struct batadv_frag_table_entry - head in the fragment buffer table
610bfc6b
MH
292 */
293struct batadv_frag_table_entry {
8b84cc4f 294 /** @fragment_list: head of list with fragments */
176e5b77 295 struct hlist_head fragment_list;
8b84cc4f
SE
296
297 /** @lock: lock to protect the list of fragments */
298 spinlock_t lock;
299
300 /** @timestamp: time (jiffie) of last received fragment */
610bfc6b 301 unsigned long timestamp;
8b84cc4f
SE
302
303 /** @seqno: sequence number of the fragments in the list */
6b5e971a 304 u16 seqno;
8b84cc4f
SE
305
306 /** @size: accumulated size of packets in list */
6b5e971a 307 u16 size;
8b84cc4f
SE
308
309 /** @total_size: expected size of the assembled packet */
6b5e971a 310 u16 total_size;
610bfc6b
MH
311};
312
313/**
314 * struct batadv_frag_list_entry - entry in a list of fragments
610bfc6b
MH
315 */
316struct batadv_frag_list_entry {
8b84cc4f 317 /** @list: list node information */
610bfc6b 318 struct hlist_node list;
8b84cc4f
SE
319
320 /** @skb: fragment */
610bfc6b 321 struct sk_buff *skb;
8b84cc4f
SE
322
323 /** @no: fragment number in the set */
6b5e971a 324 u8 no;
610bfc6b
MH
325};
326
7ea7b4a1
AQ
327/**
328 * struct batadv_vlan_tt - VLAN specific TT attributes
7ea7b4a1
AQ
329 */
330struct batadv_vlan_tt {
8b84cc4f 331 /** @crc: CRC32 checksum of the entries belonging to this vlan */
6b5e971a 332 u32 crc;
8b84cc4f
SE
333
334 /** @num_entries: number of TT entries for this VLAN */
7ea7b4a1
AQ
335 atomic_t num_entries;
336};
337
338/**
1a321b0d 339 * struct batadv_orig_node_vlan - VLAN specific data per orig_node
7ea7b4a1
AQ
340 */
341struct batadv_orig_node_vlan {
8b84cc4f 342 /** @vid: the VLAN identifier */
7ea7b4a1 343 unsigned short vid;
8b84cc4f
SE
344
345 /** @tt: VLAN specific TT attributes */
7ea7b4a1 346 struct batadv_vlan_tt tt;
8b84cc4f 347
a07369d7 348 /** @list: list node for &batadv_orig_node.vlan_list */
d0fa4f3f 349 struct hlist_node list;
8b84cc4f
SE
350
351 /**
352 * @refcount: number of context where this object is currently in use
353 */
161a3be9 354 struct kref refcount;
8b84cc4f
SE
355
356 /** @rcu: struct used for freeing in a RCU-safe manner */
7ea7b4a1
AQ
357 struct rcu_head rcu;
358};
359
bbad0a5e
AQ
360/**
361 * struct batadv_orig_bat_iv - B.A.T.M.A.N. IV private orig_node members
bbad0a5e
AQ
362 */
363struct batadv_orig_bat_iv {
8b84cc4f 364 /**
dee222c7
SE
365 * @ogm_cnt_lock: lock protecting &batadv_orig_ifinfo_bat_iv.bcast_own,
366 * &batadv_orig_ifinfo_bat_iv.bcast_own_sum,
367 * &batadv_neigh_ifinfo_bat_iv.bat_iv.real_bits and
368 * &batadv_neigh_ifinfo_bat_iv.real_packet_count
bbad0a5e
AQ
369 */
370 spinlock_t ogm_cnt_lock;
371};
372
2c53040f 373/**
b6d0ab7c 374 * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
c6c8fea2 375 */
56303d34 376struct batadv_orig_node {
8b84cc4f 377 /** @orig: originator ethernet address */
6b5e971a 378 u8 orig[ETH_ALEN];
8b84cc4f
SE
379
380 /** @ifinfo_list: list for routers per outgoing interface */
7351a482 381 struct hlist_head ifinfo_list;
8b84cc4f
SE
382
383 /**
384 * @last_bonding_candidate: pointer to last ifinfo of last used router
385 */
f3b3d901 386 struct batadv_orig_ifinfo *last_bonding_candidate;
8b84cc4f 387
17224474 388#ifdef CONFIG_BATMAN_ADV_DAT
8b84cc4f 389 /** @dat_addr: address of the orig node in the distributed hash */
785ea114 390 batadv_dat_addr_t dat_addr;
17224474 391#endif
8b84cc4f
SE
392
393 /** @last_seen: time when last packet from this node was received */
d7b2a97e 394 unsigned long last_seen;
8b84cc4f
SE
395
396 /**
397 * @bcast_seqno_reset: time when the broadcast seqno window was reset
398 */
c6c8fea2 399 unsigned long bcast_seqno_reset;
8b84cc4f 400
60432d75 401#ifdef CONFIG_BATMAN_ADV_MCAST
8b84cc4f
SE
402 /**
403 * @mcast_handler_lock: synchronizes mcast-capability and -flag changes
404 */
8a4023c5 405 spinlock_t mcast_handler_lock;
8b84cc4f
SE
406
407 /** @mcast_flags: multicast flags announced by the orig node */
6b5e971a 408 u8 mcast_flags;
8b84cc4f
SE
409
410 /**
411 * @mcast_want_all_unsnoopables_node: a list node for the
412 * mcast.want_all_unsnoopables list
413 */
ab49886e 414 struct hlist_node mcast_want_all_unsnoopables_node;
8b84cc4f
SE
415
416 /**
417 * @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4
418 * list
419 */
4c8755d6 420 struct hlist_node mcast_want_all_ipv4_node;
8b84cc4f
SE
421 /**
422 * @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6
423 * list
424 */
4c8755d6 425 struct hlist_node mcast_want_all_ipv6_node;
61caf3d1
LL
426
427 /**
428 * @mcast_want_all_rtr4_node: a list node for the mcast.want_all_rtr4
429 * list
430 */
431 struct hlist_node mcast_want_all_rtr4_node;
432 /**
433 * @mcast_want_all_rtr6_node: a list node for the mcast.want_all_rtr6
434 * list
435 */
436 struct hlist_node mcast_want_all_rtr6_node;
60432d75 437#endif
8b84cc4f
SE
438
439 /** @capabilities: announced capabilities of this originator */
65d7d460 440 unsigned long capabilities;
8b84cc4f
SE
441
442 /**
443 * @capa_initialized: bitfield to remember whether a capability was
444 * initialized
445 */
ac4eebd4 446 unsigned long capa_initialized;
8b84cc4f
SE
447
448 /** @last_ttvn: last seen translation table version number */
88a32c9a 449 atomic_t last_ttvn;
8b84cc4f
SE
450
451 /** @tt_buff: last tt changeset this node received from the orig node */
2dafb49d 452 unsigned char *tt_buff;
8b84cc4f
SE
453
454 /**
455 * @tt_buff_len: length of the last tt changeset this node received
456 * from the orig node
457 */
6b5e971a 458 s16 tt_buff_len;
8b84cc4f
SE
459
460 /** @tt_buff_lock: lock that protects tt_buff and tt_buff_len */
461 spinlock_t tt_buff_lock;
462
463 /**
bccb48c8
SE
464 * @tt_lock: avoids concurrent read from and write to the table. Table
465 * update is made up of two operations (data structure update and
69fed4ce 466 * metadata -CRC/TTVN-recalculation) and they have to be executed
8b84cc4f
SE
467 * atomically in order to avoid another thread to read the
468 * table/metadata between those.
469 */
a70a9aa9 470 spinlock_t tt_lock;
8b84cc4f
SE
471
472 /**
473 * @bcast_bits: bitfield containing the info which payload broadcast
474 * originated from this orig node this host already has seen (relative
475 * to last_bcast_seqno)
476 */
42d0b044 477 DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
8b84cc4f
SE
478
479 /**
480 * @last_bcast_seqno: last broadcast sequence number received by this
481 * host
482 */
6b5e971a 483 u32 last_bcast_seqno;
8b84cc4f
SE
484
485 /**
486 * @neigh_list: list of potential next hop neighbor towards this orig
487 * node
488 */
9591a79f 489 struct hlist_head neigh_list;
8b84cc4f
SE
490
491 /**
492 * @neigh_list_lock: lock protecting neigh_list, ifinfo_list,
493 * last_bonding_candidate and router
15c2ed75 494 */
88a32c9a 495 spinlock_t neigh_list_lock;
8b84cc4f 496
a07369d7 497 /** @hash_entry: hlist node for &batadv_priv.orig_hash */
7aadf889 498 struct hlist_node hash_entry;
8b84cc4f
SE
499
500 /** @bat_priv: pointer to soft_iface this orig node belongs to */
56303d34 501 struct batadv_priv *bat_priv;
8b84cc4f
SE
502
503 /** @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno */
6e215fd8 504 spinlock_t bcast_seqno_lock;
8b84cc4f
SE
505
506 /** @refcount: number of contexts the object is used */
7c124391 507 struct kref refcount;
8b84cc4f
SE
508
509 /** @rcu: struct used for freeing in an RCU-safe manner */
88a32c9a 510 struct rcu_head rcu;
8b84cc4f 511
d56b1705 512#ifdef CONFIG_BATMAN_ADV_NC
8b84cc4f 513 /** @in_coding_list: list of nodes this orig can hear */
d56b1705 514 struct list_head in_coding_list;
8b84cc4f
SE
515
516 /** @out_coding_list: list of nodes that can hear this orig */
d56b1705 517 struct list_head out_coding_list;
8b84cc4f
SE
518
519 /** @in_coding_list_lock: protects in_coding_list */
520 spinlock_t in_coding_list_lock;
521
522 /** @out_coding_list_lock: protects out_coding_list */
523 spinlock_t out_coding_list_lock;
d56b1705 524#endif
8b84cc4f
SE
525
526 /** @fragments: array with heads for fragment chains */
610bfc6b 527 struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT];
8b84cc4f
SE
528
529 /**
530 * @vlan_list: a list of orig_node_vlan structs, one per VLAN served by
531 * the originator represented by this object
532 */
d0fa4f3f 533 struct hlist_head vlan_list;
8b84cc4f
SE
534
535 /** @vlan_list_lock: lock protecting vlan_list */
536 spinlock_t vlan_list_lock;
537
538 /** @bat_iv: B.A.T.M.A.N. IV private structure */
bbad0a5e 539 struct batadv_orig_bat_iv bat_iv;
c6c8fea2
SE
540};
541
17cf0ea4
ML
542/**
543 * enum batadv_orig_capabilities - orig node capabilities
17cf0ea4
ML
544 */
545enum batadv_orig_capabilities {
8b84cc4f
SE
546 /**
547 * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table
548 * enabled
549 */
65d7d460 550 BATADV_ORIG_CAPA_HAS_DAT,
8b84cc4f
SE
551
552 /** @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled */
4635469f 553 BATADV_ORIG_CAPA_HAS_NC,
8b84cc4f
SE
554
555 /** @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability */
ac4eebd4 556 BATADV_ORIG_CAPA_HAS_TT,
8b84cc4f
SE
557
558 /**
559 * @BATADV_ORIG_CAPA_HAS_MCAST: orig node has some multicast capability
560 * (= orig node announces a tvlv of type BATADV_TVLV_MCAST)
561 */
9c936e3f 562 BATADV_ORIG_CAPA_HAS_MCAST,
17cf0ea4
ML
563};
564
88a32c9a
ML
565/**
566 * struct batadv_gw_node - structure for orig nodes announcing gw capabilities
88a32c9a 567 */
56303d34 568struct batadv_gw_node {
a07369d7 569 /** @list: list node for &batadv_priv_gw.list */
c6c8fea2 570 struct hlist_node list;
8b84cc4f
SE
571
572 /** @orig_node: pointer to corresponding orig node */
56303d34 573 struct batadv_orig_node *orig_node;
8b84cc4f
SE
574
575 /** @bandwidth_down: advertised uplink download bandwidth */
6b5e971a 576 u32 bandwidth_down;
8b84cc4f
SE
577
578 /** @bandwidth_up: advertised uplink upload bandwidth */
6b5e971a 579 u32 bandwidth_up;
8b84cc4f
SE
580
581 /** @refcount: number of contexts the object is used */
e7aed321 582 struct kref refcount;
8b84cc4f
SE
583
584 /** @rcu: struct used for freeing in an RCU-safe manner */
c6c8fea2
SE
585 struct rcu_head rcu;
586};
587
eb1e011a 588DECLARE_EWMA(throughput, 10, 8)
162bd64c
LL
589
590/**
591 * struct batadv_hardif_neigh_node_bat_v - B.A.T.M.A.N. V private neighbor
592 * information
162bd64c
LL
593 */
594struct batadv_hardif_neigh_node_bat_v {
8b84cc4f 595 /** @throughput: ewma link throughput towards this neighbor */
162bd64c 596 struct ewma_throughput throughput;
8b84cc4f
SE
597
598 /** @elp_interval: time interval between two ELP transmissions */
162bd64c 599 u32 elp_interval;
8b84cc4f
SE
600
601 /** @elp_latest_seqno: latest and best known ELP sequence number */
162bd64c 602 u32 elp_latest_seqno;
8b84cc4f
SE
603
604 /**
605 * @last_unicast_tx: when the last unicast packet has been sent to this
606 * neighbor
607 */
95d39278 608 unsigned long last_unicast_tx;
8b84cc4f
SE
609
610 /** @metric_work: work queue callback item for metric update */
c833484e 611 struct work_struct metric_work;
162bd64c
LL
612};
613
cef63419 614/**
d1f68250 615 * struct batadv_hardif_neigh_node - unique neighbor per hard-interface
cef63419
ML
616 */
617struct batadv_hardif_neigh_node {
a07369d7 618 /** @list: list node for &batadv_hard_iface.neigh_list */
cef63419 619 struct hlist_node list;
8b84cc4f
SE
620
621 /** @addr: the MAC address of the neighboring interface */
cef63419 622 u8 addr[ETH_ALEN];
8b84cc4f
SE
623
624 /**
625 * @orig: the address of the originator this neighbor node belongs to
626 */
3111beed 627 u8 orig[ETH_ALEN];
8b84cc4f
SE
628
629 /** @if_incoming: pointer to incoming hard-interface */
cef63419 630 struct batadv_hard_iface *if_incoming;
8b84cc4f
SE
631
632 /** @last_seen: when last packet via this neighbor was received */
cef63419 633 unsigned long last_seen;
8b84cc4f 634
162bd64c 635#ifdef CONFIG_BATMAN_ADV_BATMAN_V
8b84cc4f 636 /** @bat_v: B.A.T.M.A.N. V private data */
162bd64c
LL
637 struct batadv_hardif_neigh_node_bat_v bat_v;
638#endif
8b84cc4f
SE
639
640 /** @refcount: number of contexts the object is used */
90f564df 641 struct kref refcount;
8b84cc4f
SE
642
643 /** @rcu: struct used for freeing in a RCU-safe manner */
cef63419
ML
644 struct rcu_head rcu;
645};
646
88a32c9a 647/**
89652331 648 * struct batadv_neigh_node - structure for single hops neighbors
89652331
SW
649 */
650struct batadv_neigh_node {
a07369d7 651 /** @list: list node for &batadv_orig_node.neigh_list */
89652331 652 struct hlist_node list;
8b84cc4f
SE
653
654 /** @orig_node: pointer to corresponding orig_node */
89652331 655 struct batadv_orig_node *orig_node;
8b84cc4f
SE
656
657 /** @addr: the MAC address of the neighboring interface */
6b5e971a 658 u8 addr[ETH_ALEN];
8b84cc4f
SE
659
660 /** @ifinfo_list: list for routing metrics per outgoing interface */
89652331 661 struct hlist_head ifinfo_list;
8b84cc4f
SE
662
663 /** @ifinfo_lock: lock protecting ifinfo_list and its members */
664 spinlock_t ifinfo_lock;
665
666 /** @if_incoming: pointer to incoming hard-interface */
89652331 667 struct batadv_hard_iface *if_incoming;
8b84cc4f
SE
668
669 /** @last_seen: when last packet via this neighbor was received */
89652331 670 unsigned long last_seen;
8b84cc4f
SE
671
672 /** @hardif_neigh: hardif_neigh of this neighbor */
abe59c65 673 struct batadv_hardif_neigh_node *hardif_neigh;
8b84cc4f
SE
674
675 /** @refcount: number of contexts the object is used */
77ae32e8 676 struct kref refcount;
8b84cc4f
SE
677
678 /** @rcu: struct used for freeing in an RCU-safe manner */
89652331
SW
679 struct rcu_head rcu;
680};
681
1b371d13 682/**
1a321b0d 683 * struct batadv_neigh_ifinfo_bat_iv - neighbor information per outgoing
d1f68250 684 * interface for B.A.T.M.A.N. IV
0538f759 685 */
89652331 686struct batadv_neigh_ifinfo_bat_iv {
8b84cc4f 687 /** @tq_recv: ring buffer of received TQ values from this neigh node */
6b5e971a 688 u8 tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
8b84cc4f
SE
689
690 /** @tq_index: ring buffer index */
6b5e971a 691 u8 tq_index;
8b84cc4f
SE
692
693 /**
694 * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv)
695 */
6b5e971a 696 u8 tq_avg;
8b84cc4f
SE
697
698 /**
699 * @real_bits: bitfield containing the number of OGMs received from this
700 * neigh node (relative to orig_node->last_real_seqno)
701 */
0538f759 702 DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
8b84cc4f
SE
703
704 /** @real_packet_count: counted result of real_bits */
6b5e971a 705 u8 real_packet_count;
0538f759
AQ
706};
707
162bd64c
LL
708/**
709 * struct batadv_neigh_ifinfo_bat_v - neighbor information per outgoing
710 * interface for B.A.T.M.A.N. V
162bd64c
LL
711 */
712struct batadv_neigh_ifinfo_bat_v {
8b84cc4f
SE
713 /**
714 * @throughput: last throughput metric received from originator via this
715 * neigh
716 */
162bd64c 717 u32 throughput;
8b84cc4f
SE
718
719 /** @last_seqno: last sequence number known for this neighbor */
9323158e 720 u32 last_seqno;
162bd64c
LL
721};
722
1b371d13
SW
723/**
724 * struct batadv_neigh_ifinfo - neighbor information per outgoing interface
c6c8fea2 725 */
89652331 726struct batadv_neigh_ifinfo {
a07369d7 727 /** @list: list node for &batadv_neigh_node.ifinfo_list */
9591a79f 728 struct hlist_node list;
8b84cc4f
SE
729
730 /** @if_outgoing: pointer to outgoing hard-interface */
89652331 731 struct batadv_hard_iface *if_outgoing;
8b84cc4f
SE
732
733 /** @bat_iv: B.A.T.M.A.N. IV private structure */
89652331 734 struct batadv_neigh_ifinfo_bat_iv bat_iv;
8b84cc4f 735
162bd64c 736#ifdef CONFIG_BATMAN_ADV_BATMAN_V
8b84cc4f 737 /** @bat_v: B.A.T.M.A.N. V private data */
162bd64c
LL
738 struct batadv_neigh_ifinfo_bat_v bat_v;
739#endif
8b84cc4f
SE
740
741 /** @last_ttl: last received ttl from this neigh node */
6b5e971a 742 u8 last_ttl;
8b84cc4f
SE
743
744 /** @refcount: number of contexts the object is used */
962c6832 745 struct kref refcount;
8b84cc4f
SE
746
747 /** @rcu: struct used for freeing in a RCU-safe manner */
88a32c9a 748 struct rcu_head rcu;
c6c8fea2
SE
749};
750
426fc6c8
SE
751#ifdef CONFIG_BATMAN_ADV_BLA
752
88a32c9a
ML
753/**
754 * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
88a32c9a 755 */
56303d34 756struct batadv_bcast_duplist_entry {
bccb48c8 757 /** @orig: mac address of orig node originating the broadcast */
6b5e971a 758 u8 orig[ETH_ALEN];
8b84cc4f
SE
759
760 /** @crc: crc32 checksum of broadcast payload */
004e86fc 761 __be32 crc;
8b84cc4f
SE
762
763 /** @entrytime: time when the broadcast packet was received */
fe2da6ff
SW
764 unsigned long entrytime;
765};
7a5cc242 766#endif
c6c8fea2 767
88a32c9a
ML
768/**
769 * enum batadv_counters - indices for traffic counters
88a32c9a 770 */
d69909d2 771enum batadv_counters {
8b84cc4f 772 /** @BATADV_CNT_TX: transmitted payload traffic packet counter */
1c9b0550 773 BATADV_CNT_TX,
8b84cc4f
SE
774
775 /** @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter */
1c9b0550 776 BATADV_CNT_TX_BYTES,
8b84cc4f
SE
777
778 /**
779 * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet
780 * counter
781 */
1c9b0550 782 BATADV_CNT_TX_DROPPED,
8b84cc4f
SE
783
784 /** @BATADV_CNT_RX: received payload traffic packet counter */
1c9b0550 785 BATADV_CNT_RX,
8b84cc4f
SE
786
787 /** @BATADV_CNT_RX_BYTES: received payload traffic bytes counter */
1c9b0550 788 BATADV_CNT_RX_BYTES,
8b84cc4f
SE
789
790 /** @BATADV_CNT_FORWARD: forwarded payload traffic packet counter */
d69909d2 791 BATADV_CNT_FORWARD,
8b84cc4f
SE
792
793 /**
794 * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter
795 */
d69909d2 796 BATADV_CNT_FORWARD_BYTES,
8b84cc4f
SE
797
798 /**
799 * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet
800 * counter
801 */
d69909d2 802 BATADV_CNT_MGMT_TX,
8b84cc4f
SE
803
804 /**
805 * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes
806 * counter
807 */
d69909d2 808 BATADV_CNT_MGMT_TX_BYTES,
8b84cc4f
SE
809
810 /**
811 * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter
812 */
d69909d2 813 BATADV_CNT_MGMT_RX,
8b84cc4f
SE
814
815 /**
816 * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes
817 * counter
818 */
d69909d2 819 BATADV_CNT_MGMT_RX_BYTES,
8b84cc4f
SE
820
821 /** @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter */
ee75ed88 822 BATADV_CNT_FRAG_TX,
8b84cc4f
SE
823
824 /**
825 * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter
826 */
ee75ed88 827 BATADV_CNT_FRAG_TX_BYTES,
8b84cc4f
SE
828
829 /** @BATADV_CNT_FRAG_RX: received fragment traffic packet counter */
610bfc6b 830 BATADV_CNT_FRAG_RX,
8b84cc4f
SE
831
832 /**
833 * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter
834 */
610bfc6b 835 BATADV_CNT_FRAG_RX_BYTES,
8b84cc4f
SE
836
837 /** @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter */
610bfc6b 838 BATADV_CNT_FRAG_FWD,
8b84cc4f
SE
839
840 /**
841 * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter
842 */
610bfc6b 843 BATADV_CNT_FRAG_FWD_BYTES,
8b84cc4f
SE
844
845 /**
846 * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter
847 */
d69909d2 848 BATADV_CNT_TT_REQUEST_TX,
8b84cc4f
SE
849
850 /** @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter */
d69909d2 851 BATADV_CNT_TT_REQUEST_RX,
8b84cc4f
SE
852
853 /**
854 * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet
855 * counter
856 */
d69909d2 857 BATADV_CNT_TT_RESPONSE_TX,
8b84cc4f
SE
858
859 /**
860 * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter
861 */
d69909d2 862 BATADV_CNT_TT_RESPONSE_RX,
8b84cc4f
SE
863
864 /**
865 * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet
866 * counter
867 */
d69909d2 868 BATADV_CNT_TT_ROAM_ADV_TX,
8b84cc4f
SE
869
870 /**
871 * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter
872 */
d69909d2 873 BATADV_CNT_TT_ROAM_ADV_RX,
8b84cc4f 874
4046b24a 875#ifdef CONFIG_BATMAN_ADV_DAT
8b84cc4f
SE
876 /**
877 * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter
878 */
4046b24a 879 BATADV_CNT_DAT_GET_TX,
8b84cc4f
SE
880
881 /** @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter */
4046b24a 882 BATADV_CNT_DAT_GET_RX,
8b84cc4f
SE
883
884 /**
885 * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter
886 */
4046b24a 887 BATADV_CNT_DAT_PUT_TX,
8b84cc4f
SE
888
889 /** @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter */
4046b24a 890 BATADV_CNT_DAT_PUT_RX,
8b84cc4f
SE
891
892 /**
893 * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic
894 * packet counter
895 */
4046b24a 896 BATADV_CNT_DAT_CACHED_REPLY_TX,
3c12de9a 897#endif
8b84cc4f 898
3c12de9a 899#ifdef CONFIG_BATMAN_ADV_NC
8b84cc4f
SE
900 /**
901 * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter
902 */
3c12de9a 903 BATADV_CNT_NC_CODE,
8b84cc4f
SE
904
905 /**
906 * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes
907 * counter
908 */
3c12de9a 909 BATADV_CNT_NC_CODE_BYTES,
8b84cc4f
SE
910
911 /**
912 * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet
913 * counter
914 */
3c12de9a 915 BATADV_CNT_NC_RECODE,
8b84cc4f
SE
916
917 /**
918 * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes
919 * counter
920 */
3c12de9a 921 BATADV_CNT_NC_RECODE_BYTES,
8b84cc4f
SE
922
923 /**
924 * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc
925 * decoding
926 */
612d2b4f 927 BATADV_CNT_NC_BUFFER,
8b84cc4f
SE
928
929 /**
930 * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter
931 */
2df5278b 932 BATADV_CNT_NC_DECODE,
8b84cc4f
SE
933
934 /**
935 * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes
936 * counter
937 */
2df5278b 938 BATADV_CNT_NC_DECODE_BYTES,
8b84cc4f
SE
939
940 /**
941 * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic
942 * packet counter
943 */
2df5278b 944 BATADV_CNT_NC_DECODE_FAILED,
8b84cc4f
SE
945
946 /**
947 * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in
948 * promisc mode.
949 */
2df5278b 950 BATADV_CNT_NC_SNIFFED,
4046b24a 951#endif
8b84cc4f
SE
952
953 /** @BATADV_CNT_NUM: number of traffic counters */
d69909d2 954 BATADV_CNT_NUM,
f8214865
MH
955};
956
807736f6
SE
957/**
958 * struct batadv_priv_tt - per mesh interface translation table data
807736f6
SE
959 */
960struct batadv_priv_tt {
8b84cc4f 961 /** @vn: translation table version number */
807736f6 962 atomic_t vn;
8b84cc4f
SE
963
964 /**
965 * @ogm_append_cnt: counter of number of OGMs containing the local tt
966 * diff
967 */
807736f6 968 atomic_t ogm_append_cnt;
8b84cc4f
SE
969
970 /** @local_changes: changes registered in an originator interval */
807736f6 971 atomic_t local_changes;
8b84cc4f
SE
972
973 /**
974 * @changes_list: tracks tt local changes within an originator interval
975 */
807736f6 976 struct list_head changes_list;
8b84cc4f
SE
977
978 /** @local_hash: local translation table hash table */
807736f6 979 struct batadv_hashtable *local_hash;
8b84cc4f
SE
980
981 /** @global_hash: global translation table hash table */
807736f6 982 struct batadv_hashtable *global_hash;
8b84cc4f
SE
983
984 /** @req_list: list of pending & unanswered tt_requests */
7c26a53b 985 struct hlist_head req_list;
8b84cc4f
SE
986
987 /**
988 * @roam_list: list of the last roaming events of each client limiting
989 * the number of roaming events to avoid route flapping
990 */
807736f6 991 struct list_head roam_list;
8b84cc4f
SE
992
993 /** @changes_list_lock: lock protecting changes_list */
994 spinlock_t changes_list_lock;
995
996 /** @req_list_lock: lock protecting req_list */
997 spinlock_t req_list_lock;
998
999 /** @roam_list_lock: lock protecting roam_list */
1000 spinlock_t roam_list_lock;
1001
1002 /** @last_changeset: last tt changeset this host has generated */
807736f6 1003 unsigned char *last_changeset;
8b84cc4f
SE
1004
1005 /**
1006 * @last_changeset_len: length of last tt changeset this host has
1007 * generated
1008 */
6b5e971a 1009 s16 last_changeset_len;
8b84cc4f
SE
1010
1011 /**
1012 * @last_changeset_lock: lock protecting last_changeset &
1013 * last_changeset_len
1014 */
88a32c9a 1015 spinlock_t last_changeset_lock;
8b84cc4f
SE
1016
1017 /**
1018 * @commit_lock: prevents from executing a local TT commit while reading
bccb48c8 1019 * the local table. The local TT commit is made up of two operations
69fed4ce 1020 * (data structure update and metadata -CRC/TTVN- recalculation) and
8b84cc4f
SE
1021 * they have to be executed atomically in order to avoid another thread
1022 * to read the table/metadata between those.
1023 */
a70a9aa9 1024 spinlock_t commit_lock;
8b84cc4f
SE
1025
1026 /** @work: work queue callback item for translation table purging */
807736f6
SE
1027 struct delayed_work work;
1028};
1029
426fc6c8
SE
1030#ifdef CONFIG_BATMAN_ADV_BLA
1031
88a32c9a 1032/**
bccb48c8 1033 * struct batadv_priv_bla - per mesh interface bridge loop avoidance data
88a32c9a 1034 */
807736f6 1035struct batadv_priv_bla {
8b84cc4f 1036 /** @num_requests: number of bla requests in flight */
88a32c9a 1037 atomic_t num_requests;
8b84cc4f
SE
1038
1039 /**
1040 * @claim_hash: hash table containing mesh nodes this host has claimed
1041 */
807736f6 1042 struct batadv_hashtable *claim_hash;
8b84cc4f
SE
1043
1044 /**
1045 * @backbone_hash: hash table containing all detected backbone gateways
1046 */
807736f6 1047 struct batadv_hashtable *backbone_hash;
8b84cc4f
SE
1048
1049 /** @loopdetect_addr: MAC address used for own loopdetection frames */
cd9c7bfb 1050 u8 loopdetect_addr[ETH_ALEN];
8b84cc4f
SE
1051
1052 /**
1053 * @loopdetect_lasttime: time when the loopdetection frames were sent
1054 */
cd9c7bfb 1055 unsigned long loopdetect_lasttime;
8b84cc4f
SE
1056
1057 /**
1058 * @loopdetect_next: how many periods to wait for the next loopdetect
1059 * process
1060 */
cd9c7bfb 1061 atomic_t loopdetect_next;
8b84cc4f
SE
1062
1063 /**
1064 * @bcast_duplist: recently received broadcast packets array (for
1065 * broadcast duplicate suppression)
1066 */
807736f6 1067 struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
8b84cc4f
SE
1068
1069 /**
1070 * @bcast_duplist_curr: index of last broadcast packet added to
1071 * bcast_duplist
1072 */
807736f6 1073 int bcast_duplist_curr;
8b84cc4f
SE
1074
1075 /**
1076 * @bcast_duplist_lock: lock protecting bcast_duplist &
1077 * bcast_duplist_curr
1078 */
7dac7b76 1079 spinlock_t bcast_duplist_lock;
8b84cc4f
SE
1080
1081 /** @claim_dest: local claim data (e.g. claim group) */
807736f6 1082 struct batadv_bla_claim_dst claim_dest;
8b84cc4f
SE
1083
1084 /** @work: work queue callback item for cleanups & bla announcements */
807736f6
SE
1085 struct delayed_work work;
1086};
1087#endif
1088
426fc6c8
SE
1089#ifdef CONFIG_BATMAN_ADV_DEBUG
1090
88a32c9a 1091/**
1a321b0d 1092 * struct batadv_priv_debug_log - debug logging data
88a32c9a 1093 */
0abf5d81 1094struct batadv_priv_debug_log {
c08dd06b 1095 /** @log_buff: buffer holding the logs (ring buffer) */
0abf5d81 1096 char log_buff[BATADV_LOG_BUF_LEN];
8b84cc4f
SE
1097
1098 /** @log_start: index of next character to read */
0abf5d81 1099 unsigned long log_start;
8b84cc4f
SE
1100
1101 /** @log_end: index of next character to write */
0abf5d81 1102 unsigned long log_end;
8b84cc4f
SE
1103
1104 /** @lock: lock protecting log_buff, log_start & log_end */
1105 spinlock_t lock;
1106
1107 /** @queue_wait: log reader's wait queue */
0abf5d81
ML
1108 wait_queue_head_t queue_wait;
1109};
1110#endif
1111
88a32c9a
ML
1112/**
1113 * struct batadv_priv_gw - per mesh interface gateway data
88a32c9a 1114 */
807736f6 1115struct batadv_priv_gw {
8b84cc4f 1116 /** @gateway_list: list of available gateway nodes */
70ea5cee 1117 struct hlist_head gateway_list;
8b84cc4f 1118
9264c85c 1119 /** @list_lock: lock protecting gateway_list, curr_gw, generation */
8b84cc4f
SE
1120 spinlock_t list_lock;
1121
1122 /** @curr_gw: pointer to currently selected gateway node */
1123 struct batadv_gw_node __rcu *curr_gw;
1124
9264c85c
SE
1125 /** @generation: current (generation) sequence number */
1126 unsigned int generation;
1127
8b84cc4f
SE
1128 /**
1129 * @mode: gateway operation: off, client or server (see batadv_gw_modes)
1130 */
3a24a63e 1131 atomic_t mode;
8b84cc4f
SE
1132
1133 /** @sel_class: gateway selection class (applies if gw_mode client) */
3a24a63e 1134 atomic_t sel_class;
8b84cc4f
SE
1135
1136 /**
1137 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode
1138 * server)
1139 */
414254e3 1140 atomic_t bandwidth_down;
8b84cc4f
SE
1141
1142 /**
1143 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server)
1144 */
414254e3 1145 atomic_t bandwidth_up;
8b84cc4f
SE
1146
1147 /** @reselect: bool indicating a gateway re-selection is in progress */
807736f6
SE
1148 atomic_t reselect;
1149};
1150
ef261577
ML
1151/**
1152 * struct batadv_priv_tvlv - per mesh interface tvlv data
ef261577
ML
1153 */
1154struct batadv_priv_tvlv {
8b84cc4f
SE
1155 /**
1156 * @container_list: list of registered tvlv containers to be sent with
1157 * each OGM
1158 */
ef261577 1159 struct hlist_head container_list;
8b84cc4f
SE
1160
1161 /** @handler_list: list of the various tvlv content handlers */
ef261577 1162 struct hlist_head handler_list;
8b84cc4f
SE
1163
1164 /** @container_list_lock: protects tvlv container list access */
1165 spinlock_t container_list_lock;
1166
1167 /** @handler_list_lock: protects handler list access */
1168 spinlock_t handler_list_lock;
ef261577
ML
1169};
1170
426fc6c8
SE
1171#ifdef CONFIG_BATMAN_ADV_DAT
1172
785ea114
AQ
1173/**
1174 * struct batadv_priv_dat - per mesh interface DAT private data
785ea114
AQ
1175 */
1176struct batadv_priv_dat {
8b84cc4f 1177 /** @addr: node DAT address */
785ea114 1178 batadv_dat_addr_t addr;
8b84cc4f
SE
1179
1180 /** @hash: hashtable representing the local ARP cache */
2f1dfbe1 1181 struct batadv_hashtable *hash;
8b84cc4f
SE
1182
1183 /** @work: work queue callback item for cache purging */
2f1dfbe1 1184 struct delayed_work work;
785ea114 1185};
17224474 1186#endif
785ea114 1187
c5caf4ef 1188#ifdef CONFIG_BATMAN_ADV_MCAST
687937ab
LL
1189/**
1190 * struct batadv_mcast_querier_state - IGMP/MLD querier state when bridged
687937ab
LL
1191 */
1192struct batadv_mcast_querier_state {
8b84cc4f 1193 /** @exists: whether a querier exists in the mesh */
6486379d 1194 unsigned char exists:1;
8b84cc4f
SE
1195
1196 /**
1197 * @shadowing: if a querier exists, whether it is potentially shadowing
1198 * multicast listeners (i.e. querier is behind our own bridge segment)
1199 */
6486379d 1200 unsigned char shadowing:1;
687937ab
LL
1201};
1202
6bc45440
LL
1203/**
1204 * struct batadv_mcast_mla_flags - flags for the querier, bridge and tvlv state
1205 */
1206struct batadv_mcast_mla_flags {
1207 /** @querier_ipv4: the current state of an IGMP querier in the mesh */
1208 struct batadv_mcast_querier_state querier_ipv4;
1209
1210 /** @querier_ipv6: the current state of an MLD querier in the mesh */
1211 struct batadv_mcast_querier_state querier_ipv6;
1212
1213 /** @enabled: whether the multicast tvlv is currently enabled */
1214 unsigned char enabled:1;
1215
1216 /** @bridged: whether the soft interface has a bridge on top */
1217 unsigned char bridged:1;
1218
1219 /** @tvlv_flags: the flags we have last sent in our mcast tvlv */
1220 u8 tvlv_flags;
1221};
1222
c5caf4ef
LL
1223/**
1224 * struct batadv_priv_mcast - per mesh interface mcast data
c5caf4ef
LL
1225 */
1226struct batadv_priv_mcast {
8b84cc4f
SE
1227 /**
1228 * @mla_list: list of multicast addresses we are currently announcing
1229 * via TT
1230 */
cbebd363 1231 struct hlist_head mla_list; /* see __batadv_mcast_mla_update() */
8b84cc4f
SE
1232
1233 /**
1234 * @want_all_unsnoopables_list: a list of orig_nodes wanting all
1235 * unsnoopable multicast traffic
1236 */
ab49886e 1237 struct hlist_head want_all_unsnoopables_list;
8b84cc4f
SE
1238
1239 /**
1240 * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast
1241 * traffic
1242 */
4c8755d6 1243 struct hlist_head want_all_ipv4_list;
8b84cc4f
SE
1244
1245 /**
1246 * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast
1247 * traffic
1248 */
4c8755d6 1249 struct hlist_head want_all_ipv6_list;
8b84cc4f 1250
61caf3d1
LL
1251 /**
1252 * @want_all_rtr4_list: a list of orig_nodes wanting all routable IPv4
1253 * multicast traffic
1254 */
1255 struct hlist_head want_all_rtr4_list;
1256
1257 /**
1258 * @want_all_rtr6_list: a list of orig_nodes wanting all routable IPv6
1259 * multicast traffic
1260 */
1261 struct hlist_head want_all_rtr6_list;
1262
6bc45440
LL
1263 /**
1264 * @mla_flags: flags for the querier, bridge and tvlv state
1265 */
1266 struct batadv_mcast_mla_flags mla_flags;
8b84cc4f 1267
a3c7cd0c
LL
1268 /**
1269 * @mla_lock: a lock protecting mla_list and mla_flags
1270 */
1271 spinlock_t mla_lock;
1272
8b84cc4f
SE
1273 /**
1274 * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
1275 * traffic
1276 */
ab49886e 1277 atomic_t num_want_all_unsnoopables;
8b84cc4f
SE
1278
1279 /** @num_want_all_ipv4: counter for items in want_all_ipv4_list */
4c8755d6 1280 atomic_t num_want_all_ipv4;
8b84cc4f
SE
1281
1282 /** @num_want_all_ipv6: counter for items in want_all_ipv6_list */
4c8755d6 1283 atomic_t num_want_all_ipv6;
8b84cc4f 1284
61caf3d1
LL
1285 /** @num_want_all_rtr4: counter for items in want_all_rtr4_list */
1286 atomic_t num_want_all_rtr4;
1287
1288 /** @num_want_all_rtr6: counter for items in want_all_rtr6_list */
1289 atomic_t num_want_all_rtr6;
1290
8b84cc4f
SE
1291 /**
1292 * @want_lists_lock: lock for protecting modifications to mcasts
1293 * want_all_{unsnoopables,ipv4,ipv6}_list (traversals are rcu-locked)
1294 */
ab49886e 1295 spinlock_t want_lists_lock;
8b84cc4f
SE
1296
1297 /** @work: work queue callback item for multicast TT and TVLV updates */
cbebd363 1298 struct delayed_work work;
c5caf4ef
LL
1299};
1300#endif
1301
d353d8d4
MH
1302/**
1303 * struct batadv_priv_nc - per mesh interface network coding private data
d353d8d4
MH
1304 */
1305struct batadv_priv_nc {
8b84cc4f 1306 /** @work: work queue callback item for cleanup */
d353d8d4 1307 struct delayed_work work;
8b84cc4f 1308
dc06338d 1309#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f
SE
1310 /**
1311 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
1312 */
d56b1705 1313 struct dentry *debug_dir;
dc06338d 1314#endif
8b84cc4f
SE
1315
1316 /**
1317 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq
1318 */
d56b1705 1319 u8 min_tq;
8b84cc4f
SE
1320
1321 /**
1322 * @max_fwd_delay: maximum packet forward delay to allow coding of
1323 * packets
1324 */
95332477 1325 u32 max_fwd_delay;
8b84cc4f
SE
1326
1327 /**
1328 * @max_buffer_time: buffer time for sniffed packets used to decoding
1329 */
612d2b4f 1330 u32 max_buffer_time;
8b84cc4f
SE
1331
1332 /**
1333 * @timestamp_fwd_flush: timestamp of last forward packet queue flush
1334 */
95332477 1335 unsigned long timestamp_fwd_flush;
8b84cc4f
SE
1336
1337 /**
1338 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue
1339 * purge
1340 */
612d2b4f 1341 unsigned long timestamp_sniffed_purge;
8b84cc4f
SE
1342
1343 /**
1344 * @coding_hash: Hash table used to buffer skbs while waiting for
1345 * another incoming skb to code it with. Skbs are added to the buffer
1346 * just before being forwarded in routing.c
1347 */
95332477 1348 struct batadv_hashtable *coding_hash;
8b84cc4f
SE
1349
1350 /**
1351 * @decoding_hash: Hash table used to buffer skbs that might be needed
1352 * to decode a received coded skb. The buffer is used for 1) skbs
1353 * arriving on the soft-interface; 2) skbs overheard on the
1354 * hard-interface; and 3) skbs forwarded by batman-adv.
1355 */
612d2b4f 1356 struct batadv_hashtable *decoding_hash;
d353d8d4
MH
1357};
1358
33a3bb4a
AQ
1359/**
1360 * struct batadv_tp_unacked - unacked packet meta-information
33a3bb4a
AQ
1361 *
1362 * This struct is supposed to represent a buffer unacked packet. However, since
1363 * the purpose of the TP meter is to count the traffic only, there is no need to
1364 * store the entire sk_buff, the starting offset and the length are enough
1365 */
1366struct batadv_tp_unacked {
8b84cc4f 1367 /** @seqno: seqno of the unacked packet */
33a3bb4a 1368 u32 seqno;
8b84cc4f
SE
1369
1370 /** @len: length of the packet */
33a3bb4a 1371 u16 len;
8b84cc4f 1372
a07369d7 1373 /** @list: list node for &batadv_tp_vars.unacked_list */
33a3bb4a
AQ
1374 struct list_head list;
1375};
1376
1377/**
1378 * enum batadv_tp_meter_role - Modus in tp meter session
33a3bb4a
AQ
1379 */
1380enum batadv_tp_meter_role {
8b84cc4f 1381 /** @BATADV_TP_RECEIVER: Initialized as receiver */
33a3bb4a 1382 BATADV_TP_RECEIVER,
8b84cc4f
SE
1383
1384 /** @BATADV_TP_SENDER: Initialized as sender */
33a3bb4a
AQ
1385 BATADV_TP_SENDER
1386};
1387
1388/**
1389 * struct batadv_tp_vars - tp meter private variables per session
33a3bb4a
AQ
1390 */
1391struct batadv_tp_vars {
a07369d7 1392 /** @list: list node for &bat_priv.tp_list */
33a3bb4a 1393 struct hlist_node list;
8b84cc4f
SE
1394
1395 /** @timer: timer for ack (receiver) and retry (sender) */
33a3bb4a 1396 struct timer_list timer;
8b84cc4f
SE
1397
1398 /** @bat_priv: pointer to the mesh object */
33a3bb4a 1399 struct batadv_priv *bat_priv;
8b84cc4f
SE
1400
1401 /** @start_time: start time in jiffies */
33a3bb4a 1402 unsigned long start_time;
8b84cc4f
SE
1403
1404 /** @other_end: mac address of remote */
33a3bb4a 1405 u8 other_end[ETH_ALEN];
8b84cc4f
SE
1406
1407 /** @role: receiver/sender modi */
33a3bb4a 1408 enum batadv_tp_meter_role role;
8b84cc4f
SE
1409
1410 /** @sending: sending binary semaphore: 1 if sending, 0 is not */
33a3bb4a 1411 atomic_t sending;
8b84cc4f
SE
1412
1413 /** @reason: reason for a stopped session */
33a3bb4a 1414 enum batadv_tp_meter_reason reason;
8b84cc4f
SE
1415
1416 /** @finish_work: work item for the finishing procedure */
33a3bb4a 1417 struct delayed_work finish_work;
8b84cc4f
SE
1418
1419 /** @test_length: test length in milliseconds */
33a3bb4a 1420 u32 test_length;
8b84cc4f
SE
1421
1422 /** @session: TP session identifier */
33a3bb4a 1423 u8 session[2];
8b84cc4f
SE
1424
1425 /** @icmp_uid: local ICMP "socket" index */
33a3bb4a
AQ
1426 u8 icmp_uid;
1427
1428 /* sender variables */
8b84cc4f
SE
1429
1430 /** @dec_cwnd: decimal part of the cwnd used during linear growth */
33a3bb4a 1431 u16 dec_cwnd;
8b84cc4f
SE
1432
1433 /** @cwnd: current size of the congestion window */
33a3bb4a 1434 u32 cwnd;
8b84cc4f
SE
1435
1436 /** @cwnd_lock: lock do protect @cwnd & @dec_cwnd */
1437 spinlock_t cwnd_lock;
1438
1439 /**
1440 * @ss_threshold: Slow Start threshold. Once cwnd exceeds this value the
1441 * connection switches to the Congestion Avoidance state
1442 */
33a3bb4a 1443 u32 ss_threshold;
8b84cc4f
SE
1444
1445 /** @last_acked: last acked byte */
33a3bb4a 1446 atomic_t last_acked;
8b84cc4f
SE
1447
1448 /** @last_sent: last sent byte, not yet acked */
33a3bb4a 1449 u32 last_sent;
8b84cc4f
SE
1450
1451 /** @tot_sent: amount of data sent/ACKed so far */
33a3bb4a 1452 atomic64_t tot_sent;
8b84cc4f
SE
1453
1454 /** @dup_acks: duplicate ACKs counter */
33a3bb4a 1455 atomic_t dup_acks;
8b84cc4f
SE
1456
1457 /** @fast_recovery: true if in Fast Recovery mode */
6486379d 1458 unsigned char fast_recovery:1;
8b84cc4f
SE
1459
1460 /** @recover: last sent seqno when entering Fast Recovery */
33a3bb4a 1461 u32 recover;
8b84cc4f
SE
1462
1463 /** @rto: sender timeout */
33a3bb4a 1464 u32 rto;
8b84cc4f
SE
1465
1466 /** @srtt: smoothed RTT scaled by 2^3 */
33a3bb4a 1467 u32 srtt;
8b84cc4f
SE
1468
1469 /** @rttvar: RTT variation scaled by 2^2 */
33a3bb4a 1470 u32 rttvar;
8b84cc4f
SE
1471
1472 /**
1473 * @more_bytes: waiting queue anchor when waiting for more ack/retry
1474 * timeout
1475 */
33a3bb4a 1476 wait_queue_head_t more_bytes;
8b84cc4f
SE
1477
1478 /** @prerandom_offset: offset inside the prerandom buffer */
33a3bb4a 1479 u32 prerandom_offset;
8b84cc4f
SE
1480
1481 /** @prerandom_lock: spinlock protecting access to prerandom_offset */
1482 spinlock_t prerandom_lock;
33a3bb4a
AQ
1483
1484 /* receiver variables */
8b84cc4f
SE
1485
1486 /** @last_recv: last in-order received packet */
33a3bb4a 1487 u32 last_recv;
8b84cc4f
SE
1488
1489 /** @unacked_list: list of unacked packets (meta-info only) */
33a3bb4a 1490 struct list_head unacked_list;
8b84cc4f
SE
1491
1492 /** @unacked_lock: protect unacked_list */
1493 spinlock_t unacked_lock;
1494
6f5b92a7 1495 /** @last_recv_time: time (jiffies) a msg was received */
33a3bb4a 1496 unsigned long last_recv_time;
8b84cc4f
SE
1497
1498 /** @refcount: number of context where the object is used */
33a3bb4a 1499 struct kref refcount;
8b84cc4f
SE
1500
1501 /** @rcu: struct used for freeing in an RCU-safe manner */
33a3bb4a
AQ
1502 struct rcu_head rcu;
1503};
1504
5d2c05b2
AQ
1505/**
1506 * struct batadv_softif_vlan - per VLAN attributes set
5d2c05b2
AQ
1507 */
1508struct batadv_softif_vlan {
8b84cc4f 1509 /** @bat_priv: pointer to the mesh object */
35df3b29 1510 struct batadv_priv *bat_priv;
8b84cc4f
SE
1511
1512 /** @vid: VLAN identifier */
5d2c05b2 1513 unsigned short vid;
8b84cc4f
SE
1514
1515 /** @kobj: kobject for sysfs vlan subdirectory */
5d2c05b2 1516 struct kobject *kobj;
8b84cc4f
SE
1517
1518 /** @ap_isolation: AP isolation state */
b8cbd81d 1519 atomic_t ap_isolation; /* boolean */
8b84cc4f
SE
1520
1521 /** @tt: TT private attributes (VLAN specific) */
7ea7b4a1 1522 struct batadv_vlan_tt tt;
8b84cc4f 1523
a07369d7 1524 /** @list: list node for &bat_priv.softif_vlan_list */
5d2c05b2 1525 struct hlist_node list;
8b84cc4f
SE
1526
1527 /**
1528 * @refcount: number of context where this object is currently in use
1529 */
6be4d30c 1530 struct kref refcount;
8b84cc4f
SE
1531
1532 /** @rcu: struct used for freeing in a RCU-safe manner */
5d2c05b2
AQ
1533 struct rcu_head rcu;
1534};
1535
0da00359
AQ
1536/**
1537 * struct batadv_priv_bat_v - B.A.T.M.A.N. V per soft-interface private data
0da00359
AQ
1538 */
1539struct batadv_priv_bat_v {
8b84cc4f 1540 /** @ogm_buff: buffer holding the OGM packet */
0da00359 1541 unsigned char *ogm_buff;
8b84cc4f
SE
1542
1543 /** @ogm_buff_len: length of the OGM packet buffer */
0da00359 1544 int ogm_buff_len;
8b84cc4f
SE
1545
1546 /** @ogm_seqno: OGM sequence number - used to identify each OGM */
0da00359 1547 atomic_t ogm_seqno;
8b84cc4f 1548
a8d23cbb
SE
1549 /** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */
1550 struct mutex ogm_buff_mutex;
1551
8b84cc4f 1552 /** @ogm_wq: workqueue used to schedule OGM transmissions */
0da00359
AQ
1553 struct delayed_work ogm_wq;
1554};
1555
88a32c9a
ML
1556/**
1557 * struct batadv_priv - per mesh interface data
88a32c9a 1558 */
56303d34 1559struct batadv_priv {
8b84cc4f
SE
1560 /**
1561 * @mesh_state: current status of the mesh
1562 * (inactive/active/deactivating)
1563 */
c6c8fea2 1564 atomic_t mesh_state;
8b84cc4f
SE
1565
1566 /** @soft_iface: net device which holds this struct as private data */
5bc44dc8 1567 struct net_device *soft_iface;
8b84cc4f
SE
1568
1569 /**
1570 * @bat_counters: mesh internal traffic statistic counters (see
1571 * batadv_counters)
1572 */
6b5e971a 1573 u64 __percpu *bat_counters; /* Per cpu counters */
8b84cc4f
SE
1574
1575 /**
1576 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
1577 */
88a32c9a 1578 atomic_t aggregated_ogms;
8b84cc4f
SE
1579
1580 /** @bonding: bool indicating whether traffic bonding is enabled */
88a32c9a 1581 atomic_t bonding;
8b84cc4f
SE
1582
1583 /**
1584 * @fragmentation: bool indicating whether traffic fragmentation is
1585 * enabled
1586 */
88a32c9a 1587 atomic_t fragmentation;
8b84cc4f
SE
1588
1589 /**
1590 * @packet_size_max: max packet size that can be transmitted via
1591 * multiple fragmented skbs or a single frame if fragmentation is
1592 * disabled
1593 */
a19d3d85 1594 atomic_t packet_size_max;
8b84cc4f
SE
1595
1596 /**
1597 * @frag_seqno: incremental counter to identify chains of egress
1598 * fragments
1599 */
ee75ed88 1600 atomic_t frag_seqno;
8b84cc4f 1601
fa706554 1602#ifdef CONFIG_BATMAN_ADV_BLA
8b84cc4f
SE
1603 /**
1604 * @bridge_loop_avoidance: bool indicating whether bridge loop
1605 * avoidance is enabled
1606 */
88a32c9a 1607 atomic_t bridge_loop_avoidance;
fa706554 1608#endif
8b84cc4f 1609
33af49ad 1610#ifdef CONFIG_BATMAN_ADV_DAT
8b84cc4f
SE
1611 /**
1612 * @distributed_arp_table: bool indicating whether distributed ARP table
1613 * is enabled
1614 */
88a32c9a 1615 atomic_t distributed_arp_table;
1d8ab8d3 1616#endif
8b84cc4f 1617
1d8ab8d3 1618#ifdef CONFIG_BATMAN_ADV_MCAST
8b84cc4f
SE
1619 /**
1620 * @multicast_mode: Enable or disable multicast optimizations on this
1621 * node's sender/originating side
1622 */
1d8ab8d3 1623 atomic_t multicast_mode;
32e72744
LL
1624
1625 /**
1626 * @multicast_fanout: Maximum number of packet copies to generate for a
1627 * multicast-to-unicast conversion
1628 */
1629 atomic_t multicast_fanout;
33af49ad 1630#endif
8b84cc4f
SE
1631
1632 /** @orig_interval: OGM broadcast interval in milliseconds */
88a32c9a 1633 atomic_t orig_interval;
8b84cc4f
SE
1634
1635 /**
1636 * @hop_penalty: penalty which will be applied to an OGM's tq-field on
1637 * every hop
1638 */
88a32c9a 1639 atomic_t hop_penalty;
8b84cc4f 1640
0c430d0d 1641#ifdef CONFIG_BATMAN_ADV_DEBUG
8b84cc4f 1642 /** @log_level: configured log level (see batadv_dbg_level) */
88a32c9a 1643 atomic_t log_level;
0c430d0d 1644#endif
8b84cc4f
SE
1645
1646 /**
1647 * @isolation_mark: the skb->mark value used to match packets for AP
1648 * isolation
1649 */
6b5e971a 1650 u32 isolation_mark;
8b84cc4f
SE
1651
1652 /**
1653 * @isolation_mark_mask: bitmask identifying the bits in skb->mark to be
1654 * used for the isolation mark
1655 */
6b5e971a 1656 u32 isolation_mark_mask;
8b84cc4f
SE
1657
1658 /** @bcast_seqno: last sent broadcast packet sequence number */
c6c8fea2 1659 atomic_t bcast_seqno;
8b84cc4f
SE
1660
1661 /**
1662 * @bcast_queue_left: number of remaining buffered broadcast packet
1663 * slots
1664 */
c6c8fea2 1665 atomic_t bcast_queue_left;
8b84cc4f
SE
1666
1667 /** @batman_queue_left: number of remaining OGM packet slots */
c6c8fea2 1668 atomic_t batman_queue_left;
8b84cc4f 1669
8b84cc4f 1670 /** @mesh_obj: kobject for sysfs mesh subdirectory */
c6c8fea2 1671 struct kobject *mesh_obj;
8b84cc4f 1672
dc06338d 1673#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f 1674 /** @debug_dir: dentry for debugfs batman-adv subdirectory */
c6c8fea2 1675 struct dentry *debug_dir;
dc06338d 1676#endif
8b84cc4f
SE
1677
1678 /** @forw_bat_list: list of aggregated OGMs that will be forwarded */
c6c8fea2 1679 struct hlist_head forw_bat_list;
8b84cc4f
SE
1680
1681 /**
1682 * @forw_bcast_list: list of broadcast packets that will be
1683 * rebroadcasted
1684 */
c6c8fea2 1685 struct hlist_head forw_bcast_list;
8b84cc4f
SE
1686
1687 /** @tp_list: list of tp sessions */
33a3bb4a 1688 struct hlist_head tp_list;
8b84cc4f
SE
1689
1690 /** @tp_num: number of currently active tp sessions */
5bf74e9c 1691 struct batadv_hashtable *orig_hash;
8b84cc4f
SE
1692
1693 /** @orig_hash: hash table containing mesh participants (orig nodes) */
1694 spinlock_t forw_bat_list_lock;
1695
1696 /** @forw_bat_list_lock: lock protecting forw_bat_list */
1697 spinlock_t forw_bcast_list_lock;
1698
1699 /** @forw_bcast_list_lock: lock protecting forw_bcast_list */
1700 spinlock_t tp_list_lock;
1701
1702 /** @tp_list_lock: spinlock protecting @tp_list */
33a3bb4a 1703 atomic_t tp_num;
8b84cc4f
SE
1704
1705 /** @orig_work: work queue callback item for orig node purging */
c6c8fea2 1706 struct delayed_work orig_work;
8b84cc4f
SE
1707
1708 /**
1709 * @primary_if: one of the hard-interfaces assigned to this mesh
1710 * interface becomes the primary interface
1711 */
56303d34 1712 struct batadv_hard_iface __rcu *primary_if; /* rcu protected pointer */
8b84cc4f
SE
1713
1714 /** @algo_ops: routing algorithm used by this mesh interface */
29824a55 1715 struct batadv_algo_ops *algo_ops;
8b84cc4f
SE
1716
1717 /**
1718 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN
1719 * created on top of the mesh interface represented by this object
1720 */
5d2c05b2 1721 struct hlist_head softif_vlan_list;
8b84cc4f
SE
1722
1723 /** @softif_vlan_list_lock: lock protecting softif_vlan_list */
1724 spinlock_t softif_vlan_list_lock;
1725
807736f6 1726#ifdef CONFIG_BATMAN_ADV_BLA
bccb48c8 1727 /** @bla: bridge loop avoidance data */
807736f6 1728 struct batadv_priv_bla bla;
0abf5d81 1729#endif
8b84cc4f 1730
0abf5d81 1731#ifdef CONFIG_BATMAN_ADV_DEBUG
8b84cc4f 1732 /** @debug_log: holding debug logging relevant data */
0abf5d81 1733 struct batadv_priv_debug_log *debug_log;
807736f6 1734#endif
8b84cc4f
SE
1735
1736 /** @gw: gateway data */
807736f6 1737 struct batadv_priv_gw gw;
8b84cc4f
SE
1738
1739 /** @tt: translation table data */
807736f6 1740 struct batadv_priv_tt tt;
8b84cc4f
SE
1741
1742 /** @tvlv: type-version-length-value data */
ef261577 1743 struct batadv_priv_tvlv tvlv;
8b84cc4f 1744
17224474 1745#ifdef CONFIG_BATMAN_ADV_DAT
8b84cc4f 1746 /** @dat: distributed arp table data */
785ea114 1747 struct batadv_priv_dat dat;
17224474 1748#endif
8b84cc4f 1749
c5caf4ef 1750#ifdef CONFIG_BATMAN_ADV_MCAST
8b84cc4f 1751 /** @mcast: multicast data */
c5caf4ef
LL
1752 struct batadv_priv_mcast mcast;
1753#endif
8b84cc4f 1754
d353d8d4 1755#ifdef CONFIG_BATMAN_ADV_NC
8b84cc4f
SE
1756 /**
1757 * @network_coding: bool indicating whether network coding is enabled
1758 */
d353d8d4 1759 atomic_t network_coding;
8b84cc4f
SE
1760
1761 /** @nc: network coding data */
d353d8d4
MH
1762 struct batadv_priv_nc nc;
1763#endif /* CONFIG_BATMAN_ADV_NC */
8b84cc4f 1764
0da00359 1765#ifdef CONFIG_BATMAN_ADV_BATMAN_V
8b84cc4f 1766 /** @bat_v: B.A.T.M.A.N. V per soft-interface private data */
0da00359
AQ
1767 struct batadv_priv_bat_v bat_v;
1768#endif
c6c8fea2
SE
1769};
1770
88a32c9a
ML
1771/**
1772 * struct batadv_socket_client - layer2 icmp socket client data
88a32c9a 1773 */
56303d34 1774struct batadv_socket_client {
8b84cc4f
SE
1775 /**
1776 * @queue_list: packet queue for packets destined for this socket client
1777 */
c6c8fea2 1778 struct list_head queue_list;
8b84cc4f
SE
1779
1780 /** @queue_len: number of packets in the packet queue (queue_list) */
c6c8fea2 1781 unsigned int queue_len;
8b84cc4f
SE
1782
1783 /** @index: socket client's index in the batadv_socket_client_hash */
c6c8fea2 1784 unsigned char index;
8b84cc4f
SE
1785
1786 /** @lock: lock protecting queue_list, queue_len & index */
1787 spinlock_t lock;
1788
1789 /** @queue_wait: socket client's wait queue */
c6c8fea2 1790 wait_queue_head_t queue_wait;
8b84cc4f
SE
1791
1792 /** @bat_priv: pointer to soft_iface this client belongs to */
56303d34 1793 struct batadv_priv *bat_priv;
c6c8fea2
SE
1794};
1795
88a32c9a
ML
1796/**
1797 * struct batadv_socket_packet - layer2 icmp packet for socket client
88a32c9a 1798 */
56303d34 1799struct batadv_socket_packet {
a07369d7 1800 /** @list: list node for &batadv_socket_client.queue_list */
c6c8fea2 1801 struct list_head list;
8b84cc4f
SE
1802
1803 /** @icmp_len: size of the layer2 icmp packet */
c6c8fea2 1804 size_t icmp_len;
8b84cc4f
SE
1805
1806 /** @icmp_packet: layer2 icmp packet */
6b5e971a 1807 u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE];
c6c8fea2
SE
1808};
1809
426fc6c8
SE
1810#ifdef CONFIG_BATMAN_ADV_BLA
1811
88a32c9a
ML
1812/**
1813 * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
88a32c9a 1814 */
bae98774 1815struct batadv_bla_backbone_gw {
8b84cc4f
SE
1816 /**
1817 * @orig: originator address of backbone node (mac address of primary
1818 * iface)
1819 */
6b5e971a 1820 u8 orig[ETH_ALEN];
8b84cc4f
SE
1821
1822 /** @vid: vlan id this gateway was detected on */
eb2deb6b 1823 unsigned short vid;
8b84cc4f 1824
a07369d7 1825 /** @hash_entry: hlist node for &batadv_priv_bla.backbone_hash */
2006fea8 1826 struct hlist_node hash_entry;
8b84cc4f
SE
1827
1828 /** @bat_priv: pointer to soft_iface this backbone gateway belongs to */
2006fea8 1829 struct batadv_priv *bat_priv;
8b84cc4f
SE
1830
1831 /** @lasttime: last time we heard of this backbone gw */
88a32c9a 1832 unsigned long lasttime;
8b84cc4f
SE
1833
1834 /**
1835 * @wait_periods: grace time for bridge forward delays and bla group
1836 * forming at bootup phase - no bcast traffic is formwared until it has
1837 * elapsed
1838 */
2006fea8 1839 atomic_t wait_periods;
8b84cc4f
SE
1840
1841 /**
1842 * @request_sent: if this bool is set to true we are out of sync with
1843 * this backbone gateway - no bcast traffic is formwared until the
1844 * situation was resolved
1845 */
2006fea8 1846 atomic_t request_sent;
8b84cc4f
SE
1847
1848 /** @crc: crc16 checksum over all claims */
6b5e971a 1849 u16 crc;
8b84cc4f
SE
1850
1851 /** @crc_lock: lock protecting crc */
1852 spinlock_t crc_lock;
1853
1854 /** @report_work: work struct for reporting detected loops */
cd9c7bfb 1855 struct work_struct report_work;
8b84cc4f
SE
1856
1857 /** @refcount: number of contexts the object is used */
06e56ded 1858 struct kref refcount;
8b84cc4f
SE
1859
1860 /** @rcu: struct used for freeing in an RCU-safe manner */
2006fea8 1861 struct rcu_head rcu;
2006fea8
ML
1862};
1863
88a32c9a
ML
1864/**
1865 * struct batadv_bla_claim - claimed non-mesh client structure
88a32c9a 1866 */
712bbfe4 1867struct batadv_bla_claim {
8b84cc4f 1868 /** @addr: mac address of claimed non-mesh client */
6b5e971a 1869 u8 addr[ETH_ALEN];
8b84cc4f
SE
1870
1871 /** @vid: vlan id this client was detected on */
eb2deb6b 1872 unsigned short vid;
8b84cc4f
SE
1873
1874 /** @backbone_gw: pointer to backbone gw claiming this client */
bae98774 1875 struct batadv_bla_backbone_gw *backbone_gw;
8b84cc4f
SE
1876
1877 /** @backbone_lock: lock protecting backbone_gw pointer */
1878 spinlock_t backbone_lock;
1879
1880 /** @lasttime: last time we heard of claim (locals only) */
88a32c9a 1881 unsigned long lasttime;
8b84cc4f 1882
a07369d7 1883 /** @hash_entry: hlist node for &batadv_priv_bla.claim_hash */
88a32c9a 1884 struct hlist_node hash_entry;
8b84cc4f
SE
1885
1886 /** @refcount: number of contexts the object is used */
2006fea8 1887 struct rcu_head rcu;
8b84cc4f
SE
1888
1889 /** @rcu: struct used for freeing in an RCU-safe manner */
71b7e3d3 1890 struct kref refcount;
2006fea8
ML
1891};
1892#endif
1893
88a32c9a
ML
1894/**
1895 * struct batadv_tt_common_entry - tt local & tt global common data
88a32c9a 1896 */
56303d34 1897struct batadv_tt_common_entry {
8b84cc4f 1898 /** @addr: mac address of non-mesh client */
6b5e971a 1899 u8 addr[ETH_ALEN];
8b84cc4f
SE
1900
1901 /** @vid: VLAN identifier */
c018ad3d 1902 unsigned short vid;
8b84cc4f
SE
1903
1904 /**
a07369d7
SE
1905 * @hash_entry: hlist node for &batadv_priv_tt.local_hash or for
1906 * &batadv_priv_tt.global_hash
8b84cc4f 1907 */
93840ac4 1908 struct hlist_node hash_entry;
8b84cc4f
SE
1909
1910 /** @flags: various state handling flags (see batadv_tt_client_flags) */
6b5e971a 1911 u16 flags;
8b84cc4f
SE
1912
1913 /** @added_at: timestamp used for purging stale tt common entries */
30cfd02b 1914 unsigned long added_at;
8b84cc4f
SE
1915
1916 /** @refcount: number of contexts the object is used */
92dcdf09 1917 struct kref refcount;
8b84cc4f
SE
1918
1919 /** @rcu: struct used for freeing in an RCU-safe manner */
7683fdc1 1920 struct rcu_head rcu;
c6c8fea2
SE
1921};
1922
88a32c9a
ML
1923/**
1924 * struct batadv_tt_local_entry - translation table local entry data
88a32c9a 1925 */
56303d34 1926struct batadv_tt_local_entry {
8b84cc4f 1927 /** @common: general translation table data */
56303d34 1928 struct batadv_tt_common_entry common;
8b84cc4f
SE
1929
1930 /** @last_seen: timestamp used for purging stale tt local entries */
48100bac 1931 unsigned long last_seen;
8b84cc4f
SE
1932
1933 /** @vlan: soft-interface vlan of the entry */
a33d970d 1934 struct batadv_softif_vlan *vlan;
48100bac
AQ
1935};
1936
88a32c9a
ML
1937/**
1938 * struct batadv_tt_global_entry - translation table global entry data
88a32c9a 1939 */
56303d34 1940struct batadv_tt_global_entry {
8b84cc4f 1941 /** @common: general translation table data */
56303d34 1942 struct batadv_tt_common_entry common;
8b84cc4f
SE
1943
1944 /** @orig_list: list of orig nodes announcing this non-mesh client */
db08e6e5 1945 struct hlist_head orig_list;
8b84cc4f
SE
1946
1947 /** @orig_list_count: number of items in the orig_list */
1d8ab8d3 1948 atomic_t orig_list_count;
8b84cc4f
SE
1949
1950 /** @list_lock: lock protecting orig_list */
1951 spinlock_t list_lock;
1952
1953 /** @roam_at: time at which TT_GLOBAL_ROAM was set */
88a32c9a 1954 unsigned long roam_at;
db08e6e5
SW
1955};
1956
88a32c9a
ML
1957/**
1958 * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
88a32c9a 1959 */
56303d34 1960struct batadv_tt_orig_list_entry {
8b84cc4f 1961 /** @orig_node: pointer to orig node announcing this non-mesh client */
56303d34 1962 struct batadv_orig_node *orig_node;
8b84cc4f
SE
1963
1964 /**
1965 * @ttvn: translation table version number which added the non-mesh
1966 * client
1967 */
6b5e971a 1968 u8 ttvn;
8b84cc4f
SE
1969
1970 /** @flags: per orig entry TT sync flags */
54e22f26 1971 u8 flags;
8b84cc4f 1972
a07369d7 1973 /** @list: list node for &batadv_tt_global_entry.orig_list */
88a32c9a 1974 struct hlist_node list;
8b84cc4f
SE
1975
1976 /** @refcount: number of contexts the object is used */
6e8ef69d 1977 struct kref refcount;
8b84cc4f
SE
1978
1979 /** @rcu: struct used for freeing in an RCU-safe manner */
db08e6e5 1980 struct rcu_head rcu;
c6c8fea2
SE
1981};
1982
88a32c9a 1983/**
3f68785e 1984 * struct batadv_tt_change_node - structure for tt changes occurred
88a32c9a 1985 */
56303d34 1986struct batadv_tt_change_node {
a07369d7 1987 /** @list: list node for &batadv_priv_tt.changes_list */
a73105b8 1988 struct list_head list;
8b84cc4f
SE
1989
1990 /** @change: holds the actual translation table diff data */
e1bf0c14 1991 struct batadv_tvlv_tt_change change;
a73105b8
AQ
1992};
1993
88a32c9a
ML
1994/**
1995 * struct batadv_tt_req_node - data to keep track of the tt requests in flight
88a32c9a 1996 */
56303d34 1997struct batadv_tt_req_node {
8b84cc4f 1998 /**
6f5b92a7 1999 * @addr: mac address of the originator this request was sent to
8b84cc4f 2000 */
6b5e971a 2001 u8 addr[ETH_ALEN];
8b84cc4f
SE
2002
2003 /** @issued_at: timestamp used for purging stale tt requests */
a73105b8 2004 unsigned long issued_at;
8b84cc4f
SE
2005
2006 /** @refcount: number of contexts the object is used by */
9c4604a2 2007 struct kref refcount;
8b84cc4f 2008
a07369d7 2009 /** @list: list node for &batadv_priv_tt.req_list */
7c26a53b 2010 struct hlist_node list;
a73105b8
AQ
2011};
2012
88a32c9a
ML
2013/**
2014 * struct batadv_tt_roam_node - roaming client data
88a32c9a 2015 */
56303d34 2016struct batadv_tt_roam_node {
8b84cc4f 2017 /** @addr: mac address of the client in the roaming phase */
6b5e971a 2018 u8 addr[ETH_ALEN];
8b84cc4f
SE
2019
2020 /**
2021 * @counter: number of allowed roaming events per client within a single
2022 * OGM interval (changes are committed with each OGM)
2023 */
cc47f66e 2024 atomic_t counter;
8b84cc4f
SE
2025
2026 /**
2027 * @first_time: timestamp used for purging stale roaming node entries
2028 */
cc47f66e 2029 unsigned long first_time;
8b84cc4f 2030
a07369d7 2031 /** @list: list node for &batadv_priv_tt.roam_list */
cc47f66e
AQ
2032 struct list_head list;
2033};
2034
d56b1705
MH
2035/**
2036 * struct batadv_nc_node - network coding node
d56b1705
MH
2037 */
2038struct batadv_nc_node {
8b84cc4f 2039 /** @list: next and prev pointer for the list handling */
d56b1705 2040 struct list_head list;
8b84cc4f
SE
2041
2042 /** @addr: the node's mac address */
6b5e971a 2043 u8 addr[ETH_ALEN];
8b84cc4f
SE
2044
2045 /** @refcount: number of contexts the object is used by */
daf99b48 2046 struct kref refcount;
8b84cc4f
SE
2047
2048 /** @rcu: struct used for freeing in an RCU-safe manner */
d56b1705 2049 struct rcu_head rcu;
8b84cc4f
SE
2050
2051 /** @orig_node: pointer to corresponding orig node struct */
d56b1705 2052 struct batadv_orig_node *orig_node;
8b84cc4f
SE
2053
2054 /** @last_seen: timestamp of last ogm received from this node */
d56b1705
MH
2055 unsigned long last_seen;
2056};
2057
95332477
MH
2058/**
2059 * struct batadv_nc_path - network coding path
95332477
MH
2060 */
2061struct batadv_nc_path {
8b84cc4f 2062 /** @hash_entry: next and prev pointer for the list handling */
95332477 2063 struct hlist_node hash_entry;
8b84cc4f
SE
2064
2065 /** @rcu: struct used for freeing in an RCU-safe manner */
95332477 2066 struct rcu_head rcu;
8b84cc4f
SE
2067
2068 /** @refcount: number of contexts the object is used by */
727e0cd5 2069 struct kref refcount;
8b84cc4f
SE
2070
2071 /** @packet_list: list of buffered packets for this path */
95332477 2072 struct list_head packet_list;
8b84cc4f
SE
2073
2074 /** @packet_list_lock: access lock for packet list */
2075 spinlock_t packet_list_lock;
2076
2077 /** @next_hop: next hop (destination) of path */
6b5e971a 2078 u8 next_hop[ETH_ALEN];
8b84cc4f
SE
2079
2080 /** @prev_hop: previous hop (source) of path */
6b5e971a 2081 u8 prev_hop[ETH_ALEN];
8b84cc4f
SE
2082
2083 /** @last_valid: timestamp for last validation of path */
95332477
MH
2084 unsigned long last_valid;
2085};
2086
2087/**
2088 * struct batadv_nc_packet - network coding packet used when coding and
2089 * decoding packets
95332477
MH
2090 */
2091struct batadv_nc_packet {
8b84cc4f 2092 /** @list: next and prev pointer for the list handling */
95332477 2093 struct list_head list;
8b84cc4f
SE
2094
2095 /** @packet_id: crc32 checksum of skb data */
95332477 2096 __be32 packet_id;
8b84cc4f
SE
2097
2098 /**
2099 * @timestamp: field containing the info when the packet was added to
2100 * path
2101 */
95332477 2102 unsigned long timestamp;
8b84cc4f
SE
2103
2104 /** @neigh_node: pointer to original next hop neighbor of skb */
95332477 2105 struct batadv_neigh_node *neigh_node;
8b84cc4f
SE
2106
2107 /** @skb: skb which can be encoded or used for decoding */
95332477 2108 struct sk_buff *skb;
8b84cc4f
SE
2109
2110 /** @nc_path: pointer to path this nc packet is attached to */
95332477
MH
2111 struct batadv_nc_path *nc_path;
2112};
2113
3c12de9a 2114/**
1a321b0d
SW
2115 * struct batadv_skb_cb - control buffer structure used to store private data
2116 * relevant to batman-adv in the skb->cb buffer in skbs.
3c12de9a
MH
2117 */
2118struct batadv_skb_cb {
8b84cc4f
SE
2119 /**
2120 * @decoded: Marks a skb as decoded, which is checked when searching for
2121 * coding opportunities in network-coding.c
2122 */
6486379d 2123 unsigned char decoded:1;
8b84cc4f
SE
2124
2125 /** @num_bcasts: Counter for broadcast packet retransmissions */
6486379d 2126 unsigned char num_bcasts;
3c12de9a
MH
2127};
2128
88a32c9a
ML
2129/**
2130 * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded
c6c8fea2 2131 */
56303d34 2132struct batadv_forw_packet {
a07369d7
SE
2133 /**
2134 * @list: list node for &batadv_priv.forw.bcast_list and
2135 * &batadv_priv.forw.bat_list
2136 */
c6c8fea2 2137 struct hlist_node list;
8b84cc4f
SE
2138
2139 /** @cleanup_list: list node for purging functions */
9b4aec64 2140 struct hlist_node cleanup_list;
8b84cc4f
SE
2141
2142 /** @send_time: execution time for delayed_work (packet sending) */
c6c8fea2 2143 unsigned long send_time;
8b84cc4f
SE
2144
2145 /**
2146 * @own: bool for locally generated packets (local OGMs are re-scheduled
2147 * after sending)
2148 */
6b5e971a 2149 u8 own;
8b84cc4f
SE
2150
2151 /** @skb: bcast packet's skb buffer */
c6c8fea2 2152 struct sk_buff *skb;
8b84cc4f
SE
2153
2154 /** @packet_len: size of aggregated OGM packet inside the skb buffer */
6b5e971a 2155 u16 packet_len;
8b84cc4f
SE
2156
2157 /** @direct_link_flags: direct link flags for aggregated OGM packets */
6b5e971a 2158 u32 direct_link_flags;
8b84cc4f
SE
2159
2160 /** @num_packets: counter for aggregated OGMv1 packets */
6b5e971a 2161 u8 num_packets;
8b84cc4f
SE
2162
2163 /** @delayed_work: work queue callback item for packet sending */
c6c8fea2 2164 struct delayed_work delayed_work;
8b84cc4f
SE
2165
2166 /**
2167 * @if_incoming: pointer to incoming hard-iface or primary iface if
2168 * locally generated packet
2169 */
56303d34 2170 struct batadv_hard_iface *if_incoming;
8b84cc4f
SE
2171
2172 /**
2173 * @if_outgoing: packet where the packet should be sent to, or NULL if
2174 * unspecified
2175 */
ef0a937f 2176 struct batadv_hard_iface *if_outgoing;
8b84cc4f
SE
2177
2178 /** @queue_left: The queue (counter) this packet was applied to */
a65e5481 2179 atomic_t *queue_left;
c6c8fea2
SE
2180};
2181
29824a55
AQ
2182/**
2183 * struct batadv_algo_iface_ops - mesh algorithm callbacks (interface specific)
29824a55
AQ
2184 */
2185struct batadv_algo_iface_ops {
8b84cc4f
SE
2186 /**
2187 * @activate: start routing mechanisms when hard-interface is brought up
2188 * (optional)
2189 */
29824a55 2190 void (*activate)(struct batadv_hard_iface *hard_iface);
8b84cc4f
SE
2191
2192 /** @enable: init routing info when hard-interface is enabled */
29824a55 2193 int (*enable)(struct batadv_hard_iface *hard_iface);
8b84cc4f 2194
9e6b5648
SE
2195 /** @enabled: notification when hard-interface was enabled (optional) */
2196 void (*enabled)(struct batadv_hard_iface *hard_iface);
2197
8b84cc4f 2198 /** @disable: de-init routing info when hard-interface is disabled */
29824a55 2199 void (*disable)(struct batadv_hard_iface *hard_iface);
8b84cc4f
SE
2200
2201 /**
2202 * @update_mac: (re-)init mac addresses of the protocol information
2203 * belonging to this hard-interface
2204 */
29824a55 2205 void (*update_mac)(struct batadv_hard_iface *hard_iface);
8b84cc4f
SE
2206
2207 /** @primary_set: called when primary interface is selected / changed */
29824a55
AQ
2208 void (*primary_set)(struct batadv_hard_iface *hard_iface);
2209};
2210
2211/**
2212 * struct batadv_algo_neigh_ops - mesh algorithm callbacks (neighbour specific)
29824a55
AQ
2213 */
2214struct batadv_algo_neigh_ops {
8b84cc4f 2215 /** @hardif_init: called on creation of single hop entry (optional) */
29824a55 2216 void (*hardif_init)(struct batadv_hardif_neigh_node *neigh);
8b84cc4f
SE
2217
2218 /**
2219 * @cmp: compare the metrics of two neighbors for their respective
2220 * outgoing interfaces
2221 */
29824a55
AQ
2222 int (*cmp)(struct batadv_neigh_node *neigh1,
2223 struct batadv_hard_iface *if_outgoing1,
2224 struct batadv_neigh_node *neigh2,
2225 struct batadv_hard_iface *if_outgoing2);
8b84cc4f
SE
2226
2227 /**
2228 * @is_similar_or_better: check if neigh1 is equally similar or better
2229 * than neigh2 for their respective outgoing interface from the metric
2230 * prospective
2231 */
29824a55
AQ
2232 bool (*is_similar_or_better)(struct batadv_neigh_node *neigh1,
2233 struct batadv_hard_iface *if_outgoing1,
2234 struct batadv_neigh_node *neigh2,
2235 struct batadv_hard_iface *if_outgoing2);
8b84cc4f 2236
dc1cbd14 2237#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f 2238 /** @print: print the single hop neighbor list (optional) */
29824a55 2239 void (*print)(struct batadv_priv *priv, struct seq_file *seq);
dc1cbd14 2240#endif
8b84cc4f
SE
2241
2242 /** @dump: dump neighbors to a netlink socket (optional) */
85cf8c85
MS
2243 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
2244 struct batadv_priv *priv,
2245 struct batadv_hard_iface *hard_iface);
29824a55
AQ
2246};
2247
2248/**
2249 * struct batadv_algo_orig_ops - mesh algorithm callbacks (originator specific)
29824a55
AQ
2250 */
2251struct batadv_algo_orig_ops {
dc1cbd14 2252#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f 2253 /** @print: print the originator table (optional) */
29824a55
AQ
2254 void (*print)(struct batadv_priv *priv, struct seq_file *seq,
2255 struct batadv_hard_iface *hard_iface);
dc1cbd14 2256#endif
8b84cc4f
SE
2257
2258 /** @dump: dump originators to a netlink socket (optional) */
85cf8c85
MS
2259 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
2260 struct batadv_priv *priv,
2261 struct batadv_hard_iface *hard_iface);
29824a55
AQ
2262};
2263
08686943
AQ
2264/**
2265 * struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific)
08686943
AQ
2266 */
2267struct batadv_algo_gw_ops {
8b84cc4f 2268 /** @init_sel_class: initialize GW selection class (optional) */
1a9070ec 2269 void (*init_sel_class)(struct batadv_priv *bat_priv);
8b84cc4f
SE
2270
2271 /**
2272 * @store_sel_class: parse and stores a new GW selection class
2273 * (optional)
2274 */
08686943
AQ
2275 ssize_t (*store_sel_class)(struct batadv_priv *bat_priv, char *buff,
2276 size_t count);
8b84cc4f
SE
2277
2278 /** @show_sel_class: prints the current GW selection class (optional) */
08686943 2279 ssize_t (*show_sel_class)(struct batadv_priv *bat_priv, char *buff);
8b84cc4f
SE
2280
2281 /**
2282 * @get_best_gw_node: select the best GW from the list of available
2283 * nodes (optional)
2284 */
34d99cfe
AQ
2285 struct batadv_gw_node *(*get_best_gw_node)
2286 (struct batadv_priv *bat_priv);
8b84cc4f
SE
2287
2288 /**
2289 * @is_eligible: check if a newly discovered GW is a potential candidate
2290 * for the election as best GW (optional)
2291 */
34d99cfe
AQ
2292 bool (*is_eligible)(struct batadv_priv *bat_priv,
2293 struct batadv_orig_node *curr_gw_orig,
2294 struct batadv_orig_node *orig_node);
8b84cc4f 2295
dc1cbd14 2296#ifdef CONFIG_BATMAN_ADV_DEBUGFS
8b84cc4f 2297 /** @print: print the gateway table (optional) */
34d99cfe 2298 void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq);
dc1cbd14 2299#endif
8b84cc4f
SE
2300
2301 /** @dump: dump gateways to a netlink socket (optional) */
d7129daf
SE
2302 void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
2303 struct batadv_priv *priv);
08686943
AQ
2304};
2305
88a32c9a
ML
2306/**
2307 * struct batadv_algo_ops - mesh algorithm callbacks
88a32c9a 2308 */
56303d34 2309struct batadv_algo_ops {
8b84cc4f 2310 /** @list: list node for the batadv_algo_list */
1c280471 2311 struct hlist_node list;
8b84cc4f
SE
2312
2313 /** @name: name of the algorithm */
1c280471 2314 char *name;
8b84cc4f
SE
2315
2316 /** @iface: callbacks related to interface handling */
29824a55 2317 struct batadv_algo_iface_ops iface;
8b84cc4f
SE
2318
2319 /** @neigh: callbacks related to neighbors handling */
29824a55 2320 struct batadv_algo_neigh_ops neigh;
8b84cc4f
SE
2321
2322 /** @orig: callbacks related to originators handling */
29824a55 2323 struct batadv_algo_orig_ops orig;
8b84cc4f
SE
2324
2325 /** @gw: callbacks related to GW mode */
08686943 2326 struct batadv_algo_gw_ops gw;
1c280471
ML
2327};
2328
2f1dfbe1
AQ
2329/**
2330 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It
2331 * is used to stored ARP entries needed for the global DAT cache
2f1dfbe1
AQ
2332 */
2333struct batadv_dat_entry {
8b84cc4f 2334 /** @ip: the IPv4 corresponding to this DAT/ARP entry */
2f1dfbe1 2335 __be32 ip;
8b84cc4f
SE
2336
2337 /** @mac_addr: the MAC address associated to the stored IPv4 */
6b5e971a 2338 u8 mac_addr[ETH_ALEN];
8b84cc4f
SE
2339
2340 /** @vid: the vlan ID associated to this entry */
be1db4f6 2341 unsigned short vid;
8b84cc4f
SE
2342
2343 /**
2344 * @last_update: time in jiffies when this entry was refreshed last time
2345 */
2f1dfbe1 2346 unsigned long last_update;
8b84cc4f 2347
a07369d7 2348 /** @hash_entry: hlist node for &batadv_priv_dat.hash */
2f1dfbe1 2349 struct hlist_node hash_entry;
8b84cc4f
SE
2350
2351 /** @refcount: number of contexts the object is used */
68a6722c 2352 struct kref refcount;
8b84cc4f
SE
2353
2354 /** @rcu: struct used for freeing in an RCU-safe manner */
2f1dfbe1
AQ
2355 struct rcu_head rcu;
2356};
2357
c5caf4ef
LL
2358/**
2359 * struct batadv_hw_addr - a list entry for a MAC address
c5caf4ef
LL
2360 */
2361struct batadv_hw_addr {
8b84cc4f 2362 /** @list: list node for the linking of entries */
c5caf4ef 2363 struct hlist_node list;
8b84cc4f
SE
2364
2365 /** @addr: the MAC address of this list entry */
c5caf4ef
LL
2366 unsigned char addr[ETH_ALEN];
2367};
2368
785ea114
AQ
2369/**
2370 * struct batadv_dat_candidate - candidate destination for DAT operations
785ea114
AQ
2371 */
2372struct batadv_dat_candidate {
8b84cc4f
SE
2373 /**
2374 * @type: the type of the selected candidate. It can one of the
2375 * following:
2376 * - BATADV_DAT_CANDIDATE_NOT_FOUND
2377 * - BATADV_DAT_CANDIDATE_ORIG
2378 */
785ea114 2379 int type;
8b84cc4f
SE
2380
2381 /**
2382 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to
2383 * the corresponding originator node structure
2384 */
785ea114
AQ
2385 struct batadv_orig_node *orig_node;
2386};
2387
ef261577
ML
2388/**
2389 * struct batadv_tvlv_container - container for tvlv appended to OGMs
ef261577
ML
2390 */
2391struct batadv_tvlv_container {
a07369d7 2392 /** @list: hlist node for &batadv_priv_tvlv.container_list */
ef261577 2393 struct hlist_node list;
8b84cc4f
SE
2394
2395 /** @tvlv_hdr: tvlv header information needed to construct the tvlv */
ef261577 2396 struct batadv_tvlv_hdr tvlv_hdr;
8b84cc4f
SE
2397
2398 /** @refcount: number of contexts the object is used */
f7157dd1 2399 struct kref refcount;
ef261577
ML
2400};
2401
2402/**
2403 * struct batadv_tvlv_handler - handler for specific tvlv type and version
ef261577
ML
2404 */
2405struct batadv_tvlv_handler {
a07369d7 2406 /** @list: hlist node for &batadv_priv_tvlv.handler_list */
ef261577 2407 struct hlist_node list;
8b84cc4f
SE
2408
2409 /**
2410 * @ogm_handler: handler callback which is given the tvlv payload to
2411 * process on incoming OGM packets
2412 */
ef261577
ML
2413 void (*ogm_handler)(struct batadv_priv *bat_priv,
2414 struct batadv_orig_node *orig,
6b5e971a 2415 u8 flags, void *tvlv_value, u16 tvlv_value_len);
8b84cc4f
SE
2416
2417 /**
2418 * @unicast_handler: handler callback which is given the tvlv payload to
2419 * process on incoming unicast tvlv packets
2420 */
ef261577 2421 int (*unicast_handler)(struct batadv_priv *bat_priv,
6b5e971a
SE
2422 u8 *src, u8 *dst,
2423 void *tvlv_value, u16 tvlv_value_len);
8b84cc4f
SE
2424
2425 /** @type: tvlv type this handler feels responsible for */
6b5e971a 2426 u8 type;
8b84cc4f
SE
2427
2428 /** @version: tvlv version this handler feels responsible for */
6b5e971a 2429 u8 version;
8b84cc4f
SE
2430
2431 /** @flags: tvlv handler flags */
6b5e971a 2432 u8 flags;
8b84cc4f
SE
2433
2434 /** @refcount: number of contexts the object is used */
32836f56 2435 struct kref refcount;
8b84cc4f
SE
2436
2437 /** @rcu: struct used for freeing in an RCU-safe manner */
ef261577
ML
2438 struct rcu_head rcu;
2439};
2440
2441/**
2442 * enum batadv_tvlv_handler_flags - tvlv handler flags definitions
ef261577
ML
2443 */
2444enum batadv_tvlv_handler_flags {
8b84cc4f
SE
2445 /**
2446 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function
2447 * will call this handler even if its type was not found (with no data)
2448 */
ef261577 2449 BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1),
8b84cc4f
SE
2450
2451 /**
2452 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the
2453 * API marks a handler as being called, so it won't be called if the
2454 * BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set
2455 */
ef261577
ML
2456 BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2),
2457};
2458
77d69d8c
SE
2459/**
2460 * struct batadv_store_mesh_work - Work queue item to detach add/del interface
2461 * from sysfs locks
77d69d8c
SE
2462 */
2463struct batadv_store_mesh_work {
8b84cc4f
SE
2464 /**
2465 * @net_dev: netdevice to add/remove to/from batman-adv soft-interface
2466 */
77d69d8c 2467 struct net_device *net_dev;
8b84cc4f
SE
2468
2469 /** @soft_iface_name: name of soft-interface to modify */
77d69d8c 2470 char soft_iface_name[IFNAMSIZ];
8b84cc4f
SE
2471
2472 /** @work: work queue item */
77d69d8c
SE
2473 struct work_struct work;
2474};
2475
c6c8fea2 2476#endif /* _NET_BATMAN_ADV_TYPES_H_ */