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