linux/net/batman-adv/types.h
<<
>>
Prefs
   1/* Copyright (C) 2007-2012 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, write to the Free Software
  16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17 * 02110-1301, USA
  18 */
  19
  20#ifndef _NET_BATMAN_ADV_TYPES_H_
  21#define _NET_BATMAN_ADV_TYPES_H_
  22
  23#include "packet.h"
  24#include "bitarray.h"
  25#include <linux/kernel.h>
  26
  27#define BATADV_HEADER_LEN \
  28        (ETH_HLEN + max(sizeof(struct batadv_unicast_packet), \
  29                        sizeof(struct batadv_bcast_packet)))
  30
  31struct batadv_hard_iface {
  32        struct list_head list;
  33        int16_t if_num;
  34        char if_status;
  35        struct net_device *net_dev;
  36        atomic_t seqno;
  37        atomic_t frag_seqno;
  38        unsigned char *packet_buff;
  39        int packet_len;
  40        struct kobject *hardif_obj;
  41        atomic_t refcount;
  42        struct packet_type batman_adv_ptype;
  43        struct net_device *soft_iface;
  44        struct rcu_head rcu;
  45};
  46
  47/**
  48 *      struct batadv_orig_node - structure for orig_list maintaining nodes of mesh
  49 *      @primary_addr: hosts primary interface address
  50 *      @last_seen: when last packet from this node was received
  51 *      @bcast_seqno_reset: time when the broadcast seqno window was reset
  52 *      @batman_seqno_reset: time when the batman seqno window was reset
  53 *      @gw_flags: flags related to gateway class
  54 *      @flags: for now only VIS_SERVER flag
  55 *      @last_real_seqno: last and best known sequence number
  56 *      @last_ttl: ttl of last received packet
  57 *      @last_bcast_seqno: last broadcast sequence number received by this host
  58 *
  59 *      @candidates: how many candidates are available
  60 *      @selected: next bonding candidate
  61 */
  62struct batadv_orig_node {
  63        uint8_t orig[ETH_ALEN];
  64        uint8_t primary_addr[ETH_ALEN];
  65        struct batadv_neigh_node __rcu *router; /* rcu protected pointer */
  66        unsigned long *bcast_own;
  67        uint8_t *bcast_own_sum;
  68        unsigned long last_seen;
  69        unsigned long bcast_seqno_reset;
  70        unsigned long batman_seqno_reset;
  71        uint8_t gw_flags;
  72        uint8_t flags;
  73        atomic_t last_ttvn; /* last seen translation table version number */
  74        uint16_t tt_crc;
  75        unsigned char *tt_buff;
  76        int16_t tt_buff_len;
  77        spinlock_t tt_buff_lock; /* protects tt_buff */
  78        atomic_t tt_size;
  79        bool tt_initialised;
  80        /* The tt_poss_change flag is used to detect an ongoing roaming phase.
  81         * If true, then I sent a Roaming_adv to this orig_node and I have to
  82         * inspect every packet directed to it to check whether it is still
  83         * the true destination or not. This flag will be reset to false as
  84         * soon as I receive a new TTVN from this orig_node
  85         */
  86        bool tt_poss_change;
  87        uint32_t last_real_seqno;
  88        uint8_t last_ttl;
  89        DECLARE_BITMAP(bcast_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
  90        uint32_t last_bcast_seqno;
  91        struct hlist_head neigh_list;
  92        struct list_head frag_list;
  93        spinlock_t neigh_list_lock; /* protects neigh_list and router */
  94        atomic_t refcount;
  95        struct rcu_head rcu;
  96        struct hlist_node hash_entry;
  97        struct batadv_priv *bat_priv;
  98        unsigned long last_frag_packet;
  99        /* ogm_cnt_lock protects: bcast_own, bcast_own_sum,
 100         * neigh_node->real_bits, neigh_node->real_packet_count
 101         */
 102        spinlock_t ogm_cnt_lock;
 103        /* bcast_seqno_lock protects bcast_bits, last_bcast_seqno */
 104        spinlock_t bcast_seqno_lock;
 105        spinlock_t tt_list_lock; /* protects tt_list */
 106        atomic_t bond_candidates;
 107        struct list_head bond_list;
 108};
 109
 110struct batadv_gw_node {
 111        struct hlist_node list;
 112        struct batadv_orig_node *orig_node;
 113        unsigned long deleted;
 114        atomic_t refcount;
 115        struct rcu_head rcu;
 116};
 117
 118/*      batadv_neigh_node
 119 *      @last_seen: when last packet via this neighbor was received
 120 */
 121struct batadv_neigh_node {
 122        struct hlist_node list;
 123        uint8_t addr[ETH_ALEN];
 124        uint8_t real_packet_count;
 125        uint8_t tq_recv[BATADV_TQ_GLOBAL_WINDOW_SIZE];
 126        uint8_t tq_index;
 127        uint8_t tq_avg;
 128        uint8_t last_ttl;
 129        struct list_head bonding_list;
 130        unsigned long last_seen;
 131        DECLARE_BITMAP(real_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
 132        atomic_t refcount;
 133        struct rcu_head rcu;
 134        struct batadv_orig_node *orig_node;
 135        struct batadv_hard_iface *if_incoming;
 136        spinlock_t lq_update_lock;      /* protects: tq_recv, tq_index */
 137};
 138
 139#ifdef CONFIG_BATMAN_ADV_BLA
 140struct batadv_bcast_duplist_entry {
 141        uint8_t orig[ETH_ALEN];
 142        uint16_t crc;
 143        unsigned long entrytime;
 144};
 145#endif
 146
 147enum batadv_counters {
 148        BATADV_CNT_FORWARD,
 149        BATADV_CNT_FORWARD_BYTES,
 150        BATADV_CNT_MGMT_TX,
 151        BATADV_CNT_MGMT_TX_BYTES,
 152        BATADV_CNT_MGMT_RX,
 153        BATADV_CNT_MGMT_RX_BYTES,
 154        BATADV_CNT_TT_REQUEST_TX,
 155        BATADV_CNT_TT_REQUEST_RX,
 156        BATADV_CNT_TT_RESPONSE_TX,
 157        BATADV_CNT_TT_RESPONSE_RX,
 158        BATADV_CNT_TT_ROAM_ADV_TX,
 159        BATADV_CNT_TT_ROAM_ADV_RX,
 160        BATADV_CNT_NUM,
 161};
 162
 163struct batadv_priv {
 164        atomic_t mesh_state;
 165        struct net_device_stats stats;
 166        uint64_t __percpu *bat_counters; /* Per cpu counters */
 167        atomic_t aggregated_ogms;       /* boolean */
 168        atomic_t bonding;               /* boolean */
 169        atomic_t fragmentation;         /* boolean */
 170        atomic_t ap_isolation;          /* boolean */
 171        atomic_t bridge_loop_avoidance; /* boolean */
 172        atomic_t vis_mode;              /* VIS_TYPE_* */
 173        atomic_t gw_mode;               /* GW_MODE_* */
 174        atomic_t gw_sel_class;          /* uint */
 175        atomic_t gw_bandwidth;          /* gw bandwidth */
 176        atomic_t orig_interval;         /* uint */
 177        atomic_t hop_penalty;           /* uint */
 178        atomic_t log_level;             /* uint */
 179        atomic_t bcast_seqno;
 180        atomic_t bcast_queue_left;
 181        atomic_t batman_queue_left;
 182        atomic_t ttvn; /* translation table version number */
 183        atomic_t tt_ogm_append_cnt;
 184        atomic_t tt_local_changes; /* changes registered in a OGM interval */
 185        atomic_t bla_num_requests; /* number of bla requests in flight */
 186        /* The tt_poss_change flag is used to detect an ongoing roaming phase.
 187         * If true, then I received a Roaming_adv and I have to inspect every
 188         * packet directed to me to check whether I am still the true
 189         * destination or not. This flag will be reset to false as soon as I
 190         * increase my TTVN
 191         */
 192        bool tt_poss_change;
 193        char num_ifaces;
 194        struct batadv_debug_log *debug_log;
 195        struct kobject *mesh_obj;
 196        struct dentry *debug_dir;
 197        struct hlist_head forw_bat_list;
 198        struct hlist_head forw_bcast_list;
 199        struct hlist_head gw_list;
 200        struct list_head tt_changes_list; /* tracks changes in a OGM int */
 201        struct list_head vis_send_list;
 202        struct batadv_hashtable *orig_hash;
 203        struct batadv_hashtable *tt_local_hash;
 204        struct batadv_hashtable *tt_global_hash;
 205#ifdef CONFIG_BATMAN_ADV_BLA
 206        struct batadv_hashtable *claim_hash;
 207        struct batadv_hashtable *backbone_hash;
 208#endif
 209        struct list_head tt_req_list; /* list of pending tt_requests */
 210        struct list_head tt_roam_list;
 211        struct batadv_hashtable *vis_hash;
 212#ifdef CONFIG_BATMAN_ADV_BLA
 213        struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
 214        int bcast_duplist_curr;
 215        struct batadv_bla_claim_dst claim_dest;
 216#endif
 217        spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
 218        spinlock_t forw_bcast_list_lock; /* protects  */
 219        spinlock_t tt_changes_list_lock; /* protects tt_changes */
 220        spinlock_t tt_req_list_lock; /* protects tt_req_list */
 221        spinlock_t tt_roam_list_lock; /* protects tt_roam_list */
 222        spinlock_t gw_list_lock; /* protects gw_list and curr_gw */
 223        spinlock_t vis_hash_lock; /* protects vis_hash */
 224        spinlock_t vis_list_lock; /* protects vis_info::recv_list */
 225        atomic_t num_local_tt;
 226        /* Checksum of the local table, recomputed before sending a new OGM */
 227        uint16_t tt_crc;
 228        unsigned char *tt_buff;
 229        int16_t tt_buff_len;
 230        spinlock_t tt_buff_lock; /* protects tt_buff */
 231        struct delayed_work tt_work;
 232        struct delayed_work orig_work;
 233        struct delayed_work vis_work;
 234        struct delayed_work bla_work;
 235        struct batadv_gw_node __rcu *curr_gw;  /* rcu protected pointer */
 236        atomic_t gw_reselect;
 237        struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
 238        struct batadv_vis_info *my_vis_info;
 239        struct batadv_algo_ops *bat_algo_ops;
 240};
 241
 242struct batadv_socket_client {
 243        struct list_head queue_list;
 244        unsigned int queue_len;
 245        unsigned char index;
 246        spinlock_t lock; /* protects queue_list, queue_len, index */
 247        wait_queue_head_t queue_wait;
 248        struct batadv_priv *bat_priv;
 249};
 250
 251struct batadv_socket_packet {
 252        struct list_head list;
 253        size_t icmp_len;
 254        struct batadv_icmp_packet_rr icmp_packet;
 255};
 256
 257struct batadv_tt_common_entry {
 258        uint8_t addr[ETH_ALEN];
 259        struct hlist_node hash_entry;
 260        uint16_t flags;
 261        atomic_t refcount;
 262        struct rcu_head rcu;
 263};
 264
 265struct batadv_tt_local_entry {
 266        struct batadv_tt_common_entry common;
 267        unsigned long last_seen;
 268};
 269
 270struct batadv_tt_global_entry {
 271        struct batadv_tt_common_entry common;
 272        struct hlist_head orig_list;
 273        spinlock_t list_lock;   /* protects the list */
 274        unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
 275};
 276
 277struct batadv_tt_orig_list_entry {
 278        struct batadv_orig_node *orig_node;
 279        uint8_t ttvn;
 280        struct rcu_head rcu;
 281        struct hlist_node list;
 282};
 283
 284#ifdef CONFIG_BATMAN_ADV_BLA
 285struct batadv_backbone_gw {
 286        uint8_t orig[ETH_ALEN];
 287        short vid;              /* used VLAN ID */
 288        struct hlist_node hash_entry;
 289        struct batadv_priv *bat_priv;
 290        unsigned long lasttime; /* last time we heard of this backbone gw */
 291        atomic_t request_sent;
 292        atomic_t refcount;
 293        struct rcu_head rcu;
 294        uint16_t crc;           /* crc checksum over all claims */
 295};
 296
 297struct batadv_claim {
 298        uint8_t addr[ETH_ALEN];
 299        short vid;
 300        struct batadv_backbone_gw *backbone_gw;
 301        unsigned long lasttime; /* last time we heard of claim (locals only) */
 302        struct rcu_head rcu;
 303        atomic_t refcount;
 304        struct hlist_node hash_entry;
 305};
 306#endif
 307
 308struct batadv_tt_change_node {
 309        struct list_head list;
 310        struct batadv_tt_change change;
 311};
 312
 313struct batadv_tt_req_node {
 314        uint8_t addr[ETH_ALEN];
 315        unsigned long issued_at;
 316        struct list_head list;
 317};
 318
 319struct batadv_tt_roam_node {
 320        uint8_t addr[ETH_ALEN];
 321        atomic_t counter;
 322        unsigned long first_time;
 323        struct list_head list;
 324};
 325
 326/*      forw_packet - structure for forw_list maintaining packets to be
 327 *                    send/forwarded
 328 */
 329struct batadv_forw_packet {
 330        struct hlist_node list;
 331        unsigned long send_time;
 332        uint8_t own;
 333        struct sk_buff *skb;
 334        uint16_t packet_len;
 335        uint32_t direct_link_flags;
 336        uint8_t num_packets;
 337        struct delayed_work delayed_work;
 338        struct batadv_hard_iface *if_incoming;
 339};
 340
 341/* While scanning for vis-entries of a particular vis-originator
 342 * this list collects its interfaces to create a subgraph/cluster
 343 * out of them later
 344 */
 345struct batadv_if_list_entry {
 346        uint8_t addr[ETH_ALEN];
 347        bool primary;
 348        struct hlist_node list;
 349};
 350
 351struct batadv_debug_log {
 352        char log_buff[BATADV_LOG_BUF_LEN];
 353        unsigned long log_start;
 354        unsigned long log_end;
 355        spinlock_t lock; /* protects log_buff, log_start and log_end */
 356        wait_queue_head_t queue_wait;
 357};
 358
 359struct batadv_frag_packet_list_entry {
 360        struct list_head list;
 361        uint16_t seqno;
 362        struct sk_buff *skb;
 363};
 364
 365struct batadv_vis_info {
 366        unsigned long first_seen;
 367        /* list of server-neighbors we received a vis-packet
 368         * from.  we should not reply to them.
 369         */
 370        struct list_head recv_list;
 371        struct list_head send_list;
 372        struct kref refcount;
 373        struct hlist_node hash_entry;
 374        struct batadv_priv *bat_priv;
 375        /* this packet might be part of the vis send queue. */
 376        struct sk_buff *skb_packet;
 377        /* vis_info may follow here */
 378} __packed;
 379
 380struct batadv_vis_info_entry {
 381        uint8_t  src[ETH_ALEN];
 382        uint8_t  dest[ETH_ALEN];
 383        uint8_t  quality;       /* quality = 0 client */
 384} __packed;
 385
 386struct batadv_recvlist_node {
 387        struct list_head list;
 388        uint8_t mac[ETH_ALEN];
 389};
 390
 391struct batadv_algo_ops {
 392        struct hlist_node list;
 393        char *name;
 394        /* init routing info when hard-interface is enabled */
 395        int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
 396        /* de-init routing info when hard-interface is disabled */
 397        void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
 398        /* (re-)init mac addresses of the protocol information
 399         * belonging to this hard-interface
 400         */
 401        void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
 402        /* called when primary interface is selected / changed */
 403        void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
 404        /* prepare a new outgoing OGM for the send queue */
 405        void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
 406        /* send scheduled OGM */
 407        void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
 408};
 409
 410#endif /* _NET_BATMAN_ADV_TYPES_H_ */
 411