xref: /linux/net/batman-adv/types.h (revision 3f2fb9a834cb1fcddbae22deca7fde136944dc89)
1 /* Copyright (C) 2007-2016  B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner, Simon Wunderlich
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef _NET_BATMAN_ADV_TYPES_H_
19 #define _NET_BATMAN_ADV_TYPES_H_
20 
21 #ifndef _NET_BATMAN_ADV_MAIN_H_
22 #error only "main.h" can be included directly
23 #endif
24 
25 #include <linux/bitops.h>
26 #include <linux/compiler.h>
27 #include <linux/if_ether.h>
28 #include <linux/kref.h>
29 #include <linux/netdevice.h>
30 #include <linux/sched.h> /* for linux/wait.h */
31 #include <linux/spinlock.h>
32 #include <linux/types.h>
33 #include <linux/wait.h>
34 #include <linux/workqueue.h>
35 
36 #include "packet.h"
37 
38 struct seq_file;
39 
40 #ifdef CONFIG_BATMAN_ADV_DAT
41 
42 /**
43  * batadv_dat_addr_t - it is the type used for all DHT addresses. If it is
44  *  changed, BATADV_DAT_ADDR_MAX is changed as well.
45  *
46  * *Please be careful: batadv_dat_addr_t must be UNSIGNED*
47  */
48 #define batadv_dat_addr_t u16
49 
50 #endif /* CONFIG_BATMAN_ADV_DAT */
51 
52 /**
53  * enum batadv_dhcp_recipient - dhcp destination
54  * @BATADV_DHCP_NO: packet is not a dhcp message
55  * @BATADV_DHCP_TO_SERVER: dhcp message is directed to a server
56  * @BATADV_DHCP_TO_CLIENT: dhcp message is directed to a client
57  */
58 enum batadv_dhcp_recipient {
59 	BATADV_DHCP_NO = 0,
60 	BATADV_DHCP_TO_SERVER,
61 	BATADV_DHCP_TO_CLIENT,
62 };
63 
64 /**
65  * BATADV_TT_REMOTE_MASK - bitmask selecting the flags that are sent over the
66  *  wire only
67  */
68 #define BATADV_TT_REMOTE_MASK	0x00FF
69 
70 /**
71  * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
72  *  among the nodes. These flags are used to compute the global/local CRC
73  */
74 #define BATADV_TT_SYNC_MASK	0x00F0
75 
76 /**
77  * struct batadv_hard_iface_bat_iv - per hard-interface B.A.T.M.A.N. IV data
78  * @ogm_buff: buffer holding the OGM packet
79  * @ogm_buff_len: length of the OGM packet buffer
80  * @ogm_seqno: OGM sequence number - used to identify each OGM
81  */
82 struct batadv_hard_iface_bat_iv {
83 	unsigned char *ogm_buff;
84 	int ogm_buff_len;
85 	atomic_t ogm_seqno;
86 };
87 
88 /**
89  * struct batadv_hard_iface - network device known to batman-adv
90  * @list: list node for batadv_hardif_list
91  * @if_num: identificator of the interface
92  * @if_status: status of the interface for batman-adv
93  * @net_dev: pointer to the net_device
94  * @num_bcasts: number of payload re-broadcasts on this interface (ARQ)
95  * @hardif_obj: kobject of the per interface sysfs "mesh" directory
96  * @refcount: number of contexts the object is used
97  * @batman_adv_ptype: packet type describing packets that should be processed by
98  *  batman-adv for this interface
99  * @soft_iface: the batman-adv interface which uses this network interface
100  * @rcu: struct used for freeing in an RCU-safe manner
101  * @bat_iv: per hard-interface B.A.T.M.A.N. IV data
102  * @cleanup_work: work queue callback item for hard-interface deinit
103  * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
104  * @neigh_list: list of unique single hop neighbors via this interface
105  * @neigh_list_lock: lock protecting neigh_list
106  */
107 struct batadv_hard_iface {
108 	struct list_head list;
109 	s16 if_num;
110 	char if_status;
111 	struct net_device *net_dev;
112 	u8 num_bcasts;
113 	struct kobject *hardif_obj;
114 	struct kref refcount;
115 	struct packet_type batman_adv_ptype;
116 	struct net_device *soft_iface;
117 	struct rcu_head rcu;
118 	struct batadv_hard_iface_bat_iv bat_iv;
119 	struct work_struct cleanup_work;
120 	struct dentry *debug_dir;
121 	struct hlist_head neigh_list;
122 	/* neigh_list_lock protects: neigh_list */
123 	spinlock_t neigh_list_lock;
124 };
125 
126 /**
127  * struct batadv_orig_ifinfo - originator info per outgoing interface
128  * @list: list node for orig_node::ifinfo_list
129  * @if_outgoing: pointer to outgoing hard-interface
130  * @router: router that should be used to reach this originator
131  * @last_real_seqno: last and best known sequence number
132  * @last_ttl: ttl of last received packet
133  * @batman_seqno_reset: time when the batman seqno window was reset
134  * @refcount: number of contexts the object is used
135  * @rcu: struct used for freeing in an RCU-safe manner
136  */
137 struct batadv_orig_ifinfo {
138 	struct hlist_node list;
139 	struct batadv_hard_iface *if_outgoing;
140 	struct batadv_neigh_node __rcu *router; /* rcu protected pointer */
141 	u32 last_real_seqno;
142 	u8 last_ttl;
143 	unsigned long batman_seqno_reset;
144 	struct kref refcount;
145 	struct rcu_head rcu;
146 };
147 
148 /**
149  * struct batadv_frag_table_entry - head in the fragment buffer table
150  * @head: head of list with fragments
151  * @lock: lock to protect the list of fragments
152  * @timestamp: time (jiffie) of last received fragment
153  * @seqno: sequence number of the fragments in the list
154  * @size: accumulated size of packets in list
155  * @total_size: expected size of the assembled packet
156  */
157 struct batadv_frag_table_entry {
158 	struct hlist_head head;
159 	spinlock_t lock; /* protects head */
160 	unsigned long timestamp;
161 	u16 seqno;
162 	u16 size;
163 	u16 total_size;
164 };
165 
166 /**
167  * struct batadv_frag_list_entry - entry in a list of fragments
168  * @list: list node information
169  * @skb: fragment
170  * @no: fragment number in the set
171  */
172 struct batadv_frag_list_entry {
173 	struct hlist_node list;
174 	struct sk_buff *skb;
175 	u8 no;
176 };
177 
178 /**
179  * struct batadv_vlan_tt - VLAN specific TT attributes
180  * @crc: CRC32 checksum of the entries belonging to this vlan
181  * @num_entries: number of TT entries for this VLAN
182  */
183 struct batadv_vlan_tt {
184 	u32 crc;
185 	atomic_t num_entries;
186 };
187 
188 /**
189  * struct batadv_orig_node_vlan - VLAN specific data per orig_node
190  * @vid: the VLAN identifier
191  * @tt: VLAN specific TT attributes
192  * @list: list node for orig_node::vlan_list
193  * @refcount: number of context where this object is currently in use
194  * @rcu: struct used for freeing in a RCU-safe manner
195  */
196 struct batadv_orig_node_vlan {
197 	unsigned short vid;
198 	struct batadv_vlan_tt tt;
199 	struct hlist_node list;
200 	struct kref refcount;
201 	struct rcu_head rcu;
202 };
203 
204 /**
205  * struct batadv_orig_bat_iv - B.A.T.M.A.N. IV private orig_node members
206  * @bcast_own: set of bitfields (one per hard-interface) where each one counts
207  * the number of our OGMs this orig_node rebroadcasted "back" to us  (relative
208  * to last_real_seqno). Every bitfield is BATADV_TQ_LOCAL_WINDOW_SIZE bits long.
209  * @bcast_own_sum: sum of bcast_own
210  * @ogm_cnt_lock: lock protecting bcast_own, bcast_own_sum,
211  *  neigh_node->bat_iv.real_bits & neigh_node->bat_iv.real_packet_count
212  */
213 struct batadv_orig_bat_iv {
214 	unsigned long *bcast_own;
215 	u8 *bcast_own_sum;
216 	/* ogm_cnt_lock protects: bcast_own, bcast_own_sum,
217 	 * neigh_node->bat_iv.real_bits & neigh_node->bat_iv.real_packet_count
218 	 */
219 	spinlock_t ogm_cnt_lock;
220 };
221 
222 /**
223  * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
224  * @orig: originator ethernet address
225  * @ifinfo_list: list for routers per outgoing interface
226  * @last_bonding_candidate: pointer to last ifinfo of last used router
227  * @dat_addr: address of the orig node in the distributed hash
228  * @last_seen: time when last packet from this node was received
229  * @bcast_seqno_reset: time when the broadcast seqno window was reset
230  * @mcast_handler_lock: synchronizes mcast-capability and -flag changes
231  * @mcast_flags: multicast flags announced by the orig node
232  * @mcast_want_all_unsnoopables_node: a list node for the
233  *  mcast.want_all_unsnoopables list
234  * @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4 list
235  * @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6 list
236  * @capabilities: announced capabilities of this originator
237  * @capa_initialized: bitfield to remember whether a capability was initialized
238  * @last_ttvn: last seen translation table version number
239  * @tt_buff: last tt changeset this node received from the orig node
240  * @tt_buff_len: length of the last tt changeset this node received from the
241  *  orig node
242  * @tt_buff_lock: lock that protects tt_buff and tt_buff_len
243  * @tt_lock: prevents from updating the table while reading it. Table update is
244  *  made up by two operations (data structure update and metdata -CRC/TTVN-
245  *  recalculation) and they have to be executed atomically in order to avoid
246  *  another thread to read the table/metadata between those.
247  * @bcast_bits: bitfield containing the info which payload broadcast originated
248  *  from this orig node this host already has seen (relative to
249  *  last_bcast_seqno)
250  * @last_bcast_seqno: last broadcast sequence number received by this host
251  * @neigh_list: list of potential next hop neighbor towards this orig node
252  * @neigh_list_lock: lock protecting neigh_list and router
253  * @hash_entry: hlist node for batadv_priv::orig_hash
254  * @bat_priv: pointer to soft_iface this orig node belongs to
255  * @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno
256  * @refcount: number of contexts the object is used
257  * @rcu: struct used for freeing in an RCU-safe manner
258  * @in_coding_list: list of nodes this orig can hear
259  * @out_coding_list: list of nodes that can hear this orig
260  * @in_coding_list_lock: protects in_coding_list
261  * @out_coding_list_lock: protects out_coding_list
262  * @fragments: array with heads for fragment chains
263  * @vlan_list: a list of orig_node_vlan structs, one per VLAN served by the
264  *  originator represented by this object
265  * @vlan_list_lock: lock protecting vlan_list
266  * @bat_iv: B.A.T.M.A.N. IV private structure
267  */
268 struct batadv_orig_node {
269 	u8 orig[ETH_ALEN];
270 	struct hlist_head ifinfo_list;
271 	struct batadv_orig_ifinfo *last_bonding_candidate;
272 #ifdef CONFIG_BATMAN_ADV_DAT
273 	batadv_dat_addr_t dat_addr;
274 #endif
275 	unsigned long last_seen;
276 	unsigned long bcast_seqno_reset;
277 #ifdef CONFIG_BATMAN_ADV_MCAST
278 	/* synchronizes mcast tvlv specific orig changes */
279 	spinlock_t mcast_handler_lock;
280 	u8 mcast_flags;
281 	struct hlist_node mcast_want_all_unsnoopables_node;
282 	struct hlist_node mcast_want_all_ipv4_node;
283 	struct hlist_node mcast_want_all_ipv6_node;
284 #endif
285 	unsigned long capabilities;
286 	unsigned long capa_initialized;
287 	atomic_t last_ttvn;
288 	unsigned char *tt_buff;
289 	s16 tt_buff_len;
290 	spinlock_t tt_buff_lock; /* protects tt_buff & tt_buff_len */
291 	/* prevents from changing the table while reading it */
292 	spinlock_t tt_lock;
293 	DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
294 	u32 last_bcast_seqno;
295 	struct hlist_head neigh_list;
296 	/* neigh_list_lock protects: neigh_list and router */
297 	spinlock_t neigh_list_lock;
298 	struct hlist_node hash_entry;
299 	struct batadv_priv *bat_priv;
300 	/* bcast_seqno_lock protects: bcast_bits & last_bcast_seqno */
301 	spinlock_t bcast_seqno_lock;
302 	struct kref refcount;
303 	struct rcu_head rcu;
304 #ifdef CONFIG_BATMAN_ADV_NC
305 	struct list_head in_coding_list;
306 	struct list_head out_coding_list;
307 	spinlock_t in_coding_list_lock; /* Protects in_coding_list */
308 	spinlock_t out_coding_list_lock; /* Protects out_coding_list */
309 #endif
310 	struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT];
311 	struct hlist_head vlan_list;
312 	spinlock_t vlan_list_lock; /* protects vlan_list */
313 	struct batadv_orig_bat_iv bat_iv;
314 };
315 
316 /**
317  * enum batadv_orig_capabilities - orig node capabilities
318  * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
319  * @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
320  * @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability
321  * @BATADV_ORIG_CAPA_HAS_MCAST: orig node has some multicast capability
322  *  (= orig node announces a tvlv of type BATADV_TVLV_MCAST)
323  */
324 enum batadv_orig_capabilities {
325 	BATADV_ORIG_CAPA_HAS_DAT,
326 	BATADV_ORIG_CAPA_HAS_NC,
327 	BATADV_ORIG_CAPA_HAS_TT,
328 	BATADV_ORIG_CAPA_HAS_MCAST,
329 };
330 
331 /**
332  * struct batadv_gw_node - structure for orig nodes announcing gw capabilities
333  * @list: list node for batadv_priv_gw::list
334  * @orig_node: pointer to corresponding orig node
335  * @bandwidth_down: advertised uplink download bandwidth
336  * @bandwidth_up: advertised uplink upload bandwidth
337  * @refcount: number of contexts the object is used
338  * @rcu: struct used for freeing in an RCU-safe manner
339  */
340 struct batadv_gw_node {
341 	struct hlist_node list;
342 	struct batadv_orig_node *orig_node;
343 	u32 bandwidth_down;
344 	u32 bandwidth_up;
345 	struct kref refcount;
346 	struct rcu_head rcu;
347 };
348 
349 /**
350  * struct batadv_hardif_neigh_node - unique neighbor per hard-interface
351  * @list: list node for batadv_hard_iface::neigh_list
352  * @addr: the MAC address of the neighboring interface
353  * @if_incoming: pointer to incoming hard-interface
354  * @last_seen: when last packet via this neighbor was received
355  * @refcount: number of contexts the object is used
356  * @rcu: struct used for freeing in a RCU-safe manner
357  */
358 struct batadv_hardif_neigh_node {
359 	struct hlist_node list;
360 	u8 addr[ETH_ALEN];
361 	struct batadv_hard_iface *if_incoming;
362 	unsigned long last_seen;
363 	struct kref refcount;
364 	struct rcu_head rcu;
365 };
366 
367 /**
368  * struct batadv_neigh_node - structure for single hops neighbors
369  * @list: list node for batadv_orig_node::neigh_list
370  * @orig_node: pointer to corresponding orig_node
371  * @addr: the MAC address of the neighboring interface
372  * @ifinfo_list: list for routing metrics per outgoing interface
373  * @ifinfo_lock: lock protecting private ifinfo members and list
374  * @if_incoming: pointer to incoming hard-interface
375  * @last_seen: when last packet via this neighbor was received
376  * @refcount: number of contexts the object is used
377  * @rcu: struct used for freeing in an RCU-safe manner
378  */
379 struct batadv_neigh_node {
380 	struct hlist_node list;
381 	struct batadv_orig_node *orig_node;
382 	u8 addr[ETH_ALEN];
383 	struct hlist_head ifinfo_list;
384 	spinlock_t ifinfo_lock;	/* protects ifinfo_list and its members */
385 	struct batadv_hard_iface *if_incoming;
386 	unsigned long last_seen;
387 	struct kref refcount;
388 	struct rcu_head rcu;
389 };
390 
391 /**
392  * struct batadv_neigh_ifinfo_bat_iv - neighbor information per outgoing
393  *  interface for B.A.T.M.A.N. IV
394  * @tq_recv: ring buffer of received TQ values from this neigh node
395  * @tq_index: ring buffer index
396  * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv)
397  * @real_bits: bitfield containing the number of OGMs received from this neigh
398  *  node (relative to orig_node->last_real_seqno)
399  * @real_packet_count: counted result of real_bits
400  */
401 struct batadv_neigh_ifinfo_bat_iv {
402 	u8 tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
403 	u8 tq_index;
404 	u8 tq_avg;
405 	DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
406 	u8 real_packet_count;
407 };
408 
409 /**
410  * struct batadv_neigh_ifinfo - neighbor information per outgoing interface
411  * @list: list node for batadv_neigh_node::ifinfo_list
412  * @if_outgoing: pointer to outgoing hard-interface
413  * @bat_iv: B.A.T.M.A.N. IV private structure
414  * @last_ttl: last received ttl from this neigh node
415  * @refcount: number of contexts the object is used
416  * @rcu: struct used for freeing in a RCU-safe manner
417  */
418 struct batadv_neigh_ifinfo {
419 	struct hlist_node list;
420 	struct batadv_hard_iface *if_outgoing;
421 	struct batadv_neigh_ifinfo_bat_iv bat_iv;
422 	u8 last_ttl;
423 	struct kref refcount;
424 	struct rcu_head rcu;
425 };
426 
427 #ifdef CONFIG_BATMAN_ADV_BLA
428 
429 /**
430  * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
431  * @orig: mac address of orig node orginating the broadcast
432  * @crc: crc32 checksum of broadcast payload
433  * @entrytime: time when the broadcast packet was received
434  */
435 struct batadv_bcast_duplist_entry {
436 	u8 orig[ETH_ALEN];
437 	__be32 crc;
438 	unsigned long entrytime;
439 };
440 #endif
441 
442 /**
443  * enum batadv_counters - indices for traffic counters
444  * @BATADV_CNT_TX: transmitted payload traffic packet counter
445  * @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter
446  * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet counter
447  * @BATADV_CNT_RX: received payload traffic packet counter
448  * @BATADV_CNT_RX_BYTES: received payload traffic bytes counter
449  * @BATADV_CNT_FORWARD: forwarded payload traffic packet counter
450  * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter
451  * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet counter
452  * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes counter
453  * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter
454  * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes counter
455  * @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter
456  * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter
457  * @BATADV_CNT_FRAG_RX: received fragment traffic packet counter
458  * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter
459  * @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter
460  * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter
461  * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter
462  * @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter
463  * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet counter
464  * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter
465  * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet counter
466  * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter
467  * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter
468  * @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter
469  * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter
470  * @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter
471  * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic packet
472  *  counter
473  * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter
474  * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes counter
475  * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet counter
476  * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes counter
477  * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc decoding
478  * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter
479  * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes counter
480  * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic packet
481  *  counter
482  * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in promisc
483  *  mode.
484  * @BATADV_CNT_NUM: number of traffic counters
485  */
486 enum batadv_counters {
487 	BATADV_CNT_TX,
488 	BATADV_CNT_TX_BYTES,
489 	BATADV_CNT_TX_DROPPED,
490 	BATADV_CNT_RX,
491 	BATADV_CNT_RX_BYTES,
492 	BATADV_CNT_FORWARD,
493 	BATADV_CNT_FORWARD_BYTES,
494 	BATADV_CNT_MGMT_TX,
495 	BATADV_CNT_MGMT_TX_BYTES,
496 	BATADV_CNT_MGMT_RX,
497 	BATADV_CNT_MGMT_RX_BYTES,
498 	BATADV_CNT_FRAG_TX,
499 	BATADV_CNT_FRAG_TX_BYTES,
500 	BATADV_CNT_FRAG_RX,
501 	BATADV_CNT_FRAG_RX_BYTES,
502 	BATADV_CNT_FRAG_FWD,
503 	BATADV_CNT_FRAG_FWD_BYTES,
504 	BATADV_CNT_TT_REQUEST_TX,
505 	BATADV_CNT_TT_REQUEST_RX,
506 	BATADV_CNT_TT_RESPONSE_TX,
507 	BATADV_CNT_TT_RESPONSE_RX,
508 	BATADV_CNT_TT_ROAM_ADV_TX,
509 	BATADV_CNT_TT_ROAM_ADV_RX,
510 #ifdef CONFIG_BATMAN_ADV_DAT
511 	BATADV_CNT_DAT_GET_TX,
512 	BATADV_CNT_DAT_GET_RX,
513 	BATADV_CNT_DAT_PUT_TX,
514 	BATADV_CNT_DAT_PUT_RX,
515 	BATADV_CNT_DAT_CACHED_REPLY_TX,
516 #endif
517 #ifdef CONFIG_BATMAN_ADV_NC
518 	BATADV_CNT_NC_CODE,
519 	BATADV_CNT_NC_CODE_BYTES,
520 	BATADV_CNT_NC_RECODE,
521 	BATADV_CNT_NC_RECODE_BYTES,
522 	BATADV_CNT_NC_BUFFER,
523 	BATADV_CNT_NC_DECODE,
524 	BATADV_CNT_NC_DECODE_BYTES,
525 	BATADV_CNT_NC_DECODE_FAILED,
526 	BATADV_CNT_NC_SNIFFED,
527 #endif
528 	BATADV_CNT_NUM,
529 };
530 
531 /**
532  * struct batadv_priv_tt - per mesh interface translation table data
533  * @vn: translation table version number
534  * @ogm_append_cnt: counter of number of OGMs containing the local tt diff
535  * @local_changes: changes registered in an originator interval
536  * @changes_list: tracks tt local changes within an originator interval
537  * @local_hash: local translation table hash table
538  * @global_hash: global translation table hash table
539  * @req_list: list of pending & unanswered tt_requests
540  * @roam_list: list of the last roaming events of each client limiting the
541  *  number of roaming events to avoid route flapping
542  * @changes_list_lock: lock protecting changes_list
543  * @req_list_lock: lock protecting req_list
544  * @roam_list_lock: lock protecting roam_list
545  * @last_changeset: last tt changeset this host has generated
546  * @last_changeset_len: length of last tt changeset this host has generated
547  * @last_changeset_lock: lock protecting last_changeset & last_changeset_len
548  * @commit_lock: prevents from executing a local TT commit while reading the
549  *  local table. The local TT commit is made up by two operations (data
550  *  structure update and metdata -CRC/TTVN- recalculation) and they have to be
551  *  executed atomically in order to avoid another thread to read the
552  *  table/metadata between those.
553  * @work: work queue callback item for translation table purging
554  */
555 struct batadv_priv_tt {
556 	atomic_t vn;
557 	atomic_t ogm_append_cnt;
558 	atomic_t local_changes;
559 	struct list_head changes_list;
560 	struct batadv_hashtable *local_hash;
561 	struct batadv_hashtable *global_hash;
562 	struct hlist_head req_list;
563 	struct list_head roam_list;
564 	spinlock_t changes_list_lock; /* protects changes */
565 	spinlock_t req_list_lock; /* protects req_list */
566 	spinlock_t roam_list_lock; /* protects roam_list */
567 	unsigned char *last_changeset;
568 	s16 last_changeset_len;
569 	/* protects last_changeset & last_changeset_len */
570 	spinlock_t last_changeset_lock;
571 	/* prevents from executing a commit while reading the table */
572 	spinlock_t commit_lock;
573 	struct delayed_work work;
574 };
575 
576 #ifdef CONFIG_BATMAN_ADV_BLA
577 
578 /**
579  * struct batadv_priv_bla - per mesh interface bridge loope avoidance data
580  * @num_requests: number of bla requests in flight
581  * @claim_hash: hash table containing mesh nodes this host has claimed
582  * @backbone_hash: hash table containing all detected backbone gateways
583  * @bcast_duplist: recently received broadcast packets array (for broadcast
584  *  duplicate suppression)
585  * @bcast_duplist_curr: index of last broadcast packet added to bcast_duplist
586  * @bcast_duplist_lock: lock protecting bcast_duplist & bcast_duplist_curr
587  * @claim_dest: local claim data (e.g. claim group)
588  * @work: work queue callback item for cleanups & bla announcements
589  */
590 struct batadv_priv_bla {
591 	atomic_t num_requests;
592 	struct batadv_hashtable *claim_hash;
593 	struct batadv_hashtable *backbone_hash;
594 	struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
595 	int bcast_duplist_curr;
596 	/* protects bcast_duplist & bcast_duplist_curr */
597 	spinlock_t bcast_duplist_lock;
598 	struct batadv_bla_claim_dst claim_dest;
599 	struct delayed_work work;
600 };
601 #endif
602 
603 #ifdef CONFIG_BATMAN_ADV_DEBUG
604 
605 /**
606  * struct batadv_priv_debug_log - debug logging data
607  * @log_buff: buffer holding the logs (ring bufer)
608  * @log_start: index of next character to read
609  * @log_end: index of next character to write
610  * @lock: lock protecting log_buff, log_start & log_end
611  * @queue_wait: log reader's wait queue
612  */
613 struct batadv_priv_debug_log {
614 	char log_buff[BATADV_LOG_BUF_LEN];
615 	unsigned long log_start;
616 	unsigned long log_end;
617 	spinlock_t lock; /* protects log_buff, log_start and log_end */
618 	wait_queue_head_t queue_wait;
619 };
620 #endif
621 
622 /**
623  * struct batadv_priv_gw - per mesh interface gateway data
624  * @list: list of available gateway nodes
625  * @list_lock: lock protecting gw_list & curr_gw
626  * @curr_gw: pointer to currently selected gateway node
627  * @bandwidth_down: advertised uplink download bandwidth (if gw_mode server)
628  * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server)
629  * @reselect: bool indicating a gateway re-selection is in progress
630  */
631 struct batadv_priv_gw {
632 	struct hlist_head list;
633 	spinlock_t list_lock; /* protects gw_list & curr_gw */
634 	struct batadv_gw_node __rcu *curr_gw;  /* rcu protected pointer */
635 	atomic_t bandwidth_down;
636 	atomic_t bandwidth_up;
637 	atomic_t reselect;
638 };
639 
640 /**
641  * struct batadv_priv_tvlv - per mesh interface tvlv data
642  * @container_list: list of registered tvlv containers to be sent with each OGM
643  * @handler_list: list of the various tvlv content handlers
644  * @container_list_lock: protects tvlv container list access
645  * @handler_list_lock: protects handler list access
646  */
647 struct batadv_priv_tvlv {
648 	struct hlist_head container_list;
649 	struct hlist_head handler_list;
650 	spinlock_t container_list_lock; /* protects container_list */
651 	spinlock_t handler_list_lock; /* protects handler_list */
652 };
653 
654 #ifdef CONFIG_BATMAN_ADV_DAT
655 
656 /**
657  * struct batadv_priv_dat - per mesh interface DAT private data
658  * @addr: node DAT address
659  * @hash: hashtable representing the local ARP cache
660  * @work: work queue callback item for cache purging
661  */
662 struct batadv_priv_dat {
663 	batadv_dat_addr_t addr;
664 	struct batadv_hashtable *hash;
665 	struct delayed_work work;
666 };
667 #endif
668 
669 #ifdef CONFIG_BATMAN_ADV_MCAST
670 /**
671  * struct batadv_priv_mcast - per mesh interface mcast data
672  * @mla_list: list of multicast addresses we are currently announcing via TT
673  * @want_all_unsnoopables_list: a list of orig_nodes wanting all unsnoopable
674  *  multicast traffic
675  * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast traffic
676  * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast traffic
677  * @flags: the flags we have last sent in our mcast tvlv
678  * @enabled: whether the multicast tvlv is currently enabled
679  * @num_disabled: number of nodes that have no mcast tvlv
680  * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP traffic
681  * @num_want_all_ipv4: counter for items in want_all_ipv4_list
682  * @num_want_all_ipv6: counter for items in want_all_ipv6_list
683  * @want_lists_lock: lock for protecting modifications to mcast want lists
684  *  (traversals are rcu-locked)
685  */
686 struct batadv_priv_mcast {
687 	struct hlist_head mla_list;
688 	struct hlist_head want_all_unsnoopables_list;
689 	struct hlist_head want_all_ipv4_list;
690 	struct hlist_head want_all_ipv6_list;
691 	u8 flags;
692 	bool enabled;
693 	atomic_t num_disabled;
694 	atomic_t num_want_all_unsnoopables;
695 	atomic_t num_want_all_ipv4;
696 	atomic_t num_want_all_ipv6;
697 	/* protects want_all_{unsnoopables,ipv4,ipv6}_list */
698 	spinlock_t want_lists_lock;
699 };
700 #endif
701 
702 /**
703  * struct batadv_priv_nc - per mesh interface network coding private data
704  * @work: work queue callback item for cleanup
705  * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
706  * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq
707  * @max_fwd_delay: maximum packet forward delay to allow coding of packets
708  * @max_buffer_time: buffer time for sniffed packets used to decoding
709  * @timestamp_fwd_flush: timestamp of last forward packet queue flush
710  * @timestamp_sniffed_purge: timestamp of last sniffed packet queue purge
711  * @coding_hash: Hash table used to buffer skbs while waiting for another
712  *  incoming skb to code it with. Skbs are added to the buffer just before being
713  *  forwarded in routing.c
714  * @decoding_hash: Hash table used to buffer skbs that might be needed to decode
715  *  a received coded skb. The buffer is used for 1) skbs arriving on the
716  *  soft-interface; 2) skbs overheard on the hard-interface; and 3) skbs
717  *  forwarded by batman-adv.
718  */
719 struct batadv_priv_nc {
720 	struct delayed_work work;
721 	struct dentry *debug_dir;
722 	u8 min_tq;
723 	u32 max_fwd_delay;
724 	u32 max_buffer_time;
725 	unsigned long timestamp_fwd_flush;
726 	unsigned long timestamp_sniffed_purge;
727 	struct batadv_hashtable *coding_hash;
728 	struct batadv_hashtable *decoding_hash;
729 };
730 
731 /**
732  * struct batadv_softif_vlan - per VLAN attributes set
733  * @bat_priv: pointer to the mesh object
734  * @vid: VLAN identifier
735  * @kobj: kobject for sysfs vlan subdirectory
736  * @ap_isolation: AP isolation state
737  * @tt: TT private attributes (VLAN specific)
738  * @list: list node for bat_priv::softif_vlan_list
739  * @refcount: number of context where this object is currently in use
740  * @rcu: struct used for freeing in a RCU-safe manner
741  */
742 struct batadv_softif_vlan {
743 	struct batadv_priv *bat_priv;
744 	unsigned short vid;
745 	struct kobject *kobj;
746 	atomic_t ap_isolation;		/* boolean */
747 	struct batadv_vlan_tt tt;
748 	struct hlist_node list;
749 	struct kref refcount;
750 	struct rcu_head rcu;
751 };
752 
753 /**
754  * struct batadv_priv - per mesh interface data
755  * @mesh_state: current status of the mesh (inactive/active/deactivating)
756  * @soft_iface: net device which holds this struct as private data
757  * @stats: structure holding the data for the ndo_get_stats() call
758  * @bat_counters: mesh internal traffic statistic counters (see batadv_counters)
759  * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
760  * @bonding: bool indicating whether traffic bonding is enabled
761  * @fragmentation: bool indicating whether traffic fragmentation is enabled
762  * @packet_size_max: max packet size that can be transmitted via
763  *  multiple fragmented skbs or a single frame if fragmentation is disabled
764  * @frag_seqno: incremental counter to identify chains of egress fragments
765  * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is
766  *  enabled
767  * @distributed_arp_table: bool indicating whether distributed ARP table is
768  *  enabled
769  * @multicast_mode: Enable or disable multicast optimizations on this node's
770  *  sender/originating side
771  * @gw_mode: gateway operation: off, client or server (see batadv_gw_modes)
772  * @gw_sel_class: gateway selection class (applies if gw_mode client)
773  * @orig_interval: OGM broadcast interval in milliseconds
774  * @hop_penalty: penalty which will be applied to an OGM's tq-field on every hop
775  * @log_level: configured log level (see batadv_dbg_level)
776  * @isolation_mark: the skb->mark value used to match packets for AP isolation
777  * @isolation_mark_mask: bitmask identifying the bits in skb->mark to be used
778  *  for the isolation mark
779  * @bcast_seqno: last sent broadcast packet sequence number
780  * @bcast_queue_left: number of remaining buffered broadcast packet slots
781  * @batman_queue_left: number of remaining OGM packet slots
782  * @num_ifaces: number of interfaces assigned to this mesh interface
783  * @mesh_obj: kobject for sysfs mesh subdirectory
784  * @debug_dir: dentry for debugfs batman-adv subdirectory
785  * @forw_bat_list: list of aggregated OGMs that will be forwarded
786  * @forw_bcast_list: list of broadcast packets that will be rebroadcasted
787  * @orig_hash: hash table containing mesh participants (orig nodes)
788  * @forw_bat_list_lock: lock protecting forw_bat_list
789  * @forw_bcast_list_lock: lock protecting forw_bcast_list
790  * @orig_work: work queue callback item for orig node purging
791  * @cleanup_work: work queue callback item for soft-interface deinit
792  * @primary_if: one of the hard-interfaces assigned to this mesh interface
793  *  becomes the primary interface
794  * @bat_algo_ops: routing algorithm used by this mesh interface
795  * @softif_vlan_list: a list of softif_vlan structs, one per VLAN created on top
796  *  of the mesh interface represented by this object
797  * @softif_vlan_list_lock: lock protecting softif_vlan_list
798  * @bla: bridge loope avoidance data
799  * @debug_log: holding debug logging relevant data
800  * @gw: gateway data
801  * @tt: translation table data
802  * @tvlv: type-version-length-value data
803  * @dat: distributed arp table data
804  * @mcast: multicast data
805  * @network_coding: bool indicating whether network coding is enabled
806  * @nc: network coding data
807  */
808 struct batadv_priv {
809 	atomic_t mesh_state;
810 	struct net_device *soft_iface;
811 	struct net_device_stats stats;
812 	u64 __percpu *bat_counters; /* Per cpu counters */
813 	atomic_t aggregated_ogms;
814 	atomic_t bonding;
815 	atomic_t fragmentation;
816 	atomic_t packet_size_max;
817 	atomic_t frag_seqno;
818 #ifdef CONFIG_BATMAN_ADV_BLA
819 	atomic_t bridge_loop_avoidance;
820 #endif
821 #ifdef CONFIG_BATMAN_ADV_DAT
822 	atomic_t distributed_arp_table;
823 #endif
824 #ifdef CONFIG_BATMAN_ADV_MCAST
825 	atomic_t multicast_mode;
826 #endif
827 	atomic_t gw_mode;
828 	atomic_t gw_sel_class;
829 	atomic_t orig_interval;
830 	atomic_t hop_penalty;
831 #ifdef CONFIG_BATMAN_ADV_DEBUG
832 	atomic_t log_level;
833 #endif
834 	u32 isolation_mark;
835 	u32 isolation_mark_mask;
836 	atomic_t bcast_seqno;
837 	atomic_t bcast_queue_left;
838 	atomic_t batman_queue_left;
839 	char num_ifaces;
840 	struct kobject *mesh_obj;
841 	struct dentry *debug_dir;
842 	struct hlist_head forw_bat_list;
843 	struct hlist_head forw_bcast_list;
844 	struct batadv_hashtable *orig_hash;
845 	spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
846 	spinlock_t forw_bcast_list_lock; /* protects forw_bcast_list */
847 	struct delayed_work orig_work;
848 	struct work_struct cleanup_work;
849 	struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
850 	struct batadv_algo_ops *bat_algo_ops;
851 	struct hlist_head softif_vlan_list;
852 	spinlock_t softif_vlan_list_lock; /* protects softif_vlan_list */
853 #ifdef CONFIG_BATMAN_ADV_BLA
854 	struct batadv_priv_bla bla;
855 #endif
856 #ifdef CONFIG_BATMAN_ADV_DEBUG
857 	struct batadv_priv_debug_log *debug_log;
858 #endif
859 	struct batadv_priv_gw gw;
860 	struct batadv_priv_tt tt;
861 	struct batadv_priv_tvlv tvlv;
862 #ifdef CONFIG_BATMAN_ADV_DAT
863 	struct batadv_priv_dat dat;
864 #endif
865 #ifdef CONFIG_BATMAN_ADV_MCAST
866 	struct batadv_priv_mcast mcast;
867 #endif
868 #ifdef CONFIG_BATMAN_ADV_NC
869 	atomic_t network_coding;
870 	struct batadv_priv_nc nc;
871 #endif /* CONFIG_BATMAN_ADV_NC */
872 };
873 
874 /**
875  * struct batadv_socket_client - layer2 icmp socket client data
876  * @queue_list: packet queue for packets destined for this socket client
877  * @queue_len: number of packets in the packet queue (queue_list)
878  * @index: socket client's index in the batadv_socket_client_hash
879  * @lock: lock protecting queue_list, queue_len & index
880  * @queue_wait: socket client's wait queue
881  * @bat_priv: pointer to soft_iface this client belongs to
882  */
883 struct batadv_socket_client {
884 	struct list_head queue_list;
885 	unsigned int queue_len;
886 	unsigned char index;
887 	spinlock_t lock; /* protects queue_list, queue_len & index */
888 	wait_queue_head_t queue_wait;
889 	struct batadv_priv *bat_priv;
890 };
891 
892 /**
893  * struct batadv_socket_packet - layer2 icmp packet for socket client
894  * @list: list node for batadv_socket_client::queue_list
895  * @icmp_len: size of the layer2 icmp packet
896  * @icmp_packet: layer2 icmp packet
897  */
898 struct batadv_socket_packet {
899 	struct list_head list;
900 	size_t icmp_len;
901 	u8 icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE];
902 };
903 
904 #ifdef CONFIG_BATMAN_ADV_BLA
905 
906 /**
907  * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
908  * @orig: originator address of backbone node (mac address of primary iface)
909  * @vid: vlan id this gateway was detected on
910  * @hash_entry: hlist node for batadv_priv_bla::backbone_hash
911  * @bat_priv: pointer to soft_iface this backbone gateway belongs to
912  * @lasttime: last time we heard of this backbone gw
913  * @wait_periods: grace time for bridge forward delays and bla group forming at
914  *  bootup phase - no bcast traffic is formwared until it has elapsed
915  * @request_sent: if this bool is set to true we are out of sync with this
916  *  backbone gateway - no bcast traffic is formwared until the situation was
917  *  resolved
918  * @crc: crc16 checksum over all claims
919  * @crc_lock: lock protecting crc
920  * @refcount: number of contexts the object is used
921  * @rcu: struct used for freeing in an RCU-safe manner
922  */
923 struct batadv_bla_backbone_gw {
924 	u8 orig[ETH_ALEN];
925 	unsigned short vid;
926 	struct hlist_node hash_entry;
927 	struct batadv_priv *bat_priv;
928 	unsigned long lasttime;
929 	atomic_t wait_periods;
930 	atomic_t request_sent;
931 	u16 crc;
932 	spinlock_t crc_lock; /* protects crc */
933 	struct kref refcount;
934 	struct rcu_head rcu;
935 };
936 
937 /**
938  * struct batadv_bla_claim - claimed non-mesh client structure
939  * @addr: mac address of claimed non-mesh client
940  * @vid: vlan id this client was detected on
941  * @backbone_gw: pointer to backbone gw claiming this client
942  * @lasttime: last time we heard of claim (locals only)
943  * @hash_entry: hlist node for batadv_priv_bla::claim_hash
944  * @refcount: number of contexts the object is used
945  * @rcu: struct used for freeing in an RCU-safe manner
946  */
947 struct batadv_bla_claim {
948 	u8 addr[ETH_ALEN];
949 	unsigned short vid;
950 	struct batadv_bla_backbone_gw *backbone_gw;
951 	unsigned long lasttime;
952 	struct hlist_node hash_entry;
953 	struct rcu_head rcu;
954 	struct kref refcount;
955 };
956 #endif
957 
958 /**
959  * struct batadv_tt_common_entry - tt local & tt global common data
960  * @addr: mac address of non-mesh client
961  * @vid: VLAN identifier
962  * @hash_entry: hlist node for batadv_priv_tt::local_hash or for
963  *  batadv_priv_tt::global_hash
964  * @flags: various state handling flags (see batadv_tt_client_flags)
965  * @added_at: timestamp used for purging stale tt common entries
966  * @refcount: number of contexts the object is used
967  * @rcu: struct used for freeing in an RCU-safe manner
968  */
969 struct batadv_tt_common_entry {
970 	u8 addr[ETH_ALEN];
971 	unsigned short vid;
972 	struct hlist_node hash_entry;
973 	u16 flags;
974 	unsigned long added_at;
975 	struct kref refcount;
976 	struct rcu_head rcu;
977 };
978 
979 /**
980  * struct batadv_tt_local_entry - translation table local entry data
981  * @common: general translation table data
982  * @last_seen: timestamp used for purging stale tt local entries
983  */
984 struct batadv_tt_local_entry {
985 	struct batadv_tt_common_entry common;
986 	unsigned long last_seen;
987 };
988 
989 /**
990  * struct batadv_tt_global_entry - translation table global entry data
991  * @common: general translation table data
992  * @orig_list: list of orig nodes announcing this non-mesh client
993  * @orig_list_count: number of items in the orig_list
994  * @list_lock: lock protecting orig_list
995  * @roam_at: time at which TT_GLOBAL_ROAM was set
996  */
997 struct batadv_tt_global_entry {
998 	struct batadv_tt_common_entry common;
999 	struct hlist_head orig_list;
1000 	atomic_t orig_list_count;
1001 	spinlock_t list_lock;	/* protects orig_list */
1002 	unsigned long roam_at;
1003 };
1004 
1005 /**
1006  * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
1007  * @orig_node: pointer to orig node announcing this non-mesh client
1008  * @ttvn: translation table version number which added the non-mesh client
1009  * @list: list node for batadv_tt_global_entry::orig_list
1010  * @refcount: number of contexts the object is used
1011  * @rcu: struct used for freeing in an RCU-safe manner
1012  */
1013 struct batadv_tt_orig_list_entry {
1014 	struct batadv_orig_node *orig_node;
1015 	u8 ttvn;
1016 	struct hlist_node list;
1017 	struct kref refcount;
1018 	struct rcu_head rcu;
1019 };
1020 
1021 /**
1022  * struct batadv_tt_change_node - structure for tt changes occurred
1023  * @list: list node for batadv_priv_tt::changes_list
1024  * @change: holds the actual translation table diff data
1025  */
1026 struct batadv_tt_change_node {
1027 	struct list_head list;
1028 	struct batadv_tvlv_tt_change change;
1029 };
1030 
1031 /**
1032  * struct batadv_tt_req_node - data to keep track of the tt requests in flight
1033  * @addr: mac address address of the originator this request was sent to
1034  * @issued_at: timestamp used for purging stale tt requests
1035  * @list: list node for batadv_priv_tt::req_list
1036  */
1037 struct batadv_tt_req_node {
1038 	u8 addr[ETH_ALEN];
1039 	unsigned long issued_at;
1040 	struct hlist_node list;
1041 };
1042 
1043 /**
1044  * struct batadv_tt_roam_node - roaming client data
1045  * @addr: mac address of the client in the roaming phase
1046  * @counter: number of allowed roaming events per client within a single
1047  *  OGM interval (changes are committed with each OGM)
1048  * @first_time: timestamp used for purging stale roaming node entries
1049  * @list: list node for batadv_priv_tt::roam_list
1050  */
1051 struct batadv_tt_roam_node {
1052 	u8 addr[ETH_ALEN];
1053 	atomic_t counter;
1054 	unsigned long first_time;
1055 	struct list_head list;
1056 };
1057 
1058 /**
1059  * struct batadv_nc_node - network coding node
1060  * @list: next and prev pointer for the list handling
1061  * @addr: the node's mac address
1062  * @refcount: number of contexts the object is used by
1063  * @rcu: struct used for freeing in an RCU-safe manner
1064  * @orig_node: pointer to corresponding orig node struct
1065  * @last_seen: timestamp of last ogm received from this node
1066  */
1067 struct batadv_nc_node {
1068 	struct list_head list;
1069 	u8 addr[ETH_ALEN];
1070 	struct kref refcount;
1071 	struct rcu_head rcu;
1072 	struct batadv_orig_node *orig_node;
1073 	unsigned long last_seen;
1074 };
1075 
1076 /**
1077  * struct batadv_nc_path - network coding path
1078  * @hash_entry: next and prev pointer for the list handling
1079  * @rcu: struct used for freeing in an RCU-safe manner
1080  * @refcount: number of contexts the object is used by
1081  * @packet_list: list of buffered packets for this path
1082  * @packet_list_lock: access lock for packet list
1083  * @next_hop: next hop (destination) of path
1084  * @prev_hop: previous hop (source) of path
1085  * @last_valid: timestamp for last validation of path
1086  */
1087 struct batadv_nc_path {
1088 	struct hlist_node hash_entry;
1089 	struct rcu_head rcu;
1090 	struct kref refcount;
1091 	struct list_head packet_list;
1092 	spinlock_t packet_list_lock; /* Protects packet_list */
1093 	u8 next_hop[ETH_ALEN];
1094 	u8 prev_hop[ETH_ALEN];
1095 	unsigned long last_valid;
1096 };
1097 
1098 /**
1099  * struct batadv_nc_packet - network coding packet used when coding and
1100  *  decoding packets
1101  * @list: next and prev pointer for the list handling
1102  * @packet_id: crc32 checksum of skb data
1103  * @timestamp: field containing the info when the packet was added to path
1104  * @neigh_node: pointer to original next hop neighbor of skb
1105  * @skb: skb which can be encoded or used for decoding
1106  * @nc_path: pointer to path this nc packet is attached to
1107  */
1108 struct batadv_nc_packet {
1109 	struct list_head list;
1110 	__be32 packet_id;
1111 	unsigned long timestamp;
1112 	struct batadv_neigh_node *neigh_node;
1113 	struct sk_buff *skb;
1114 	struct batadv_nc_path *nc_path;
1115 };
1116 
1117 /**
1118  * struct batadv_skb_cb - control buffer structure used to store private data
1119  *  relevant to batman-adv in the skb->cb buffer in skbs.
1120  * @decoded: Marks a skb as decoded, which is checked when searching for coding
1121  *  opportunities in network-coding.c
1122  */
1123 struct batadv_skb_cb {
1124 	bool decoded;
1125 };
1126 
1127 /**
1128  * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded
1129  * @list: list node for batadv_socket_client::queue_list
1130  * @send_time: execution time for delayed_work (packet sending)
1131  * @own: bool for locally generated packets (local OGMs are re-scheduled after
1132  *  sending)
1133  * @skb: bcast packet's skb buffer
1134  * @packet_len: size of aggregated OGM packet inside the skb buffer
1135  * @direct_link_flags: direct link flags for aggregated OGM packets
1136  * @num_packets: counter for bcast packet retransmission
1137  * @delayed_work: work queue callback item for packet sending
1138  * @if_incoming: pointer to incoming hard-iface or primary iface if
1139  *  locally generated packet
1140  * @if_outgoing: packet where the packet should be sent to, or NULL if
1141  *  unspecified
1142  */
1143 struct batadv_forw_packet {
1144 	struct hlist_node list;
1145 	unsigned long send_time;
1146 	u8 own;
1147 	struct sk_buff *skb;
1148 	u16 packet_len;
1149 	u32 direct_link_flags;
1150 	u8 num_packets;
1151 	struct delayed_work delayed_work;
1152 	struct batadv_hard_iface *if_incoming;
1153 	struct batadv_hard_iface *if_outgoing;
1154 };
1155 
1156 /**
1157  * struct batadv_algo_ops - mesh algorithm callbacks
1158  * @list: list node for the batadv_algo_list
1159  * @name: name of the algorithm
1160  * @bat_iface_enable: init routing info when hard-interface is enabled
1161  * @bat_iface_disable: de-init routing info when hard-interface is disabled
1162  * @bat_iface_update_mac: (re-)init mac addresses of the protocol information
1163  *  belonging to this hard-interface
1164  * @bat_primary_iface_set: called when primary interface is selected / changed
1165  * @bat_ogm_schedule: prepare a new outgoing OGM for the send queue
1166  * @bat_ogm_emit: send scheduled OGM
1167  * @bat_hardif_neigh_init: called on creation of single hop entry
1168  * @bat_neigh_cmp: compare the metrics of two neighbors for their respective
1169  *  outgoing interfaces
1170  * @bat_neigh_is_similar_or_better: check if neigh1 is equally similar or
1171  *  better than neigh2 for their respective outgoing interface from the metric
1172  *  prospective
1173  * @bat_neigh_print: print the single hop neighbor list (optional)
1174  * @bat_neigh_free: free the resources allocated by the routing algorithm for a
1175  *  neigh_node object
1176  * @bat_orig_print: print the originator table (optional)
1177  * @bat_orig_free: free the resources allocated by the routing algorithm for an
1178  *  orig_node object
1179  * @bat_orig_add_if: ask the routing algorithm to apply the needed changes to
1180  *  the orig_node due to a new hard-interface being added into the mesh
1181  * @bat_orig_del_if: ask the routing algorithm to apply the needed changes to
1182  *  the orig_node due to an hard-interface being removed from the mesh
1183  */
1184 struct batadv_algo_ops {
1185 	struct hlist_node list;
1186 	char *name;
1187 	int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
1188 	void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
1189 	void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
1190 	void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
1191 	void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
1192 	void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
1193 	/* neigh_node handling API */
1194 	void (*bat_hardif_neigh_init)(struct batadv_hardif_neigh_node *neigh);
1195 	int (*bat_neigh_cmp)(struct batadv_neigh_node *neigh1,
1196 			     struct batadv_hard_iface *if_outgoing1,
1197 			     struct batadv_neigh_node *neigh2,
1198 			     struct batadv_hard_iface *if_outgoing2);
1199 	bool (*bat_neigh_is_similar_or_better)
1200 		(struct batadv_neigh_node *neigh1,
1201 		 struct batadv_hard_iface *if_outgoing1,
1202 		 struct batadv_neigh_node *neigh2,
1203 		 struct batadv_hard_iface *if_outgoing2);
1204 	void (*bat_neigh_print)(struct batadv_priv *priv, struct seq_file *seq);
1205 	void (*bat_neigh_free)(struct batadv_neigh_node *neigh);
1206 	/* orig_node handling API */
1207 	void (*bat_orig_print)(struct batadv_priv *priv, struct seq_file *seq,
1208 			       struct batadv_hard_iface *hard_iface);
1209 	void (*bat_orig_free)(struct batadv_orig_node *orig_node);
1210 	int (*bat_orig_add_if)(struct batadv_orig_node *orig_node,
1211 			       int max_if_num);
1212 	int (*bat_orig_del_if)(struct batadv_orig_node *orig_node,
1213 			       int max_if_num, int del_if_num);
1214 };
1215 
1216 /**
1217  * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It
1218  * is used to stored ARP entries needed for the global DAT cache
1219  * @ip: the IPv4 corresponding to this DAT/ARP entry
1220  * @mac_addr: the MAC address associated to the stored IPv4
1221  * @vid: the vlan ID associated to this entry
1222  * @last_update: time in jiffies when this entry was refreshed last time
1223  * @hash_entry: hlist node for batadv_priv_dat::hash
1224  * @refcount: number of contexts the object is used
1225  * @rcu: struct used for freeing in an RCU-safe manner
1226  */
1227 struct batadv_dat_entry {
1228 	__be32 ip;
1229 	u8 mac_addr[ETH_ALEN];
1230 	unsigned short vid;
1231 	unsigned long last_update;
1232 	struct hlist_node hash_entry;
1233 	struct kref refcount;
1234 	struct rcu_head rcu;
1235 };
1236 
1237 /**
1238  * struct batadv_hw_addr - a list entry for a MAC address
1239  * @list: list node for the linking of entries
1240  * @addr: the MAC address of this list entry
1241  */
1242 struct batadv_hw_addr {
1243 	struct hlist_node list;
1244 	unsigned char addr[ETH_ALEN];
1245 };
1246 
1247 /**
1248  * struct batadv_dat_candidate - candidate destination for DAT operations
1249  * @type: the type of the selected candidate. It can one of the following:
1250  *	  - BATADV_DAT_CANDIDATE_NOT_FOUND
1251  *	  - BATADV_DAT_CANDIDATE_ORIG
1252  * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to the
1253  *	       corresponding originator node structure
1254  */
1255 struct batadv_dat_candidate {
1256 	int type;
1257 	struct batadv_orig_node *orig_node;
1258 };
1259 
1260 /**
1261  * struct batadv_tvlv_container - container for tvlv appended to OGMs
1262  * @list: hlist node for batadv_priv_tvlv::container_list
1263  * @tvlv_hdr: tvlv header information needed to construct the tvlv
1264  * @refcount: number of contexts the object is used
1265  */
1266 struct batadv_tvlv_container {
1267 	struct hlist_node list;
1268 	struct batadv_tvlv_hdr tvlv_hdr;
1269 	struct kref refcount;
1270 };
1271 
1272 /**
1273  * struct batadv_tvlv_handler - handler for specific tvlv type and version
1274  * @list: hlist node for batadv_priv_tvlv::handler_list
1275  * @ogm_handler: handler callback which is given the tvlv payload to process on
1276  *  incoming OGM packets
1277  * @unicast_handler: handler callback which is given the tvlv payload to process
1278  *  on incoming unicast tvlv packets
1279  * @type: tvlv type this handler feels responsible for
1280  * @version: tvlv version this handler feels responsible for
1281  * @flags: tvlv handler flags
1282  * @refcount: number of contexts the object is used
1283  * @rcu: struct used for freeing in an RCU-safe manner
1284  */
1285 struct batadv_tvlv_handler {
1286 	struct hlist_node list;
1287 	void (*ogm_handler)(struct batadv_priv *bat_priv,
1288 			    struct batadv_orig_node *orig,
1289 			    u8 flags, void *tvlv_value, u16 tvlv_value_len);
1290 	int (*unicast_handler)(struct batadv_priv *bat_priv,
1291 			       u8 *src, u8 *dst,
1292 			       void *tvlv_value, u16 tvlv_value_len);
1293 	u8 type;
1294 	u8 version;
1295 	u8 flags;
1296 	struct kref refcount;
1297 	struct rcu_head rcu;
1298 };
1299 
1300 /**
1301  * enum batadv_tvlv_handler_flags - tvlv handler flags definitions
1302  * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function will call
1303  *  this handler even if its type was not found (with no data)
1304  * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the API marks
1305  *  a handler as being called, so it won't be called if the
1306  *  BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set
1307  */
1308 enum batadv_tvlv_handler_flags {
1309 	BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1),
1310 	BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2),
1311 };
1312 
1313 #endif /* _NET_BATMAN_ADV_TYPES_H_ */
1314