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