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