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_TX,
 149        BATADV_CNT_TX_BYTES,
 150        BATADV_CNT_TX_DROPPED,
 151        BATADV_CNT_RX,
 152        BATADV_CNT_RX_BYTES,
 153        BATADV_CNT_FORWARD,
 154        BATADV_CNT_FORWARD_BYTES,
 155        BATADV_CNT_MGMT_TX,
 156        BATADV_CNT_MGMT_TX_BYTES,
 157        BATADV_CNT_MGMT_RX,
 158        BATADV_CNT_MGMT_RX_BYTES,
 159        BATADV_CNT_TT_REQUEST_TX,
 160        BATADV_CNT_TT_REQUEST_RX,
 161        BATADV_CNT_TT_RESPONSE_TX,
 162        BATADV_CNT_TT_RESPONSE_RX,
 163        BATADV_CNT_TT_ROAM_ADV_TX,
 164        BATADV_CNT_TT_ROAM_ADV_RX,
 165        BATADV_CNT_NUM,
 166};
 167
 168/**
 169 * struct batadv_priv_tt - per mesh interface translation table data
 170 * @vn: translation table version number
 171 * @local_changes: changes registered in an originator interval
 172 * @poss_change: Detect an ongoing roaming phase. If true, then this node
 173 *  received a roaming_adv and has to inspect every packet directed to it to
 174 *  check whether it still is the true destination or not. This flag will be
 175 *  reset to false as soon as the this node's ttvn is increased
 176 * @changes_list: tracks tt local changes within an originator interval
 177 * @req_list: list of pending tt_requests
 178 * @local_crc: Checksum of the local table, recomputed before sending a new OGM
 179 */
 180struct batadv_priv_tt {
 181        atomic_t vn;
 182        atomic_t ogm_append_cnt;
 183        atomic_t local_changes;
 184        bool poss_change;
 185        struct list_head changes_list;
 186        struct batadv_hashtable *local_hash;
 187        struct batadv_hashtable *global_hash;
 188        struct list_head req_list;
 189        struct list_head roam_list;
 190        spinlock_t changes_list_lock; /* protects changes */
 191        spinlock_t req_list_lock; /* protects req_list */
 192        spinlock_t roam_list_lock; /* protects roam_list */
 193        atomic_t local_entry_num;
 194        uint16_t local_crc;
 195        unsigned char *last_changeset;
 196        int16_t last_changeset_len;
 197        spinlock_t last_changeset_lock; /* protects last_changeset */
 198        struct delayed_work work;
 199};
 200
 201#ifdef CONFIG_BATMAN_ADV_BLA
 202struct batadv_priv_bla {
 203        atomic_t num_requests; /* number of bla requests in flight */
 204        struct batadv_hashtable *claim_hash;
 205        struct batadv_hashtable *backbone_hash;
 206        struct batadv_bcast_duplist_entry bcast_duplist[BATADV_DUPLIST_SIZE];
 207        int bcast_duplist_curr;
 208        /* protects bcast_duplist and bcast_duplist_curr */
 209        spinlock_t bcast_duplist_lock;
 210        struct batadv_bla_claim_dst claim_dest;
 211        struct delayed_work work;
 212};
 213#endif
 214
 215struct batadv_priv_gw {
 216        struct hlist_head list;
 217        spinlock_t list_lock; /* protects gw_list and curr_gw */
 218        struct batadv_gw_node __rcu *curr_gw;  /* rcu protected pointer */
 219        atomic_t reselect;
 220};
 221
 222struct batadv_priv_vis {
 223        struct list_head send_list;
 224        struct batadv_hashtable *hash;
 225        spinlock_t hash_lock; /* protects hash */
 226        spinlock_t list_lock; /* protects info::recv_list */
 227        struct delayed_work work;
 228        struct batadv_vis_info *my_info;
 229};
 230
 231struct batadv_priv {
 232        atomic_t mesh_state;
 233        struct net_device_stats stats;
 234        uint64_t __percpu *bat_counters; /* Per cpu counters */
 235        atomic_t aggregated_ogms;       /* boolean */
 236        atomic_t bonding;               /* boolean */
 237        atomic_t fragmentation;         /* boolean */
 238        atomic_t ap_isolation;          /* boolean */
 239        atomic_t bridge_loop_avoidance; /* boolean */
 240        atomic_t vis_mode;              /* VIS_TYPE_* */
 241        atomic_t gw_mode;               /* GW_MODE_* */
 242        atomic_t gw_sel_class;          /* uint */
 243        atomic_t gw_bandwidth;          /* gw bandwidth */
 244        atomic_t orig_interval;         /* uint */
 245        atomic_t hop_penalty;           /* uint */
 246        atomic_t log_level;             /* uint */
 247        atomic_t bcast_seqno;
 248        atomic_t bcast_queue_left;
 249        atomic_t batman_queue_left;
 250        char num_ifaces;
 251        struct batadv_debug_log *debug_log;
 252        struct kobject *mesh_obj;
 253        struct dentry *debug_dir;
 254        struct hlist_head forw_bat_list;
 255        struct hlist_head forw_bcast_list;
 256        struct batadv_hashtable *orig_hash;
 257        spinlock_t forw_bat_list_lock; /* protects forw_bat_list */
 258        spinlock_t forw_bcast_list_lock; /* protects  */
 259        struct delayed_work orig_work;
 260        struct batadv_hard_iface __rcu *primary_if;  /* rcu protected pointer */
 261        struct batadv_algo_ops *bat_algo_ops;
 262#ifdef CONFIG_BATMAN_ADV_BLA
 263        struct batadv_priv_bla bla;
 264#endif
 265        struct batadv_priv_gw gw;
 266        struct batadv_priv_tt tt;
 267        struct batadv_priv_vis vis;
 268};
 269
 270struct batadv_socket_client {
 271        struct list_head queue_list;
 272        unsigned int queue_len;
 273        unsigned char index;
 274        spinlock_t lock; /* protects queue_list, queue_len, index */
 275        wait_queue_head_t queue_wait;
 276        struct batadv_priv *bat_priv;
 277};
 278
 279struct batadv_socket_packet {
 280        struct list_head list;
 281        size_t icmp_len;
 282        struct batadv_icmp_packet_rr icmp_packet;
 283};
 284
 285struct batadv_tt_common_entry {
 286        uint8_t addr[ETH_ALEN];
 287        struct hlist_node hash_entry;
 288        uint16_t flags;
 289        unsigned long added_at;
 290        atomic_t refcount;
 291        struct rcu_head rcu;
 292};
 293
 294struct batadv_tt_local_entry {
 295        struct batadv_tt_common_entry common;
 296        unsigned long last_seen;
 297};
 298
 299struct batadv_tt_global_entry {
 300        struct batadv_tt_common_entry common;
 301        struct hlist_head orig_list;
 302        spinlock_t list_lock;   /* protects the list */
 303        unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
 304};
 305
 306struct batadv_tt_orig_list_entry {
 307        struct batadv_orig_node *orig_node;
 308        uint8_t ttvn;
 309        atomic_t refcount;
 310        struct rcu_head rcu;
 311        struct hlist_node list;
 312};
 313
 314#ifdef CONFIG_BATMAN_ADV_BLA
 315struct batadv_backbone_gw {
 316        uint8_t orig[ETH_ALEN];
 317        short vid;              /* used VLAN ID */
 318        struct hlist_node hash_entry;
 319        struct batadv_priv *bat_priv;
 320        unsigned long lasttime; /* last time we heard of this backbone gw */
 321        atomic_t request_sent;
 322        atomic_t refcount;
 323        struct rcu_head rcu;
 324        uint16_t crc;           /* crc checksum over all claims */
 325};
 326
 327struct batadv_claim {
 328        uint8_t addr[ETH_ALEN];
 329        short vid;
 330        struct batadv_backbone_gw *backbone_gw;
 331        unsigned long lasttime; /* last time we heard of claim (locals only) */
 332        struct rcu_head rcu;
 333        atomic_t refcount;
 334        struct hlist_node hash_entry;
 335};
 336#endif
 337
 338struct batadv_tt_change_node {
 339        struct list_head list;
 340        struct batadv_tt_change change;
 341};
 342
 343struct batadv_tt_req_node {
 344        uint8_t addr[ETH_ALEN];
 345        unsigned long issued_at;
 346        struct list_head list;
 347};
 348
 349struct batadv_tt_roam_node {
 350        uint8_t addr[ETH_ALEN];
 351        atomic_t counter;
 352        unsigned long first_time;
 353        struct list_head list;
 354};
 355
 356/*      forw_packet - structure for forw_list maintaining packets to be
 357 *                    send/forwarded
 358 */
 359struct batadv_forw_packet {
 360        struct hlist_node list;
 361        unsigned long send_time;
 362        uint8_t own;
 363        struct sk_buff *skb;
 364        uint16_t packet_len;
 365        uint32_t direct_link_flags;
 366        uint8_t num_packets;
 367        struct delayed_work delayed_work;
 368        struct batadv_hard_iface *if_incoming;
 369};
 370
 371/* While scanning for vis-entries of a particular vis-originator
 372 * this list collects its interfaces to create a subgraph/cluster
 373 * out of them later
 374 */
 375struct batadv_if_list_entry {
 376        uint8_t addr[ETH_ALEN];
 377        bool primary;
 378        struct hlist_node list;
 379};
 380
 381struct batadv_debug_log {
 382        char log_buff[BATADV_LOG_BUF_LEN];
 383        unsigned long log_start;
 384        unsigned long log_end;
 385        spinlock_t lock; /* protects log_buff, log_start and log_end */
 386        wait_queue_head_t queue_wait;
 387};
 388
 389struct batadv_frag_packet_list_entry {
 390        struct list_head list;
 391        uint16_t seqno;
 392        struct sk_buff *skb;
 393};
 394
 395struct batadv_vis_info {
 396        unsigned long first_seen;
 397        /* list of server-neighbors we received a vis-packet
 398         * from.  we should not reply to them.
 399         */
 400        struct list_head recv_list;
 401        struct list_head send_list;
 402        struct kref refcount;
 403        struct hlist_node hash_entry;
 404        struct batadv_priv *bat_priv;
 405        /* this packet might be part of the vis send queue. */
 406        struct sk_buff *skb_packet;
 407        /* vis_info may follow here */
 408} __packed;
 409
 410struct batadv_vis_info_entry {
 411        uint8_t  src[ETH_ALEN];
 412        uint8_t  dest[ETH_ALEN];
 413        uint8_t  quality;       /* quality = 0 client */
 414} __packed;
 415
 416struct batadv_recvlist_node {
 417        struct list_head list;
 418        uint8_t mac[ETH_ALEN];
 419};
 420
 421struct batadv_algo_ops {
 422        struct hlist_node list;
 423        char *name;
 424        /* init routing info when hard-interface is enabled */
 425        int (*bat_iface_enable)(struct batadv_hard_iface *hard_iface);
 426        /* de-init routing info when hard-interface is disabled */
 427        void (*bat_iface_disable)(struct batadv_hard_iface *hard_iface);
 428        /* (re-)init mac addresses of the protocol information
 429         * belonging to this hard-interface
 430         */
 431        void (*bat_iface_update_mac)(struct batadv_hard_iface *hard_iface);
 432        /* called when primary interface is selected / changed */
 433        void (*bat_primary_iface_set)(struct batadv_hard_iface *hard_iface);
 434        /* prepare a new outgoing OGM for the send queue */
 435        void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface);
 436        /* send scheduled OGM */
 437        void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet);
 438};
 439
 440#endif /* _NET_BATMAN_ADV_TYPES_H_ */
 441
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.