linux/net/batman-adv/types.h
<<
>>
Prefs
   1/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
   2 *
   3 * Marek Lindner, Simon Wunderlich
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of version 2 of the GNU General Public
   7 * License as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but
  10 * WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12 * General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#ifndef _NET_BATMAN_ADV_TYPES_H_
  19#define _NET_BATMAN_ADV_TYPES_H_
  20
  21#include "packet.h"
  22#include "bitarray.h"
  23#include <linux/kernel.h>
  24
  25#ifdef CONFIG_BATMAN_ADV_DAT
  26
  27/**
  28 * batadv_dat_addr_t - it is the type used for all DHT addresses. If it is
  29 *  changed, BATADV_DAT_ADDR_MAX is changed as well.
  30 *
  31 * *Please be careful: batadv_dat_addr_t must be UNSIGNED*
  32 */
  33#define batadv_dat_addr_t uint16_t
  34
  35#endif /* CONFIG_BATMAN_ADV_DAT */
  36
  37/**
  38 * enum batadv_dhcp_recipient - dhcp destination
  39 * @BATADV_DHCP_NO: packet is not a dhcp message
  40 * @BATADV_DHCP_TO_SERVER: dhcp message is directed to a server
  41 * @BATADV_DHCP_TO_CLIENT: dhcp message is directed to a client
  42 */
  43enum batadv_dhcp_recipient {
  44        BATADV_DHCP_NO = 0,
  45        BATADV_DHCP_TO_SERVER,
  46        BATADV_DHCP_TO_CLIENT,
  47};
  48
  49/**
  50 * BATADV_TT_REMOTE_MASK - bitmask selecting the flags that are sent over the
  51 *  wire only
  52 */
  53#define BATADV_TT_REMOTE_MASK   0x00FF
  54
  55/**
  56 * BATADV_TT_SYNC_MASK - bitmask of the flags that need to be kept in sync
  57 *  among the nodes. These flags are used to compute the global/local CRC
  58 */
  59#define BATADV_TT_SYNC_MASK     0x00F0
  60
  61/**
  62 * struct batadv_hard_iface_bat_iv - per hard interface B.A.T.M.A.N. IV data
  63 * @ogm_buff: buffer holding the OGM packet
  64 * @ogm_buff_len: length of the OGM packet buffer
  65 * @ogm_seqno: OGM sequence number - used to identify each OGM
  66 */
  67struct batadv_hard_iface_bat_iv {
  68        unsigned char *ogm_buff;
  69        int ogm_buff_len;
  70        atomic_t ogm_seqno;
  71};
  72
  73/**
  74 * struct batadv_hard_iface - network device known to batman-adv
  75 * @list: list node for batadv_hardif_list
  76 * @if_num: identificator of the interface
  77 * @if_status: status of the interface for batman-adv
  78 * @net_dev: pointer to the net_device
  79 * @num_bcasts: number of payload re-broadcasts on this interface (ARQ)
  80 * @hardif_obj: kobject of the per interface sysfs "mesh" directory
  81 * @refcount: number of contexts the object is used
  82 * @batman_adv_ptype: packet type describing packets that should be processed by
  83 *  batman-adv for this interface
  84 * @soft_iface: the batman-adv interface which uses this network interface
  85 * @rcu: struct used for freeing in an RCU-safe manner
  86 * @bat_iv: BATMAN IV specific per hard interface data
  87 * @cleanup_work: work queue callback item for hard interface deinit
  88 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
  89 */
  90struct batadv_hard_iface {
  91        struct list_head list;
  92        int16_t if_num;
  93        char if_status;
  94        struct net_device *net_dev;
  95        uint8_t num_bcasts;
  96        struct kobject *hardif_obj;
  97        atomic_t refcount;
  98        struct packet_type batman_adv_ptype;
  99        struct net_device *soft_iface;
 100        struct rcu_head rcu;
 101        struct batadv_hard_iface_bat_iv bat_iv;
 102        struct work_struct cleanup_work;
 103        struct dentry *debug_dir;
 104};
 105
 106/**
 107 * struct batadv_orig_ifinfo - originator info per outgoing interface
 108 * @list: list node for orig_node::ifinfo_list
 109 * @if_outgoing: pointer to outgoing hard interface
 110 * @router: router that should be used to reach this originator
 111 * @last_real_seqno: last and best known sequence number
 112 * @last_ttl: ttl of last received packet
 113 * @batman_seqno_reset: time when the batman seqno window was reset
 114 * @refcount: number of contexts the object is used
 115 * @rcu: struct used for freeing in an RCU-safe manner
 116 */
 117struct batadv_orig_ifinfo {
 118        struct hlist_node list;
 119        struct batadv_hard_iface *if_outgoing;
 120        struct batadv_neigh_node __rcu *router; /* rcu protected pointer */
 121        uint32_t last_real_seqno;
 122        uint8_t last_ttl;
 123        unsigned long batman_seqno_reset;
 124        atomic_t refcount;
 125        struct rcu_head rcu;
 126};
 127
 128/**
 129 * struct batadv_frag_table_entry - head in the fragment buffer table
 130 * @head: head of list with fragments
 131 * @lock: lock to protect the list of fragments
 132 * @timestamp: time (jiffie) of last received fragment
 133 * @seqno: sequence number of the fragments in the list
 134 * @size: accumulated size of packets in list
 135 */
 136struct batadv_frag_table_entry {
 137        struct hlist_head head;
 138        spinlock_t lock; /* protects head */
 139        unsigned long timestamp;
 140        uint16_t seqno;
 141        uint16_t size;
 142};
 143
 144/**
 145 * struct batadv_frag_list_entry - entry in a list of fragments
 146 * @list: list node information
 147 * @skb: fragment
 148 * @no: fragment number in the set
 149 */
 150struct batadv_frag_list_entry {
 151        struct hlist_node list;
 152        struct sk_buff *skb;
 153        uint8_t no;
 154};
 155
 156/**
 157 * struct batadv_vlan_tt - VLAN specific TT attributes
 158 * @crc: CRC32 checksum of the entries belonging to this vlan
 159 * @num_entries: number of TT entries for this VLAN
 160 */
 161struct batadv_vlan_tt {
 162        uint32_t crc;
 163        atomic_t num_entries;
 164};
 165
 166/**
 167 * struct batadv_orig_node_vlan - VLAN specific data per orig_node
 168 * @vid: the VLAN identifier
 169 * @tt: VLAN specific TT attributes
 170 * @list: list node for orig_node::vlan_list
 171 * @refcount: number of context where this object is currently in use
 172 * @rcu: struct used for freeing in a RCU-safe manner
 173 */
 174struct batadv_orig_node_vlan {
 175        unsigned short vid;
 176        struct batadv_vlan_tt tt;
 177        struct list_head list;
 178        atomic_t refcount;
 179        struct rcu_head rcu;
 180};
 181
 182/**
 183 * struct batadv_orig_bat_iv - B.A.T.M.A.N. IV private orig_node members
 184 * @bcast_own: bitfield containing the number of our OGMs this orig_node
 185 *  rebroadcasted "back" to us (relative to last_real_seqno)
 186 * @bcast_own_sum: counted result of bcast_own
 187 * @ogm_cnt_lock: lock protecting bcast_own, bcast_own_sum,
 188 *  neigh_node->bat_iv.real_bits & neigh_node->bat_iv.real_packet_count
 189 */
 190struct batadv_orig_bat_iv {
 191        unsigned long *bcast_own;
 192        uint8_t *bcast_own_sum;
 193        /* ogm_cnt_lock protects: bcast_own, bcast_own_sum,
 194         * neigh_node->bat_iv.real_bits & neigh_node->bat_iv.real_packet_count
 195         */
 196        spinlock_t ogm_cnt_lock;
 197};
 198
 199/**
 200 * struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
 201 * @orig: originator ethernet address
 202 * @ifinfo_list: list for routers per outgoing interface
 203 * @last_bonding_candidate: pointer to last ifinfo of last used router
 204 * @batadv_dat_addr_t:  address of the orig node in the distributed hash
 205 * @last_seen: time when last packet from this node was received
 206 * @bcast_seqno_reset: time when the broadcast seqno window was reset
 207 * @mcast_flags: multicast flags announced by the orig node
 208 * @mcast_want_all_unsnoop_node: a list node for the
 209 *  mcast.want_all_unsnoopables list
 210 * @mcast_want_all_ipv4_node: a list node for the mcast.want_all_ipv4 list
 211 * @mcast_want_all_ipv6_node: a list node for the mcast.want_all_ipv6 list
 212 * @capabilities: announced capabilities of this originator
 213 * @capa_initialized: bitfield to remember whether a capability was initialized
 214 * @last_ttvn: last seen translation table version number
 215 * @tt_buff: last tt changeset this node received from the orig node
 216 * @tt_buff_len: length of the last tt changeset this node received from the
 217 *  orig node
 218 * @tt_buff_lock: lock that protects tt_buff and tt_buff_len
 219 * @tt_lock: prevents from updating the table while reading it. Table update is
 220 *  made up by two operations (data structure update and metdata -CRC/TTVN-
 221 *  recalculation) and they have to be executed atomically in order to avoid
 222 *  another thread to read the table/metadata between those.
 223 * @bcast_bits: bitfield containing the info which payload broadcast originated
 224 *  from this orig node this host already has seen (relative to
 225 *  last_bcast_seqno)
 226 * @last_bcast_seqno: last broadcast sequence number received by this host
 227 * @neigh_list: list of potential next hop neighbor towards this orig node
 228 * @neigh_list_lock: lock protecting neigh_list and router
 229 * @hash_entry: hlist node for batadv_priv::orig_hash
 230 * @bat_priv: pointer to soft_iface this orig node belongs to
 231 * @bcast_seqno_lock: lock protecting bcast_bits & last_bcast_seqno
 232 * @refcount: number of contexts the object is used
 233 * @rcu: struct used for freeing in an RCU-safe manner
 234 * @in_coding_list: list of nodes this orig can hear
 235 * @out_coding_list: list of nodes that can hear this orig
 236 * @in_coding_list_lock: protects in_coding_list
 237 * @out_coding_list_lock: protects out_coding_list
 238 * @fragments: array with heads for fragment chains
 239 * @vlan_list: a list of orig_node_vlan structs, one per VLAN served by the
 240 *  originator represented by this object
 241 * @vlan_list_lock: lock protecting vlan_list
 242 * @bat_iv: B.A.T.M.A.N. IV private structure
 243 */
 244struct batadv_orig_node {
 245        uint8_t orig[ETH_ALEN];
 246        struct hlist_head ifinfo_list;
 247        struct batadv_orig_ifinfo *last_bonding_candidate;
 248#ifdef CONFIG_BATMAN_ADV_DAT
 249        batadv_dat_addr_t dat_addr;
 250#endif
 251        unsigned long last_seen;
 252        unsigned long bcast_seqno_reset;
 253#ifdef CONFIG_BATMAN_ADV_MCAST
 254        uint8_t mcast_flags;
 255        struct hlist_node mcast_want_all_unsnoopables_node;
 256        struct hlist_node mcast_want_all_ipv4_node;
 257        struct hlist_node mcast_want_all_ipv6_node;
 258#endif
 259        uint8_t capabilities;
 260        uint8_t capa_initialized;
 261        atomic_t last_ttvn;
 262        unsigned char *tt_buff;
 263        int16_t tt_buff_len;
 264        spinlock_t tt_buff_lock; /* protects tt_buff & tt_buff_len */
 265        /* prevents from changing the table while reading it */
 266        spinlock_t tt_lock;
 267        DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
 268        uint32_t last_bcast_seqno;
 269        struct hlist_head neigh_list;
 270        /* neigh_list_lock protects: neigh_list and router */
 271        spinlock_t neigh_list_lock;
 272        struct hlist_node hash_entry;
 273        struct batadv_priv *bat_priv;
 274        /* bcast_seqno_lock protects: bcast_bits & last_bcast_seqno */
 275        spinlock_t bcast_seqno_lock;
 276        atomic_t refcount;
 277        struct rcu_head rcu;
 278#ifdef CONFIG_BATMAN_ADV_NC
 279        struct list_head in_coding_list;
 280        struct list_head out_coding_list;
 281        spinlock_t in_coding_list_lock; /* Protects in_coding_list */
 282        spinlock_t out_coding_list_lock; /* Protects out_coding_list */
 283#endif
 284        struct batadv_frag_table_entry fragments[BATADV_FRAG_BUFFER_COUNT];
 285        struct list_head vlan_list;
 286        spinlock_t vlan_list_lock; /* protects vlan_list */
 287        struct batadv_orig_bat_iv bat_iv;
 288};
 289
 290/**
 291 * enum batadv_orig_capabilities - orig node capabilities
 292 * @BATADV_ORIG_CAPA_HAS_DAT: orig node has distributed arp table enabled
 293 * @BATADV_ORIG_CAPA_HAS_NC: orig node has network coding enabled
 294 * @BATADV_ORIG_CAPA_HAS_TT: orig node has tt capability
 295 * @BATADV_ORIG_CAPA_HAS_MCAST: orig node has some multicast capability
 296 *  (= orig node announces a tvlv of type BATADV_TVLV_MCAST)
 297 */
 298enum batadv_orig_capabilities {
 299        BATADV_ORIG_CAPA_HAS_DAT = BIT(0),
 300        BATADV_ORIG_CAPA_HAS_NC = BIT(1),
 301        BATADV_ORIG_CAPA_HAS_TT = BIT(2),
 302        BATADV_ORIG_CAPA_HAS_MCAST = BIT(3),
 303};
 304
 305/**
 306 * struct batadv_gw_node - structure for orig nodes announcing gw capabilities
 307 * @list: list node for batadv_priv_gw::list
 308 * @orig_node: pointer to corresponding orig node
 309 * @bandwidth_down: advertised uplink download bandwidth
 310 * @bandwidth_up: advertised uplink upload bandwidth
 311 * @deleted: this struct is scheduled for deletion
 312 * @refcount: number of contexts the object is used
 313 * @rcu: struct used for freeing in an RCU-safe manner
 314 */
 315struct batadv_gw_node {
 316        struct hlist_node list;
 317        struct batadv_orig_node *orig_node;
 318        uint32_t bandwidth_down;
 319        uint32_t bandwidth_up;
 320        unsigned long deleted;
 321        atomic_t refcount;
 322        struct rcu_head rcu;
 323};
 324
 325/**
 326 * struct batadv_neigh_node - structure for single hops neighbors
 327 * @list: list node for batadv_orig_node::neigh_list
 328 * @orig_node: pointer to corresponding orig_node
 329 * @addr: the MAC address of the neighboring interface
 330 * @ifinfo_list: list for routing metrics per outgoing interface
 331 * @ifinfo_lock: lock protecting private ifinfo members and list
 332 * @if_incoming: pointer to incoming hard interface
 333 * @last_seen: when last packet via this neighbor was received
 334 * @last_ttl: last received ttl from this neigh node
 335 * @rcu: struct used for freeing in an RCU-safe manner
 336 * @bat_iv: B.A.T.M.A.N. IV private structure
 337 */
 338struct batadv_neigh_node {
 339        struct hlist_node list;
 340        struct batadv_orig_node *orig_node;
 341        uint8_t addr[ETH_ALEN];
 342        struct hlist_head ifinfo_list;
 343        spinlock_t ifinfo_lock; /* protects ifinfo_list and its members */
 344        struct batadv_hard_iface *if_incoming;
 345        unsigned long last_seen;
 346        atomic_t refcount;
 347        struct rcu_head rcu;
 348};
 349
 350/**
 351 * struct batadv_neigh_ifinfo_bat_iv - neighbor information per outgoing
 352 *  interface for BATMAN IV
 353 * @tq_recv: ring buffer of received TQ values from this neigh node
 354 * @tq_index: ring buffer index
 355 * @tq_avg: averaged tq of all tq values in the ring buffer (tq_recv)
 356 * @real_bits: bitfield containing the number of OGMs received from this neigh
 357 *  node (relative to orig_node->last_real_seqno)
 358 * @real_packet_count: counted result of real_bits
 359 */
 360struct batadv_neigh_ifinfo_bat_iv {
 361        uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
 362        uint8_t tq_index;
 363        uint8_t tq_avg;
 364        DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
 365        uint8_t real_packet_count;
 366};
 367
 368/**
 369 * struct batadv_neigh_ifinfo - neighbor information per outgoing interface
 370 * @list: list node for batadv_neigh_node::ifinfo_list
 371 * @if_outgoing: pointer to outgoing hard interface
 372 * @bat_iv: B.A.T.M.A.N. IV private structure
 373 * @last_ttl: last received ttl from this neigh node
 374 * @refcount: number of contexts the object is used
 375 * @rcu: struct used for freeing in a RCU-safe manner
 376 */
 377struct batadv_neigh_ifinfo {
 378        struct hlist_node list;
 379        struct batadv_hard_iface *if_outgoing;
 380        struct batadv_neigh_ifinfo_bat_iv bat_iv;
 381        uint8_t last_ttl;
 382        atomic_t refcount;
 383        struct rcu_head rcu;
 384};
 385
 386/**
 387 * struct batadv_bcast_duplist_entry - structure for LAN broadcast suppression
 388 * @orig[ETH_ALEN]: mac address of orig node orginating the broadcast
 389 * @crc: crc32 checksum of broadcast payload
 390 * @entrytime: time when the broadcast packet was received
 391 */
 392#ifdef CONFIG_BATMAN_ADV_BLA
 393struct batadv_bcast_duplist_entry {
 394        uint8_t orig[ETH_ALEN];
 395        __be32 crc;
 396        unsigned long entrytime;
 397};
 398#endif
 399
 400/**
 401 * enum batadv_counters - indices for traffic counters
 402 * @BATADV_CNT_TX: transmitted payload traffic packet counter
 403 * @BATADV_CNT_TX_BYTES: transmitted payload traffic bytes counter
 404 * @BATADV_CNT_TX_DROPPED: dropped transmission payload traffic packet counter
 405 * @BATADV_CNT_RX: received payload traffic packet counter
 406 * @BATADV_CNT_RX_BYTES: received payload traffic bytes counter
 407 * @BATADV_CNT_FORWARD: forwarded payload traffic packet counter
 408 * @BATADV_CNT_FORWARD_BYTES: forwarded payload traffic bytes counter
 409 * @BATADV_CNT_MGMT_TX: transmitted routing protocol traffic packet counter
 410 * @BATADV_CNT_MGMT_TX_BYTES: transmitted routing protocol traffic bytes counter
 411 * @BATADV_CNT_MGMT_RX: received routing protocol traffic packet counter
 412 * @BATADV_CNT_MGMT_RX_BYTES: received routing protocol traffic bytes counter
 413 * @BATADV_CNT_FRAG_TX: transmitted fragment traffic packet counter
 414 * @BATADV_CNT_FRAG_TX_BYTES: transmitted fragment traffic bytes counter
 415 * @BATADV_CNT_FRAG_RX: received fragment traffic packet counter
 416 * @BATADV_CNT_FRAG_RX_BYTES: received fragment traffic bytes counter
 417 * @BATADV_CNT_FRAG_FWD: forwarded fragment traffic packet counter
 418 * @BATADV_CNT_FRAG_FWD_BYTES: forwarded fragment traffic bytes counter
 419 * @BATADV_CNT_TT_REQUEST_TX: transmitted tt req traffic packet counter
 420 * @BATADV_CNT_TT_REQUEST_RX: received tt req traffic packet counter
 421 * @BATADV_CNT_TT_RESPONSE_TX: transmitted tt resp traffic packet counter
 422 * @BATADV_CNT_TT_RESPONSE_RX: received tt resp traffic packet counter
 423 * @BATADV_CNT_TT_ROAM_ADV_TX: transmitted tt roam traffic packet counter
 424 * @BATADV_CNT_TT_ROAM_ADV_RX: received tt roam traffic packet counter
 425 * @BATADV_CNT_DAT_GET_TX: transmitted dht GET traffic packet counter
 426 * @BATADV_CNT_DAT_GET_RX: received dht GET traffic packet counter
 427 * @BATADV_CNT_DAT_PUT_TX: transmitted dht PUT traffic packet counter
 428 * @BATADV_CNT_DAT_PUT_RX: received dht PUT traffic packet counter
 429 * @BATADV_CNT_DAT_CACHED_REPLY_TX: transmitted dat cache reply traffic packet
 430 *  counter
 431 * @BATADV_CNT_NC_CODE: transmitted nc-combined traffic packet counter
 432 * @BATADV_CNT_NC_CODE_BYTES: transmitted nc-combined traffic bytes counter
 433 * @BATADV_CNT_NC_RECODE: transmitted nc-recombined traffic packet counter
 434 * @BATADV_CNT_NC_RECODE_BYTES: transmitted nc-recombined traffic bytes counter
 435 * @BATADV_CNT_NC_BUFFER: counter for packets buffered for later nc decoding
 436 * @BATADV_CNT_NC_DECODE: received and nc-decoded traffic packet counter
 437 * @BATADV_CNT_NC_DECODE_BYTES: received and nc-decoded traffic bytes counter
 438 * @BATADV_CNT_NC_DECODE_FAILED: received and decode-failed traffic packet
 439 *  counter
 440 * @BATADV_CNT_NC_SNIFFED: counter for nc-decoded packets received in promisc
 441 *  mode.
 442 * @BATADV_CNT_NUM: number of traffic counters
 443 */
 444enum batadv_counters {
 445        BATADV_CNT_TX,
 446        BATADV_CNT_TX_BYTES,
 447        BATADV_CNT_TX_DROPPED,
 448        BATADV_CNT_RX,
 449        BATADV_CNT_RX_BYTES,
 450        BATADV_CNT_FORWARD,
 451        BATADV_CNT_FORWARD_BYTES,
 452        BATADV_CNT_MGMT_TX,
 453        BATADV_CNT_MGMT_TX_BYTES,
 454        BATADV_CNT_MGMT_RX,
 455        BATADV_CNT_MGMT_RX_BYTES,
 456        BATADV_CNT_FRAG_TX,
 457        BATADV_CNT_FRAG_TX_BYTES,
 458        BATADV_CNT_FRAG_RX,
 459        BATADV_CNT_FRAG_RX_BYTES,
 460        BATADV_CNT_FRAG_FWD,
 461        BATADV_CNT_FRAG_FWD_BYTES,
 462        BATADV_CNT_TT_REQUEST_TX,
 463        BATADV_CNT_TT_REQUEST_RX,
 464        BATADV_CNT_TT_RESPONSE_TX,
 465        BATADV_CNT_TT_RESPONSE_RX,
 466        BATADV_CNT_TT_ROAM_ADV_TX,
 467        BATADV_CNT_TT_ROAM_ADV_RX,
 468#ifdef CONFIG_BATMAN_ADV_DAT
 469        BATADV_CNT_DAT_GET_TX,
 470        BATADV_CNT_DAT_GET_RX,
 471        BATADV_CNT_DAT_PUT_TX,
 472        BATADV_CNT_DAT_PUT_RX,
 473        BATADV_CNT_DAT_CACHED_REPLY_TX,
 474#endif
 475#ifdef CONFIG_BATMAN_ADV_NC
 476        BATADV_CNT_NC_CODE,
 477        BATADV_CNT_NC_CODE_BYTES,
 478        BATADV_CNT_NC_RECODE,
 479        BATADV_CNT_NC_RECODE_BYTES,
 480        BATADV_CNT_NC_BUFFER,
 481        BATADV_CNT_NC_DECODE,
 482        BATADV_CNT_NC_DECODE_BYTES,
 483        BATADV_CNT_NC_DECODE_FAILED,
 484        BATADV_CNT_NC_SNIFFED,
 485#endif
 486        BATADV_CNT_NUM,
 487};
 488
 489/**
 490 * struct batadv_priv_tt - per mesh interface translation table data
 491 * @vn: translation table version number
 492 * @ogm_append_cnt: counter of number of OGMs containing the local tt diff
 493 * @local_changes: changes registered in an originator interval
 494 * @changes_list: tracks tt local changes within an originator interval
 495 * @local_hash: local translation table hash table
 496 * @global_hash: global translation table hash table
 497 * @req_list: list of pending & unanswered tt_requests
 498 * @roam_list: list of the last roaming events of each client limiting the
 499 *  number of roaming events to avoid route flapping
 500 * @changes_list_lock: lock protecting changes_list
 501 * @req_list_lock: lock protecting req_list
 502 * @roam_list_lock: lock protecting roam_list
 503 * @last_changeset: last tt changeset this host has generated
 504 * @last_changeset_len: length of last tt changeset this host has generated
 505 * @last_changeset_lock: lock protecting last_changeset & last_changeset_len
 506 * @commit_lock: prevents from executing a local TT commit while reading the
 507 *  local table. The local TT commit is made up by two operations (data
 508 *  structure update and metdata -CRC/TTVN- recalculation) and they have to be
 509 *  executed atomically in order to avoid another thread to read the
 510 *  table/metadata between those.
 511 * @work: work queue callback item for translation table purging
 512 */
 513struct batadv_priv_tt {
 514        atomic_t vn;
 515        atomic_t ogm_append_cnt;
 516        atomic_t local_changes;
 517        struct list_head changes_list;
 518        struct batadv_hashtable *local_hash;
 519        struct batadv_hashtable *global_hash;
 520        struct list_head req_list;
 521        struct list_head roam_list;
 522        spinlock_t changes_list_lock; /* protects changes */
 523        spinlock_t req_list_lock; /* protects req_list */
 524        spinlock_t roam_list_lock; /* protects roam_list */
 525        unsigned char *last_changeset;
 526        int16_t last_changeset_len;
 527        /* protects last_changeset & last_changeset_len */
 528        spinlock_t last_changeset_lock;
 529        /* prevents from executing a commit while reading the table */
 530        spinlock_t commit_lock;
 531        struct delayed_work work;
 532};
 533
 534/**
 535 * struct batadv_priv_bla - per mesh interface bridge loope avoidance data
 536 * @num_requests; number of bla requests in flight
 537 * @claim_hash: hash table containing mesh nodes this host has claimed
 538 * @backbone_hash: hash table containing all detected backbone gateways
 539 * @bcast_duplist: recently received broadcast packets array (for broadcast
 540 *  duplicate suppression)
 541 * @bcast_duplist_curr: index of last broadcast packet added to bcast_duplist
 542 * @bcast_duplist_lock: lock protecting bcast_duplist & bcast_duplist_curr
 543 * @claim_dest: local claim data (e.g. claim group)
 544 * @work: work queue callback item for cleanups & bla announcements
 545 */
 546#ifdef CONFIG_BATMAN_ADV_BLA
 547struct batadv_priv_bla {
 548        atomic_t num_requests;
 549        struct batadv_hashtable *claim_hash;
 550        struct batadv_hashtable *backbone_hash;
 551        struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
 552        int bcast_duplist_curr;
 553        /* protects bcast_duplist & bcast_duplist_curr */
 554        spinlock_t bcast_duplist_lock;
 555        struct batadv_bla_claim_dst claim_dest;
 556        struct delayed_work work;
 557};
 558#endif
 559
 560/**
 561 * struct batadv_priv_debug_log - debug logging data
 562 * @log_buff: buffer holding the logs (ring bufer)
 563 * @log_start: index of next character to read
 564 * @log_end: index of next character to write
 565 * @lock: lock protecting log_buff, log_start & log_end
 566 * @queue_wait: log reader's wait queue
 567 */
 568#ifdef CONFIG_BATMAN_ADV_DEBUG
 569struct batadv_priv_debug_log {
 570        char log_buff[BATADV_LOG_BUF_LEN];
 571        unsigned long log_start;
 572        unsigned long log_end;
 573        spinlock_t lock; /* protects log_buff, log_start and log_end */
 574        wait_queue_head_t queue_wait;
 575};
 576#endif
 577
 578/**
 579 * struct batadv_priv_gw - per mesh interface gateway data
 580 * @list: list of available gateway nodes
 581 * @list_lock: lock protecting gw_list & curr_gw
 582 * @curr_gw: pointer to currently selected gateway node
 583 * @bandwidth_down: advertised uplink download bandwidth (if gw_mode server)
 584 * @bandwidth_up: advertised uplink upload bandwidth (if gw_mode server)
 585 * @reselect: bool indicating a gateway re-selection is in progress
 586 */
 587struct batadv_priv_gw {
 588        struct hlist_head list;
 589        spinlock_t list_lock; /* protects gw_list & curr_gw */
 590        struct batadv_gw_node __rcu *curr_gw;  /* rcu protected pointer */
 591        atomic_t bandwidth_down;
 592        atomic_t bandwidth_up;
 593        atomic_t reselect;
 594};
 595
 596/**
 597 * struct batadv_priv_tvlv - per mesh interface tvlv data
 598 * @container_list: list of registered tvlv containers to be sent with each OGM
 599 * @handler_list: list of the various tvlv content handlers
 600 * @container_list_lock: protects tvlv container list access
 601 * @handler_list_lock: protects handler list access
 602 */
 603struct batadv_priv_tvlv {
 604        struct hlist_head container_list;
 605        struct hlist_head handler_list;
 606        spinlock_t container_list_lock; /* protects container_list */
 607        spinlock_t handler_list_lock; /* protects handler_list */
 608};
 609
 610/**
 611 * struct batadv_priv_dat - per mesh interface DAT private data
 612 * @addr: node DAT address
 613 * @hash: hashtable representing the local ARP cache
 614 * @work: work queue callback item for cache purging
 615 */
 616#ifdef CONFIG_BATMAN_ADV_DAT
 617struct batadv_priv_dat {
 618        batadv_dat_addr_t addr;
 619        struct batadv_hashtable *hash;
 620        struct delayed_work work;
 621};
 622#endif
 623
 624#ifdef CONFIG_BATMAN_ADV_MCAST
 625/**
 626 * struct batadv_priv_mcast - per mesh interface mcast data
 627 * @mla_list: list of multicast addresses we are currently announcing via TT
 628 * @want_all_unsnoopables_list: a list of orig_nodes wanting all unsnoopable
 629 *  multicast traffic
 630 * @want_all_ipv4_list: a list of orig_nodes wanting all IPv4 multicast traffic
 631 * @want_all_ipv6_list: a list of orig_nodes wanting all IPv6 multicast traffic
 632 * @flags: the flags we have last sent in our mcast tvlv
 633 * @enabled: whether the multicast tvlv is currently enabled
 634 * @num_disabled: number of nodes that have no mcast tvlv
 635 * @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP traffic
 636 * @num_want_all_ipv4: counter for items in want_all_ipv4_list
 637 * @num_want_all_ipv6: counter for items in want_all_ipv6_list
 638 * @want_lists_lock: lock for protecting modifications to mcast want lists
 639 *  (traversals are rcu-locked)
 640 */
 641struct batadv_priv_mcast {
 642        struct hlist_head mla_list;
 643        struct hlist_head want_all_unsnoopables_list;
 644        struct hlist_head want_all_ipv4_list;
 645        struct hlist_head want_all_ipv6_list;
 646        uint8_t flags;
 647        bool enabled;
 648        atomic_t num_disabled;
 649        atomic_t num_want_all_unsnoopables;
 650        atomic_t num_want_all_ipv4;
 651        atomic_t num_want_all_ipv6;
 652        /* protects want_all_{unsnoopables,ipv4,ipv6}_list */
 653        spinlock_t want_lists_lock;
 654};
 655#endif
 656
 657/**
 658 * struct batadv_priv_nc - per mesh interface network coding private data
 659 * @work: work queue callback item for cleanup
 660 * @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
 661 * @min_tq: only consider neighbors for encoding if neigh_tq > min_tq
 662 * @max_fwd_delay: maximum packet forward delay to allow coding of packets
 663 * @max_buffer_time: buffer time for sniffed packets used to decoding
 664 * @timestamp_fwd_flush: timestamp of last forward packet queue flush
 665 * @timestamp_sniffed_purge: timestamp of last sniffed packet queue purge
 666 * @coding_hash: Hash table used to buffer skbs while waiting for another
 667 *  incoming skb to code it with. Skbs are added to the buffer just before being
 668 *  forwarded in routing.c
 669 * @decoding_hash: Hash table used to buffer skbs that might be needed to decode
 670 *  a received coded skb. The buffer is used for 1) skbs arriving on the
 671 *  soft-interface; 2) skbs overheard on the hard-interface; and 3) skbs
 672 *  forwarded by batman-adv.
 673 */
 674struct batadv_priv_nc {
 675        struct delayed_work work;
 676        struct dentry *debug_dir;
 677        u8 min_tq;
 678        u32 max_fwd_delay;
 679        u32 max_buffer_time;
 680        unsigned long timestamp_fwd_flush;
 681        unsigned long timestamp_sniffed_purge;
 682        struct batadv_hashtable *coding_hash;
 683        struct batadv_hashtable *decoding_hash;
 684};
 685
 686/**
 687 * struct batadv_softif_vlan - per VLAN attributes set
 688 * @bat_priv: pointer to the mesh object
 689 * @vid: VLAN identifier
 690 * @kobj: kobject for sysfs vlan subdirectory
 691 * @ap_isolation: AP isolation state
 692 * @tt: TT private attributes (VLAN specific)
 693 * @list: list node for bat_priv::softif_vlan_list
 694 * @refcount: number of context where this object is currently in use
 695 * @rcu: struct used for freeing in a RCU-safe manner
 696 */
 697struct batadv_softif_vlan {
 698        struct batadv_priv *bat_priv;
 699        unsigned short vid;
 700        struct kobject *kobj;
 701        atomic_t ap_isolation;          /* boolean */
 702        struct batadv_vlan_tt tt;
 703        struct hlist_node list;
 704        atomic_t refcount;
 705        struct rcu_head rcu;
 706};
 707
 708/**
 709 * struct batadv_priv - per mesh interface data
 710 * @mesh_state: current status of the mesh (inactive/active/deactivating)
 711 * @soft_iface: net device which holds this struct as private data
 712 * @stats: structure holding the data for the ndo_get_stats() call
 713 * @bat_counters: mesh internal traffic statistic counters (see batadv_counters)
 714 * @aggregated_ogms: bool indicating whether OGM aggregation is enabled
 715 * @bonding: bool indicating whether traffic bonding is enabled
 716 * @fragmentation: bool indicating whether traffic fragmentation is enabled
 717 * @packet_size_max: max packet size that can be transmitted via
 718 *  multiple fragmented skbs or a single frame if fragmentation is disabled
 719 * @frag_seqno: incremental counter to identify chains of egress fragments
 720 * @bridge_loop_avoidance: bool indicating whether bridge loop avoidance is
 721 *  enabled
 722 * @distributed_arp_table: bool indicating whether distributed ARP table is
 723 *  enabled
 724 * @multicast_mode: Enable or disable multicast optimizations on this node's
 725 *  sender/originating side
 726 * @gw_mode: gateway operation: off, client or server (see batadv_gw_modes)
 727 * @gw_sel_class: gateway selection class (applies if gw_mode client)
 728 * @orig_interval: OGM broadcast interval in milliseconds
 729 * @hop_penalty: penalty which will be applied to an OGM's tq-field on every hop
 730 * @log_level: configured log level (see batadv_dbg_level)
 731 * @bcast_seqno: last sent broadcast packet sequence number
 732 * @bcast_queue_left: number of remaining buffered broadcast packet slots
 733 * @batman_queue_left: number of remaining OGM packet slots
 734 * @num_ifaces: number of interfaces assigned to this mesh interface
 735 * @mesh_obj: kobject for sysfs mesh subdirectory
 736 * @debug_dir: dentry for debugfs batman-adv subdirectory
 737 * @forw_bat_list: list of aggregated OGMs that will be forwarded
 738 * @forw_bcast_list: list of broadcast packets that will be rebroadcasted
 739 * @orig_hash: hash table containing mesh participants (orig nodes)
 740 * @forw_bat_list_lock: lock protecting forw_bat_list
 741 * @forw_bcast_list_lock: lock protecting forw_bcast_list
 742 * @orig_work: work queue callback item for orig node purging
 743 * @cleanup_work: work queue callback item for soft interface deinit
 744 * @primary_if: one of the hard interfaces assigned to this mesh interface
 745 *  becomes the primary interface
 746 * @bat_algo_ops: routing algorithm used by this mesh interface
 747 * @softif_vlan_list: a list of softif_vlan structs, one per VLAN created on top
 748 *  of the mesh interface represented by this object
 749 * @softif_vlan_list_lock: lock protecting softif_vlan_list
 750 * @bla: bridge loope avoidance data
 751 * @debug_log: holding debug logging relevant data
 752 * @gw: gateway data
 753 * @tt: translation table data
 754 * @tvlv: type-version-length-value data
 755 * @dat: distributed arp table data
 756 * @mcast: multicast data
 757 * @network_coding: bool indicating whether network coding is enabled
 758 * @batadv_priv_nc: network coding data
 759 */
 760struct batadv_priv {
 761        atomic_t mesh_state;
 762        struct net_device *soft_iface;
 763        struct net_device_stats stats;
 764        uint64_t __percpu *bat_counters; /* Per cpu counters */
 765        atomic_t aggregated_ogms;
 766        atomic_t bonding;
 767        atomic_t fragmentation;
 768        atomic_t packet_size_max;
 769        atomic_t frag_seqno;
 770#ifdef CONFIG_BATMAN_ADV_BLA
 771        atomic_t bridge_loop_avoidance;
 772#endif
 773#ifdef CONFIG_BATMAN_ADV_DAT
 774        atomic_t distributed_arp_table;
 775#endif
 776#ifdef CONFIG_BATMAN_ADV_MCAST
 777        atomic_t multicast_mode;
 778#endif
 779        atomic_t gw_mode;
 780        atomic_t gw_sel_class;
 781        atomic_t orig_interval;
 782        atomic_t hop_penalty;
 783#ifdef CONFIG_BATMAN_ADV_DEBUG
 784        atomic_t log_level;
 785#endif
 786        uint32_t isolation_mark;
 787        uint32_t isolation_mark_mask;
 788        atomic_t bcast_seqno;
 789        atomic_t bcast_queue_left;
 790        atomic_t batman_queue_left;
 791        char num_ifaces;
 792        struct kobject *mesh_obj;
 793        struct dentry *debug_dir;
 794        struct hlist_head forw_bat_list;
 795        struct hlist_head forw_bcast_list;
 796        struct batadv_hashtable *orig_hash;
 797        spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
 798        spinlock_t forw_bcast_list_lock; /* protects forw_bcast_list */
 799        struct delayed_work orig_work;
 800        struct work_struct cleanup_work;
 801        struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
 802        struct batadv_algo_ops *bat_algo_ops;
 803        struct hlist_head softif_vlan_list;
 804        spinlock_t softif_vlan_list_lock; /* protects softif_vlan_list */
 805#ifdef CONFIG_BATMAN_ADV_BLA
 806        struct batadv_priv_bla bla;
 807#endif
 808#ifdef CONFIG_BATMAN_ADV_DEBUG
 809        struct batadv_priv_debug_log *debug_log;
 810#endif
 811        struct batadv_priv_gw gw;
 812        struct batadv_priv_tt tt;
 813        struct batadv_priv_tvlv tvlv;
 814#ifdef CONFIG_BATMAN_ADV_DAT
 815        struct batadv_priv_dat dat;
 816#endif
 817#ifdef CONFIG_BATMAN_ADV_MCAST
 818        struct batadv_priv_mcast mcast;
 819#endif
 820#ifdef CONFIG_BATMAN_ADV_NC
 821        atomic_t network_coding;
 822        struct batadv_priv_nc nc;
 823#endif /* CONFIG_BATMAN_ADV_NC */
 824};
 825
 826/**
 827 * struct batadv_socket_client - layer2 icmp socket client data
 828 * @queue_list: packet queue for packets destined for this socket client
 829 * @queue_len: number of packets in the packet queue (queue_list)
 830 * @index: socket client's index in the batadv_socket_client_hash
 831 * @lock: lock protecting queue_list, queue_len & index
 832 * @queue_wait: socket client's wait queue
 833 * @bat_priv: pointer to soft_iface this client belongs to
 834 */
 835struct batadv_socket_client {
 836        struct list_head queue_list;
 837        unsigned int queue_len;
 838        unsigned char index;
 839        spinlock_t lock; /* protects queue_list, queue_len & index */
 840        wait_queue_head_t queue_wait;
 841        struct batadv_priv *bat_priv;
 842};
 843
 844/**
 845 * struct batadv_socket_packet - layer2 icmp packet for socket client
 846 * @list: list node for batadv_socket_client::queue_list
 847 * @icmp_len: size of the layer2 icmp packet
 848 * @icmp_packet: layer2 icmp packet
 849 */
 850struct batadv_socket_packet {
 851        struct list_head list;
 852        size_t icmp_len;
 853        uint8_t icmp_packet[BATADV_ICMP_MAX_PACKET_SIZE];
 854};
 855
 856/**
 857 * struct batadv_bla_backbone_gw - batman-adv gateway bridged into the LAN
 858 * @orig: originator address of backbone node (mac address of primary iface)
 859 * @vid: vlan id this gateway was detected on
 860 * @hash_entry: hlist node for batadv_priv_bla::backbone_hash
 861 * @bat_priv: pointer to soft_iface this backbone gateway belongs to
 862 * @lasttime: last time we heard of this backbone gw
 863 * @wait_periods: grace time for bridge forward delays and bla group forming at
 864 *  bootup phase - no bcast traffic is formwared until it has elapsed
 865 * @request_sent: if this bool is set to true we are out of sync with this
 866 *  backbone gateway - no bcast traffic is formwared until the situation was
 867 *  resolved
 868 * @crc: crc16 checksum over all claims
 869 * @refcount: number of contexts the object is used
 870 * @rcu: struct used for freeing in an RCU-safe manner
 871 */
 872#ifdef CONFIG_BATMAN_ADV_BLA
 873struct batadv_bla_backbone_gw {
 874        uint8_t orig[ETH_ALEN];
 875        unsigned short vid;
 876        struct hlist_node hash_entry;
 877        struct batadv_priv *bat_priv;
 878        unsigned long lasttime;
 879        atomic_t wait_periods;
 880        atomic_t request_sent;
 881        uint16_t crc;
 882        atomic_t refcount;
 883        struct rcu_head rcu;
 884};
 885
 886/**
 887 * struct batadv_bla_claim - claimed non-mesh client structure
 888 * @addr: mac address of claimed non-mesh client
 889 * @vid: vlan id this client was detected on
 890 * @batadv_bla_backbone_gw: pointer to backbone gw claiming this client
 891 * @lasttime: last time we heard of claim (locals only)
 892 * @hash_entry: hlist node for batadv_priv_bla::claim_hash
 893 * @refcount: number of contexts the object is used
 894 * @rcu: struct used for freeing in an RCU-safe manner
 895 */
 896struct batadv_bla_claim {
 897        uint8_t addr[ETH_ALEN];
 898        unsigned short vid;
 899        struct batadv_bla_backbone_gw *backbone_gw;
 900        unsigned long lasttime;
 901        struct hlist_node hash_entry;
 902        struct rcu_head rcu;
 903        atomic_t refcount;
 904};
 905#endif
 906
 907/**
 908 * struct batadv_tt_common_entry - tt local & tt global common data
 909 * @addr: mac address of non-mesh client
 910 * @vid: VLAN identifier
 911 * @hash_entry: hlist node for batadv_priv_tt::local_hash or for
 912 *  batadv_priv_tt::global_hash
 913 * @flags: various state handling flags (see batadv_tt_client_flags)
 914 * @added_at: timestamp used for purging stale tt common entries
 915 * @refcount: number of contexts the object is used
 916 * @rcu: struct used for freeing in an RCU-safe manner
 917 */
 918struct batadv_tt_common_entry {
 919        uint8_t addr[ETH_ALEN];
 920        unsigned short vid;
 921        struct hlist_node hash_entry;
 922        uint16_t flags;
 923        unsigned long added_at;
 924        atomic_t refcount;
 925        struct rcu_head rcu;
 926};
 927
 928/**
 929 * struct batadv_tt_local_entry - translation table local entry data
 930 * @common: general translation table data
 931 * @last_seen: timestamp used for purging stale tt local entries
 932 */
 933struct batadv_tt_local_entry {
 934        struct batadv_tt_common_entry common;
 935        unsigned long last_seen;
 936};
 937
 938/**
 939 * struct batadv_tt_global_entry - translation table global entry data
 940 * @common: general translation table data
 941 * @orig_list: list of orig nodes announcing this non-mesh client
 942 * @orig_list_count: number of items in the orig_list
 943 * @list_lock: lock protecting orig_list
 944 * @roam_at: time at which TT_GLOBAL_ROAM was set
 945 */
 946struct batadv_tt_global_entry {
 947        struct batadv_tt_common_entry common;
 948        struct hlist_head orig_list;
 949        atomic_t orig_list_count;
 950        spinlock_t list_lock;   /* protects orig_list */
 951        unsigned long roam_at;
 952};
 953
 954/**
 955 * struct batadv_tt_orig_list_entry - orig node announcing a non-mesh client
 956 * @orig_node: pointer to orig node announcing this non-mesh client
 957 * @ttvn: translation table version number which added the non-mesh client
 958 * @list: list node for batadv_tt_global_entry::orig_list
 959 * @refcount: number of contexts the object is used
 960 * @rcu: struct used for freeing in an RCU-safe manner
 961 */
 962struct batadv_tt_orig_list_entry {
 963        struct batadv_orig_node *orig_node;
 964        uint8_t ttvn;
 965        struct hlist_node list;
 966        atomic_t refcount;
 967        struct rcu_head rcu;
 968};
 969
 970/**
 971 * struct batadv_tt_change_node - structure for tt changes occurred
 972 * @list: list node for batadv_priv_tt::changes_list
 973 * @change: holds the actual translation table diff data
 974 */
 975struct batadv_tt_change_node {
 976        struct list_head list;
 977        struct batadv_tvlv_tt_change change;
 978};
 979
 980/**
 981 * struct batadv_tt_req_node - data to keep track of the tt requests in flight
 982 * @addr: mac address address of the originator this request was sent to
 983 * @issued_at: timestamp used for purging stale tt requests
 984 * @list: list node for batadv_priv_tt::req_list
 985 */
 986struct batadv_tt_req_node {
 987        uint8_t addr[ETH_ALEN];
 988        unsigned long issued_at;
 989        struct list_head list;
 990};
 991
 992/**
 993 * struct batadv_tt_roam_node - roaming client data
 994 * @addr: mac address of the client in the roaming phase
 995 * @counter: number of allowed roaming events per client within a single
 996 *  OGM interval (changes are committed with each OGM)
 997 * @first_time: timestamp used for purging stale roaming node entries
 998 * @list: list node for batadv_priv_tt::roam_list
 999 */
