xref: /openbmc/linux/net/batman-adv/types.h (revision 6f96d46f)
17db7d9f3SSven Eckelmann /* SPDX-License-Identifier: GPL-2.0 */
2cfa55c6dSSven Eckelmann /* Copyright (C) B.A.T.M.A.N. contributors:
3c6c8fea2SSven Eckelmann  *
4c6c8fea2SSven Eckelmann  * Marek Lindner, Simon Wunderlich
5c6c8fea2SSven Eckelmann  */
6c6c8fea2SSven Eckelmann 
7c6c8fea2SSven Eckelmann #ifndef _NET_BATMAN_ADV_TYPES_H_
8c6c8fea2SSven Eckelmann #define _NET_BATMAN_ADV_TYPES_H_
9c6c8fea2SSven Eckelmann 
101e2c2a4fSSven Eckelmann #ifndef _NET_BATMAN_ADV_MAIN_H_
111e2c2a4fSSven Eckelmann #error only "main.h" can be included directly
121e2c2a4fSSven Eckelmann #endif
131e2c2a4fSSven Eckelmann 
14162bd64cSLinus Luessing #include <linux/average.h>
151e2c2a4fSSven Eckelmann #include <linux/bitops.h>
161e2c2a4fSSven Eckelmann #include <linux/compiler.h>
1768a600deSSven Eckelmann #include <linux/if.h>
181e2c2a4fSSven Eckelmann #include <linux/if_ether.h>
1990f564dfSSven Eckelmann #include <linux/kref.h>
20a8d23cbbSSven Eckelmann #include <linux/mutex.h>
211e2c2a4fSSven Eckelmann #include <linux/netdevice.h>
2285cf8c85SMatthias Schiffer #include <linux/netlink.h>
231e2c2a4fSSven Eckelmann #include <linux/sched.h> /* for linux/wait.h */
2468a600deSSven Eckelmann #include <linux/skbuff.h>
251e2c2a4fSSven Eckelmann #include <linux/spinlock.h>
2668a600deSSven Eckelmann #include <linux/timer.h>
271e2c2a4fSSven Eckelmann #include <linux/types.h>
281e2c2a4fSSven Eckelmann #include <linux/wait.h>
291e2c2a4fSSven Eckelmann #include <linux/workqueue.h>
30fec149f5SSven Eckelmann #include <uapi/linux/batadv_packet.h>
3133a3bb4aSAntonio Quartulli #include <uapi/linux/batman_adv.h>
321e2c2a4fSSven Eckelmann 
3317224474SAntonio Quartulli #ifdef CONFIG_BATMAN_ADV_DAT
3417224474SAntonio Quartulli 
35151dcb3cSAntonio Quartulli /**
36993a4a5fSSven Eckelmann  * typedef batadv_dat_addr_t - type used for all DHT addresses
37993a4a5fSSven Eckelmann  *
38993a4a5fSSven Eckelmann  * If it is changed, BATADV_DAT_ADDR_MAX is changed as well.
39785ea114SAntonio Quartulli  *
40785ea114SAntonio Quartulli  * *Please be careful: batadv_dat_addr_t must be UNSIGNED*
41785ea114SAntonio Quartulli  */
42993a4a5fSSven Eckelmann typedef u16 batadv_dat_addr_t;
43785ea114SAntonio Quartulli 
4417224474SAntonio Quartulli #endif /* CONFIG_BATMAN_ADV_DAT */
4517224474SAntonio Quartulli 
4614511519SMarek Lindner /**
476c413b1cSAntonio Quartulli  * enum batadv_dhcp_recipient - dhcp destination
486c413b1cSAntonio Quartulli  */
496c413b1cSAntonio Quartulli enum batadv_dhcp_recipient {
508b84cc4fSSven Eckelmann 	/** @BATADV_DHCP_NO: packet is not a dhcp message */
516c413b1cSAntonio Quartulli 	BATADV_DHCP_NO = 0,
528b84cc4fSSven Eckelmann 
538b84cc4fSSven Eckelmann 	/** @BATADV_DHCP_TO_SERVER: dhcp message is directed to a server */
546c413b1cSAntonio Quartulli 	BATADV_DHCP_TO_SERVER,
558b84cc4fSSven Eckelmann 
568b84cc4fSSven Eckelmann 	/** @BATADV_DHCP_TO_CLIENT: dhcp message is directed to a client */
576c413b1cSAntonio Quartulli 	BATADV_DHCP_TO_CLIENT,
586c413b1cSAntonio Quartulli };
596c413b1cSAntonio Quartulli 
606c413b1cSAntonio Quartulli /**
613c4f7ab6SAntonio Quartulli  * BATADV_TT_REMOTE_MASK - bitmask selecting the flags that are sent over the
623c4f7ab6SAntonio Quartulli  *  wire only
633c4f7ab6SAntonio Quartulli  */
643c4f7ab6SAntonio Quartulli #define BATADV_TT_REMOTE_MASK	0x00FF
653c4f7ab6SAntonio Quartulli 
663c4f7ab6SAntonio Quartulli /**
670eb01568SAntonio Quartulli  * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
680eb01568SAntonio Quartulli  *  among the nodes. These flags are used to compute the global/local CRC
690eb01568SAntonio Quartulli  */
700eb01568SAntonio Quartulli #define BATADV_TT_SYNC_MASK	0x00F0
710eb01568SAntonio Quartulli 
720eb01568SAntonio Quartulli /**
73d1f68250SMarek Lindner  * struct batadv_hard_iface_bat_iv - per hard-interface B.A.T.M.A.N. IV data
7414511519SMarek Lindner  */
7514511519SMarek Lindner struct batadv_hard_iface_bat_iv {
768b84cc4fSSven Eckelmann 	/** @ogm_buff: buffer holding the OGM packet */
7714511519SMarek Lindner 	unsigned char *ogm_buff;
788b84cc4fSSven Eckelmann 
798b84cc4fSSven Eckelmann 	/** @ogm_buff_len: length of the OGM packet buffer */
8014511519SMarek Lindner 	int ogm_buff_len;
818b84cc4fSSven Eckelmann 
828b84cc4fSSven Eckelmann 	/** @ogm_seqno: OGM sequence number - used to identify each OGM */
8314511519SMarek Lindner 	atomic_t ogm_seqno;
8440e220b4SSven Eckelmann 
8540e220b4SSven Eckelmann 	/** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */
8640e220b4SSven Eckelmann 	struct mutex ogm_buff_mutex;
8714511519SMarek Lindner };
8814511519SMarek Lindner 
8988a32c9aSMarek Lindner /**
90c833484eSAntonio Quartulli  * enum batadv_v_hard_iface_flags - interface flags useful to B.A.T.M.A.N. V
91c833484eSAntonio Quartulli  */
92c833484eSAntonio Quartulli enum batadv_v_hard_iface_flags {
938b84cc4fSSven Eckelmann 	/**
948b84cc4fSSven Eckelmann 	 * @BATADV_FULL_DUPLEX: tells if the connection over this link is
958b84cc4fSSven Eckelmann 	 *  full-duplex
968b84cc4fSSven Eckelmann 	 */
97c833484eSAntonio Quartulli 	BATADV_FULL_DUPLEX	= BIT(0),
988b84cc4fSSven Eckelmann 
998b84cc4fSSven Eckelmann 	/**
1008b84cc4fSSven Eckelmann 	 * @BATADV_WARNING_DEFAULT: tells whether we have warned the user that
1018b84cc4fSSven Eckelmann 	 *  no throughput data is available for this interface and that default
1028b84cc4fSSven Eckelmann 	 *  values are assumed.
1038b84cc4fSSven Eckelmann 	 */
104c833484eSAntonio Quartulli 	BATADV_WARNING_DEFAULT	= BIT(1),
105c833484eSAntonio Quartulli };
106c833484eSAntonio Quartulli 
107c833484eSAntonio Quartulli /**
108d6f94d91SLinus Luessing  * struct batadv_hard_iface_bat_v - per hard-interface B.A.T.M.A.N. V data
109d6f94d91SLinus Luessing  */
110d6f94d91SLinus Luessing struct batadv_hard_iface_bat_v {
1118b84cc4fSSven Eckelmann 	/** @elp_interval: time interval between two ELP transmissions */
112d6f94d91SLinus Luessing 	atomic_t elp_interval;
1138b84cc4fSSven Eckelmann 
1148b84cc4fSSven Eckelmann 	/** @elp_seqno: current ELP sequence number */
115d6f94d91SLinus Luessing 	atomic_t elp_seqno;
1168b84cc4fSSven Eckelmann 
1178b84cc4fSSven Eckelmann 	/** @elp_skb: base skb containing the ELP message to send */
118d6f94d91SLinus Luessing 	struct sk_buff *elp_skb;
1198b84cc4fSSven Eckelmann 
1208b84cc4fSSven Eckelmann 	/** @elp_wq: workqueue used to schedule ELP transmissions */
121d6f94d91SLinus Luessing 	struct delayed_work elp_wq;
1228b84cc4fSSven Eckelmann 
123f89255a0SLinus Lüssing 	/** @aggr_wq: workqueue used to transmit queued OGM packets */
124f89255a0SLinus Lüssing 	struct delayed_work aggr_wq;
125f89255a0SLinus Lüssing 
126f89255a0SLinus Lüssing 	/** @aggr_list: queue for to be aggregated OGM packets */
127f89255a0SLinus Lüssing 	struct sk_buff_head aggr_list;
128f89255a0SLinus Lüssing 
129f89255a0SLinus Lüssing 	/** @aggr_len: size of the OGM aggregate (excluding ethernet header) */
130f89255a0SLinus Lüssing 	unsigned int aggr_len;
131f89255a0SLinus Lüssing 
1328b84cc4fSSven Eckelmann 	/**
1338b84cc4fSSven Eckelmann 	 * @throughput_override: throughput override to disable link
1348b84cc4fSSven Eckelmann 	 *  auto-detection
1358b84cc4fSSven Eckelmann 	 */
1360b5ecc68SAntonio Quartulli 	atomic_t throughput_override;
1378b84cc4fSSven Eckelmann 
1388b84cc4fSSven Eckelmann 	/** @flags: interface specific flags */
139c833484eSAntonio Quartulli 	u8 flags;
140d6f94d91SLinus Luessing };
141d6f94d91SLinus Luessing 
142d6f94d91SLinus Luessing /**
14310b1bbb4SSven Eckelmann  * enum batadv_hard_iface_wifi_flags - Flags describing the wifi configuration
14410b1bbb4SSven Eckelmann  *  of a batadv_hard_iface
14510b1bbb4SSven Eckelmann  */
14610b1bbb4SSven Eckelmann enum batadv_hard_iface_wifi_flags {
1478b84cc4fSSven Eckelmann 	/** @BATADV_HARDIF_WIFI_WEXT_DIRECT: it is a wext wifi device */
14810b1bbb4SSven Eckelmann 	BATADV_HARDIF_WIFI_WEXT_DIRECT = BIT(0),
1498b84cc4fSSven Eckelmann 
1508b84cc4fSSven Eckelmann 	/** @BATADV_HARDIF_WIFI_CFG80211_DIRECT: it is a cfg80211 wifi device */
15110b1bbb4SSven Eckelmann 	BATADV_HARDIF_WIFI_CFG80211_DIRECT = BIT(1),
1528b84cc4fSSven Eckelmann 
1538b84cc4fSSven Eckelmann 	/**
1548b84cc4fSSven Eckelmann 	 * @BATADV_HARDIF_WIFI_WEXT_INDIRECT: link device is a wext wifi device
1558b84cc4fSSven Eckelmann 	 */
1565ed4a460SMarek Lindner 	BATADV_HARDIF_WIFI_WEXT_INDIRECT = BIT(2),
1578b84cc4fSSven Eckelmann 
1588b84cc4fSSven Eckelmann 	/**
1598b84cc4fSSven Eckelmann 	 * @BATADV_HARDIF_WIFI_CFG80211_INDIRECT: link device is a cfg80211 wifi
1608b84cc4fSSven Eckelmann 	 * device
1618b84cc4fSSven Eckelmann 	 */
1625ed4a460SMarek Lindner 	BATADV_HARDIF_WIFI_CFG80211_INDIRECT = BIT(3),
16310b1bbb4SSven Eckelmann };
16410b1bbb4SSven Eckelmann 
16510b1bbb4SSven Eckelmann /**
16688a32c9aSMarek Lindner  * struct batadv_hard_iface - network device known to batman-adv
16788a32c9aSMarek Lindner  */
16856303d34SSven Eckelmann struct batadv_hard_iface {
1698b84cc4fSSven Eckelmann 	/** @list: list node for batadv_hardif_list */
170c6c8fea2SSven Eckelmann 	struct list_head list;
1718b84cc4fSSven Eckelmann 
1728b84cc4fSSven Eckelmann 	/** @if_status: status of the interface for batman-adv */
173c6c8fea2SSven Eckelmann 	char if_status;
1748b84cc4fSSven Eckelmann 
1758b84cc4fSSven Eckelmann 	/**
1768b84cc4fSSven Eckelmann 	 * @num_bcasts: number of payload re-broadcasts on this interface (ARQ)
1778b84cc4fSSven Eckelmann 	 */
1786b5e971aSSven Eckelmann 	u8 num_bcasts;
1798b84cc4fSSven Eckelmann 
1808b84cc4fSSven Eckelmann 	/**
1818b84cc4fSSven Eckelmann 	 * @wifi_flags: flags whether this is (directly or indirectly) a wifi
1828b84cc4fSSven Eckelmann 	 *  interface
1838b84cc4fSSven Eckelmann 	 */
18410b1bbb4SSven Eckelmann 	u32 wifi_flags;
1858b84cc4fSSven Eckelmann 
1868b84cc4fSSven Eckelmann 	/** @net_dev: pointer to the net_device */
18775721643SSven Eckelmann 	struct net_device *net_dev;
1888b84cc4fSSven Eckelmann 
1898b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
1907a659d56SSven Eckelmann 	struct kref refcount;
1918b84cc4fSSven Eckelmann 
1928b84cc4fSSven Eckelmann 	/**
1938b84cc4fSSven Eckelmann 	 * @batman_adv_ptype: packet type describing packets that should be
1948b84cc4fSSven Eckelmann 	 * processed by batman-adv for this interface
1958b84cc4fSSven Eckelmann 	 */
196c6c8fea2SSven Eckelmann 	struct packet_type batman_adv_ptype;
1978b84cc4fSSven Eckelmann 
1988b84cc4fSSven Eckelmann 	/**
1998b84cc4fSSven Eckelmann 	 * @soft_iface: the batman-adv interface which uses this network
2008b84cc4fSSven Eckelmann 	 *  interface
2018b84cc4fSSven Eckelmann 	 */
202c6c8fea2SSven Eckelmann 	struct net_device *soft_iface;
2038b84cc4fSSven Eckelmann 
2048b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
205c6c8fea2SSven Eckelmann 	struct rcu_head rcu;
2068b84cc4fSSven Eckelmann 
2073bda14d0SLinus Lüssing 	/**
2083bda14d0SLinus Lüssing 	 * @hop_penalty: penalty which will be applied to the tq-field
2093bda14d0SLinus Lüssing 	 * of an OGM received via this interface
2103bda14d0SLinus Lüssing 	 */
2113bda14d0SLinus Lüssing 	atomic_t hop_penalty;
2123bda14d0SLinus Lüssing 
2138b84cc4fSSven Eckelmann 	/** @bat_iv: per hard-interface B.A.T.M.A.N. IV data */
21414511519SMarek Lindner 	struct batadv_hard_iface_bat_iv bat_iv;
2158b84cc4fSSven Eckelmann 
216d6f94d91SLinus Luessing #ifdef CONFIG_BATMAN_ADV_BATMAN_V
2178b84cc4fSSven Eckelmann 	/** @bat_v: per hard-interface B.A.T.M.A.N. V data */
218d6f94d91SLinus Luessing 	struct batadv_hard_iface_bat_v bat_v;
219d6f94d91SLinus Luessing #endif
2208b84cc4fSSven Eckelmann 
2218b84cc4fSSven Eckelmann 	/**
2228b84cc4fSSven Eckelmann 	 * @neigh_list: list of unique single hop neighbors via this interface
2238b84cc4fSSven Eckelmann 	 */
224cef63419SMarek Lindner 	struct hlist_head neigh_list;
2258b84cc4fSSven Eckelmann 
2268b84cc4fSSven Eckelmann 	/** @neigh_list_lock: lock protecting neigh_list */
227cef63419SMarek Lindner 	spinlock_t neigh_list_lock;
228c6c8fea2SSven Eckelmann };
229c6c8fea2SSven Eckelmann 
2302c53040fSBen Hutchings /**
23125d81f93SSven Eckelmann  * struct batadv_orig_ifinfo_bat_iv - B.A.T.M.A.N. IV private orig_ifinfo
23225d81f93SSven Eckelmann  *  members
233dee222c7SSven Eckelmann  */
234dee222c7SSven Eckelmann struct batadv_orig_ifinfo_bat_iv {
235dee222c7SSven Eckelmann 	/**
236dee222c7SSven Eckelmann 	 * @bcast_own: bitfield which counts the number of our OGMs this
237dee222c7SSven Eckelmann 	 * orig_node rebroadcasted "back" to us  (relative to last_real_seqno)
238dee222c7SSven Eckelmann 	 */
239dee222c7SSven Eckelmann 	DECLARE_BITMAP(bcast_own, BATADV_TQ_LOCAL_WINDOW_SIZE);
240dee222c7SSven Eckelmann 
241dee222c7SSven Eckelmann 	/** @bcast_own_sum: sum of bcast_own */
242dee222c7SSven Eckelmann 	u8 bcast_own_sum;
243dee222c7SSven Eckelmann };
244dee222c7SSven Eckelmann 
245dee222c7SSven Eckelmann /**
2467351a482SSimon Wunderlich  * struct batadv_orig_ifinfo - originator info per outgoing interface
2477351a482SSimon Wunderlich  */
2487351a482SSimon Wunderlich struct batadv_orig_ifinfo {
249a07369d7SSven Eckelmann 	/** @list: list node for &batadv_orig_node.ifinfo_list */
2507351a482SSimon Wunderlich 	struct hlist_node list;
2518b84cc4fSSven Eckelmann 
2528b84cc4fSSven Eckelmann 	/** @if_outgoing: pointer to outgoing hard-interface */
2537351a482SSimon Wunderlich 	struct batadv_hard_iface *if_outgoing;
2548b84cc4fSSven Eckelmann 
2558b84cc4fSSven Eckelmann 	/** @router: router that should be used to reach this originator */
2568b84cc4fSSven Eckelmann 	struct batadv_neigh_node __rcu *router;
2578b84cc4fSSven Eckelmann 
2588b84cc4fSSven Eckelmann 	/** @last_real_seqno: last and best known sequence number */
2596b5e971aSSven Eckelmann 	u32 last_real_seqno;
2608b84cc4fSSven Eckelmann 
2618b84cc4fSSven Eckelmann 	/** @last_ttl: ttl of last received packet */
2626b5e971aSSven Eckelmann 	u8 last_ttl;
2638b84cc4fSSven Eckelmann 
2648b84cc4fSSven Eckelmann 	/** @last_seqno_forwarded: seqno of the OGM which was forwarded last */
2659323158eSAntonio Quartulli 	u32 last_seqno_forwarded;
2668b84cc4fSSven Eckelmann 
2678b84cc4fSSven Eckelmann 	/** @batman_seqno_reset: time when the batman seqno window was reset */
2687351a482SSimon Wunderlich 	unsigned long batman_seqno_reset;
2698b84cc4fSSven Eckelmann 
270dee222c7SSven Eckelmann 	/** @bat_iv: B.A.T.M.A.N. IV private structure */
271dee222c7SSven Eckelmann 	struct batadv_orig_ifinfo_bat_iv bat_iv;
272dee222c7SSven Eckelmann 
2738b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
274a6ba0d34SSven Eckelmann 	struct kref refcount;
2758b84cc4fSSven Eckelmann 
2768b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
2777351a482SSimon Wunderlich 	struct rcu_head rcu;
2787351a482SSimon Wunderlich };
2797351a482SSimon Wunderlich 
2807351a482SSimon Wunderlich /**
281610bfc6bSMartin Hundebøll  * struct batadv_frag_table_entry - head in the fragment buffer table
282610bfc6bSMartin Hundebøll  */
283610bfc6bSMartin Hundebøll struct batadv_frag_table_entry {
2848b84cc4fSSven Eckelmann 	/** @fragment_list: head of list with fragments */
285176e5b77SSven Eckelmann 	struct hlist_head fragment_list;
2868b84cc4fSSven Eckelmann 
2878b84cc4fSSven Eckelmann 	/** @lock: lock to protect the list of fragments */
2888b84cc4fSSven Eckelmann 	spinlock_t lock;
2898b84cc4fSSven Eckelmann 
2908b84cc4fSSven Eckelmann 	/** @timestamp: time (jiffie) of last received fragment */
291610bfc6bSMartin Hundebøll 	unsigned long timestamp;
2928b84cc4fSSven Eckelmann 
2938b84cc4fSSven Eckelmann 	/** @seqno: sequence number of the fragments in the list */
2946b5e971aSSven Eckelmann 	u16 seqno;
2958b84cc4fSSven Eckelmann 
2968b84cc4fSSven Eckelmann 	/** @size: accumulated size of packets in list */
2976b5e971aSSven Eckelmann 	u16 size;
2988b84cc4fSSven Eckelmann 
2998b84cc4fSSven Eckelmann 	/** @total_size: expected size of the assembled packet */
3006b5e971aSSven Eckelmann 	u16 total_size;
301610bfc6bSMartin Hundebøll };
302610bfc6bSMartin Hundebøll 
303610bfc6bSMartin Hundebøll /**
304610bfc6bSMartin Hundebøll  * struct batadv_frag_list_entry - entry in a list of fragments
305610bfc6bSMartin Hundebøll  */
306610bfc6bSMartin Hundebøll struct batadv_frag_list_entry {
3078b84cc4fSSven Eckelmann 	/** @list: list node information */
308610bfc6bSMartin Hundebøll 	struct hlist_node list;
3098b84cc4fSSven Eckelmann 
3108b84cc4fSSven Eckelmann 	/** @skb: fragment */
311610bfc6bSMartin Hundebøll 	struct sk_buff *skb;
3128b84cc4fSSven Eckelmann 
3138b84cc4fSSven Eckelmann 	/** @no: fragment number in the set */
3146b5e971aSSven Eckelmann 	u8 no;
315610bfc6bSMartin Hundebøll };
316610bfc6bSMartin Hundebøll 
317610bfc6bSMartin Hundebøll /**
3187ea7b4a1SAntonio Quartulli  * struct batadv_vlan_tt - VLAN specific TT attributes
3197ea7b4a1SAntonio Quartulli  */
3207ea7b4a1SAntonio Quartulli struct batadv_vlan_tt {
3218b84cc4fSSven Eckelmann 	/** @crc: CRC32 checksum of the entries belonging to this vlan */
3226b5e971aSSven Eckelmann 	u32 crc;
3238b84cc4fSSven Eckelmann 
3248b84cc4fSSven Eckelmann 	/** @num_entries: number of TT entries for this VLAN */
3257ea7b4a1SAntonio Quartulli 	atomic_t num_entries;
3267ea7b4a1SAntonio Quartulli };
3277ea7b4a1SAntonio Quartulli 
3287ea7b4a1SAntonio Quartulli /**
3291a321b0dSSimon Wunderlich  * struct batadv_orig_node_vlan - VLAN specific data per orig_node
3307ea7b4a1SAntonio Quartulli  */
3317ea7b4a1SAntonio Quartulli struct batadv_orig_node_vlan {
3328b84cc4fSSven Eckelmann 	/** @vid: the VLAN identifier */
3337ea7b4a1SAntonio Quartulli 	unsigned short vid;
3348b84cc4fSSven Eckelmann 
3358b84cc4fSSven Eckelmann 	/** @tt: VLAN specific TT attributes */
3367ea7b4a1SAntonio Quartulli 	struct batadv_vlan_tt tt;
3378b84cc4fSSven Eckelmann 
338a07369d7SSven Eckelmann 	/** @list: list node for &batadv_orig_node.vlan_list */
339d0fa4f3fSMarek Lindner 	struct hlist_node list;
3408b84cc4fSSven Eckelmann 
3418b84cc4fSSven Eckelmann 	/**
3428b84cc4fSSven Eckelmann 	 * @refcount: number of context where this object is currently in use
3438b84cc4fSSven Eckelmann 	 */
344161a3be9SSven Eckelmann 	struct kref refcount;
3458b84cc4fSSven Eckelmann 
3468b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in a RCU-safe manner */
3477ea7b4a1SAntonio Quartulli 	struct rcu_head rcu;
3487ea7b4a1SAntonio Quartulli };
3497ea7b4a1SAntonio Quartulli 
3507ea7b4a1SAntonio Quartulli /**
351bbad0a5eSAntonio Quartulli  * struct batadv_orig_bat_iv - B.A.T.M.A.N. IV private orig_node members
352bbad0a5eSAntonio Quartulli  */
353bbad0a5eSAntonio Quartulli struct batadv_orig_bat_iv {
3548b84cc4fSSven Eckelmann 	/**
355dee222c7SSven Eckelmann 	 * @ogm_cnt_lock: lock protecting &batadv_orig_ifinfo_bat_iv.bcast_own,
356dee222c7SSven Eckelmann 	 * &batadv_orig_ifinfo_bat_iv.bcast_own_sum,
357dee222c7SSven Eckelmann 	 * &batadv_neigh_ifinfo_bat_iv.bat_iv.real_bits and
358dee222c7SSven Eckelmann 	 * &batadv_neigh_ifinfo_bat_iv.real_packet_count
359bbad0a5eSAntonio Quartulli 	 */
360bbad0a5eSAntonio Quartulli 	spinlock_t ogm_cnt_lock;
361bbad0a5eSAntonio Quartulli };
362bbad0a5eSAntonio Quartulli 
363bbad0a5eSAntonio Quartulli /**
3642c53040fSBen Hutchings  * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
365c6c8fea2SSven Eckelmann  */
36656303d34SSven Eckelmann struct batadv_orig_node {
3678b84cc4fSSven Eckelmann 	/** @orig: originator ethernet address */
3686b5e971aSSven Eckelmann 	u8 orig[ETH_ALEN];
3698b84cc4fSSven Eckelmann 
3708b84cc4fSSven Eckelmann 	/** @ifinfo_list: list for routers per outgoing interface */
3717351a482SSimon Wunderlich 	struct hlist_head ifinfo_list;
3728b84cc4fSSven Eckelmann 
3738b84cc4fSSven Eckelmann 	/**
3748b84cc4fSSven Eckelmann 	 * @last_bonding_candidate: pointer to last ifinfo of last used router
3758b84cc4fSSven Eckelmann 	 */
376f3b3d901SSimon Wunderlich 	struct batadv_orig_ifinfo *last_bonding_candidate;
3778b84cc4fSSven Eckelmann 
37817224474SAntonio Quartulli #ifdef CONFIG_BATMAN_ADV_DAT
3798b84cc4fSSven Eckelmann 	/** @dat_addr: address of the orig node in the distributed hash */
380785ea114SAntonio Quartulli 	batadv_dat_addr_t dat_addr;
38117224474SAntonio Quartulli #endif
3828b84cc4fSSven Eckelmann 
3838b84cc4fSSven Eckelmann 	/** @last_seen: time when last packet from this node was received */
384d7b2a97eSMarek Lindner 	unsigned long last_seen;
3858b84cc4fSSven Eckelmann 
3868b84cc4fSSven Eckelmann 	/**
3878b84cc4fSSven Eckelmann 	 * @bcast_seqno_reset: time when the broadcast seqno window was reset
3888b84cc4fSSven Eckelmann 	 */
389c6c8fea2SSven Eckelmann 	unsigned long bcast_seqno_reset;
3908b84cc4fSSven Eckelmann 
39160432d75SLinus Lüssing #ifdef CONFIG_BATMAN_ADV_MCAST
3928b84cc4fSSven Eckelmann 	/**
3938b84cc4fSSven Eckelmann 	 * @mcast_handler_lock: synchronizes mcast-capability and -flag changes
3948b84cc4fSSven Eckelmann 	 */
3958a4023c5SLinus Lüssing 	spinlock_t mcast_handler_lock;
3968b84cc4fSSven Eckelmann 
3978b84cc4fSSven Eckelmann 	/** @mcast_flags: multicast flags announced by the orig node */
3986b5e971aSSven Eckelmann 	u8 mcast_flags;
3998b84cc4fSSven Eckelmann 
4008b84cc4fSSven Eckelmann 	/**
4018b84cc4fSSven Eckelmann 	 * @mcast_want_all_unsnoopables_node: a list node for the
4028b84cc4fSSven Eckelmann 	 *  mcast.want_all_unsnoopables list
4038b84cc4fSSven Eckelmann 	 */
404ab49886eSLinus Lüssing 	struct hlist_node mcast_want_all_unsnoopables_node;
4058b84cc4fSSven Eckelmann 
4068b84cc4fSSven Eckelmann 	/**
4078b84cc4fSSven Eckelmann 	 * @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4
4088b84cc4fSSven Eckelmann 	 *  list
4098b84cc4fSSven Eckelmann 	 */
4104c8755d6SLinus Lüssing 	struct hlist_node mcast_want_all_ipv4_node;
4118b84cc4fSSven Eckelmann 	/**
4128b84cc4fSSven Eckelmann 	 * @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6
4138b84cc4fSSven Eckelmann 	 *  list
4148b84cc4fSSven Eckelmann 	 */
4154c8755d6SLinus Lüssing 	struct hlist_node mcast_want_all_ipv6_node;
41661caf3d1SLinus Lüssing 
41761caf3d1SLinus Lüssing 	/**
41861caf3d1SLinus Lüssing 	 * @mcast_want_all_rtr4_node: a list node for the mcast.want_all_rtr4
41961caf3d1SLinus Lüssing 	 *  list
42061caf3d1SLinus Lüssing 	 */
42161caf3d1SLinus Lüssing 	struct hlist_node mcast_want_all_rtr4_node;
42261caf3d1SLinus Lüssing 	/**
42361caf3d1SLinus Lüssing 	 * @mcast_want_all_rtr6_node: a list node for the mcast.want_all_rtr6
42461caf3d1SLinus Lüssing 	 *  list
42561caf3d1SLinus Lüssing 	 */
42661caf3d1SLinus Lüssing 	struct hlist_node mcast_want_all_rtr6_node;
42760432d75SLinus Lüssing #endif
4288b84cc4fSSven Eckelmann 
4298b84cc4fSSven Eckelmann 	/** @capabilities: announced capabilities of this originator */
43065d7d460SLinus Lüssing 	unsigned long capabilities;
4318b84cc4fSSven Eckelmann 
4328b84cc4fSSven Eckelmann 	/**
4338b84cc4fSSven Eckelmann 	 * @capa_initialized: bitfield to remember whether a capability was
4348b84cc4fSSven Eckelmann 	 *  initialized
4358b84cc4fSSven Eckelmann 	 */
436ac4eebd4SLinus Lüssing 	unsigned long capa_initialized;
4378b84cc4fSSven Eckelmann 
4388b84cc4fSSven Eckelmann 	/** @last_ttvn: last seen translation table version number */
43988a32c9aSMarek Lindner 	atomic_t last_ttvn;
4408b84cc4fSSven Eckelmann 
4418b84cc4fSSven Eckelmann 	/** @tt_buff: last tt changeset this node received from the orig node */
4422dafb49dSAntonio Quartulli 	unsigned char *tt_buff;
4438b84cc4fSSven Eckelmann 
4448b84cc4fSSven Eckelmann 	/**
4458b84cc4fSSven Eckelmann 	 * @tt_buff_len: length of the last tt changeset this node received
4468b84cc4fSSven Eckelmann 	 *  from the orig node
4478b84cc4fSSven Eckelmann 	 */
4486b5e971aSSven Eckelmann 	s16 tt_buff_len;
4498b84cc4fSSven Eckelmann 
4508b84cc4fSSven Eckelmann 	/** @tt_buff_lock: lock that protects tt_buff and tt_buff_len */
4518b84cc4fSSven Eckelmann 	spinlock_t tt_buff_lock;
4528b84cc4fSSven Eckelmann 
4538b84cc4fSSven Eckelmann 	/**
454bccb48c8SSven Eckelmann 	 * @tt_lock: avoids concurrent read from and write to the table. Table
455bccb48c8SSven Eckelmann 	 *  update is made up of two operations (data structure update and
45669fed4ceSSven Eckelmann 	 *  metadata -CRC/TTVN-recalculation) and they have to be executed
4578b84cc4fSSven Eckelmann 	 *  atomically in order to avoid another thread to read the
4588b84cc4fSSven Eckelmann 	 *  table/metadata between those.
4598b84cc4fSSven Eckelmann 	 */
460a70a9aa9SAntonio Quartulli 	spinlock_t tt_lock;
4618b84cc4fSSven Eckelmann 
4628b84cc4fSSven Eckelmann 	/**
4638b84cc4fSSven Eckelmann 	 * @bcast_bits: bitfield containing the info which payload broadcast
4648b84cc4fSSven Eckelmann 	 *  originated from this orig node this host already has seen (relative
4658b84cc4fSSven Eckelmann 	 *  to last_bcast_seqno)
4668b84cc4fSSven Eckelmann 	 */
46742d0b044SSven Eckelmann 	DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
4688b84cc4fSSven Eckelmann 
4698b84cc4fSSven Eckelmann 	/**
4708b84cc4fSSven Eckelmann 	 * @last_bcast_seqno: last broadcast sequence number received by this
4718b84cc4fSSven Eckelmann 	 *  host
4728b84cc4fSSven Eckelmann 	 */
4736b5e971aSSven Eckelmann 	u32 last_bcast_seqno;
4748b84cc4fSSven Eckelmann 
4758b84cc4fSSven Eckelmann 	/**
4768b84cc4fSSven Eckelmann 	 * @neigh_list: list of potential next hop neighbor towards this orig
4778b84cc4fSSven Eckelmann 	 *  node
4788b84cc4fSSven Eckelmann 	 */
4799591a79fSMarek Lindner 	struct hlist_head neigh_list;
4808b84cc4fSSven Eckelmann 
4818b84cc4fSSven Eckelmann 	/**
4828b84cc4fSSven Eckelmann 	 * @neigh_list_lock: lock protecting neigh_list, ifinfo_list,
48315c2ed75SSven Eckelmann 	 *  last_bonding_candidate and router
48415c2ed75SSven Eckelmann 	 */
48588a32c9aSMarek Lindner 	spinlock_t neigh_list_lock;
4868b84cc4fSSven Eckelmann 
487a07369d7SSven Eckelmann 	/** @hash_entry: hlist node for &batadv_priv.orig_hash */
4887aadf889SMarek Lindner 	struct hlist_node hash_entry;
4898b84cc4fSSven Eckelmann 
4908b84cc4fSSven Eckelmann 	/** @bat_priv: pointer to soft_iface this orig node belongs to */
49156303d34SSven Eckelmann 	struct batadv_priv *bat_priv;
4928b84cc4fSSven Eckelmann 
4938b84cc4fSSven Eckelmann 	/** @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno */
4946e215fd8SSven Eckelmann 	spinlock_t bcast_seqno_lock;
4958b84cc4fSSven Eckelmann 
4968b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
4977c124391SSven Eckelmann 	struct kref refcount;
4988b84cc4fSSven Eckelmann 
4998b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
50088a32c9aSMarek Lindner 	struct rcu_head rcu;
5018b84cc4fSSven Eckelmann 
502d56b1705SMartin Hundebøll #ifdef CONFIG_BATMAN_ADV_NC
5038b84cc4fSSven Eckelmann 	/** @in_coding_list: list of nodes this orig can hear */
504d56b1705SMartin Hundebøll 	struct list_head in_coding_list;
5058b84cc4fSSven Eckelmann 
5068b84cc4fSSven Eckelmann 	/** @out_coding_list: list of nodes that can hear this orig */
507d56b1705SMartin Hundebøll 	struct list_head out_coding_list;
5088b84cc4fSSven Eckelmann 
5098b84cc4fSSven Eckelmann 	/** @in_coding_list_lock: protects in_coding_list */
5108b84cc4fSSven Eckelmann 	spinlock_t in_coding_list_lock;
5118b84cc4fSSven Eckelmann 
5128b84cc4fSSven Eckelmann 	/** @out_coding_list_lock: protects out_coding_list */
5138b84cc4fSSven Eckelmann 	spinlock_t out_coding_list_lock;
514d56b1705SMartin Hundebøll #endif
5158b84cc4fSSven Eckelmann 
5168b84cc4fSSven Eckelmann 	/** @fragments: array with heads for fragment chains */
517610bfc6bSMartin Hundebøll 	struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT];
5188b84cc4fSSven Eckelmann 
5198b84cc4fSSven Eckelmann 	/**
5208b84cc4fSSven Eckelmann 	 * @vlan_list: a list of orig_node_vlan structs, one per VLAN served by
5218b84cc4fSSven Eckelmann 	 *  the originator represented by this object
5228b84cc4fSSven Eckelmann 	 */
523d0fa4f3fSMarek Lindner 	struct hlist_head vlan_list;
5248b84cc4fSSven Eckelmann 
5258b84cc4fSSven Eckelmann 	/** @vlan_list_lock: lock protecting vlan_list */
5268b84cc4fSSven Eckelmann 	spinlock_t vlan_list_lock;
5278b84cc4fSSven Eckelmann 
5288b84cc4fSSven Eckelmann 	/** @bat_iv: B.A.T.M.A.N. IV private structure */
529bbad0a5eSAntonio Quartulli 	struct batadv_orig_bat_iv bat_iv;
530c6c8fea2SSven Eckelmann };
531c6c8fea2SSven Eckelmann 
53288a32c9aSMarek Lindner /**
53317cf0ea4SMarek Lindner  * enum batadv_orig_capabilities - orig node capabilities
5348b84cc4fSSven Eckelmann  */
5358b84cc4fSSven Eckelmann enum batadv_orig_capabilities {
5368b84cc4fSSven Eckelmann 	/**
5378b84cc4fSSven Eckelmann 	 * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table
5388b84cc4fSSven Eckelmann 	 *  enabled
5398b84cc4fSSven Eckelmann 	 */
5408b84cc4fSSven Eckelmann 	BATADV_ORIG_CAPA_HAS_DAT,
5418b84cc4fSSven Eckelmann 
5428b84cc4fSSven Eckelmann 	/** @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled */
5438b84cc4fSSven Eckelmann 	BATADV_ORIG_CAPA_HAS_NC,
5448b84cc4fSSven Eckelmann 
5458b84cc4fSSven Eckelmann 	/** @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability */
5468b84cc4fSSven Eckelmann 	BATADV_ORIG_CAPA_HAS_TT,
5478b84cc4fSSven Eckelmann 
5488b84cc4fSSven Eckelmann 	/**
54960432d75SLinus Lüssing 	 * @BATADV_ORIG_CAPA_HAS_MCAST: orig node has some multicast capability
55060432d75SLinus Lüssing 	 *  (= orig node announces a tvlv of type BATADV_TVLV_MCAST)
55117cf0ea4SMarek Lindner 	 */
5529c936e3fSLinus Lüssing 	BATADV_ORIG_CAPA_HAS_MCAST,
55317cf0ea4SMarek Lindner };
55417cf0ea4SMarek Lindner 
55517cf0ea4SMarek Lindner /**
55688a32c9aSMarek Lindner  * struct batadv_gw_node - structure for orig nodes announcing gw capabilities
55788a32c9aSMarek Lindner  */
55856303d34SSven Eckelmann struct batadv_gw_node {
559a07369d7SSven Eckelmann 	/** @list: list node for &batadv_priv_gw.list */
560c6c8fea2SSven Eckelmann 	struct hlist_node list;
5618b84cc4fSSven Eckelmann 
5628b84cc4fSSven Eckelmann 	/** @orig_node: pointer to corresponding orig node */
56356303d34SSven Eckelmann 	struct batadv_orig_node *orig_node;
5648b84cc4fSSven Eckelmann 
5658b84cc4fSSven Eckelmann 	/** @bandwidth_down: advertised uplink download bandwidth */
5666b5e971aSSven Eckelmann 	u32 bandwidth_down;
5678b84cc4fSSven Eckelmann 
5688b84cc4fSSven Eckelmann 	/** @bandwidth_up: advertised uplink upload bandwidth */
5696b5e971aSSven Eckelmann 	u32 bandwidth_up;
5708b84cc4fSSven Eckelmann 
5718b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
572e7aed321SSven Eckelmann 	struct kref refcount;
5738b84cc4fSSven Eckelmann 
5748b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
575c6c8fea2SSven Eckelmann 	struct rcu_head rcu;
576c6c8fea2SSven Eckelmann };
577c6c8fea2SSven Eckelmann 
578eb1e011aSJohannes Berg DECLARE_EWMA(throughput, 10, 8)
579162bd64cSLinus Luessing 
580162bd64cSLinus Luessing /**
581162bd64cSLinus Luessing  * struct batadv_hardif_neigh_node_bat_v - B.A.T.M.A.N. V private neighbor
582162bd64cSLinus Luessing  *  information
583162bd64cSLinus Luessing  */
584162bd64cSLinus Luessing struct batadv_hardif_neigh_node_bat_v {
5858b84cc4fSSven Eckelmann 	/** @throughput: ewma link throughput towards this neighbor */
586162bd64cSLinus Luessing 	struct ewma_throughput throughput;
5878b84cc4fSSven Eckelmann 
5888b84cc4fSSven Eckelmann 	/** @elp_interval: time interval between two ELP transmissions */
589162bd64cSLinus Luessing 	u32 elp_interval;
5908b84cc4fSSven Eckelmann 
5918b84cc4fSSven Eckelmann 	/** @elp_latest_seqno: latest and best known ELP sequence number */
592162bd64cSLinus Luessing 	u32 elp_latest_seqno;
5938b84cc4fSSven Eckelmann 
5948b84cc4fSSven Eckelmann 	/**
5958b84cc4fSSven Eckelmann 	 * @last_unicast_tx: when the last unicast packet has been sent to this
5968b84cc4fSSven Eckelmann 	 *  neighbor
5978b84cc4fSSven Eckelmann 	 */
59895d39278SAntonio Quartulli 	unsigned long last_unicast_tx;
5998b84cc4fSSven Eckelmann 
6008b84cc4fSSven Eckelmann 	/** @metric_work: work queue callback item for metric update */
601c833484eSAntonio Quartulli 	struct work_struct metric_work;
602162bd64cSLinus Luessing };
603162bd64cSLinus Luessing 
60488a32c9aSMarek Lindner /**
605d1f68250SMarek Lindner  * struct batadv_hardif_neigh_node - unique neighbor per hard-interface
606cef63419SMarek Lindner  */
607cef63419SMarek Lindner struct batadv_hardif_neigh_node {
608a07369d7SSven Eckelmann 	/** @list: list node for &batadv_hard_iface.neigh_list */
609cef63419SMarek Lindner 	struct hlist_node list;
6108b84cc4fSSven Eckelmann 
6118b84cc4fSSven Eckelmann 	/** @addr: the MAC address of the neighboring interface */
612cef63419SMarek Lindner 	u8 addr[ETH_ALEN];
6138b84cc4fSSven Eckelmann 
6148b84cc4fSSven Eckelmann 	/**
6158b84cc4fSSven Eckelmann 	 * @orig: the address of the originator this neighbor node belongs to
6168b84cc4fSSven Eckelmann 	 */
6173111beedSLinus Lüssing 	u8 orig[ETH_ALEN];
6188b84cc4fSSven Eckelmann 
6198b84cc4fSSven Eckelmann 	/** @if_incoming: pointer to incoming hard-interface */
620cef63419SMarek Lindner 	struct batadv_hard_iface *if_incoming;
6218b84cc4fSSven Eckelmann 
6228b84cc4fSSven Eckelmann 	/** @last_seen: when last packet via this neighbor was received */
623cef63419SMarek Lindner 	unsigned long last_seen;
6248b84cc4fSSven Eckelmann 
625162bd64cSLinus Luessing #ifdef CONFIG_BATMAN_ADV_BATMAN_V
6268b84cc4fSSven Eckelmann 	/** @bat_v: B.A.T.M.A.N. V private data */
627162bd64cSLinus Luessing 	struct batadv_hardif_neigh_node_bat_v bat_v;
628162bd64cSLinus Luessing #endif
6298b84cc4fSSven Eckelmann 
6308b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
63190f564dfSSven Eckelmann 	struct kref refcount;
6328b84cc4fSSven Eckelmann 
6338b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in a RCU-safe manner */
634cef63419SMarek Lindner 	struct rcu_head rcu;
635cef63419SMarek Lindner };
636cef63419SMarek Lindner 
637cef63419SMarek Lindner /**
6380538f759SAntonio Quartulli  * struct batadv_neigh_node - structure for single hops neighbors
6390538f759SAntonio Quartulli  */
6400538f759SAntonio Quartulli struct batadv_neigh_node {
641a07369d7SSven Eckelmann 	/** @list: list node for &batadv_orig_node.neigh_list */
6420538f759SAntonio Quartulli 	struct hlist_node list;
6438b84cc4fSSven Eckelmann 
6448b84cc4fSSven Eckelmann 	/** @orig_node: pointer to corresponding orig_node */
6450538f759SAntonio Quartulli 	struct batadv_orig_node *orig_node;
6468b84cc4fSSven Eckelmann 
6478b84cc4fSSven Eckelmann 	/** @addr: the MAC address of the neighboring interface */
6486b5e971aSSven Eckelmann 	u8 addr[ETH_ALEN];
6498b84cc4fSSven Eckelmann 
6508b84cc4fSSven Eckelmann 	/** @ifinfo_list: list for routing metrics per outgoing interface */
65189652331SSimon Wunderlich 	struct hlist_head ifinfo_list;
6528b84cc4fSSven Eckelmann 
6538b84cc4fSSven Eckelmann 	/** @ifinfo_lock: lock protecting ifinfo_list and its members */
6548b84cc4fSSven Eckelmann 	spinlock_t ifinfo_lock;
6558b84cc4fSSven Eckelmann 
6568b84cc4fSSven Eckelmann 	/** @if_incoming: pointer to incoming hard-interface */
6570538f759SAntonio Quartulli 	struct batadv_hard_iface *if_incoming;
6588b84cc4fSSven Eckelmann 
6598b84cc4fSSven Eckelmann 	/** @last_seen: when last packet via this neighbor was received */
6600538f759SAntonio Quartulli 	unsigned long last_seen;
6618b84cc4fSSven Eckelmann 
6628b84cc4fSSven Eckelmann 	/** @hardif_neigh: hardif_neigh of this neighbor */
663abe59c65SSven Eckelmann 	struct batadv_hardif_neigh_node *hardif_neigh;
6648b84cc4fSSven Eckelmann 
6658b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
66677ae32e8SSven Eckelmann 	struct kref refcount;
6678b84cc4fSSven Eckelmann 
6688b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
66989652331SSimon Wunderlich 	struct rcu_head rcu;
67089652331SSimon Wunderlich };
67189652331SSimon Wunderlich 
6721b371d13SSimon Wunderlich /**
6731a321b0dSSimon Wunderlich  * struct batadv_neigh_ifinfo_bat_iv - neighbor information per outgoing
674d1f68250SMarek Lindner  *  interface for B.A.T.M.A.N. IV
67589652331SSimon Wunderlich  */
67689652331SSimon Wunderlich struct batadv_neigh_ifinfo_bat_iv {
6778b84cc4fSSven Eckelmann 	/** @tq_recv: ring buffer of received TQ values from this neigh node */
6786b5e971aSSven Eckelmann 	u8 tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
6798b84cc4fSSven Eckelmann 
6808b84cc4fSSven Eckelmann 	/** @tq_index: ring buffer index */
6816b5e971aSSven Eckelmann 	u8 tq_index;
6828b84cc4fSSven Eckelmann 
6838b84cc4fSSven Eckelmann 	/**
6848b84cc4fSSven Eckelmann 	 * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv)
6858b84cc4fSSven Eckelmann 	 */
6866b5e971aSSven Eckelmann 	u8 tq_avg;
6878b84cc4fSSven Eckelmann 
6888b84cc4fSSven Eckelmann 	/**
6898b84cc4fSSven Eckelmann 	 * @real_bits: bitfield containing the number of OGMs received from this
6908b84cc4fSSven Eckelmann 	 *  neigh node (relative to orig_node->last_real_seqno)
6918b84cc4fSSven Eckelmann 	 */
69289652331SSimon Wunderlich 	DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
6938b84cc4fSSven Eckelmann 
6948b84cc4fSSven Eckelmann 	/** @real_packet_count: counted result of real_bits */
6956b5e971aSSven Eckelmann 	u8 real_packet_count;
69689652331SSimon Wunderlich };
69789652331SSimon Wunderlich 
6981b371d13SSimon Wunderlich /**
699162bd64cSLinus Luessing  * struct batadv_neigh_ifinfo_bat_v - neighbor information per outgoing
700162bd64cSLinus Luessing  *  interface for B.A.T.M.A.N. V
701162bd64cSLinus Luessing  */
702162bd64cSLinus Luessing struct batadv_neigh_ifinfo_bat_v {
7038b84cc4fSSven Eckelmann 	/**
7048b84cc4fSSven Eckelmann 	 * @throughput: last throughput metric received from originator via this
7058b84cc4fSSven Eckelmann 	 *  neigh
7068b84cc4fSSven Eckelmann 	 */
707162bd64cSLinus Luessing 	u32 throughput;
7088b84cc4fSSven Eckelmann 
7098b84cc4fSSven Eckelmann 	/** @last_seqno: last sequence number known for this neighbor */
7109323158eSAntonio Quartulli 	u32 last_seqno;
711162bd64cSLinus Luessing };
712162bd64cSLinus Luessing 
713162bd64cSLinus Luessing /**
7141b371d13SSimon Wunderlich  * struct batadv_neigh_ifinfo - neighbor information per outgoing interface
71589652331SSimon Wunderlich  */
71689652331SSimon Wunderlich struct batadv_neigh_ifinfo {
717a07369d7SSven Eckelmann 	/** @list: list node for &batadv_neigh_node.ifinfo_list */
71889652331SSimon Wunderlich 	struct hlist_node list;
7198b84cc4fSSven Eckelmann 
7208b84cc4fSSven Eckelmann 	/** @if_outgoing: pointer to outgoing hard-interface */
72189652331SSimon Wunderlich 	struct batadv_hard_iface *if_outgoing;
7228b84cc4fSSven Eckelmann 
7238b84cc4fSSven Eckelmann 	/** @bat_iv: B.A.T.M.A.N. IV private structure */
72489652331SSimon Wunderlich 	struct batadv_neigh_ifinfo_bat_iv bat_iv;
7258b84cc4fSSven Eckelmann 
726162bd64cSLinus Luessing #ifdef CONFIG_BATMAN_ADV_BATMAN_V
7278b84cc4fSSven Eckelmann 	/** @bat_v: B.A.T.M.A.N. V private data */
728162bd64cSLinus Luessing 	struct batadv_neigh_ifinfo_bat_v bat_v;
729162bd64cSLinus Luessing #endif
7308b84cc4fSSven Eckelmann 
7318b84cc4fSSven Eckelmann 	/** @last_ttl: last received ttl from this neigh node */
7326b5e971aSSven Eckelmann 	u8 last_ttl;
7338b84cc4fSSven Eckelmann 
7348b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used */
735962c6832SSven Eckelmann 	struct kref refcount;
7368b84cc4fSSven Eckelmann 
7378b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in a RCU-safe manner */
73888a32c9aSMarek Lindner 	struct rcu_head rcu;
739c6c8fea2SSven Eckelmann };
740c6c8fea2SSven Eckelmann 
741426fc6c8SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_BLA
742426fc6c8SSven Eckelmann 
74388a32c9aSMarek Lindner /**
74488a32c9aSMarek Lindner  * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
74588a32c9aSMarek Lindner  */
74656303d34SSven Eckelmann struct batadv_bcast_duplist_entry {
747bccb48c8SSven Eckelmann 	/** @orig: mac address of orig node originating the broadcast */
7486b5e971aSSven Eckelmann 	u8 orig[ETH_ALEN];
7498b84cc4fSSven Eckelmann 
7508b84cc4fSSven Eckelmann 	/** @crc: crc32 checksum of broadcast payload */
751004e86fcSSimon Wunderlich 	__be32 crc;
7528b84cc4fSSven Eckelmann 
7538b84cc4fSSven Eckelmann 	/** @entrytime: time when the broadcast packet was received */
754fe2da6ffSSimon Wunderlich 	unsigned long entrytime;
755fe2da6ffSSimon Wunderlich };
7567a5cc242SSimon Wunderlich #endif
757c6c8fea2SSven Eckelmann 
75888a32c9aSMarek Lindner /**
75988a32c9aSMarek Lindner  * enum batadv_counters - indices for traffic counters
76088a32c9aSMarek Lindner  */
761d69909d2SSven Eckelmann enum batadv_counters {
7628b84cc4fSSven Eckelmann 	/** @BATADV_CNT_TX: transmitted payload traffic packet counter */
7631c9b0550SMarek Lindner 	BATADV_CNT_TX,
7648b84cc4fSSven Eckelmann 
7658b84cc4fSSven Eckelmann 	/** @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter */
7661c9b0550SMarek Lindner 	BATADV_CNT_TX_BYTES,
7678b84cc4fSSven Eckelmann 
7688b84cc4fSSven Eckelmann 	/**
7698b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet
7708b84cc4fSSven Eckelmann 	 *  counter
7718b84cc4fSSven Eckelmann 	 */
7721c9b0550SMarek Lindner 	BATADV_CNT_TX_DROPPED,
7738b84cc4fSSven Eckelmann 
7748b84cc4fSSven Eckelmann 	/** @BATADV_CNT_RX: received payload traffic packet counter */
7751c9b0550SMarek Lindner 	BATADV_CNT_RX,
7768b84cc4fSSven Eckelmann 
7778b84cc4fSSven Eckelmann 	/** @BATADV_CNT_RX_BYTES: received payload traffic bytes counter */
7781c9b0550SMarek Lindner 	BATADV_CNT_RX_BYTES,
7798b84cc4fSSven Eckelmann 
7808b84cc4fSSven Eckelmann 	/** @BATADV_CNT_FORWARD: forwarded payload traffic packet counter */
781d69909d2SSven Eckelmann 	BATADV_CNT_FORWARD,
7828b84cc4fSSven Eckelmann 
7838b84cc4fSSven Eckelmann 	/**
7848b84cc4fSSven Eckelmann 	 * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter
7858b84cc4fSSven Eckelmann 	 */
786d69909d2SSven Eckelmann 	BATADV_CNT_FORWARD_BYTES,
7878b84cc4fSSven Eckelmann 
7888b84cc4fSSven Eckelmann 	/**
7898b84cc4fSSven Eckelmann 	 * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet
7908b84cc4fSSven Eckelmann 	 *  counter
7918b84cc4fSSven Eckelmann 	 */
792d69909d2SSven Eckelmann 	BATADV_CNT_MGMT_TX,
7938b84cc4fSSven Eckelmann 
7948b84cc4fSSven Eckelmann 	/**
7958b84cc4fSSven Eckelmann 	 * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes
7968b84cc4fSSven Eckelmann 	 *  counter
7978b84cc4fSSven Eckelmann 	 */
798d69909d2SSven Eckelmann 	BATADV_CNT_MGMT_TX_BYTES,
7998b84cc4fSSven Eckelmann 
8008b84cc4fSSven Eckelmann 	/**
8018b84cc4fSSven Eckelmann 	 * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter
8028b84cc4fSSven Eckelmann 	 */
803d69909d2SSven Eckelmann 	BATADV_CNT_MGMT_RX,
8048b84cc4fSSven Eckelmann 
8058b84cc4fSSven Eckelmann 	/**
8068b84cc4fSSven Eckelmann 	 * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes
8078b84cc4fSSven Eckelmann 	 *  counter
8088b84cc4fSSven Eckelmann 	 */
809d69909d2SSven Eckelmann 	BATADV_CNT_MGMT_RX_BYTES,
8108b84cc4fSSven Eckelmann 
8118b84cc4fSSven Eckelmann 	/** @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter */
812ee75ed88SMartin Hundebøll 	BATADV_CNT_FRAG_TX,
8138b84cc4fSSven Eckelmann 
8148b84cc4fSSven Eckelmann 	/**
8158b84cc4fSSven Eckelmann 	 * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter
8168b84cc4fSSven Eckelmann 	 */
817ee75ed88SMartin Hundebøll 	BATADV_CNT_FRAG_TX_BYTES,
8188b84cc4fSSven Eckelmann 
8198b84cc4fSSven Eckelmann 	/** @BATADV_CNT_FRAG_RX: received fragment traffic packet counter */
820610bfc6bSMartin Hundebøll 	BATADV_CNT_FRAG_RX,
8218b84cc4fSSven Eckelmann 
8228b84cc4fSSven Eckelmann 	/**
8238b84cc4fSSven Eckelmann 	 * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter
8248b84cc4fSSven Eckelmann 	 */
825610bfc6bSMartin Hundebøll 	BATADV_CNT_FRAG_RX_BYTES,
8268b84cc4fSSven Eckelmann 
8278b84cc4fSSven Eckelmann 	/** @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter */
828610bfc6bSMartin Hundebøll 	BATADV_CNT_FRAG_FWD,
8298b84cc4fSSven Eckelmann 
8308b84cc4fSSven Eckelmann 	/**
8318b84cc4fSSven Eckelmann 	 * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter
8328b84cc4fSSven Eckelmann 	 */
833610bfc6bSMartin Hundebøll 	BATADV_CNT_FRAG_FWD_BYTES,
8348b84cc4fSSven Eckelmann 
8358b84cc4fSSven Eckelmann 	/**
8368b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter
8378b84cc4fSSven Eckelmann 	 */
838d69909d2SSven Eckelmann 	BATADV_CNT_TT_REQUEST_TX,
8398b84cc4fSSven Eckelmann 
8408b84cc4fSSven Eckelmann 	/** @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter */
841d69909d2SSven Eckelmann 	BATADV_CNT_TT_REQUEST_RX,
8428b84cc4fSSven Eckelmann 
8438b84cc4fSSven Eckelmann 	/**
8448b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet
8458b84cc4fSSven Eckelmann 	 *  counter
8468b84cc4fSSven Eckelmann 	 */
847d69909d2SSven Eckelmann 	BATADV_CNT_TT_RESPONSE_TX,
8488b84cc4fSSven Eckelmann 
8498b84cc4fSSven Eckelmann 	/**
8508b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter
8518b84cc4fSSven Eckelmann 	 */
852d69909d2SSven Eckelmann 	BATADV_CNT_TT_RESPONSE_RX,
8538b84cc4fSSven Eckelmann 
8548b84cc4fSSven Eckelmann 	/**
8558b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet
8568b84cc4fSSven Eckelmann 	 *  counter
8578b84cc4fSSven Eckelmann 	 */
858d69909d2SSven Eckelmann 	BATADV_CNT_TT_ROAM_ADV_TX,
8598b84cc4fSSven Eckelmann 
8608b84cc4fSSven Eckelmann 	/**
8618b84cc4fSSven Eckelmann 	 * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter
8628b84cc4fSSven Eckelmann 	 */
863d69909d2SSven Eckelmann 	BATADV_CNT_TT_ROAM_ADV_RX,
8648b84cc4fSSven Eckelmann 
8654046b24aSMartin Hundebøll #ifdef CONFIG_BATMAN_ADV_DAT
8668b84cc4fSSven Eckelmann 	/**
8678b84cc4fSSven Eckelmann 	 * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter
8688b84cc4fSSven Eckelmann 	 */
8694046b24aSMartin Hundebøll 	BATADV_CNT_DAT_GET_TX,
8708b84cc4fSSven Eckelmann 
8718b84cc4fSSven Eckelmann 	/** @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter */
8724046b24aSMartin Hundebøll 	BATADV_CNT_DAT_GET_RX,
8738b84cc4fSSven Eckelmann 
8748b84cc4fSSven Eckelmann 	/**
8758b84cc4fSSven Eckelmann 	 * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter
8768b84cc4fSSven Eckelmann 	 */
8774046b24aSMartin Hundebøll 	BATADV_CNT_DAT_PUT_TX,
8788b84cc4fSSven Eckelmann 
8798b84cc4fSSven Eckelmann 	/** @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter */
8804046b24aSMartin Hundebøll 	BATADV_CNT_DAT_PUT_RX,
8818b84cc4fSSven Eckelmann 
8828b84cc4fSSven Eckelmann 	/**
8838b84cc4fSSven Eckelmann 	 * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic
8848b84cc4fSSven Eckelmann 	 *  packet counter
8858b84cc4fSSven Eckelmann 	 */
8864046b24aSMartin Hundebøll 	BATADV_CNT_DAT_CACHED_REPLY_TX,
8874046b24aSMartin Hundebøll #endif
8888b84cc4fSSven Eckelmann 
8893c12de9aSMartin Hundebøll #ifdef CONFIG_BATMAN_ADV_NC
8908b84cc4fSSven Eckelmann 	/**
8918b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter
8928b84cc4fSSven Eckelmann 	 */
8933c12de9aSMartin Hundebøll 	BATADV_CNT_NC_CODE,
8948b84cc4fSSven Eckelmann 
8958b84cc4fSSven Eckelmann 	/**
8968b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes
8978b84cc4fSSven Eckelmann 	 *  counter
8988b84cc4fSSven Eckelmann 	 */
8993c12de9aSMartin Hundebøll 	BATADV_CNT_NC_CODE_BYTES,
9008b84cc4fSSven Eckelmann 
9018b84cc4fSSven Eckelmann 	/**
9028b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet
9038b84cc4fSSven Eckelmann 	 *  counter
9048b84cc4fSSven Eckelmann 	 */
9053c12de9aSMartin Hundebøll 	BATADV_CNT_NC_RECODE,
9068b84cc4fSSven Eckelmann 
9078b84cc4fSSven Eckelmann 	/**
9088b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes
9098b84cc4fSSven Eckelmann 	 *  counter
9108b84cc4fSSven Eckelmann 	 */
9113c12de9aSMartin Hundebøll 	BATADV_CNT_NC_RECODE_BYTES,
9128b84cc4fSSven Eckelmann 
9138b84cc4fSSven Eckelmann 	/**
9148b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc
9158b84cc4fSSven Eckelmann 	 *  decoding
9168b84cc4fSSven Eckelmann 	 */
917612d2b4fSMartin Hundebøll 	BATADV_CNT_NC_BUFFER,
9188b84cc4fSSven Eckelmann 
9198b84cc4fSSven Eckelmann 	/**
9208b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter
9218b84cc4fSSven Eckelmann 	 */
9222df5278bSMartin Hundebøll 	BATADV_CNT_NC_DECODE,
9238b84cc4fSSven Eckelmann 
9248b84cc4fSSven Eckelmann 	/**
9258b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes
9268b84cc4fSSven Eckelmann 	 *  counter
9278b84cc4fSSven Eckelmann 	 */
9282df5278bSMartin Hundebøll 	BATADV_CNT_NC_DECODE_BYTES,
9298b84cc4fSSven Eckelmann 
9308b84cc4fSSven Eckelmann 	/**
9318b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic
9328b84cc4fSSven Eckelmann 	 *  packet counter
9338b84cc4fSSven Eckelmann 	 */
9342df5278bSMartin Hundebøll 	BATADV_CNT_NC_DECODE_FAILED,
9358b84cc4fSSven Eckelmann 
9368b84cc4fSSven Eckelmann 	/**
9378b84cc4fSSven Eckelmann 	 * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in
9388b84cc4fSSven Eckelmann 	 *  promisc mode.
9398b84cc4fSSven Eckelmann 	 */
9402df5278bSMartin Hundebøll 	BATADV_CNT_NC_SNIFFED,
9413c12de9aSMartin Hundebøll #endif
9428b84cc4fSSven Eckelmann 
9438b84cc4fSSven Eckelmann 	/** @BATADV_CNT_NUM: number of traffic counters */
944d69909d2SSven Eckelmann 	BATADV_CNT_NUM,
945f8214865SMartin Hundebøll };
946f8214865SMartin Hundebøll 
947807736f6SSven Eckelmann /**
948807736f6SSven Eckelmann  * struct batadv_priv_tt - per mesh interface translation table data
949807736f6SSven Eckelmann  */
950807736f6SSven Eckelmann struct batadv_priv_tt {
9518b84cc4fSSven Eckelmann 	/** @vn: translation table version number */
952807736f6SSven Eckelmann 	atomic_t vn;
9538b84cc4fSSven Eckelmann 
9548b84cc4fSSven Eckelmann 	/**
9558b84cc4fSSven Eckelmann 	 * @ogm_append_cnt: counter of number of OGMs containing the local tt
9568b84cc4fSSven Eckelmann 	 *  diff
9578b84cc4fSSven Eckelmann 	 */
958807736f6SSven Eckelmann 	atomic_t ogm_append_cnt;
9598b84cc4fSSven Eckelmann 
9608b84cc4fSSven Eckelmann 	/** @local_changes: changes registered in an originator interval */
961807736f6SSven Eckelmann 	atomic_t local_changes;
9628b84cc4fSSven Eckelmann 
9638b84cc4fSSven Eckelmann 	/**
9648b84cc4fSSven Eckelmann 	 * @changes_list: tracks tt local changes within an originator interval
9658b84cc4fSSven Eckelmann 	 */
966807736f6SSven Eckelmann 	struct list_head changes_list;
9678b84cc4fSSven Eckelmann 
9688b84cc4fSSven Eckelmann 	/** @local_hash: local translation table hash table */
969807736f6SSven Eckelmann 	struct batadv_hashtable *local_hash;
9708b84cc4fSSven Eckelmann 
9718b84cc4fSSven Eckelmann 	/** @global_hash: global translation table hash table */
972807736f6SSven Eckelmann 	struct batadv_hashtable *global_hash;
9738b84cc4fSSven Eckelmann 
9748b84cc4fSSven Eckelmann 	/** @req_list: list of pending & unanswered tt_requests */
9757c26a53bSMarek Lindner 	struct hlist_head req_list;
9768b84cc4fSSven Eckelmann 
9778b84cc4fSSven Eckelmann 	/**
9788b84cc4fSSven Eckelmann 	 * @roam_list: list of the last roaming events of each client limiting
9798b84cc4fSSven Eckelmann 	 *  the number of roaming events to avoid route flapping
9808b84cc4fSSven Eckelmann 	 */
981807736f6SSven Eckelmann 	struct list_head roam_list;
9828b84cc4fSSven Eckelmann 
9838b84cc4fSSven Eckelmann 	/** @changes_list_lock: lock protecting changes_list */
9848b84cc4fSSven Eckelmann 	spinlock_t changes_list_lock;
9858b84cc4fSSven Eckelmann 
9868b84cc4fSSven Eckelmann 	/** @req_list_lock: lock protecting req_list */
9878b84cc4fSSven Eckelmann 	spinlock_t req_list_lock;
9888b84cc4fSSven Eckelmann 
9898b84cc4fSSven Eckelmann 	/** @roam_list_lock: lock protecting roam_list */
9908b84cc4fSSven Eckelmann 	spinlock_t roam_list_lock;
9918b84cc4fSSven Eckelmann 
9928b84cc4fSSven Eckelmann 	/** @last_changeset: last tt changeset this host has generated */
993807736f6SSven Eckelmann 	unsigned char *last_changeset;
9948b84cc4fSSven Eckelmann 
9958b84cc4fSSven Eckelmann 	/**
9968b84cc4fSSven Eckelmann 	 * @last_changeset_len: length of last tt changeset this host has
9978b84cc4fSSven Eckelmann 	 *  generated
9988b84cc4fSSven Eckelmann 	 */
9996b5e971aSSven Eckelmann 	s16 last_changeset_len;
10008b84cc4fSSven Eckelmann 
10018b84cc4fSSven Eckelmann 	/**
10028b84cc4fSSven Eckelmann 	 * @last_changeset_lock: lock protecting last_changeset &
10038b84cc4fSSven Eckelmann 	 *  last_changeset_len
10048b84cc4fSSven Eckelmann 	 */
100588a32c9aSMarek Lindner 	spinlock_t last_changeset_lock;
10068b84cc4fSSven Eckelmann 
10078b84cc4fSSven Eckelmann 	/**
10088b84cc4fSSven Eckelmann 	 * @commit_lock: prevents from executing a local TT commit while reading
1009bccb48c8SSven Eckelmann 	 *  the local table. The local TT commit is made up of two operations
101069fed4ceSSven Eckelmann 	 *  (data structure update and metadata -CRC/TTVN- recalculation) and
10118b84cc4fSSven Eckelmann 	 *  they have to be executed atomically in order to avoid another thread
10128b84cc4fSSven Eckelmann 	 *  to read the table/metadata between those.
10138b84cc4fSSven Eckelmann 	 */
1014a70a9aa9SAntonio Quartulli 	spinlock_t commit_lock;
10158b84cc4fSSven Eckelmann 
10168b84cc4fSSven Eckelmann 	/** @work: work queue callback item for translation table purging */
1017807736f6SSven Eckelmann 	struct delayed_work work;
1018807736f6SSven Eckelmann };
1019807736f6SSven Eckelmann 
1020426fc6c8SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_BLA
1021426fc6c8SSven Eckelmann 
102288a32c9aSMarek Lindner /**
1023bccb48c8SSven Eckelmann  * struct batadv_priv_bla - per mesh interface bridge loop avoidance data
102488a32c9aSMarek Lindner  */
1025807736f6SSven Eckelmann struct batadv_priv_bla {
10268b84cc4fSSven Eckelmann 	/** @num_requests: number of bla requests in flight */
102788a32c9aSMarek Lindner 	atomic_t num_requests;
10288b84cc4fSSven Eckelmann 
10298b84cc4fSSven Eckelmann 	/**
10308b84cc4fSSven Eckelmann 	 * @claim_hash: hash table containing mesh nodes this host has claimed
10318b84cc4fSSven Eckelmann 	 */
1032807736f6SSven Eckelmann 	struct batadv_hashtable *claim_hash;
10338b84cc4fSSven Eckelmann 
10348b84cc4fSSven Eckelmann 	/**
10358b84cc4fSSven Eckelmann 	 * @backbone_hash: hash table containing all detected backbone gateways
10368b84cc4fSSven Eckelmann 	 */
1037807736f6SSven Eckelmann 	struct batadv_hashtable *backbone_hash;
10388b84cc4fSSven Eckelmann 
10398b84cc4fSSven Eckelmann 	/** @loopdetect_addr: MAC address used for own loopdetection frames */
1040cd9c7bfbSSimon Wunderlich 	u8 loopdetect_addr[ETH_ALEN];
10418b84cc4fSSven Eckelmann 
10428b84cc4fSSven Eckelmann 	/**
10438b84cc4fSSven Eckelmann 	 * @loopdetect_lasttime: time when the loopdetection frames were sent
10448b84cc4fSSven Eckelmann 	 */
1045cd9c7bfbSSimon Wunderlich 	unsigned long loopdetect_lasttime;
10468b84cc4fSSven Eckelmann 
10478b84cc4fSSven Eckelmann 	/**
10488b84cc4fSSven Eckelmann 	 * @loopdetect_next: how many periods to wait for the next loopdetect
10498b84cc4fSSven Eckelmann 	 *  process
10508b84cc4fSSven Eckelmann 	 */
1051cd9c7bfbSSimon Wunderlich 	atomic_t loopdetect_next;
10528b84cc4fSSven Eckelmann 
10538b84cc4fSSven Eckelmann 	/**
10548b84cc4fSSven Eckelmann 	 * @bcast_duplist: recently received broadcast packets array (for
10558b84cc4fSSven Eckelmann 	 *  broadcast duplicate suppression)
10568b84cc4fSSven Eckelmann 	 */
1057807736f6SSven Eckelmann 	struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
10588b84cc4fSSven Eckelmann 
10598b84cc4fSSven Eckelmann 	/**
10608b84cc4fSSven Eckelmann 	 * @bcast_duplist_curr: index of last broadcast packet added to
10618b84cc4fSSven Eckelmann 	 *  bcast_duplist
10628b84cc4fSSven Eckelmann 	 */
1063807736f6SSven Eckelmann 	int bcast_duplist_curr;
10648b84cc4fSSven Eckelmann 
10658b84cc4fSSven Eckelmann 	/**
10668b84cc4fSSven Eckelmann 	 * @bcast_duplist_lock: lock protecting bcast_duplist &
10678b84cc4fSSven Eckelmann 	 *  bcast_duplist_curr
10688b84cc4fSSven Eckelmann 	 */
10697dac7b76SLinus Lüssing 	spinlock_t bcast_duplist_lock;
10708b84cc4fSSven Eckelmann 
10718b84cc4fSSven Eckelmann 	/** @claim_dest: local claim data (e.g. claim group) */
1072807736f6SSven Eckelmann 	struct batadv_bla_claim_dst claim_dest;
10738b84cc4fSSven Eckelmann 
10748b84cc4fSSven Eckelmann 	/** @work: work queue callback item for cleanups & bla announcements */
1075807736f6SSven Eckelmann 	struct delayed_work work;
1076807736f6SSven Eckelmann };
1077807736f6SSven Eckelmann #endif
1078807736f6SSven Eckelmann 
1079426fc6c8SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_DEBUG
1080426fc6c8SSven Eckelmann 
108188a32c9aSMarek Lindner /**
10821a321b0dSSimon Wunderlich  * struct batadv_priv_debug_log - debug logging data
108388a32c9aSMarek Lindner  */
10840abf5d81SMarek Lindner struct batadv_priv_debug_log {
1085c08dd06bSSven Eckelmann 	/** @log_buff: buffer holding the logs (ring buffer) */
10860abf5d81SMarek Lindner 	char log_buff[BATADV_LOG_BUF_LEN];
10878b84cc4fSSven Eckelmann 
10888b84cc4fSSven Eckelmann 	/** @log_start: index of next character to read */
10890abf5d81SMarek Lindner 	unsigned long log_start;
10908b84cc4fSSven Eckelmann 
10918b84cc4fSSven Eckelmann 	/** @log_end: index of next character to write */
10920abf5d81SMarek Lindner 	unsigned long log_end;
10938b84cc4fSSven Eckelmann 
10948b84cc4fSSven Eckelmann 	/** @lock: lock protecting log_buff, log_start & log_end */
10958b84cc4fSSven Eckelmann 	spinlock_t lock;
10968b84cc4fSSven Eckelmann 
10978b84cc4fSSven Eckelmann 	/** @queue_wait: log reader's wait queue */
10980abf5d81SMarek Lindner 	wait_queue_head_t queue_wait;
10990abf5d81SMarek Lindner };
11000abf5d81SMarek Lindner #endif
11010abf5d81SMarek Lindner 
110288a32c9aSMarek Lindner /**
110388a32c9aSMarek Lindner  * struct batadv_priv_gw - per mesh interface gateway data
110488a32c9aSMarek Lindner  */
1105807736f6SSven Eckelmann struct batadv_priv_gw {
11068b84cc4fSSven Eckelmann 	/** @gateway_list: list of available gateway nodes */
110770ea5ceeSSven Eckelmann 	struct hlist_head gateway_list;
11088b84cc4fSSven Eckelmann 
11099264c85cSSven Eckelmann 	/** @list_lock: lock protecting gateway_list, curr_gw, generation */
11108b84cc4fSSven Eckelmann 	spinlock_t list_lock;
11118b84cc4fSSven Eckelmann 
11128b84cc4fSSven Eckelmann 	/** @curr_gw: pointer to currently selected gateway node */
11138b84cc4fSSven Eckelmann 	struct batadv_gw_node __rcu *curr_gw;
11148b84cc4fSSven Eckelmann 
11159264c85cSSven Eckelmann 	/** @generation: current (generation) sequence number */
11169264c85cSSven Eckelmann 	unsigned int generation;
11179264c85cSSven Eckelmann 
11188b84cc4fSSven Eckelmann 	/**
11198b84cc4fSSven Eckelmann 	 * @mode: gateway operation: off, client or server (see batadv_gw_modes)
11208b84cc4fSSven Eckelmann 	 */
11213a24a63eSAntonio Quartulli 	atomic_t mode;
11228b84cc4fSSven Eckelmann 
11238b84cc4fSSven Eckelmann 	/** @sel_class: gateway selection class (applies if gw_mode client) */
11243a24a63eSAntonio Quartulli 	atomic_t sel_class;
11258b84cc4fSSven Eckelmann 
11268b84cc4fSSven Eckelmann 	/**
11278b84cc4fSSven Eckelmann 	 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode
11288b84cc4fSSven Eckelmann 	 *  server)
11298b84cc4fSSven Eckelmann 	 */
1130414254e3SMarek Lindner 	atomic_t bandwidth_down;
11318b84cc4fSSven Eckelmann 
11328b84cc4fSSven Eckelmann 	/**
11338b84cc4fSSven Eckelmann 	 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server)
11348b84cc4fSSven Eckelmann 	 */
1135414254e3SMarek Lindner 	atomic_t bandwidth_up;
11368b84cc4fSSven Eckelmann 
11378b84cc4fSSven Eckelmann 	/** @reselect: bool indicating a gateway re-selection is in progress */
1138807736f6SSven Eckelmann 	atomic_t reselect;
1139807736f6SSven Eckelmann };
1140807736f6SSven Eckelmann 
114188a32c9aSMarek Lindner /**
1142ef261577SMarek Lindner  * struct batadv_priv_tvlv - per mesh interface tvlv data
1143ef261577SMarek Lindner  */
1144ef261577SMarek Lindner struct batadv_priv_tvlv {
11458b84cc4fSSven Eckelmann 	/**
11468b84cc4fSSven Eckelmann 	 * @container_list: list of registered tvlv containers to be sent with
11478b84cc4fSSven Eckelmann 	 *  each OGM
11488b84cc4fSSven Eckelmann 	 */
1149ef261577SMarek Lindner 	struct hlist_head container_list;
11508b84cc4fSSven Eckelmann 
11518b84cc4fSSven Eckelmann 	/** @handler_list: list of the various tvlv content handlers */
1152ef261577SMarek Lindner 	struct hlist_head handler_list;
11538b84cc4fSSven Eckelmann 
11548b84cc4fSSven Eckelmann 	/** @container_list_lock: protects tvlv container list access */
11558b84cc4fSSven Eckelmann 	spinlock_t container_list_lock;
11568b84cc4fSSven Eckelmann 
11578b84cc4fSSven Eckelmann 	/** @handler_list_lock: protects handler list access */
11588b84cc4fSSven Eckelmann 	spinlock_t handler_list_lock;
1159ef261577SMarek Lindner };
1160ef261577SMarek Lindner 
1161426fc6c8SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_DAT
1162426fc6c8SSven Eckelmann 
1163ef261577SMarek Lindner /**
1164785ea114SAntonio Quartulli  * struct batadv_priv_dat - per mesh interface DAT private data
1165785ea114SAntonio Quartulli  */
1166785ea114SAntonio Quartulli struct batadv_priv_dat {
11678b84cc4fSSven Eckelmann 	/** @addr: node DAT address */
1168785ea114SAntonio Quartulli 	batadv_dat_addr_t addr;
11698b84cc4fSSven Eckelmann 
11708b84cc4fSSven Eckelmann 	/** @hash: hashtable representing the local ARP cache */
11712f1dfbe1SAntonio Quartulli 	struct batadv_hashtable *hash;
11728b84cc4fSSven Eckelmann 
11738b84cc4fSSven Eckelmann 	/** @work: work queue callback item for cache purging */
11742f1dfbe1SAntonio Quartulli 	struct delayed_work work;
1175785ea114SAntonio Quartulli };
117617224474SAntonio Quartulli #endif
1177785ea114SAntonio Quartulli 
1178c5caf4efSLinus Lüssing #ifdef CONFIG_BATMAN_ADV_MCAST
1179c5caf4efSLinus Lüssing /**
1180687937abSLinus Lüssing  * struct batadv_mcast_querier_state - IGMP/MLD querier state when bridged
11818b84cc4fSSven Eckelmann  */
11828b84cc4fSSven Eckelmann struct batadv_mcast_querier_state {
11838b84cc4fSSven Eckelmann 	/** @exists: whether a querier exists in the mesh */
11846486379dSSven Eckelmann 	unsigned char exists:1;
11858b84cc4fSSven Eckelmann 
11868b84cc4fSSven Eckelmann 	/**
1187687937abSLinus Lüssing 	 * @shadowing: if a querier exists, whether it is potentially shadowing
1188687937abSLinus Lüssing 	 *  multicast listeners (i.e. querier is behind our own bridge segment)
1189687937abSLinus Lüssing 	 */
11906486379dSSven Eckelmann 	unsigned char shadowing:1;
1191687937abSLinus Lüssing };
1192687937abSLinus Lüssing 
1193687937abSLinus Lüssing /**
11946bc45440SLinus Lüssing  * struct batadv_mcast_mla_flags - flags for the querier, bridge and tvlv state
11956bc45440SLinus Lüssing  */
11966bc45440SLinus Lüssing struct batadv_mcast_mla_flags {
11976bc45440SLinus Lüssing 	/** @querier_ipv4: the current state of an IGMP querier in the mesh */
11986bc45440SLinus Lüssing 	struct batadv_mcast_querier_state querier_ipv4;
11996bc45440SLinus Lüssing 
12006bc45440SLinus Lüssing 	/** @querier_ipv6: the current state of an MLD querier in the mesh */
12016bc45440SLinus Lüssing 	struct batadv_mcast_querier_state querier_ipv6;
12026bc45440SLinus Lüssing 
12036bc45440SLinus Lüssing 	/** @enabled: whether the multicast tvlv is currently enabled */
12046bc45440SLinus Lüssing 	unsigned char enabled:1;
12056bc45440SLinus Lüssing 
12066bc45440SLinus Lüssing 	/** @bridged: whether the soft interface has a bridge on top */
12076bc45440SLinus Lüssing 	unsigned char bridged:1;
12086bc45440SLinus Lüssing 
12096bc45440SLinus Lüssing 	/** @tvlv_flags: the flags we have last sent in our mcast tvlv */
12106bc45440SLinus Lüssing 	u8 tvlv_flags;
12116bc45440SLinus Lüssing };
12126bc45440SLinus Lüssing 
12136bc45440SLinus Lüssing /**
1214c5caf4efSLinus Lüssing  * struct batadv_priv_mcast - per mesh interface mcast data
1215c5caf4efSLinus Lüssing  */
1216c5caf4efSLinus Lüssing struct batadv_priv_mcast {
12178b84cc4fSSven Eckelmann 	/**
12188b84cc4fSSven Eckelmann 	 * @mla_list: list of multicast addresses we are currently announcing
12198b84cc4fSSven Eckelmann 	 *  via TT
12208b84cc4fSSven Eckelmann 	 */
1221cbebd363SLinus Lüssing 	struct hlist_head mla_list; /* see __batadv_mcast_mla_update() */
12228b84cc4fSSven Eckelmann 
12238b84cc4fSSven Eckelmann 	/**
12248b84cc4fSSven Eckelmann 	 * @want_all_unsnoopables_list: a list of orig_nodes wanting all
12258b84cc4fSSven Eckelmann 	 *  unsnoopable multicast traffic
12268b84cc4fSSven Eckelmann 	 */
1227ab49886eSLinus Lüssing 	struct hlist_head want_all_unsnoopables_list;
12288b84cc4fSSven Eckelmann 
12298b84cc4fSSven Eckelmann 	/**
12308b84cc4fSSven Eckelmann 	 * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast
12318b84cc4fSSven Eckelmann 	 *  traffic
12328b84cc4fSSven Eckelmann 	 */
12334c8755d6SLinus Lüssing 	struct hlist_head want_all_ipv4_list;
12348b84cc4fSSven Eckelmann 
12358b84cc4fSSven Eckelmann 	/**
12368b84cc4fSSven Eckelmann 	 * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast
12378b84cc4fSSven Eckelmann 	 *  traffic
12388b84cc4fSSven Eckelmann 	 */
12394c8755d6SLinus Lüssing 	struct hlist_head want_all_ipv6_list;
12408b84cc4fSSven Eckelmann 
12416bc45440SLinus Lüssing 	/**
124261caf3d1SLinus Lüssing 	 * @want_all_rtr4_list: a list of orig_nodes wanting all routable IPv4
124361caf3d1SLinus Lüssing 	 *  multicast traffic
124461caf3d1SLinus Lüssing 	 */
124561caf3d1SLinus Lüssing 	struct hlist_head want_all_rtr4_list;
124661caf3d1SLinus Lüssing 
124761caf3d1SLinus Lüssing 	/**
124861caf3d1SLinus Lüssing 	 * @want_all_rtr6_list: a list of orig_nodes wanting all routable IPv6
124961caf3d1SLinus Lüssing 	 *  multicast traffic
125061caf3d1SLinus Lüssing 	 */
125161caf3d1SLinus Lüssing 	struct hlist_head want_all_rtr6_list;
125261caf3d1SLinus Lüssing 
125361caf3d1SLinus Lüssing 	/**
12546bc45440SLinus Lüssing 	 * @mla_flags: flags for the querier, bridge and tvlv state
12556bc45440SLinus Lüssing 	 */
12566bc45440SLinus Lüssing 	struct batadv_mcast_mla_flags mla_flags;
12578b84cc4fSSven Eckelmann 
12588b84cc4fSSven Eckelmann 	/**
1259a3c7cd0cSLinus Lüssing 	 * @mla_lock: a lock protecting mla_list and mla_flags
1260a3c7cd0cSLinus Lüssing 	 */
1261a3c7cd0cSLinus Lüssing 	spinlock_t mla_lock;
1262a3c7cd0cSLinus Lüssing 
1263a3c7cd0cSLinus Lüssing 	/**
12648b84cc4fSSven Eckelmann 	 * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
12658b84cc4fSSven Eckelmann 	 *  traffic
12668b84cc4fSSven Eckelmann 	 */
1267ab49886eSLinus Lüssing 	atomic_t num_want_all_unsnoopables;
12688b84cc4fSSven Eckelmann 
12698b84cc4fSSven Eckelmann 	/** @num_want_all_ipv4: counter for items in want_all_ipv4_list */
12704c8755d6SLinus Lüssing 	atomic_t num_want_all_ipv4;
12718b84cc4fSSven Eckelmann 
12728b84cc4fSSven Eckelmann 	/** @num_want_all_ipv6: counter for items in want_all_ipv6_list */
12734c8755d6SLinus Lüssing 	atomic_t num_want_all_ipv6;
12748b84cc4fSSven Eckelmann 
127561caf3d1SLinus Lüssing 	/** @num_want_all_rtr4: counter for items in want_all_rtr4_list */
127661caf3d1SLinus Lüssing 	atomic_t num_want_all_rtr4;
127761caf3d1SLinus Lüssing 
127861caf3d1SLinus Lüssing 	/** @num_want_all_rtr6: counter for items in want_all_rtr6_list */
127961caf3d1SLinus Lüssing 	atomic_t num_want_all_rtr6;
128061caf3d1SLinus Lüssing 
12818b84cc4fSSven Eckelmann 	/**
12828b84cc4fSSven Eckelmann 	 * @want_lists_lock: lock for protecting modifications to mcasts
12838b84cc4fSSven Eckelmann 	 *  want_all_{unsnoopables,ipv4,ipv6}_list (traversals are rcu-locked)
12848b84cc4fSSven Eckelmann 	 */
1285ab49886eSLinus Lüssing 	spinlock_t want_lists_lock;
12868b84cc4fSSven Eckelmann 
12878b84cc4fSSven Eckelmann 	/** @work: work queue callback item for multicast TT and TVLV updates */
1288cbebd363SLinus Lüssing 	struct delayed_work work;
1289c5caf4efSLinus Lüssing };
1290c5caf4efSLinus Lüssing #endif
1291c5caf4efSLinus Lüssing 
129288a32c9aSMarek Lindner /**
1293d353d8d4SMartin Hundebøll  * struct batadv_priv_nc - per mesh interface network coding private data
1294d353d8d4SMartin Hundebøll  */
1295d353d8d4SMartin Hundebøll struct batadv_priv_nc {
12968b84cc4fSSven Eckelmann 	/** @work: work queue callback item for cleanup */
1297d353d8d4SMartin Hundebøll 	struct delayed_work work;
12988b84cc4fSSven Eckelmann 
12998b84cc4fSSven Eckelmann 	/**
13008b84cc4fSSven Eckelmann 	 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq
13018b84cc4fSSven Eckelmann 	 */
1302d56b1705SMartin Hundebøll 	u8 min_tq;
13038b84cc4fSSven Eckelmann 
13048b84cc4fSSven Eckelmann 	/**
13058b84cc4fSSven Eckelmann 	 * @max_fwd_delay: maximum packet forward delay to allow coding of
13068b84cc4fSSven Eckelmann 	 *  packets
13078b84cc4fSSven Eckelmann 	 */
130895332477SMartin Hundebøll 	u32 max_fwd_delay;
13098b84cc4fSSven Eckelmann 
13108b84cc4fSSven Eckelmann 	/**
13118b84cc4fSSven Eckelmann 	 * @max_buffer_time: buffer time for sniffed packets used to decoding
13128b84cc4fSSven Eckelmann 	 */
1313612d2b4fSMartin Hundebøll 	u32 max_buffer_time;
13148b84cc4fSSven Eckelmann 
13158b84cc4fSSven Eckelmann 	/**
13168b84cc4fSSven Eckelmann 	 * @timestamp_fwd_flush: timestamp of last forward packet queue flush
13178b84cc4fSSven Eckelmann 	 */
131895332477SMartin Hundebøll 	unsigned long timestamp_fwd_flush;
13198b84cc4fSSven Eckelmann 
13208b84cc4fSSven Eckelmann 	/**
13218b84cc4fSSven Eckelmann 	 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue
13228b84cc4fSSven Eckelmann 	 *  purge
13238b84cc4fSSven Eckelmann 	 */
1324612d2b4fSMartin Hundebøll 	unsigned long timestamp_sniffed_purge;
13258b84cc4fSSven Eckelmann 
13268b84cc4fSSven Eckelmann 	/**
13278b84cc4fSSven Eckelmann 	 * @coding_hash: Hash table used to buffer skbs while waiting for
13288b84cc4fSSven Eckelmann 	 *  another incoming skb to code it with. Skbs are added to the buffer
13298b84cc4fSSven Eckelmann 	 *  just before being forwarded in routing.c
13308b84cc4fSSven Eckelmann 	 */
133195332477SMartin Hundebøll 	struct batadv_hashtable *coding_hash;
13328b84cc4fSSven Eckelmann 
13338b84cc4fSSven Eckelmann 	/**
13348b84cc4fSSven Eckelmann 	 * @decoding_hash: Hash table used to buffer skbs that might be needed
13358b84cc4fSSven Eckelmann 	 *  to decode a received coded skb. The buffer is used for 1) skbs
13368b84cc4fSSven Eckelmann 	 *  arriving on the soft-interface; 2) skbs overheard on the
13378b84cc4fSSven Eckelmann 	 *  hard-interface; and 3) skbs forwarded by batman-adv.
13388b84cc4fSSven Eckelmann 	 */
1339612d2b4fSMartin Hundebøll 	struct batadv_hashtable *decoding_hash;
1340d353d8d4SMartin Hundebøll };
1341d353d8d4SMartin Hundebøll 
1342d353d8d4SMartin Hundebøll /**
134333a3bb4aSAntonio Quartulli  * struct batadv_tp_unacked - unacked packet meta-information
134433a3bb4aSAntonio Quartulli  *
134533a3bb4aSAntonio Quartulli  * This struct is supposed to represent a buffer unacked packet. However, since
134633a3bb4aSAntonio Quartulli  * the purpose of the TP meter is to count the traffic only, there is no need to
134733a3bb4aSAntonio Quartulli  * store the entire sk_buff, the starting offset and the length are enough
134833a3bb4aSAntonio Quartulli  */
134933a3bb4aSAntonio Quartulli struct batadv_tp_unacked {
13508b84cc4fSSven Eckelmann 	/** @seqno: seqno of the unacked packet */
135133a3bb4aSAntonio Quartulli 	u32 seqno;
13528b84cc4fSSven Eckelmann 
13538b84cc4fSSven Eckelmann 	/** @len: length of the packet */
135433a3bb4aSAntonio Quartulli 	u16 len;
13558b84cc4fSSven Eckelmann 
1356a07369d7SSven Eckelmann 	/** @list: list node for &batadv_tp_vars.unacked_list */
135733a3bb4aSAntonio Quartulli 	struct list_head list;
135833a3bb4aSAntonio Quartulli };
135933a3bb4aSAntonio Quartulli 
136033a3bb4aSAntonio Quartulli /**
136133a3bb4aSAntonio Quartulli  * enum batadv_tp_meter_role - Modus in tp meter session
136233a3bb4aSAntonio Quartulli  */
136333a3bb4aSAntonio Quartulli enum batadv_tp_meter_role {
13648b84cc4fSSven Eckelmann 	/** @BATADV_TP_RECEIVER: Initialized as receiver */
136533a3bb4aSAntonio Quartulli 	BATADV_TP_RECEIVER,
13668b84cc4fSSven Eckelmann 
13678b84cc4fSSven Eckelmann 	/** @BATADV_TP_SENDER: Initialized as sender */
136833a3bb4aSAntonio Quartulli 	BATADV_TP_SENDER
136933a3bb4aSAntonio Quartulli };
137033a3bb4aSAntonio Quartulli 
137133a3bb4aSAntonio Quartulli /**
137233a3bb4aSAntonio Quartulli  * struct batadv_tp_vars - tp meter private variables per session
137333a3bb4aSAntonio Quartulli  */
137433a3bb4aSAntonio Quartulli struct batadv_tp_vars {
1375a07369d7SSven Eckelmann 	/** @list: list node for &bat_priv.tp_list */
137633a3bb4aSAntonio Quartulli 	struct hlist_node list;
13778b84cc4fSSven Eckelmann 
13788b84cc4fSSven Eckelmann 	/** @timer: timer for ack (receiver) and retry (sender) */
137933a3bb4aSAntonio Quartulli 	struct timer_list timer;
13808b84cc4fSSven Eckelmann 
13818b84cc4fSSven Eckelmann 	/** @bat_priv: pointer to the mesh object */
138233a3bb4aSAntonio Quartulli 	struct batadv_priv *bat_priv;
13838b84cc4fSSven Eckelmann 
13848b84cc4fSSven Eckelmann 	/** @start_time: start time in jiffies */
138533a3bb4aSAntonio Quartulli 	unsigned long start_time;
13868b84cc4fSSven Eckelmann 
13878b84cc4fSSven Eckelmann 	/** @other_end: mac address of remote */
138833a3bb4aSAntonio Quartulli 	u8 other_end[ETH_ALEN];
13898b84cc4fSSven Eckelmann 
13908b84cc4fSSven Eckelmann 	/** @role: receiver/sender modi */
139133a3bb4aSAntonio Quartulli 	enum batadv_tp_meter_role role;
13928b84cc4fSSven Eckelmann 
13938b84cc4fSSven Eckelmann 	/** @sending: sending binary semaphore: 1 if sending, 0 is not */
139433a3bb4aSAntonio Quartulli 	atomic_t sending;
13958b84cc4fSSven Eckelmann 
13968b84cc4fSSven Eckelmann 	/** @reason: reason for a stopped session */
139733a3bb4aSAntonio Quartulli 	enum batadv_tp_meter_reason reason;
13988b84cc4fSSven Eckelmann 
13998b84cc4fSSven Eckelmann 	/** @finish_work: work item for the finishing procedure */
140033a3bb4aSAntonio Quartulli 	struct delayed_work finish_work;
14018b84cc4fSSven Eckelmann 
14028b84cc4fSSven Eckelmann 	/** @test_length: test length in milliseconds */
140333a3bb4aSAntonio Quartulli 	u32 test_length;
14048b84cc4fSSven Eckelmann 
14058b84cc4fSSven Eckelmann 	/** @session: TP session identifier */
140633a3bb4aSAntonio Quartulli 	u8 session[2];
14078b84cc4fSSven Eckelmann 
14088b84cc4fSSven Eckelmann 	/** @icmp_uid: local ICMP "socket" index */
140933a3bb4aSAntonio Quartulli 	u8 icmp_uid;
141033a3bb4aSAntonio Quartulli 
141133a3bb4aSAntonio Quartulli 	/* sender variables */
14128b84cc4fSSven Eckelmann 
14138b84cc4fSSven Eckelmann 	/** @dec_cwnd: decimal part of the cwnd used during linear growth */
141433a3bb4aSAntonio Quartulli 	u16 dec_cwnd;
14158b84cc4fSSven Eckelmann 
14168b84cc4fSSven Eckelmann 	/** @cwnd: current size of the congestion window */
141733a3bb4aSAntonio Quartulli 	u32 cwnd;
14188b84cc4fSSven Eckelmann 
14198b84cc4fSSven Eckelmann 	/** @cwnd_lock: lock do protect @cwnd & @dec_cwnd */
14208b84cc4fSSven Eckelmann 	spinlock_t cwnd_lock;
14218b84cc4fSSven Eckelmann 
14228b84cc4fSSven Eckelmann 	/**
14238b84cc4fSSven Eckelmann 	 * @ss_threshold: Slow Start threshold. Once cwnd exceeds this value the
14248b84cc4fSSven Eckelmann 	 *  connection switches to the Congestion Avoidance state
14258b84cc4fSSven Eckelmann 	 */
142633a3bb4aSAntonio Quartulli 	u32 ss_threshold;
14278b84cc4fSSven Eckelmann 
14288b84cc4fSSven Eckelmann 	/** @last_acked: last acked byte */
142933a3bb4aSAntonio Quartulli 	atomic_t last_acked;
14308b84cc4fSSven Eckelmann 
14318b84cc4fSSven Eckelmann 	/** @last_sent: last sent byte, not yet acked */
143233a3bb4aSAntonio Quartulli 	u32 last_sent;
14338b84cc4fSSven Eckelmann 
14348b84cc4fSSven Eckelmann 	/** @tot_sent: amount of data sent/ACKed so far */
143533a3bb4aSAntonio Quartulli 	atomic64_t tot_sent;
14368b84cc4fSSven Eckelmann 
14378b84cc4fSSven Eckelmann 	/** @dup_acks: duplicate ACKs counter */
143833a3bb4aSAntonio Quartulli 	atomic_t dup_acks;
14398b84cc4fSSven Eckelmann 
14408b84cc4fSSven Eckelmann 	/** @fast_recovery: true if in Fast Recovery mode */
14416486379dSSven Eckelmann 	unsigned char fast_recovery:1;
14428b84cc4fSSven Eckelmann 
14438b84cc4fSSven Eckelmann 	/** @recover: last sent seqno when entering Fast Recovery */
144433a3bb4aSAntonio Quartulli 	u32 recover;
14458b84cc4fSSven Eckelmann 
14468b84cc4fSSven Eckelmann 	/** @rto: sender timeout */
144733a3bb4aSAntonio Quartulli 	u32 rto;
14488b84cc4fSSven Eckelmann 
14498b84cc4fSSven Eckelmann 	/** @srtt: smoothed RTT scaled by 2^3 */
145033a3bb4aSAntonio Quartulli 	u32 srtt;
14518b84cc4fSSven Eckelmann 
14528b84cc4fSSven Eckelmann 	/** @rttvar: RTT variation scaled by 2^2 */
145333a3bb4aSAntonio Quartulli 	u32 rttvar;
14548b84cc4fSSven Eckelmann 
14558b84cc4fSSven Eckelmann 	/**
14568b84cc4fSSven Eckelmann 	 * @more_bytes: waiting queue anchor when waiting for more ack/retry
14578b84cc4fSSven Eckelmann 	 *  timeout
14588b84cc4fSSven Eckelmann 	 */
145933a3bb4aSAntonio Quartulli 	wait_queue_head_t more_bytes;
14608b84cc4fSSven Eckelmann 
14618b84cc4fSSven Eckelmann 	/** @prerandom_offset: offset inside the prerandom buffer */
146233a3bb4aSAntonio Quartulli 	u32 prerandom_offset;
14638b84cc4fSSven Eckelmann 
14648b84cc4fSSven Eckelmann 	/** @prerandom_lock: spinlock protecting access to prerandom_offset */
14658b84cc4fSSven Eckelmann 	spinlock_t prerandom_lock;
146633a3bb4aSAntonio Quartulli 
146733a3bb4aSAntonio Quartulli 	/* receiver variables */
14688b84cc4fSSven Eckelmann 
14698b84cc4fSSven Eckelmann 	/** @last_recv: last in-order received packet */
147033a3bb4aSAntonio Quartulli 	u32 last_recv;
14718b84cc4fSSven Eckelmann 
14728b84cc4fSSven Eckelmann 	/** @unacked_list: list of unacked packets (meta-info only) */
147333a3bb4aSAntonio Quartulli 	struct list_head unacked_list;
14748b84cc4fSSven Eckelmann 
14758b84cc4fSSven Eckelmann 	/** @unacked_lock: protect unacked_list */
14768b84cc4fSSven Eckelmann 	spinlock_t unacked_lock;
14778b84cc4fSSven Eckelmann 
14786f5b92a7SRandy Dunlap 	/** @last_recv_time: time (jiffies) a msg was received */
147933a3bb4aSAntonio Quartulli 	unsigned long last_recv_time;
14808b84cc4fSSven Eckelmann 
14818b84cc4fSSven Eckelmann 	/** @refcount: number of context where the object is used */
148233a3bb4aSAntonio Quartulli 	struct kref refcount;
14838b84cc4fSSven Eckelmann 
14848b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
148533a3bb4aSAntonio Quartulli 	struct rcu_head rcu;
148633a3bb4aSAntonio Quartulli };
148733a3bb4aSAntonio Quartulli 
148833a3bb4aSAntonio Quartulli /**
14895d2c05b2SAntonio Quartulli  * struct batadv_softif_vlan - per VLAN attributes set
14905d2c05b2SAntonio Quartulli  */
14915d2c05b2SAntonio Quartulli struct batadv_softif_vlan {
14928b84cc4fSSven Eckelmann 	/** @bat_priv: pointer to the mesh object */
149335df3b29SAntonio Quartulli 	struct batadv_priv *bat_priv;
14948b84cc4fSSven Eckelmann 
14958b84cc4fSSven Eckelmann 	/** @vid: VLAN identifier */
14965d2c05b2SAntonio Quartulli 	unsigned short vid;
14978b84cc4fSSven Eckelmann 
14988b84cc4fSSven Eckelmann 	/** @ap_isolation: AP isolation state */
1499b8cbd81dSAntonio Quartulli 	atomic_t ap_isolation;		/* boolean */
15008b84cc4fSSven Eckelmann 
15018b84cc4fSSven Eckelmann 	/** @tt: TT private attributes (VLAN specific) */
15027ea7b4a1SAntonio Quartulli 	struct batadv_vlan_tt tt;
15038b84cc4fSSven Eckelmann 
1504a07369d7SSven Eckelmann 	/** @list: list node for &bat_priv.softif_vlan_list */
15055d2c05b2SAntonio Quartulli 	struct hlist_node list;
15068b84cc4fSSven Eckelmann 
15078b84cc4fSSven Eckelmann 	/**
15088b84cc4fSSven Eckelmann 	 * @refcount: number of context where this object is currently in use
15098b84cc4fSSven Eckelmann 	 */
15106be4d30cSSven Eckelmann 	struct kref refcount;
15118b84cc4fSSven Eckelmann 
15128b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in a RCU-safe manner */
15135d2c05b2SAntonio Quartulli 	struct rcu_head rcu;
15145d2c05b2SAntonio Quartulli };
15155d2c05b2SAntonio Quartulli 
15165d2c05b2SAntonio Quartulli /**
15170da00359SAntonio Quartulli  * struct batadv_priv_bat_v - B.A.T.M.A.N. V per soft-interface private data
15180da00359SAntonio Quartulli  */
15190da00359SAntonio Quartulli struct batadv_priv_bat_v {
15208b84cc4fSSven Eckelmann 	/** @ogm_buff: buffer holding the OGM packet */
15210da00359SAntonio Quartulli 	unsigned char *ogm_buff;
15228b84cc4fSSven Eckelmann 
15238b84cc4fSSven Eckelmann 	/** @ogm_buff_len: length of the OGM packet buffer */
15240da00359SAntonio Quartulli 	int ogm_buff_len;
15258b84cc4fSSven Eckelmann 
15268b84cc4fSSven Eckelmann 	/** @ogm_seqno: OGM sequence number - used to identify each OGM */
15270da00359SAntonio Quartulli 	atomic_t ogm_seqno;
15288b84cc4fSSven Eckelmann 
1529a8d23cbbSSven Eckelmann 	/** @ogm_buff_mutex: lock protecting ogm_buff and ogm_buff_len */
1530a8d23cbbSSven Eckelmann 	struct mutex ogm_buff_mutex;
1531a8d23cbbSSven Eckelmann 
15328b84cc4fSSven Eckelmann 	/** @ogm_wq: workqueue used to schedule OGM transmissions */
15330da00359SAntonio Quartulli 	struct delayed_work ogm_wq;
15340da00359SAntonio Quartulli };
15350da00359SAntonio Quartulli 
15360da00359SAntonio Quartulli /**
153788a32c9aSMarek Lindner  * struct batadv_priv - per mesh interface data
153888a32c9aSMarek Lindner  */
153956303d34SSven Eckelmann struct batadv_priv {
15408b84cc4fSSven Eckelmann 	/**
15418b84cc4fSSven Eckelmann 	 * @mesh_state: current status of the mesh
15428b84cc4fSSven Eckelmann 	 *  (inactive/active/deactivating)
15438b84cc4fSSven Eckelmann 	 */
1544c6c8fea2SSven Eckelmann 	atomic_t mesh_state;
15458b84cc4fSSven Eckelmann 
15468b84cc4fSSven Eckelmann 	/** @soft_iface: net device which holds this struct as private data */
15475bc44dc8SSimon Wunderlich 	struct net_device *soft_iface;
15488b84cc4fSSven Eckelmann 
15498b84cc4fSSven Eckelmann 	/**
15508b84cc4fSSven Eckelmann 	 * @mtu_set_by_user: MTU was set once by user
15518b84cc4fSSven Eckelmann 	 * protected by rtnl_lock
15528b84cc4fSSven Eckelmann 	 */
15536b5e971aSSven Eckelmann 	int mtu_set_by_user;
15548b84cc4fSSven Eckelmann 
15558b84cc4fSSven Eckelmann 	/**
15568b84cc4fSSven Eckelmann 	 * @bat_counters: mesh internal traffic statistic counters (see
15578b84cc4fSSven Eckelmann 	 *  batadv_counters)
155888a32c9aSMarek Lindner 	 */
15598b84cc4fSSven Eckelmann 	u64 __percpu *bat_counters; /* Per cpu counters */
15608b84cc4fSSven Eckelmann 
156188a32c9aSMarek Lindner 	/**
15628b84cc4fSSven Eckelmann 	 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
15638b84cc4fSSven Eckelmann 	 */
15648b84cc4fSSven Eckelmann 	atomic_t aggregated_ogms;
15658b84cc4fSSven Eckelmann 
15668b84cc4fSSven Eckelmann 	/** @bonding: bool indicating whether traffic bonding is enabled */
156788a32c9aSMarek Lindner 	atomic_t bonding;
15688b84cc4fSSven Eckelmann 
15698b84cc4fSSven Eckelmann 	/**
15708b84cc4fSSven Eckelmann 	 * @fragmentation: bool indicating whether traffic fragmentation is
15718b84cc4fSSven Eckelmann 	 *  enabled
15728b84cc4fSSven Eckelmann 	 */
15738b84cc4fSSven Eckelmann 	atomic_t fragmentation;
1574a19d3d85SMarek Lindner 
15758b84cc4fSSven Eckelmann 	/**
15768b84cc4fSSven Eckelmann 	 * @packet_size_max: max packet size that can be transmitted via
15778b84cc4fSSven Eckelmann 	 *  multiple fragmented skbs or a single frame if fragmentation is
15788b84cc4fSSven Eckelmann 	 *  disabled
15798b84cc4fSSven Eckelmann 	 */
1580ee75ed88SMartin Hundebøll 	atomic_t packet_size_max;
15818b84cc4fSSven Eckelmann 
1582fa706554SAntonio Quartulli 	/**
15838b84cc4fSSven Eckelmann 	 * @frag_seqno: incremental counter to identify chains of egress
15848b84cc4fSSven Eckelmann 	 *  fragments
15858b84cc4fSSven Eckelmann 	 */
15868b84cc4fSSven Eckelmann 	atomic_t frag_seqno;
158788a32c9aSMarek Lindner 
1588fa706554SAntonio Quartulli #ifdef CONFIG_BATMAN_ADV_BLA
15898b84cc4fSSven Eckelmann 	/**
159033af49adSAntonio Quartulli 	 * @bridge_loop_avoidance: bool indicating whether bridge loop
15918b84cc4fSSven Eckelmann 	 *  avoidance is enabled
15928b84cc4fSSven Eckelmann 	 */
15938b84cc4fSSven Eckelmann 	atomic_t bridge_loop_avoidance;
15948b84cc4fSSven Eckelmann #endif
159588a32c9aSMarek Lindner 
159633af49adSAntonio Quartulli #ifdef CONFIG_BATMAN_ADV_DAT
15978b84cc4fSSven Eckelmann 	/**
15981d8ab8d3SLinus Lüssing 	 * @distributed_arp_table: bool indicating whether distributed ARP table
15998b84cc4fSSven Eckelmann 	 *  is enabled
16008b84cc4fSSven Eckelmann 	 */
16018b84cc4fSSven Eckelmann 	atomic_t distributed_arp_table;
16028b84cc4fSSven Eckelmann #endif
16031d8ab8d3SLinus Lüssing 
160432e72744SLinus Lüssing #ifdef CONFIG_BATMAN_ADV_MCAST
160532e72744SLinus Lüssing 	/**
160632e72744SLinus Lüssing 	 * @multicast_mode: Enable or disable multicast optimizations on this
160732e72744SLinus Lüssing 	 *  node's sender/originating side
160832e72744SLinus Lüssing 	 */
160932e72744SLinus Lüssing 	atomic_t multicast_mode;
16101d8ab8d3SLinus Lüssing 
16118b84cc4fSSven Eckelmann 	/**
16128b84cc4fSSven Eckelmann 	 * @multicast_fanout: Maximum number of packet copies to generate for a
161388a32c9aSMarek Lindner 	 *  multicast-to-unicast conversion
16148b84cc4fSSven Eckelmann 	 */
16158b84cc4fSSven Eckelmann 	atomic_t multicast_fanout;
16168b84cc4fSSven Eckelmann #endif
16178b84cc4fSSven Eckelmann 
16188b84cc4fSSven Eckelmann 	/** @orig_interval: OGM broadcast interval in milliseconds */
161988a32c9aSMarek Lindner 	atomic_t orig_interval;
16208b84cc4fSSven Eckelmann 
16210c430d0dSMarek Lindner 	/**
16228b84cc4fSSven Eckelmann 	 * @hop_penalty: penalty which will be applied to an OGM's tq-field on
162388a32c9aSMarek Lindner 	 *  every hop
16240c430d0dSMarek Lindner 	 */
16258b84cc4fSSven Eckelmann 	atomic_t hop_penalty;
16268b84cc4fSSven Eckelmann 
16278b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_DEBUG
16288b84cc4fSSven Eckelmann 	/** @log_level: configured log level (see batadv_dbg_level) */
16298b84cc4fSSven Eckelmann 	atomic_t log_level;
16306b5e971aSSven Eckelmann #endif
16318b84cc4fSSven Eckelmann 
16328b84cc4fSSven Eckelmann 	/**
16338b84cc4fSSven Eckelmann 	 * @isolation_mark: the skb->mark value used to match packets for AP
16348b84cc4fSSven Eckelmann 	 *  isolation
16358b84cc4fSSven Eckelmann 	 */
16366b5e971aSSven Eckelmann 	u32 isolation_mark;
16378b84cc4fSSven Eckelmann 
16388b84cc4fSSven Eckelmann 	/**
1639c6c8fea2SSven Eckelmann 	 * @isolation_mark_mask: bitmask identifying the bits in skb->mark to be
16408b84cc4fSSven Eckelmann 	 *  used for the isolation mark
16418b84cc4fSSven Eckelmann 	 */
16428b84cc4fSSven Eckelmann 	u32 isolation_mark_mask;
16438b84cc4fSSven Eckelmann 
16448b84cc4fSSven Eckelmann 	/** @bcast_seqno: last sent broadcast packet sequence number */
1645c6c8fea2SSven Eckelmann 	atomic_t bcast_seqno;
16468b84cc4fSSven Eckelmann 
16478b84cc4fSSven Eckelmann 	/**
1648c6c8fea2SSven Eckelmann 	 * @bcast_queue_left: number of remaining buffered broadcast packet
16498b84cc4fSSven Eckelmann 	 *  slots
16508b84cc4fSSven Eckelmann 	 */
1651c6c8fea2SSven Eckelmann 	atomic_t bcast_queue_left;
16528b84cc4fSSven Eckelmann 
16538b84cc4fSSven Eckelmann 	/** @batman_queue_left: number of remaining OGM packet slots */
16548b84cc4fSSven Eckelmann 	atomic_t batman_queue_left;
16558b84cc4fSSven Eckelmann 
16568b84cc4fSSven Eckelmann 	/** @forw_bat_list: list of aggregated OGMs that will be forwarded */
1657c6c8fea2SSven Eckelmann 	struct hlist_head forw_bat_list;
16588b84cc4fSSven Eckelmann 
16598b84cc4fSSven Eckelmann 	/**
166033a3bb4aSAntonio Quartulli 	 * @forw_bcast_list: list of broadcast packets that will be
16618b84cc4fSSven Eckelmann 	 *  rebroadcasted
1662549750baSLinus Lüssing 	 */
16635bf74e9cSSven Eckelmann 	struct hlist_head forw_bcast_list;
16648b84cc4fSSven Eckelmann 
1665549750baSLinus Lüssing 	/** @tp_list: list of tp sessions */
16668b84cc4fSSven Eckelmann 	struct hlist_head tp_list;
16678b84cc4fSSven Eckelmann 
1668549750baSLinus Lüssing 	/** @orig_hash: hash table containing mesh participants (orig nodes) */
16698b84cc4fSSven Eckelmann 	struct batadv_hashtable *orig_hash;
16708b84cc4fSSven Eckelmann 
1671549750baSLinus Lüssing 	/** @forw_bat_list_lock: lock protecting forw_bat_list */
16728b84cc4fSSven Eckelmann 	spinlock_t forw_bat_list_lock;
16738b84cc4fSSven Eckelmann 
1674549750baSLinus Lüssing 	/** @forw_bcast_list_lock: lock protecting forw_bcast_list */
167533a3bb4aSAntonio Quartulli 	spinlock_t forw_bcast_list_lock;
16768b84cc4fSSven Eckelmann 
16778b84cc4fSSven Eckelmann 	/** @tp_list_lock: spinlock protecting @tp_list */
1678c6c8fea2SSven Eckelmann 	spinlock_t tp_list_lock;
16798b84cc4fSSven Eckelmann 
16808b84cc4fSSven Eckelmann 	/** @tp_num: number of currently active tp sessions */
16818b84cc4fSSven Eckelmann 	atomic_t tp_num;
16828b84cc4fSSven Eckelmann 
16838b84cc4fSSven Eckelmann 	/** @orig_work: work queue callback item for orig node purging */
168456303d34SSven Eckelmann 	struct delayed_work orig_work;
16858b84cc4fSSven Eckelmann 
16868b84cc4fSSven Eckelmann 	/**
168729824a55SAntonio Quartulli 	 * @primary_if: one of the hard-interfaces assigned to this mesh
16888b84cc4fSSven Eckelmann 	 *  interface becomes the primary interface
16898b84cc4fSSven Eckelmann 	 */
16908b84cc4fSSven Eckelmann 	struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
16918b84cc4fSSven Eckelmann 
16928b84cc4fSSven Eckelmann 	/** @algo_ops: routing algorithm used by this mesh interface */
16935d2c05b2SAntonio Quartulli 	struct batadv_algo_ops *algo_ops;
16948b84cc4fSSven Eckelmann 
16958b84cc4fSSven Eckelmann 	/**
16968b84cc4fSSven Eckelmann 	 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN
16978b84cc4fSSven Eckelmann 	 *  created on top of the mesh interface represented by this object
1698807736f6SSven Eckelmann 	 */
1699bccb48c8SSven Eckelmann 	struct hlist_head softif_vlan_list;
1700807736f6SSven Eckelmann 
1701807736f6SSven Eckelmann 	/** @softif_vlan_list_lock: lock protecting softif_vlan_list */
17028b84cc4fSSven Eckelmann 	spinlock_t softif_vlan_list_lock;
17030abf5d81SMarek Lindner 
17048b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_BLA
17050abf5d81SMarek Lindner 	/** @bla: bridge loop avoidance data */
17060abf5d81SMarek Lindner 	struct batadv_priv_bla bla;
17078b84cc4fSSven Eckelmann #endif
17088b84cc4fSSven Eckelmann 
1709807736f6SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_DEBUG
17108b84cc4fSSven Eckelmann 	/** @debug_log: holding debug logging relevant data */
17118b84cc4fSSven Eckelmann 	struct batadv_priv_debug_log *debug_log;
1712807736f6SSven Eckelmann #endif
17138b84cc4fSSven Eckelmann 
17148b84cc4fSSven Eckelmann 	/** @gw: gateway data */
1715ef261577SMarek Lindner 	struct batadv_priv_gw gw;
17168b84cc4fSSven Eckelmann 
171717224474SAntonio Quartulli 	/** @tt: translation table data */
17188b84cc4fSSven Eckelmann 	struct batadv_priv_tt tt;
1719785ea114SAntonio Quartulli 
172017224474SAntonio Quartulli 	/** @tvlv: type-version-length-value data */
17218b84cc4fSSven Eckelmann 	struct batadv_priv_tvlv tvlv;
1722c5caf4efSLinus Lüssing 
17238b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_DAT
1724c5caf4efSLinus Lüssing 	/** @dat: distributed arp table data */
1725c5caf4efSLinus Lüssing 	struct batadv_priv_dat dat;
17268b84cc4fSSven Eckelmann #endif
1727d353d8d4SMartin Hundebøll 
17288b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_MCAST
17298b84cc4fSSven Eckelmann 	/** @mcast: multicast data */
17308b84cc4fSSven Eckelmann 	struct batadv_priv_mcast mcast;
1731d353d8d4SMartin Hundebøll #endif
17328b84cc4fSSven Eckelmann 
17338b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_NC
1734d353d8d4SMartin Hundebøll 	/**
1735d353d8d4SMartin Hundebøll 	 * @network_coding: bool indicating whether network coding is enabled
17368b84cc4fSSven Eckelmann 	 */
17370da00359SAntonio Quartulli 	atomic_t network_coding;
17388b84cc4fSSven Eckelmann 
17390da00359SAntonio Quartulli 	/** @nc: network coding data */
17400da00359SAntonio Quartulli 	struct batadv_priv_nc nc;
1741c6c8fea2SSven Eckelmann #endif /* CONFIG_BATMAN_ADV_NC */
1742c6c8fea2SSven Eckelmann 
1743426fc6c8SSven Eckelmann #ifdef CONFIG_BATMAN_ADV_BATMAN_V
1744426fc6c8SSven Eckelmann 	/** @bat_v: B.A.T.M.A.N. V per soft-interface private data */
174588a32c9aSMarek Lindner 	struct batadv_priv_bat_v bat_v;
174688a32c9aSMarek Lindner #endif
174788a32c9aSMarek Lindner };
1748bae98774SMarek Lindner 
17498b84cc4fSSven Eckelmann #ifdef CONFIG_BATMAN_ADV_BLA
17508b84cc4fSSven Eckelmann 
17518b84cc4fSSven Eckelmann /**
17528b84cc4fSSven Eckelmann  * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
17536b5e971aSSven Eckelmann  */
17548b84cc4fSSven Eckelmann struct batadv_bla_backbone_gw {
17558b84cc4fSSven Eckelmann 	/**
1756eb2deb6bSAntonio Quartulli 	 * @orig: originator address of backbone node (mac address of primary
17578b84cc4fSSven Eckelmann 	 *  iface)
1758a07369d7SSven Eckelmann 	 */
17592006fea8SMarek Lindner 	u8 orig[ETH_ALEN];
17608b84cc4fSSven Eckelmann 
17618b84cc4fSSven Eckelmann 	/** @vid: vlan id this gateway was detected on */
17622006fea8SMarek Lindner 	unsigned short vid;
17638b84cc4fSSven Eckelmann 
17648b84cc4fSSven Eckelmann 	/** @hash_entry: hlist node for &batadv_priv_bla.backbone_hash */
176588a32c9aSMarek Lindner 	struct hlist_node hash_entry;
17668b84cc4fSSven Eckelmann 
17678b84cc4fSSven Eckelmann 	/** @bat_priv: pointer to soft_iface this backbone gateway belongs to */
17688b84cc4fSSven Eckelmann 	struct batadv_priv *bat_priv;
17698b84cc4fSSven Eckelmann 
17708b84cc4fSSven Eckelmann 	/** @lasttime: last time we heard of this backbone gw */
17718b84cc4fSSven Eckelmann 	unsigned long lasttime;
17722006fea8SMarek Lindner 
17738b84cc4fSSven Eckelmann 	/**
17748b84cc4fSSven Eckelmann 	 * @wait_periods: grace time for bridge forward delays and bla group
17758b84cc4fSSven Eckelmann 	 *  forming at bootup phase - no bcast traffic is formwared until it has
17768b84cc4fSSven Eckelmann 	 *  elapsed
17778b84cc4fSSven Eckelmann 	 */
17788b84cc4fSSven Eckelmann 	atomic_t wait_periods;
17792006fea8SMarek Lindner 
17808b84cc4fSSven Eckelmann 	/**
17818b84cc4fSSven Eckelmann 	 * @request_sent: if this bool is set to true we are out of sync with
17826b5e971aSSven Eckelmann 	 *  this backbone gateway - no bcast traffic is formwared until the
17838b84cc4fSSven Eckelmann 	 *  situation was resolved
17848b84cc4fSSven Eckelmann 	 */
17858b84cc4fSSven Eckelmann 	atomic_t request_sent;
17868b84cc4fSSven Eckelmann 
17878b84cc4fSSven Eckelmann 	/** @crc: crc16 checksum over all claims */
1788cd9c7bfbSSimon Wunderlich 	u16 crc;
17898b84cc4fSSven Eckelmann 
17908b84cc4fSSven Eckelmann 	/** @crc_lock: lock protecting crc */
179106e56dedSSven Eckelmann 	spinlock_t crc_lock;
17928b84cc4fSSven Eckelmann 
17938b84cc4fSSven Eckelmann 	/** @report_work: work struct for reporting detected loops */
17942006fea8SMarek Lindner 	struct work_struct report_work;
17952006fea8SMarek Lindner 
17962006fea8SMarek Lindner 	/** @refcount: number of contexts the object is used */
179788a32c9aSMarek Lindner 	struct kref refcount;
179888a32c9aSMarek Lindner 
179988a32c9aSMarek Lindner 	/** @rcu: struct used for freeing in an RCU-safe manner */
1800712bbfe4SMarek Lindner 	struct rcu_head rcu;
18018b84cc4fSSven Eckelmann };
18026b5e971aSSven Eckelmann 
18038b84cc4fSSven Eckelmann /**
18048b84cc4fSSven Eckelmann  * struct batadv_bla_claim - claimed non-mesh client structure
1805eb2deb6bSAntonio Quartulli  */
18068b84cc4fSSven Eckelmann struct batadv_bla_claim {
18078b84cc4fSSven Eckelmann 	/** @addr: mac address of claimed non-mesh client */
1808bae98774SMarek Lindner 	u8 addr[ETH_ALEN];
18098b84cc4fSSven Eckelmann 
18108b84cc4fSSven Eckelmann 	/** @vid: vlan id this client was detected on */
18118b84cc4fSSven Eckelmann 	unsigned short vid;
18128b84cc4fSSven Eckelmann 
18138b84cc4fSSven Eckelmann 	/** @backbone_gw: pointer to backbone gw claiming this client */
181488a32c9aSMarek Lindner 	struct batadv_bla_backbone_gw *backbone_gw;
18158b84cc4fSSven Eckelmann 
1816a07369d7SSven Eckelmann 	/** @backbone_lock: lock protecting backbone_gw pointer */
181788a32c9aSMarek Lindner 	spinlock_t backbone_lock;
18188b84cc4fSSven Eckelmann 
18198b84cc4fSSven Eckelmann 	/** @lasttime: last time we heard of claim (locals only) */
18202006fea8SMarek Lindner 	unsigned long lasttime;
18218b84cc4fSSven Eckelmann 
18228b84cc4fSSven Eckelmann 	/** @hash_entry: hlist node for &batadv_priv_bla.claim_hash */
182371b7e3d3SSven Eckelmann 	struct hlist_node hash_entry;
18242006fea8SMarek Lindner 
18252006fea8SMarek Lindner 	/** @refcount: number of contexts the object is used */
18262006fea8SMarek Lindner 	struct rcu_head rcu;
182788a32c9aSMarek Lindner 
182888a32c9aSMarek Lindner 	/** @rcu: struct used for freeing in an RCU-safe manner */
182988a32c9aSMarek Lindner 	struct kref refcount;
183056303d34SSven Eckelmann };
18318b84cc4fSSven Eckelmann #endif
18326b5e971aSSven Eckelmann 
18338b84cc4fSSven Eckelmann /**
18348b84cc4fSSven Eckelmann  * struct batadv_tt_common_entry - tt local & tt global common data
1835c018ad3dSAntonio Quartulli  */
18368b84cc4fSSven Eckelmann struct batadv_tt_common_entry {
18378b84cc4fSSven Eckelmann 	/** @addr: mac address of non-mesh client */
1838a07369d7SSven Eckelmann 	u8 addr[ETH_ALEN];
1839a07369d7SSven Eckelmann 
18408b84cc4fSSven Eckelmann 	/** @vid: VLAN identifier */
184193840ac4SAntonio Quartulli 	unsigned short vid;
18428b84cc4fSSven Eckelmann 
18438b84cc4fSSven Eckelmann 	/**
18446b5e971aSSven Eckelmann 	 * @hash_entry: hlist node for &batadv_priv_tt.local_hash or for
18458b84cc4fSSven Eckelmann 	 *  &batadv_priv_tt.global_hash
18468b84cc4fSSven Eckelmann 	 */
184730cfd02bSAntonio Quartulli 	struct hlist_node hash_entry;
18488b84cc4fSSven Eckelmann 
18498b84cc4fSSven Eckelmann 	/** @flags: various state handling flags (see batadv_tt_client_flags) */
185092dcdf09SSven Eckelmann 	u16 flags;
18518b84cc4fSSven Eckelmann 
18528b84cc4fSSven Eckelmann 	/** @added_at: timestamp used for purging stale tt common entries */
18537683fdc1SAntonio Quartulli 	unsigned long added_at;
1854c6c8fea2SSven Eckelmann 
1855c6c8fea2SSven Eckelmann 	/** @refcount: number of contexts the object is used */
185688a32c9aSMarek Lindner 	struct kref refcount;
185788a32c9aSMarek Lindner 
185888a32c9aSMarek Lindner 	/** @rcu: struct used for freeing in an RCU-safe manner */
185956303d34SSven Eckelmann 	struct rcu_head rcu;
18608b84cc4fSSven Eckelmann };
186156303d34SSven Eckelmann 
18628b84cc4fSSven Eckelmann /**
18638b84cc4fSSven Eckelmann  * struct batadv_tt_local_entry - translation table local entry data
186448100bacSAntonio Quartulli  */
18658b84cc4fSSven Eckelmann struct batadv_tt_local_entry {
18668b84cc4fSSven Eckelmann 	/** @common: general translation table data */
1867a33d970dSSven Eckelmann 	struct batadv_tt_common_entry common;
186848100bacSAntonio Quartulli 
186948100bacSAntonio Quartulli 	/** @last_seen: timestamp used for purging stale tt local entries */
187088a32c9aSMarek Lindner 	unsigned long last_seen;
187188a32c9aSMarek Lindner 
187288a32c9aSMarek Lindner 	/** @vlan: soft-interface vlan of the entry */
187356303d34SSven Eckelmann 	struct batadv_softif_vlan *vlan;
18748b84cc4fSSven Eckelmann };
187556303d34SSven Eckelmann 
18768b84cc4fSSven Eckelmann /**
18778b84cc4fSSven Eckelmann  * struct batadv_tt_global_entry - translation table global entry data
1878db08e6e5SSimon Wunderlich  */
18798b84cc4fSSven Eckelmann struct batadv_tt_global_entry {
18808b84cc4fSSven Eckelmann 	/** @common: general translation table data */
18811d8ab8d3SLinus Lüssing 	struct batadv_tt_common_entry common;
18828b84cc4fSSven Eckelmann 
18838b84cc4fSSven Eckelmann 	/** @orig_list: list of orig nodes announcing this non-mesh client */
18848b84cc4fSSven Eckelmann 	struct hlist_head orig_list;
18858b84cc4fSSven Eckelmann 
18868b84cc4fSSven Eckelmann 	/** @orig_list_count: number of items in the orig_list */
188788a32c9aSMarek Lindner 	atomic_t orig_list_count;
1888db08e6e5SSimon Wunderlich 
1889db08e6e5SSimon Wunderlich 	/** @list_lock: lock protecting orig_list */
189088a32c9aSMarek Lindner 	spinlock_t list_lock;
189188a32c9aSMarek Lindner 
189288a32c9aSMarek Lindner 	/** @roam_at: time at which TT_GLOBAL_ROAM was set */
189356303d34SSven Eckelmann 	unsigned long roam_at;
18948b84cc4fSSven Eckelmann };
189556303d34SSven Eckelmann 
18968b84cc4fSSven Eckelmann /**
18978b84cc4fSSven Eckelmann  * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
18988b84cc4fSSven Eckelmann  */
18998b84cc4fSSven Eckelmann struct batadv_tt_orig_list_entry {
19008b84cc4fSSven Eckelmann 	/** @orig_node: pointer to orig node announcing this non-mesh client */
19016b5e971aSSven Eckelmann 	struct batadv_orig_node *orig_node;
19028b84cc4fSSven Eckelmann 
19038b84cc4fSSven Eckelmann 	/**
190454e22f26SLinus Lüssing 	 * @ttvn: translation table version number which added the non-mesh
19058b84cc4fSSven Eckelmann 	 *  client
1906a07369d7SSven Eckelmann 	 */
190788a32c9aSMarek Lindner 	u8 ttvn;
19088b84cc4fSSven Eckelmann 
19098b84cc4fSSven Eckelmann 	/** @flags: per orig entry TT sync flags */
19106e8ef69dSSven Eckelmann 	u8 flags;
19118b84cc4fSSven Eckelmann 
19128b84cc4fSSven Eckelmann 	/** @list: list node for &batadv_tt_global_entry.orig_list */
1913db08e6e5SSimon Wunderlich 	struct hlist_node list;
1914c6c8fea2SSven Eckelmann 
1915c6c8fea2SSven Eckelmann 	/** @refcount: number of contexts the object is used */
191688a32c9aSMarek Lindner 	struct kref refcount;
19173f68785eSAntonio Quartulli 
191888a32c9aSMarek Lindner 	/** @rcu: struct used for freeing in an RCU-safe manner */
191956303d34SSven Eckelmann 	struct rcu_head rcu;
1920a07369d7SSven Eckelmann };
1921a73105b8SAntonio Quartulli 
19228b84cc4fSSven Eckelmann /**
19238b84cc4fSSven Eckelmann  * struct batadv_tt_change_node - structure for tt changes occurred
1924e1bf0c14SMarek Lindner  */
1925a73105b8SAntonio Quartulli struct batadv_tt_change_node {
1926a73105b8SAntonio Quartulli 	/** @list: list node for &batadv_priv_tt.changes_list */
192788a32c9aSMarek Lindner 	struct list_head list;
192888a32c9aSMarek Lindner 
192988a32c9aSMarek Lindner 	/** @change: holds the actual translation table diff data */
193056303d34SSven Eckelmann 	struct batadv_tvlv_tt_change change;
19318b84cc4fSSven Eckelmann };
19326f5b92a7SRandy Dunlap 
19338b84cc4fSSven Eckelmann /**
19346b5e971aSSven Eckelmann  * struct batadv_tt_req_node - data to keep track of the tt requests in flight
19358b84cc4fSSven Eckelmann  */
19368b84cc4fSSven Eckelmann struct batadv_tt_req_node {
1937a73105b8SAntonio Quartulli 	/**
19388b84cc4fSSven Eckelmann 	 * @addr: mac address of the originator this request was sent to
19398b84cc4fSSven Eckelmann 	 */
19409c4604a2SSven Eckelmann 	u8 addr[ETH_ALEN];
19418b84cc4fSSven Eckelmann 
1942a07369d7SSven Eckelmann 	/** @issued_at: timestamp used for purging stale tt requests */
19437c26a53bSMarek Lindner 	unsigned long issued_at;
1944a73105b8SAntonio Quartulli 
1945a73105b8SAntonio Quartulli 	/** @refcount: number of contexts the object is used by */
194688a32c9aSMarek Lindner 	struct kref refcount;
194788a32c9aSMarek Lindner 
194888a32c9aSMarek Lindner 	/** @list: list node for &batadv_priv_tt.req_list */
194956303d34SSven Eckelmann 	struct hlist_node list;
19508b84cc4fSSven Eckelmann };
19516b5e971aSSven Eckelmann 
19528b84cc4fSSven Eckelmann /**
19538b84cc4fSSven Eckelmann  * struct batadv_tt_roam_node - roaming client data
19548b84cc4fSSven Eckelmann  */
19558b84cc4fSSven Eckelmann struct batadv_tt_roam_node {
19568b84cc4fSSven Eckelmann 	/** @addr: mac address of the client in the roaming phase */
1957cc47f66eSAntonio Quartulli 	u8 addr[ETH_ALEN];
19588b84cc4fSSven Eckelmann 
19598b84cc4fSSven Eckelmann 	/**
19608b84cc4fSSven Eckelmann 	 * @counter: number of allowed roaming events per client within a single
19618b84cc4fSSven Eckelmann 	 * OGM interval (changes are committed with each OGM)
1962cc47f66eSAntonio Quartulli 	 */
19638b84cc4fSSven Eckelmann 	atomic_t counter;
1964a07369d7SSven Eckelmann 
1965cc47f66eSAntonio Quartulli 	/**
1966cc47f66eSAntonio Quartulli 	 * @first_time: timestamp used for purging stale roaming node entries
1967cc47f66eSAntonio Quartulli 	 */
196888a32c9aSMarek Lindner 	unsigned long first_time;
1969d56b1705SMartin Hundebøll 
1970d56b1705SMartin Hundebøll 	/** @list: list node for &batadv_priv_tt.roam_list */
1971d56b1705SMartin Hundebøll 	struct list_head list;
19728b84cc4fSSven Eckelmann };
1973d56b1705SMartin Hundebøll 
19748b84cc4fSSven Eckelmann /**
19758b84cc4fSSven Eckelmann  * struct batadv_nc_node - network coding node
19766b5e971aSSven Eckelmann  */
19778b84cc4fSSven Eckelmann struct batadv_nc_node {
19788b84cc4fSSven Eckelmann 	/** @list: next and prev pointer for the list handling */
1979daf99b48SSven Eckelmann 	struct list_head list;
19808b84cc4fSSven Eckelmann 
19818b84cc4fSSven Eckelmann 	/** @addr: the node's mac address */
1982d56b1705SMartin Hundebøll 	u8 addr[ETH_ALEN];
19838b84cc4fSSven Eckelmann 
19848b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used by */
1985d56b1705SMartin Hundebøll 	struct kref refcount;
19868b84cc4fSSven Eckelmann 
19878b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
1988d56b1705SMartin Hundebøll 	struct rcu_head rcu;
1989d56b1705SMartin Hundebøll 
1990d56b1705SMartin Hundebøll 	/** @orig_node: pointer to corresponding orig node struct */
1991d56b1705SMartin Hundebøll 	struct batadv_orig_node *orig_node;
199295332477SMartin Hundebøll 
199395332477SMartin Hundebøll 	/** @last_seen: timestamp of last ogm received from this node */
199495332477SMartin Hundebøll 	unsigned long last_seen;
19958b84cc4fSSven Eckelmann };
199695332477SMartin Hundebøll 
19978b84cc4fSSven Eckelmann /**
19988b84cc4fSSven Eckelmann  * struct batadv_nc_path - network coding path
199995332477SMartin Hundebøll  */
20008b84cc4fSSven Eckelmann struct batadv_nc_path {
20018b84cc4fSSven Eckelmann 	/** @hash_entry: next and prev pointer for the list handling */
2002727e0cd5SSven Eckelmann 	struct hlist_node hash_entry;
20038b84cc4fSSven Eckelmann 
20048b84cc4fSSven Eckelmann 	/** @rcu: struct used for freeing in an RCU-safe manner */
200595332477SMartin Hundebøll 	struct rcu_head rcu;
20068b84cc4fSSven Eckelmann 
20078b84cc4fSSven Eckelmann 	/** @refcount: number of contexts the object is used by */
20088b84cc4fSSven Eckelmann 	struct kref refcount;
20098b84cc4fSSven Eckelmann 
20108b84cc4fSSven Eckelmann 	/** @packet_list: list of buffered packets for this path */
20116b5e971aSSven Eckelmann 	struct list_head packet_list;
20128b84cc4fSSven Eckelmann 
20138b84cc4fSSven Eckelmann 	/** @packet_list_lock: access lock for packet list */
20146b5e971aSSven Eckelmann 	spinlock_t packet_list_lock;
20158b84cc4fSSven Eckelmann 
20168b84cc4fSSven Eckelmann 	/** @next_hop: next hop (destination) of path */
201795332477SMartin Hundebøll 	u8 next_hop[ETH_ALEN];
201895332477SMartin Hundebøll 
201995332477SMartin Hundebøll 	/** @prev_hop: previous hop (source) of path */
202095332477SMartin Hundebøll 	u8 prev_hop[ETH_ALEN];
202195332477SMartin Hundebøll 
202295332477SMartin Hundebøll 	/** @last_valid: timestamp for last validation of path */
202395332477SMartin Hundebøll 	unsigned long last_valid;
202495332477SMartin Hundebøll };
20258b84cc4fSSven Eckelmann 
202695332477SMartin Hundebøll /**
20278b84cc4fSSven Eckelmann  * struct batadv_nc_packet - network coding packet used when coding and
20288b84cc4fSSven Eckelmann  *  decoding packets
202995332477SMartin Hundebøll  */
20308b84cc4fSSven Eckelmann struct batadv_nc_packet {
20318b84cc4fSSven Eckelmann 	/** @list: next and prev pointer for the list handling */
20328b84cc4fSSven Eckelmann 	struct list_head list;
20338b84cc4fSSven Eckelmann 
20348b84cc4fSSven Eckelmann 	/** @packet_id: crc32 checksum of skb data */
203595332477SMartin Hundebøll 	__be32 packet_id;
20368b84cc4fSSven Eckelmann 
20378b84cc4fSSven Eckelmann 	/**
203895332477SMartin Hundebøll 	 * @timestamp: field containing the info when the packet was added to
20398b84cc4fSSven Eckelmann 	 *  path
20408b84cc4fSSven Eckelmann 	 */
204195332477SMartin Hundebøll 	unsigned long timestamp;
20428b84cc4fSSven Eckelmann 
20438b84cc4fSSven Eckelmann 	/** @neigh_node: pointer to original next hop neighbor of skb */
204495332477SMartin Hundebøll 	struct batadv_neigh_node *neigh_node;
204595332477SMartin Hundebøll 
204695332477SMartin Hundebøll 	/** @skb: skb which can be encoded or used for decoding */
204795332477SMartin Hundebøll 	struct sk_buff *skb;
20481a321b0dSSimon Wunderlich 
20491a321b0dSSimon Wunderlich 	/** @nc_path: pointer to path this nc packet is attached to */
20503c12de9aSMartin Hundebøll 	struct batadv_nc_path *nc_path;
20513c12de9aSMartin Hundebøll };
20528b84cc4fSSven Eckelmann 
20538b84cc4fSSven Eckelmann /**
20548b84cc4fSSven Eckelmann  * struct batadv_skb_cb - control buffer structure used to store private data
20558b84cc4fSSven Eckelmann  *  relevant to batman-adv in the skb->cb buffer in skbs.
20566486379dSSven Eckelmann  */
20578b84cc4fSSven Eckelmann struct batadv_skb_cb {
20588b84cc4fSSven Eckelmann 	/**
20596486379dSSven Eckelmann 	 * @decoded: Marks a skb as decoded, which is checked when searching for
20603c12de9aSMartin Hundebøll 	 *  coding opportunities in network-coding.c
20613c12de9aSMartin Hundebøll 	 */
20623c12de9aSMartin Hundebøll 	unsigned char decoded:1;
206388a32c9aSMarek Lindner 
2064c6c8fea2SSven Eckelmann 	/** @num_bcasts: Counter for broadcast packet retransmissions */
206556303d34SSven Eckelmann 	unsigned char num_bcasts;
2066a07369d7SSven Eckelmann };
2067a07369d7SSven Eckelmann 
2068a07369d7SSven Eckelmann /**
2069a07369d7SSven Eckelmann  * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded
2070c6c8fea2SSven Eckelmann  */
20718b84cc4fSSven Eckelmann struct batadv_forw_packet {
20728b84cc4fSSven Eckelmann 	/**
20739b4aec64SLinus Lüssing 	 * @list: list node for &batadv_priv.forw.bcast_list and
20748b84cc4fSSven Eckelmann 	 *  &batadv_priv.forw.bat_list
20758b84cc4fSSven Eckelmann 	 */
2076c6c8fea2SSven Eckelmann 	struct hlist_node list;
20778b84cc4fSSven Eckelmann 
20788b84cc4fSSven Eckelmann 	/** @cleanup_list: list node for purging functions */
20798b84cc4fSSven Eckelmann 	struct hlist_node cleanup_list;
20808b84cc4fSSven Eckelmann 
20818b84cc4fSSven Eckelmann 	/** @send_time: execution time for delayed_work (packet sending) */
20826b5e971aSSven Eckelmann 	unsigned long send_time;
20838b84cc4fSSven Eckelmann 
20848b84cc4fSSven Eckelmann 	/**
2085c6c8fea2SSven Eckelmann 	 * @own: bool for locally generated packets (local OGMs are re-scheduled
20868b84cc4fSSven Eckelmann 	 * after sending)
20878b84cc4fSSven Eckelmann 	 */
20886b5e971aSSven Eckelmann 	u8 own;
20898b84cc4fSSven Eckelmann 
20908b84cc4fSSven Eckelmann 	/** @skb: bcast packet's skb buffer */
20916b5e971aSSven Eckelmann 	struct sk_buff *skb;
20928b84cc4fSSven Eckelmann 
20938b84cc4fSSven Eckelmann 	/** @packet_len: size of aggregated OGM packet inside the skb buffer */
20946b5e971aSSven Eckelmann 	u16 packet_len;
20958b84cc4fSSven Eckelmann 
20968b84cc4fSSven Eckelmann 	/** @direct_link_flags: direct link flags for aggregated OGM packets */
2097c6c8fea2SSven Eckelmann 	u32 direct_link_flags;
20988b84cc4fSSven Eckelmann 
20998b84cc4fSSven Eckelmann 	/** @num_packets: counter for aggregated OGMv1 packets */
21008b84cc4fSSven Eckelmann 	u8 num_packets;
21018b84cc4fSSven Eckelmann 
21028b84cc4fSSven Eckelmann 	/** @delayed_work: work queue callback item for packet sending */
210356303d34SSven Eckelmann 	struct delayed_work delayed_work;
21048b84cc4fSSven Eckelmann 
21058b84cc4fSSven Eckelmann 	/**
21068b84cc4fSSven Eckelmann 	 * @if_incoming: pointer to incoming hard-iface or primary iface if
21078b84cc4fSSven Eckelmann 	 *  locally generated packet
21088b84cc4fSSven Eckelmann 	 */
2109ef0a937fSSimon Wunderlich 	struct batadv_hard_iface *if_incoming;
21108b84cc4fSSven Eckelmann 
21118b84cc4fSSven Eckelmann 	/**
2112a65e5481SLinus Lüssing 	 * @if_outgoing: packet where the packet should be sent to, or NULL if
2113c6c8fea2SSven Eckelmann 	 *  unspecified
2114c6c8fea2SSven Eckelmann 	 */
211588a32c9aSMarek Lindner 	struct batadv_hard_iface *if_outgoing;
211629824a55SAntonio Quartulli 
211729824a55SAntonio Quartulli 	/** @queue_left: The queue (counter) this packet was applied to */
211829824a55SAntonio Quartulli 	atomic_t *queue_left;
21198b84cc4fSSven Eckelmann };
21208b84cc4fSSven Eckelmann 
21218b84cc4fSSven Eckelmann /**
21228b84cc4fSSven Eckelmann  * struct batadv_algo_iface_ops - mesh algorithm callbacks (interface specific)
212329824a55SAntonio Quartulli  */
21248b84cc4fSSven Eckelmann struct batadv_algo_iface_ops {
21258b84cc4fSSven Eckelmann 	/**
212629824a55SAntonio Quartulli 	 * @activate: start routing mechanisms when hard-interface is brought up
21278b84cc4fSSven Eckelmann 	 *  (optional)
21289e6b5648SSven Eckelmann 	 */
21299e6b5648SSven Eckelmann 	void (*activate)(struct batadv_hard_iface *hard_iface);
21309e6b5648SSven Eckelmann 
21318b84cc4fSSven Eckelmann 	/** @enable: init routing info when hard-interface is enabled */
213229824a55SAntonio Quartulli 	int (*enable)(struct batadv_hard_iface *hard_iface);
21338b84cc4fSSven Eckelmann 
21348b84cc4fSSven Eckelmann 	/** @enabled: notification when hard-interface was enabled (optional) */
21358b84cc4fSSven Eckelmann 	void (*enabled)(struct batadv_hard_iface *hard_iface);
21368b84cc4fSSven Eckelmann 
21378b84cc4fSSven Eckelmann 	/** @disable: de-init routing info when hard-interface is disabled */
213829824a55SAntonio Quartulli 	void (*disable)(struct batadv_hard_iface *hard_iface);
21398b84cc4fSSven Eckelmann 
21408b84cc4fSSven Eckelmann 	/**
214129824a55SAntonio Quartulli 	 * @update_mac: (re-)init mac addresses of the protocol information
214229824a55SAntonio Quartulli 	 *  belonging to this hard-interface
214329824a55SAntonio Quartulli 	 */
214429824a55SAntonio Quartulli 	void (*update_mac)(struct batadv_hard_iface *hard_iface);
214529824a55SAntonio Quartulli 
214629824a55SAntonio Quartulli 	/** @primary_set: called when primary interface is selected / changed */
214729824a55SAntonio Quartulli 	void (*primary_set)(struct batadv_hard_iface *hard_iface);
21488b84cc4fSSven Eckelmann };
214929824a55SAntonio Quartulli 
21508b84cc4fSSven Eckelmann /**
21518b84cc4fSSven Eckelmann  * struct batadv_algo_neigh_ops - mesh algorithm callbacks (neighbour specific)
21528b84cc4fSSven Eckelmann  */
21538b84cc4fSSven Eckelmann struct batadv_algo_neigh_ops {
21548b84cc4fSSven Eckelmann 	/** @hardif_init: called on creation of single hop entry (optional) */
215529824a55SAntonio Quartulli 	void (*hardif_init)(struct batadv_hardif_neigh_node *neigh);
215629824a55SAntonio Quartulli 
215729824a55SAntonio Quartulli 	/**
215829824a55SAntonio Quartulli 	 * @cmp: compare the metrics of two neighbors for their respective
21598b84cc4fSSven Eckelmann 	 *  outgoing interfaces
21608b84cc4fSSven Eckelmann 	 */
21618b84cc4fSSven Eckelmann 	int (*cmp)(struct batadv_neigh_node *neigh1,
21628b84cc4fSSven Eckelmann 		   struct batadv_hard_iface *if_outgoing1,
21638b84cc4fSSven Eckelmann 		   struct batadv_neigh_node *neigh2,
21648b84cc4fSSven Eckelmann 		   struct batadv_hard_iface *if_outgoing2);
216529824a55SAntonio Quartulli 
216629824a55SAntonio Quartulli 	/**
216729824a55SAntonio Quartulli 	 * @is_similar_or_better: check if neigh1 is equally similar or better
216829824a55SAntonio Quartulli 	 *  than neigh2 for their respective outgoing interface from the metric
21698b84cc4fSSven Eckelmann 	 *  prospective
21708b84cc4fSSven Eckelmann 	 */
217185cf8c85SMatthias Schiffer 	bool (*is_similar_or_better)(struct batadv_neigh_node *neigh1,
217285cf8c85SMatthias Schiffer 				     struct batadv_hard_iface *if_outgoing1,
217385cf8c85SMatthias Schiffer 				     struct batadv_neigh_node *neigh2,
217429824a55SAntonio Quartulli 				     struct batadv_hard_iface *if_outgoing2);
217529824a55SAntonio Quartulli 
217629824a55SAntonio Quartulli 	/** @dump: dump neighbors to a netlink socket (optional) */
217729824a55SAntonio Quartulli 	void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
217829824a55SAntonio Quartulli 		     struct batadv_priv *priv,
217929824a55SAntonio Quartulli 		     struct batadv_hard_iface *hard_iface);
21808b84cc4fSSven Eckelmann };
218185cf8c85SMatthias Schiffer 
218285cf8c85SMatthias Schiffer /**
218385cf8c85SMatthias Schiffer  * struct batadv_algo_orig_ops - mesh algorithm callbacks (originator specific)
218429824a55SAntonio Quartulli  */
218529824a55SAntonio Quartulli struct batadv_algo_orig_ops {
218629824a55SAntonio Quartulli 	/** @dump: dump originators to a netlink socket (optional) */
218708686943SAntonio Quartulli 	void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
218808686943SAntonio Quartulli 		     struct batadv_priv *priv,
218908686943SAntonio Quartulli 		     struct batadv_hard_iface *hard_iface);
21908b84cc4fSSven Eckelmann };
21911a9070ecSSven Eckelmann 
21928b84cc4fSSven Eckelmann /**
21938b84cc4fSSven Eckelmann  * struct batadv_algo_gw_ops - mesh algorithm callbacks (GW specific)
2194*6f96d46fSSven Eckelmann  */
21958b84cc4fSSven Eckelmann struct batadv_algo_gw_ops {
2196*6f96d46fSSven Eckelmann 	/** @init_sel_class: initialize GW selection class (optional) */
2197*6f96d46fSSven Eckelmann 	void (*init_sel_class)(struct batadv_priv *bat_priv);
21988b84cc4fSSven Eckelmann 
21998b84cc4fSSven Eckelmann 	/**
22008b84cc4fSSven Eckelmann 	 * @sel_class_max: maximum allowed GW selection class
22018b84cc4fSSven Eckelmann 	 */
220234d99cfeSAntonio Quartulli 	u32 sel_class_max;
220334d99cfeSAntonio Quartulli 
22048b84cc4fSSven Eckelmann 	/**
22058b84cc4fSSven Eckelmann 	 * @get_best_gw_node: select the best GW from the list of available
22068b84cc4fSSven Eckelmann 	 *  nodes (optional)
22078b84cc4fSSven Eckelmann 	 */
22088b84cc4fSSven Eckelmann 	struct batadv_gw_node *(*get_best_gw_node)
220934d99cfeSAntonio Quartulli 		(struct batadv_priv *bat_priv);
221034d99cfeSAntonio Quartulli 
221134d99cfeSAntonio Quartulli 	/**
22128b84cc4fSSven Eckelmann 	 * @is_eligible: check if a newly discovered GW is a potential candidate
22138b84cc4fSSven Eckelmann 	 *  for the election as best GW (optional)
2214d7129dafSSven Eckelmann 	 */
2215d7129dafSSven Eckelmann 	bool (*is_eligible)(struct batadv_priv *bat_priv,
221608686943SAntonio Quartulli 			    struct batadv_orig_node *curr_gw_orig,
221708686943SAntonio Quartulli 			    struct batadv_orig_node *orig_node);
221808686943SAntonio Quartulli 
221988a32c9aSMarek Lindner 	/** @dump: dump gateways to a netlink socket (optional) */
222088a32c9aSMarek Lindner 	void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
222156303d34SSven Eckelmann 		     struct batadv_priv *priv);
22228b84cc4fSSven Eckelmann };
22231c280471SMarek Lindner 
22248b84cc4fSSven Eckelmann /**
22258b84cc4fSSven Eckelmann  * struct batadv_algo_ops - mesh algorithm callbacks
22261c280471SMarek Lindner  */
22278b84cc4fSSven Eckelmann struct batadv_algo_ops {
22288b84cc4fSSven Eckelmann 	/** @list: list node for the batadv_algo_list */
222929824a55SAntonio Quartulli 	struct hlist_node list;
22308b84cc4fSSven Eckelmann 
22318b84cc4fSSven Eckelmann 	/** @name: name of the algorithm */
223229824a55SAntonio Quartulli 	char *name;
22338b84cc4fSSven Eckelmann 
22348b84cc4fSSven Eckelmann 	/** @iface: callbacks related to interface handling */
223529824a55SAntonio Quartulli 	struct batadv_algo_iface_ops iface;
22368b84cc4fSSven Eckelmann 
22378b84cc4fSSven Eckelmann 	/** @neigh: callbacks related to neighbors handling */
223808686943SAntonio Quartulli 	struct batadv_algo_neigh_ops neigh;
22391c280471SMarek Lindner 
22401c280471SMarek Lindner 	/** @orig: callbacks related to originators handling */
2241785ea114SAntonio Quartulli 	struct batadv_algo_orig_ops orig;
22422f1dfbe1SAntonio Quartulli 
22432f1dfbe1SAntonio Quartulli 	/** @gw: callbacks related to GW mode */
22442f1dfbe1SAntonio Quartulli 	struct batadv_algo_gw_ops gw;
22452f1dfbe1SAntonio Quartulli };
22468b84cc4fSSven Eckelmann 
22472f1dfbe1SAntonio Quartulli /**
22488b84cc4fSSven Eckelmann  * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It
22498b84cc4fSSven Eckelmann  * is used to stored ARP entries needed for the global DAT cache
22506b5e971aSSven Eckelmann  */
22518b84cc4fSSven Eckelmann struct batadv_dat_entry {
22528b84cc4fSSven Eckelmann 	/** @ip: the IPv4 corresponding to this DAT/ARP entry */
2253be1db4f6SAntonio Quartulli 	__be32 ip;
22548b84cc4fSSven Eckelmann 
22558b84cc4fSSven Eckelmann 	/** @mac_addr: the MAC address associated to the stored IPv4 */
22568b84cc4fSSven Eckelmann 	u8 mac_addr[ETH_ALEN];
22578b84cc4fSSven Eckelmann 
22582f1dfbe1SAntonio Quartulli 	/** @vid: the vlan ID associated to this entry */
22598b84cc4fSSven Eckelmann 	unsigned short vid;
2260a07369d7SSven Eckelmann 
22612f1dfbe1SAntonio Quartulli 	/**
22628b84cc4fSSven Eckelmann 	 * @last_update: time in jiffies when this entry was refreshed last time
22638b84cc4fSSven Eckelmann 	 */
226468a6722cSSven Eckelmann 	unsigned long last_update;
22658b84cc4fSSven Eckelmann 
22668b84cc4fSSven Eckelmann 	/** @hash_entry: hlist node for &batadv_priv_dat.hash */
22672f1dfbe1SAntonio Quartulli 	struct hlist_node hash_entry;
22682f1dfbe1SAntonio Quartulli 
22692f1dfbe1SAntonio Quartulli 	/** @refcount: number of contexts the object is used */
22702f1dfbe1SAntonio Quartulli 	struct kref refcount;
2271c5caf4efSLinus Lüssing 
2272c5caf4efSLinus Lüssing 	/** @rcu: struct used for freeing in an RCU-safe manner */
2273c5caf4efSLinus Lüssing 	struct rcu_head rcu;
22748b84cc4fSSven Eckelmann };
2275c5caf4efSLinus Lüssing 
22768b84cc4fSSven Eckelmann /**
22778b84cc4fSSven Eckelmann  * struct batadv_hw_addr - a list entry for a MAC address
2278c5caf4efSLinus Lüssing  */
2279c5caf4efSLinus Lüssing struct batadv_hw_addr {
2280c5caf4efSLinus Lüssing 	/** @list: list node for the linking of entries */
2281c5caf4efSLinus Lüssing 	struct hlist_node list;
2282785ea114SAntonio Quartulli 
2283785ea114SAntonio Quartulli 	/** @addr: the MAC address of this list entry */
2284785ea114SAntonio Quartulli 	unsigned char addr[ETH_ALEN];
22858b84cc4fSSven Eckelmann };
22868b84cc4fSSven Eckelmann 
22878b84cc4fSSven Eckelmann /**
22888b84cc4fSSven Eckelmann  * struct batadv_dat_candidate - candidate destination for DAT operations
22898b84cc4fSSven Eckelmann  */
22908b84cc4fSSven Eckelmann struct batadv_dat_candidate {
2291785ea114SAntonio Quartulli 	/**
22928b84cc4fSSven Eckelmann 	 * @type: the type of the selected candidate. It can one of the
22938b84cc4fSSven Eckelmann 	 *  following:
22948b84cc4fSSven Eckelmann 	 *	  - BATADV_DAT_CANDIDATE_NOT_FOUND
22958b84cc4fSSven Eckelmann 	 *	  - BATADV_DAT_CANDIDATE_ORIG
22968b84cc4fSSven Eckelmann 	 */
2297785ea114SAntonio Quartulli 	int type;
2298785ea114SAntonio Quartulli 
2299785ea114SAntonio Quartulli 	/**
2300ef261577SMarek Lindner 	 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to
2301ef261577SMarek Lindner 	 * the corresponding originator node structure
2302ef261577SMarek Lindner 	 */
2303ef261577SMarek Lindner 	struct batadv_orig_node *orig_node;
2304a07369d7SSven Eckelmann };
2305ef261577SMarek Lindner 
23068b84cc4fSSven Eckelmann /**
23078b84cc4fSSven Eckelmann  * struct batadv_tvlv_container - container for tvlv appended to OGMs
2308ef261577SMarek Lindner  */
23098b84cc4fSSven Eckelmann struct batadv_tvlv_container {
23108b84cc4fSSven Eckelmann 	/** @list: hlist node for &batadv_priv_tvlv.container_list */
2311f7157dd1SSven Eckelmann 	struct hlist_node list;
2312ef261577SMarek Lindner 
2313ef261577SMarek Lindner 	/** @tvlv_hdr: tvlv header information needed to construct the tvlv */
2314ef261577SMarek Lindner 	struct batadv_tvlv_hdr tvlv_hdr;
2315ef261577SMarek Lindner 
2316ef261577SMarek Lindner 	/** @refcount: number of contexts the object is used */
2317ef261577SMarek Lindner 	struct kref refcount;
2318a07369d7SSven Eckelmann };
2319ef261577SMarek Lindner 
23208b84cc4fSSven Eckelmann /**
23218b84cc4fSSven Eckelmann  * struct batadv_tvlv_handler - handler for specific tvlv type and version
23228b84cc4fSSven Eckelmann  */
23238b84cc4fSSven Eckelmann struct batadv_tvlv_handler {
23248b84cc4fSSven Eckelmann 	/** @list: hlist node for &batadv_priv_tvlv.handler_list */
2325ef261577SMarek Lindner 	struct hlist_node list;
2326ef261577SMarek Lindner 
23276b5e971aSSven Eckelmann 	/**
23288b84cc4fSSven Eckelmann 	 * @ogm_handler: handler callback which is given the tvlv payload to
23298b84cc4fSSven Eckelmann 	 *  process on incoming OGM packets
23308b84cc4fSSven Eckelmann 	 */
23318b84cc4fSSven Eckelmann 	void (*ogm_handler)(struct batadv_priv *bat_priv,
23328b84cc4fSSven Eckelmann 			    struct batadv_orig_node *orig,
2333ef261577SMarek Lindner 			    u8 flags, void *tvlv_value, u16 tvlv_value_len);
23346b5e971aSSven Eckelmann 
23356b5e971aSSven Eckelmann 	/**
23368b84cc4fSSven Eckelmann 	 * @unicast_handler: handler callback which is given the tvlv payload to
23370c4061c0SLinus Lüssing 	 *  process on incoming unicast tvlv packets
23380c4061c0SLinus Lüssing 	 */
23390c4061c0SLinus Lüssing 	int (*unicast_handler)(struct batadv_priv *bat_priv,
23400c4061c0SLinus Lüssing 			       u8 *src, u8 *dst,
23410c4061c0SLinus Lüssing 			       void *tvlv_value, u16 tvlv_value_len);
23420c4061c0SLinus Lüssing 
23438b84cc4fSSven Eckelmann 	/**
23446b5e971aSSven Eckelmann 	 * @mcast_handler: handler callback which is given the tvlv payload to
23458b84cc4fSSven Eckelmann 	 *  process on incoming mcast packet
23468b84cc4fSSven Eckelmann 	 */
23476b5e971aSSven Eckelmann 	int (*mcast_handler)(struct batadv_priv *bat_priv, struct sk_buff *skb);
23488b84cc4fSSven Eckelmann 
23498b84cc4fSSven Eckelmann 	/** @type: tvlv type this handler feels responsible for */
23506b5e971aSSven Eckelmann 	u8 type;
23518b84cc4fSSven Eckelmann 
23528b84cc4fSSven Eckelmann 	/** @version: tvlv version this handler feels responsible for */
235332836f56SSven Eckelmann 	u8 version;
23548b84cc4fSSven Eckelmann 
23558b84cc4fSSven Eckelmann 	/** @flags: tvlv handler flags */
2356ef261577SMarek Lindner 	u8 flags;
2357ef261577SMarek Lindner 
2358ef261577SMarek Lindner 	/** @refcount: number of contexts the object is used */
2359ef261577SMarek Lindner 	struct kref refcount;
2360ef261577SMarek Lindner 
2361ef261577SMarek Lindner 	/** @rcu: struct used for freeing in an RCU-safe manner */
2362ef261577SMarek Lindner 	struct rcu_head rcu;
23638b84cc4fSSven Eckelmann };
23648b84cc4fSSven Eckelmann 
23658b84cc4fSSven Eckelmann /**
23668b84cc4fSSven Eckelmann  * enum batadv_tvlv_handler_flags - tvlv handler flags definitions
2367ef261577SMarek Lindner  */
23688b84cc4fSSven Eckelmann enum batadv_tvlv_handler_flags {
23698b84cc4fSSven Eckelmann 	/**
23708b84cc4fSSven Eckelmann 	 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function
23718b84cc4fSSven Eckelmann 	 *  will call this handler even if its type was not found (with no data)
23728b84cc4fSSven Eckelmann 	 */
23738b84cc4fSSven Eckelmann 	BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1),
2374ef261577SMarek Lindner 
2375ef261577SMarek Lindner 	/**
2376ef261577SMarek Lindner 	 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the
2377c6c8fea2SSven Eckelmann 	 *  API marks a handler as being called, so it won't be called if the
2378 	 *  BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set
2379 	 */
2380 	BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2),
2381 };
2382 
2383 #endif /* _NET_BATMAN_ADV_TYPES_H_ */
2384