cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

types.h (62344B)


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