1000struct batadv_tt_roam_node {
1001        uint8_t addr[ETH_ALEN];
1002        atomic_t counter;
1003        unsigned long first_time;
1004        struct list_head list;
1005};
1006
1007/**
1008 * struct batadv_nc_node - network coding node
1009 * @list: next and prev pointer for the list handling
1010 * @addr: the node's mac address
1011 * @refcount: number of contexts the object is used by
1012 * @rcu: struct used for freeing in an RCU-safe manner
1013 * @orig_node: pointer to corresponding orig node struct
1014 * @last_seen: timestamp of last ogm received from this node
1015 */
1016struct batadv_nc_node {
1017        struct list_head list;
1018        uint8_t addr[ETH_ALEN];
1019        atomic_t refcount;
1020        struct rcu_head rcu;
1021        struct batadv_orig_node *orig_node;
1022        unsigned long last_seen;
1023};
1024
1025/**
1026 * struct batadv_nc_path - network coding path
1027 * @hash_entry: next and prev pointer for the list handling
1028 * @rcu: struct used for freeing in an RCU-safe manner
1029 * @refcount: number of contexts the object is used by
1030 * @packet_list: list of buffered packets for this path
1031 * @packet_list_lock: access lock for packet list
1032 * @next_hop: next hop (destination) of path
1033 * @prev_hop: previous hop (source) of path
1034 * @last_valid: timestamp for last validation of path
1035 */
1036struct batadv_nc_path {
1037        struct hlist_node hash_entry;
1038        struct rcu_head rcu;
1039        atomic_t refcount;
1040        struct list_head packet_list;
1041        spinlock_t packet_list_lock; /* Protects packet_list */
1042        uint8_t next_hop[ETH_ALEN];
1043        uint8_t prev_hop[ETH_ALEN];
1044        unsigned long last_valid;
1045};
1046
1047/**
1048 * struct batadv_nc_packet - network coding packet used when coding and
1049 *  decoding packets
1050 * @list: next and prev pointer for the list handling
1051 * @packet_id: crc32 checksum of skb data
1052 * @timestamp: field containing the info when the packet was added to path
1053 * @neigh_node: pointer to original next hop neighbor of skb
1054 * @skb: skb which can be encoded or used for decoding
1055 * @nc_path: pointer to path this nc packet is attached to
1056 */
1057struct batadv_nc_packet {
1058        struct list_head list;
1059        __be32 packet_id;
1060        unsigned long timestamp;
1061        struct batadv_neigh_node *neigh_node;
1062        struct sk_buff *skb;
1063        struct batadv_nc_path *nc_path;
1064};
1065
1066/**
1067 * struct batadv_skb_cb - control buffer structure used to store private data
1068 *  relevant to batman-adv in the skb->cb buffer in skbs.
1069 * @decoded: Marks a skb as decoded, which is checked when searching for coding
1070 *  opportunities in network-coding.c
1071 */
1072struct batadv_skb_cb {
1073        bool decoded;
1074};
1075
1076/**
1077 * struct batadv_forw_packet - structure for bcast packets to be sent/forwarded
1078 * @list: list node for batadv_socket_client::queue_list
1079 * @send_time: execution time for delayed_work (packet sending)
1080 * @own: bool for locally generated packets (local OGMs are re-scheduled after
1081 *  sending)
1082 * @skb: bcast packet's skb buffer
1083 * @packet_len: size of aggregated OGM packet inside the skb buffer
1084 * @direct_link_flags: direct link flags for aggregated OGM packets
1085 * @num_packets: counter for bcast packet retransmission
1086 * @delayed_work: work queue callback item for packet sending
1087 * @if_incoming: pointer to incoming hard-iface or primary iface if
1088 *  locally generated packet
1089 * @if_outgoing: packet where the packet should be sent to, or NULL if
1090 *  unspecified
1091 */
1092struct batadv_forw_packet {
1093        struct hlist_node list;
1094        unsigned long send_time;
1095        uint8_t own;
1096        struct sk_buff *skb;
1097        uint16_t packet_len;
1098        uint32_t direct_link_flags;
1099        uint8_t num_packets;
1100        struct delayed_work delayed_work;
1101        struct batadv_hard_iface *if_incoming;
1102        struct batadv_hard_iface *if_outgoing;
1103};
1104
1105/**
1106 * struct batadv_algo_ops - mesh algorithm callbacks
1107 * @list: list node for the batadv_algo_list
1108 * @name: name of the algorithm
1109 * @bat_iface_enable: init routing info when hard-interface is enabled
1110 * @bat_iface_disable: de-init routing info when hard-interface is disabled
1111 * @bat_iface_update_mac: (re-)init mac addresses of the protocol information
1112 *  belonging to this hard-interface
1113 * @bat_primary_iface_set: called when primary interface is selected / changed
1114 * @bat_ogm_schedule: prepare a new outgoing OGM for the send queue
1115 * @bat_ogm_emit: send scheduled OGM
1116 * @bat_neigh_cmp: compare the metrics of two neighbors for their respective
1117 *  outgoing interfaces
1118 * @bat_neigh_is_equiv_or_better: check if neigh1 is equally good or better
1119 *  than neigh2 for their respective outgoing interface from the metric
1120 *  prospective
1121 * @bat_orig_print: print the originator table (optional)
1122 * @bat_orig_free: free the resources allocated by the routing algorithm for an
1123 *  orig_node object
1124 * @bat_orig_add_if: ask the routing algorithm to apply the needed changes to
1125 *  the orig_node due to a new hard-interface being added into the mesh
1126 * @bat_orig_del_if: ask the routing algorithm to apply the needed changes to
1127 *  the orig_node due to an hard-interface being removed from the mesh
1128 */
1129struct batadv_algo_ops {
1130        struct hlist_node list;
1131        char *name;
1132        int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
1133        void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
1134        void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
1135        void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
1136        void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
1137        void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
1138        int (*bat_neigh_cmp)(struct batadv_neigh_node *neigh1,
1139                             struct batadv_hard_iface *if_outgoing1,
1140                             struct batadv_neigh_node *neigh2,
1141                             struct batadv_hard_iface *if_outgoing2);
1142        bool (*bat_neigh_is_equiv_or_better)
1143                (struct batadv_neigh_node *neigh1,
1144                 struct batadv_hard_iface *if_outgoing1,
1145                 struct batadv_neigh_node *neigh2,
1146                 struct batadv_hard_iface *if_outgoing2);
1147        /* orig_node handling API */
1148        void (*bat_orig_print)(struct batadv_priv *priv, struct seq_file *seq,
1149                               struct batadv_hard_iface *hard_iface);
1150        void (*bat_orig_free)(struct batadv_orig_node *orig_node);
1151        int (*bat_orig_add_if)(struct batadv_orig_node *orig_node,
1152                               int max_if_num);
1153        int (*bat_orig_del_if)(struct batadv_orig_node *orig_node,
1154                               int max_if_num, int del_if_num);
1155};
1156
1157/**
1158 * struct batadv_dat_entry - it is a single entry of batman-adv ARP backend. It
1159 * is used to stored ARP entries needed for the global DAT cache
1160 * @ip: the IPv4 corresponding to this DAT/ARP entry
1161 * @mac_addr: the MAC address associated to the stored IPv4
1162 * @vid: the vlan ID associated to this entry
1163 * @last_update: time in jiffies when this entry was refreshed last time
1164 * @hash_entry: hlist node for batadv_priv_dat::hash
1165 * @refcount: number of contexts the object is used
1166 * @rcu: struct used for freeing in an RCU-safe manner
1167 */
1168struct batadv_dat_entry {
1169        __be32 ip;
1170        uint8_t mac_addr[ETH_ALEN];
1171        unsigned short vid;
1172        unsigned long last_update;
1173        struct hlist_node hash_entry;
1174        atomic_t refcount;
1175        struct rcu_head rcu;
1176};
1177
1178/**
1179 * struct batadv_hw_addr - a list entry for a MAC address
1180 * @list: list node for the linking of entries
1181 * @addr: the MAC address of this list entry
1182 */
1183struct batadv_hw_addr {
1184        struct hlist_node list;
1185        unsigned char addr[ETH_ALEN];
1186};
1187
1188/**
1189 * struct batadv_dat_candidate - candidate destination for DAT operations
1190 * @type: the type of the selected candidate. It can one of the following:
1191 *        - BATADV_DAT_CANDIDATE_NOT_FOUND
1192 *        - BATADV_DAT_CANDIDATE_ORIG
1193 * @orig_node: if type is BATADV_DAT_CANDIDATE_ORIG this field points to the
1194 *             corresponding originator node structure
1195 */
1196struct batadv_dat_candidate {
1197        int type;
1198        struct batadv_orig_node *orig_node;
1199};
1200
1201/**
1202 * struct batadv_tvlv_container - container for tvlv appended to OGMs
1203 * @list: hlist node for batadv_priv_tvlv::container_list
1204 * @tvlv_hdr: tvlv header information needed to construct the tvlv
1205 * @value_len: length of the buffer following this struct which contains
1206 *  the actual tvlv payload
1207 * @refcount: number of contexts the object is used
1208 */
1209struct batadv_tvlv_container {
1210        struct hlist_node list;
1211        struct batadv_tvlv_hdr tvlv_hdr;
1212        atomic_t refcount;
1213};
1214
1215/**
1216 * struct batadv_tvlv_handler - handler for specific tvlv type and version
1217 * @list: hlist node for batadv_priv_tvlv::handler_list
1218 * @ogm_handler: handler callback which is given the tvlv payload to process on
1219 *  incoming OGM packets
1220 * @unicast_handler: handler callback which is given the tvlv payload to process
1221 *  on incoming unicast tvlv packets
1222 * @type: tvlv type this handler feels responsible for
1223 * @version: tvlv version this handler feels responsible for
1224 * @flags: tvlv handler flags
1225 * @refcount: number of contexts the object is used
1226 * @rcu: struct used for freeing in an RCU-safe manner
1227 */
1228struct batadv_tvlv_handler {
1229        struct hlist_node list;
1230        void (*ogm_handler)(struct batadv_priv *bat_priv,
1231                            struct batadv_orig_node *orig,
1232                            uint8_t flags,
1233                            void *tvlv_value, uint16_t tvlv_value_len);
1234        int (*unicast_handler)(struct batadv_priv *bat_priv,
1235                               uint8_t *src, uint8_t *dst,
1236                               void *tvlv_value, uint16_t tvlv_value_len);
1237        uint8_t type;
1238        uint8_t version;
1239        uint8_t flags;
1240        atomic_t refcount;
1241        struct rcu_head rcu;
1242};
1243
1244/**
1245 * enum batadv_tvlv_handler_flags - tvlv handler flags definitions
1246 * @BATADV_TVLV_HANDLER_OGM_CIFNOTFND: tvlv ogm processing function will call
1247 *  this handler even if its type was not found (with no data)
1248 * @BATADV_TVLV_HANDLER_OGM_CALLED: interval tvlv handling flag - the API marks
1249 *  a handler as being called, so it won't be called if the
1250 *  BATADV_TVLV_HANDLER_OGM_CIFNOTFND flag was set
1251 */
1252enum batadv_tvlv_handler_flags {
1253        BATADV_TVLV_HANDLER_OGM_CIFNOTFND = BIT(1),
1254        BATADV_TVLV_HANDLER_OGM_CALLED = BIT(2),
1255};
1256
1257#endif /* _NET_BATMAN_ADV_TYPES_H_ */
1258