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