linux/net/batman-adv/main.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (C) B.A.T.M.A.N. contributors:
   3 *
   4 * Marek Lindner, Simon Wunderlich
   5 */
   6
   7#ifndef _NET_BATMAN_ADV_MAIN_H_
   8#define _NET_BATMAN_ADV_MAIN_H_
   9
  10#define BATADV_DRIVER_AUTHOR "Marek Lindner <mareklindner@neomailbox.ch>, " \
  11                             "Simon Wunderlich <sw@simonwunderlich.de>"
  12#define BATADV_DRIVER_DESC   "B.A.T.M.A.N. advanced"
  13#define BATADV_DRIVER_DEVICE "batman-adv"
  14
  15#ifndef BATADV_SOURCE_VERSION
  16#define BATADV_SOURCE_VERSION "2021.3"
  17#endif
  18
  19/* B.A.T.M.A.N. parameters */
  20
  21#define BATADV_TQ_MAX_VALUE 255
  22#define BATADV_THROUGHPUT_MAX_VALUE 0xFFFFFFFF
  23#define BATADV_JITTER 20
  24
  25/* Time To Live of broadcast messages */
  26#define BATADV_TTL 50
  27
  28/* maximum sequence number age of broadcast messages */
  29#define BATADV_BCAST_MAX_AGE 64
  30
  31/* purge originators after time in seconds if no valid packet comes in
  32 * -> TODO: check influence on BATADV_TQ_LOCAL_WINDOW_SIZE
  33 */
  34#define BATADV_PURGE_TIMEOUT 200000 /* 200 seconds */
  35#define BATADV_TT_LOCAL_TIMEOUT 600000 /* in milliseconds */
  36#define BATADV_TT_CLIENT_ROAM_TIMEOUT 600000 /* in milliseconds */
  37#define BATADV_TT_CLIENT_TEMP_TIMEOUT 600000 /* in milliseconds */
  38#define BATADV_TT_WORK_PERIOD 5000 /* 5 seconds */
  39#define BATADV_ORIG_WORK_PERIOD 1000 /* 1 second */
  40#define BATADV_MCAST_WORK_PERIOD 500 /* 0.5 seconds */
  41#define BATADV_DAT_ENTRY_TIMEOUT (5 * 60000) /* 5 mins in milliseconds */
  42/* sliding packet range of received originator messages in sequence numbers
  43 * (should be a multiple of our word size)
  44 */
  45#define BATADV_TQ_LOCAL_WINDOW_SIZE 64
  46/* milliseconds we have to keep pending tt_req */
  47#define BATADV_TT_REQUEST_TIMEOUT 3000
  48
  49#define BATADV_TQ_GLOBAL_WINDOW_SIZE 5
  50#define BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM 1
  51#define BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM 1
  52#define BATADV_TQ_TOTAL_BIDRECT_LIMIT 1
  53
  54/* B.A.T.M.A.N. V */
  55#define BATADV_THROUGHPUT_DEFAULT_VALUE 10 /* 1 Mbps */
  56#define BATADV_ELP_PROBES_PER_NODE 2
  57#define BATADV_ELP_MIN_PROBE_SIZE 200 /* bytes */
  58#define BATADV_ELP_PROBE_MAX_TX_DIFF 100 /* milliseconds */
  59#define BATADV_ELP_MAX_AGE 64
  60#define BATADV_OGM_MAX_ORIGDIFF 5
  61#define BATADV_OGM_MAX_AGE 64
  62
  63/* number of OGMs sent with the last tt diff */
  64#define BATADV_TT_OGM_APPEND_MAX 3
  65
  66/* Time in which a client can roam at most ROAMING_MAX_COUNT times in
  67 * milliseconds
  68 */
  69#define BATADV_ROAMING_MAX_TIME 20000
  70#define BATADV_ROAMING_MAX_COUNT 5
  71
  72#define BATADV_NO_FLAGS 0
  73
  74#define BATADV_NULL_IFINDEX 0 /* dummy ifindex used to avoid iface checks */
  75
  76#define BATADV_NO_MARK 0
  77
  78/* default interface for multi interface operation. The default interface is
  79 * used for communication which originated locally (i.e. is not forwarded)
  80 * or where special forwarding is not desired/necessary.
  81 */
  82#define BATADV_IF_DEFAULT       ((struct batadv_hard_iface *)NULL)
  83
  84#define BATADV_NUM_WORDS BITS_TO_LONGS(BATADV_TQ_LOCAL_WINDOW_SIZE)
  85
  86#define BATADV_LOG_BUF_LEN 8192   /* has to be a power of 2 */
  87
  88/* number of packets to send for broadcasts on different interface types */
  89#define BATADV_NUM_BCASTS_DEFAULT 1
  90#define BATADV_NUM_BCASTS_WIRELESS 3
  91
  92/* length of the single packet used by the TP meter */
  93#define BATADV_TP_PACKET_LEN ETH_DATA_LEN
  94
  95/* msecs after which an ARP_REQUEST is sent in broadcast as fallback */
  96#define ARP_REQ_DELAY 250
  97/* numbers of originator to contact for any PUT/GET DHT operation */
  98#define BATADV_DAT_CANDIDATES_NUM 3
  99
 100/* BATADV_TQ_SIMILARITY_THRESHOLD - TQ points that a secondary metric can differ
 101 * at most from the primary one in order to be still considered acceptable
 102 */
 103#define BATADV_TQ_SIMILARITY_THRESHOLD 50
 104
 105/* should not be bigger than 512 bytes or change the size of
 106 * forw_packet->direct_link_flags
 107 */
 108#define BATADV_MAX_AGGREGATION_BYTES 512
 109#define BATADV_MAX_AGGREGATION_MS 100
 110
 111#define BATADV_BLA_PERIOD_LENGTH        10000   /* 10 seconds */
 112#define BATADV_BLA_BACKBONE_TIMEOUT     (BATADV_BLA_PERIOD_LENGTH * 6)
 113#define BATADV_BLA_CLAIM_TIMEOUT        (BATADV_BLA_PERIOD_LENGTH * 10)
 114#define BATADV_BLA_WAIT_PERIODS         3
 115#define BATADV_BLA_LOOPDETECT_PERIODS   6
 116#define BATADV_BLA_LOOPDETECT_TIMEOUT   3000    /* 3 seconds */
 117
 118#define BATADV_DUPLIST_SIZE             16
 119#define BATADV_DUPLIST_TIMEOUT          500     /* 500 ms */
 120/* don't reset again within 30 seconds */
 121#define BATADV_RESET_PROTECTION_MS 30000
 122#define BATADV_EXPECTED_SEQNO_RANGE     65536
 123
 124#define BATADV_NC_NODE_TIMEOUT 10000 /* Milliseconds */
 125
 126/**
 127 * BATADV_TP_MAX_NUM - maximum number of simultaneously active tp sessions
 128 */
 129#define BATADV_TP_MAX_NUM 5
 130
 131/**
 132 * enum batadv_mesh_state - State of a soft interface
 133 */
 134enum batadv_mesh_state {
 135        /** @BATADV_MESH_INACTIVE: soft interface is not yet running */
 136        BATADV_MESH_INACTIVE,
 137
 138        /** @BATADV_MESH_ACTIVE: interface is up and running */
 139        BATADV_MESH_ACTIVE,
 140
 141        /** @BATADV_MESH_DEACTIVATING: interface is getting shut down */
 142        BATADV_MESH_DEACTIVATING,
 143};
 144
 145#define BATADV_BCAST_QUEUE_LEN          256
 146#define BATADV_BATMAN_QUEUE_LEN 256
 147
 148/**
 149 * enum batadv_uev_action - action type of uevent
 150 */
 151enum batadv_uev_action {
 152        /** @BATADV_UEV_ADD: gateway was selected (after none was selected) */
 153        BATADV_UEV_ADD = 0,
 154
 155        /**
 156         * @BATADV_UEV_DEL: selected gateway was removed and none is selected
 157         * anymore
 158         */
 159        BATADV_UEV_DEL,
 160
 161        /**
 162         * @BATADV_UEV_CHANGE: a different gateway was selected as based gateway
 163         */
 164        BATADV_UEV_CHANGE,
 165
 166        /**
 167         * @BATADV_UEV_LOOPDETECT: loop was detected which cannot be handled by
 168         * bridge loop avoidance
 169         */
 170        BATADV_UEV_LOOPDETECT,
 171};
 172
 173/**
 174 * enum batadv_uev_type - Type of uevent
 175 */
 176enum batadv_uev_type {
 177        /** @BATADV_UEV_GW: selected gateway was modified */
 178        BATADV_UEV_GW = 0,
 179
 180        /** @BATADV_UEV_BLA: bridge loop avoidance event */
 181        BATADV_UEV_BLA,
 182};
 183
 184#define BATADV_GW_THRESHOLD     50
 185
 186/* Number of fragment chains for each orig_node */
 187#define BATADV_FRAG_BUFFER_COUNT 8
 188/* Maximum number of fragments for one packet */
 189#define BATADV_FRAG_MAX_FRAGMENTS 16
 190/* Maxumim size of each fragment */
 191#define BATADV_FRAG_MAX_FRAG_SIZE 1280
 192/* Time to keep fragments while waiting for rest of the fragments */
 193#define BATADV_FRAG_TIMEOUT 10000
 194
 195#define BATADV_DAT_CANDIDATE_NOT_FOUND  0
 196#define BATADV_DAT_CANDIDATE_ORIG       1
 197
 198/* Debug Messages */
 199#ifdef pr_fmt
 200#undef pr_fmt
 201#endif
 202/* Append 'batman-adv: ' before kernel messages */
 203#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 204
 205/* Kernel headers */
 206
 207#include <linux/atomic.h>
 208#include <linux/compiler.h>
 209#include <linux/etherdevice.h>
 210#include <linux/if_vlan.h>
 211#include <linux/jiffies.h>
 212#include <linux/netdevice.h>
 213#include <linux/percpu.h>
 214#include <linux/skbuff.h>
 215#include <linux/types.h>
 216#include <uapi/linux/batadv_packet.h>
 217
 218#include "types.h"
 219#include "main.h"
 220
 221/**
 222 * batadv_print_vid() - return printable version of vid information
 223 * @vid: the VLAN identifier
 224 *
 225 * Return: -1 when no VLAN is used, VLAN id otherwise
 226 */
 227static inline int batadv_print_vid(unsigned short vid)
 228{
 229        if (vid & BATADV_VLAN_HAS_TAG)
 230                return (int)(vid & VLAN_VID_MASK);
 231        else
 232                return -1;
 233}
 234
 235extern struct list_head batadv_hardif_list;
 236extern unsigned int batadv_hardif_generation;
 237
 238extern unsigned char batadv_broadcast_addr[];
 239extern struct workqueue_struct *batadv_event_workqueue;
 240
 241int batadv_mesh_init(struct net_device *soft_iface);
 242void batadv_mesh_free(struct net_device *soft_iface);
 243bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr);
 244int batadv_max_header_len(void);
 245void batadv_skb_set_priority(struct sk_buff *skb, int offset);
 246int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 247                           struct packet_type *ptype,
 248                           struct net_device *orig_dev);
 249int
 250batadv_recv_handler_register(u8 packet_type,
 251                             int (*recv_handler)(struct sk_buff *,
 252                                                 struct batadv_hard_iface *));
 253void batadv_recv_handler_unregister(u8 packet_type);
 254__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr);
 255
 256/**
 257 * batadv_compare_eth() - Compare two not u16 aligned Ethernet addresses
 258 * @data1: Pointer to a six-byte array containing the Ethernet address
 259 * @data2: Pointer other six-byte array containing the Ethernet address
 260 *
 261 * note: can't use ether_addr_equal() as it requires aligned memory
 262 *
 263 * Return: true if they are the same ethernet addr
 264 */
 265static inline bool batadv_compare_eth(const void *data1, const void *data2)
 266{
 267        return ether_addr_equal_unaligned(data1, data2);
 268}
 269
 270/**
 271 * batadv_has_timed_out() - compares current time (jiffies) and timestamp +
 272 *  timeout
 273 * @timestamp:          base value to compare with (in jiffies)
 274 * @timeout:            added to base value before comparing (in milliseconds)
 275 *
 276 * Return: true if current time is after timestamp + timeout
 277 */
 278static inline bool batadv_has_timed_out(unsigned long timestamp,
 279                                        unsigned int timeout)
 280{
 281        return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
 282}
 283
 284/**
 285 * batadv_atomic_dec_not_zero() - Decrease unless the number is 0
 286 * @v: pointer of type atomic_t
 287 *
 288 * Return: non-zero if v was not 0, and zero otherwise.
 289 */
 290#define batadv_atomic_dec_not_zero(v)   atomic_add_unless((v), -1, 0)
 291
 292/**
 293 * batadv_smallest_signed_int() - Returns the smallest signed integer in two's
 294 *  complement with the sizeof x
 295 * @x: type of integer
 296 *
 297 * Return: smallest signed integer of type
 298 */
 299#define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
 300
 301/**
 302 * batadv_seq_before() - Checks if a sequence number x is a predecessor of y
 303 * @x: potential predecessor of @y
 304 * @y: value to compare @x against
 305 *
 306 * It handles overflows/underflows and can correctly check for a predecessor
 307 * unless the variable sequence number has grown by more than
 308 * 2**(bitwidth(x)-1)-1.
 309 *
 310 * This means that for a u8 with the maximum value 255, it would think:
 311 *
 312 * * when adding nothing - it is neither a predecessor nor a successor
 313 * * before adding more than 127 to the starting value - it is a predecessor,
 314 * * when adding 128 - it is neither a predecessor nor a successor,
 315 * * after adding more than 127 to the starting value - it is a successor
 316 *
 317 * Return: true when x is a predecessor of y, false otherwise
 318 */
 319#define batadv_seq_before(x, y) ({ \
 320        typeof(x)_d1 = (x); \
 321        typeof(y)_d2 = (y); \
 322        typeof(x)_dummy = (_d1 - _d2); \
 323        (void)(&_d1 == &_d2); \
 324        _dummy > batadv_smallest_signed_int(_dummy); \
 325})
 326
 327/**
 328 * batadv_seq_after() - Checks if a sequence number x is a successor of y
 329 * @x: potential successor of @y
 330 * @y: value to compare @x against
 331 *
 332 * It handles overflows/underflows and can correctly check for a successor
 333 * unless the variable sequence number has grown by more than
 334 * 2**(bitwidth(x)-1)-1.
 335 *
 336 * This means that for a u8 with the maximum value 255, it would think:
 337 *
 338 * * when adding nothing - it is neither a predecessor nor a successor
 339 * * before adding more than 127 to the starting value - it is a predecessor,
 340 * * when adding 128 - it is neither a predecessor nor a successor,
 341 * * after adding more than 127 to the starting value - it is a successor
 342 *
 343 * Return: true when x is a successor of y, false otherwise
 344 */
 345#define batadv_seq_after(x, y) batadv_seq_before(y, x)
 346
 347/**
 348 * batadv_add_counter() - Add to per cpu statistics counter of soft interface
 349 * @bat_priv: the bat priv with all the soft interface information
 350 * @idx: counter index which should be modified
 351 * @count: value to increase counter by
 352 *
 353 * Stop preemption on local cpu while incrementing the counter
 354 */
 355static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx,
 356                                      size_t count)
 357{
 358        this_cpu_add(bat_priv->bat_counters[idx], count);
 359}
 360
 361/**
 362 * batadv_inc_counter() - Increase per cpu statistics counter of soft interface
 363 * @b: the bat priv with all the soft interface information
 364 * @i: counter index which should be modified
 365 */
 366#define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
 367
 368/**
 369 * BATADV_SKB_CB() - Get batadv_skb_cb from skb control buffer
 370 * @__skb: skb holding the control buffer
 371 *
 372 * The members of the control buffer are defined in struct batadv_skb_cb in
 373 * types.h. The macro is inspired by the similar macro TCP_SKB_CB() in tcp.h.
 374 *
 375 * Return: pointer to the batadv_skb_cb of the skb
 376 */
 377#define BATADV_SKB_CB(__skb)       ((struct batadv_skb_cb *)&((__skb)->cb[0]))
 378
 379unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len);
 380bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid);
 381int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type,
 382                        enum batadv_uev_action action, const char *data);
 383
 384#endif /* _NET_BATMAN_ADV_MAIN_H_ */
 385