root/net/batman-adv/main.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. batadv_print_vid
  2. batadv_compare_eth
  3. batadv_has_timed_out
  4. batadv_add_counter

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* Copyright (C) 2007-2019  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 "2019.4"
  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 #define BATADV_NUM_BCASTS_MAX 3
  92 
  93 /* length of the single packet used by the TP meter */
  94 #define BATADV_TP_PACKET_LEN ETH_DATA_LEN
  95 
  96 /* msecs after which an ARP_REQUEST is sent in broadcast as fallback */
  97 #define ARP_REQ_DELAY 250
  98 /* numbers of originator to contact for any PUT/GET DHT operation */
  99 #define BATADV_DAT_CANDIDATES_NUM 3
 100 
 101 /* BATADV_TQ_SIMILARITY_THRESHOLD - TQ points that a secondary metric can differ
 102  * at most from the primary one in order to be still considered acceptable
 103  */
 104 #define BATADV_TQ_SIMILARITY_THRESHOLD 50
 105 
 106 /* should not be bigger than 512 bytes or change the size of
 107  * forw_packet->direct_link_flags
 108  */
 109 #define BATADV_MAX_AGGREGATION_BYTES 512
 110 #define BATADV_MAX_AGGREGATION_MS 100
 111 
 112 #define BATADV_BLA_PERIOD_LENGTH        10000   /* 10 seconds */
 113 #define BATADV_BLA_BACKBONE_TIMEOUT     (BATADV_BLA_PERIOD_LENGTH * 6)
 114 #define BATADV_BLA_CLAIM_TIMEOUT        (BATADV_BLA_PERIOD_LENGTH * 10)
 115 #define BATADV_BLA_WAIT_PERIODS         3
 116 #define BATADV_BLA_LOOPDETECT_PERIODS   6
 117 #define BATADV_BLA_LOOPDETECT_TIMEOUT   3000    /* 3 seconds */
 118 
 119 #define BATADV_DUPLIST_SIZE             16
 120 #define BATADV_DUPLIST_TIMEOUT          500     /* 500 ms */
 121 /* don't reset again within 30 seconds */
 122 #define BATADV_RESET_PROTECTION_MS 30000
 123 #define BATADV_EXPECTED_SEQNO_RANGE     65536
 124 
 125 #define BATADV_NC_NODE_TIMEOUT 10000 /* Milliseconds */
 126 
 127 /**
 128  * BATADV_TP_MAX_NUM - maximum number of simultaneously active tp sessions
 129  */
 130 #define BATADV_TP_MAX_NUM 5
 131 
 132 /**
 133  * enum batadv_mesh_state - State of a soft interface
 134  */
 135 enum batadv_mesh_state {
 136         /** @BATADV_MESH_INACTIVE: soft interface is not yet running */
 137         BATADV_MESH_INACTIVE,
 138 
 139         /** @BATADV_MESH_ACTIVE: interface is up and running */
 140         BATADV_MESH_ACTIVE,
 141 
 142         /** @BATADV_MESH_DEACTIVATING: interface is getting shut down */
 143         BATADV_MESH_DEACTIVATING,
 144 };
 145 
 146 #define BATADV_BCAST_QUEUE_LEN          256
 147 #define BATADV_BATMAN_QUEUE_LEN 256
 148 
 149 /**
 150  * enum batadv_uev_action - action type of uevent
 151  */
 152 enum batadv_uev_action {
 153         /** @BATADV_UEV_ADD: gateway was selected (after none was selected) */
 154         BATADV_UEV_ADD = 0,
 155 
 156         /**
 157          * @BATADV_UEV_DEL: selected gateway was removed and none is selected
 158          * anymore
 159          */
 160         BATADV_UEV_DEL,
 161 
 162         /**
 163          * @BATADV_UEV_CHANGE: a different gateway was selected as based gateway
 164          */
 165         BATADV_UEV_CHANGE,
 166 
 167         /**
 168          * @BATADV_UEV_LOOPDETECT: loop was detected which cannot be handled by
 169          * bridge loop avoidance
 170          */
 171         BATADV_UEV_LOOPDETECT,
 172 };
 173 
 174 /**
 175  * enum batadv_uev_type - Type of uevent
 176  */
 177 enum batadv_uev_type {
 178         /** @BATADV_UEV_GW: selected gateway was modified */
 179         BATADV_UEV_GW = 0,
 180 
 181         /** @BATADV_UEV_BLA: bridge loop avoidance event */
 182         BATADV_UEV_BLA,
 183 };
 184 
 185 #define BATADV_GW_THRESHOLD     50
 186 
 187 /* Number of fragment chains for each orig_node */
 188 #define BATADV_FRAG_BUFFER_COUNT 8
 189 /* Maximum number of fragments for one packet */
 190 #define BATADV_FRAG_MAX_FRAGMENTS 16
 191 /* Maxumim size of each fragment */
 192 #define BATADV_FRAG_MAX_FRAG_SIZE 1280
 193 /* Time to keep fragments while waiting for rest of the fragments */
 194 #define BATADV_FRAG_TIMEOUT 10000
 195 
 196 #define BATADV_DAT_CANDIDATE_NOT_FOUND  0
 197 #define BATADV_DAT_CANDIDATE_ORIG       1
 198 
 199 /* Debug Messages */
 200 #ifdef pr_fmt
 201 #undef pr_fmt
 202 #endif
 203 /* Append 'batman-adv: ' before kernel messages */
 204 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 205 
 206 /* Kernel headers */
 207 
 208 #include <linux/atomic.h>
 209 #include <linux/compiler.h>
 210 #include <linux/etherdevice.h>
 211 #include <linux/if_vlan.h>
 212 #include <linux/jiffies.h>
 213 #include <linux/netdevice.h>
 214 #include <linux/percpu.h>
 215 #include <linux/seq_file.h>
 216 #include <linux/skbuff.h>
 217 #include <linux/types.h>
 218 #include <uapi/linux/batadv_packet.h>
 219 
 220 #include "types.h"
 221 #include "main.h"
 222 
 223 /**
 224  * batadv_print_vid() - return printable version of vid information
 225  * @vid: the VLAN identifier
 226  *
 227  * Return: -1 when no VLAN is used, VLAN id otherwise
 228  */
 229 static inline int batadv_print_vid(unsigned short vid)
 230 {
 231         if (vid & BATADV_VLAN_HAS_TAG)
 232                 return (int)(vid & VLAN_VID_MASK);
 233         else
 234                 return -1;
 235 }
 236 
 237 extern struct list_head batadv_hardif_list;
 238 extern unsigned int batadv_hardif_generation;
 239 
 240 extern unsigned char batadv_broadcast_addr[];
 241 extern struct workqueue_struct *batadv_event_workqueue;
 242 
 243 int batadv_mesh_init(struct net_device *soft_iface);
 244 void batadv_mesh_free(struct net_device *soft_iface);
 245 bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr);
 246 struct batadv_hard_iface *
 247 batadv_seq_print_text_primary_if_get(struct seq_file *seq);
 248 int batadv_max_header_len(void);
 249 void batadv_skb_set_priority(struct sk_buff *skb, int offset);
 250 int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 251                            struct packet_type *ptype,
 252                            struct net_device *orig_dev);
 253 int
 254 batadv_recv_handler_register(u8 packet_type,
 255                              int (*recv_handler)(struct sk_buff *,
 256                                                  struct batadv_hard_iface *));
 257 void batadv_recv_handler_unregister(u8 packet_type);
 258 __be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr);
 259 
 260 /**
 261  * batadv_compare_eth() - Compare two not u16 aligned Ethernet addresses
 262  * @data1: Pointer to a six-byte array containing the Ethernet address
 263  * @data2: Pointer other six-byte array containing the Ethernet address
 264  *
 265  * note: can't use ether_addr_equal() as it requires aligned memory
 266  *
 267  * Return: true if they are the same ethernet addr
 268  */
 269 static inline bool batadv_compare_eth(const void *data1, const void *data2)
 270 {
 271         return ether_addr_equal_unaligned(data1, data2);
 272 }
 273 
 274 /**
 275  * batadv_has_timed_out() - compares current time (jiffies) and timestamp +
 276  *  timeout
 277  * @timestamp:          base value to compare with (in jiffies)
 278  * @timeout:            added to base value before comparing (in milliseconds)
 279  *
 280  * Return: true if current time is after timestamp + timeout
 281  */
 282 static inline bool batadv_has_timed_out(unsigned long timestamp,
 283                                         unsigned int timeout)
 284 {
 285         return time_is_before_jiffies(timestamp + msecs_to_jiffies(timeout));
 286 }
 287 
 288 /**
 289  * batadv_atomic_dec_not_zero() - Decrease unless the number is 0
 290  * @v: pointer of type atomic_t
 291  *
 292  * Return: non-zero if v was not 0, and zero otherwise.
 293  */
 294 #define batadv_atomic_dec_not_zero(v)   atomic_add_unless((v), -1, 0)
 295 
 296 /**
 297  * batadv_smallest_signed_int() - Returns the smallest signed integer in two's
 298  *  complement with the sizeof x
 299  * @x: type of integer
 300  *
 301  * Return: smallest signed integer of type
 302  */
 303 #define batadv_smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
 304 
 305 /**
 306  * batadv_seq_before() - Checks if a sequence number x is a predecessor of y
 307  * @x: potential predecessor of @y
 308  * @y: value to compare @x against
 309  *
 310  * It handles overflows/underflows and can correctly check for a predecessor
 311  * unless the variable sequence number has grown by more then
 312  * 2**(bitwidth(x)-1)-1.
 313  *
 314  * This means that for a u8 with the maximum value 255, it would think:
 315  *
 316  * * when adding nothing - it is neither a predecessor nor a successor
 317  * * before adding more than 127 to the starting value - it is a predecessor,
 318  * * when adding 128 - it is neither a predecessor nor a successor,
 319  * * after adding more than 127 to the starting value - it is a successor
 320  *
 321  * Return: true when x is a predecessor of y, false otherwise
 322  */
 323 #define batadv_seq_before(x, y) ({ \
 324         typeof(x)_d1 = (x); \
 325         typeof(y)_d2 = (y); \
 326         typeof(x)_dummy = (_d1 - _d2); \
 327         (void)(&_d1 == &_d2); \
 328         _dummy > batadv_smallest_signed_int(_dummy); \
 329 })
 330 
 331 /**
 332  * batadv_seq_after() - Checks if a sequence number x is a successor of y
 333  * @x: potential sucessor of @y
 334  * @y: value to compare @x against
 335  *
 336  * It handles overflows/underflows and can correctly check for a successor
 337  * unless the variable sequence number has grown by more then
 338  * 2**(bitwidth(x)-1)-1.
 339  *
 340  * This means that for a u8 with the maximum value 255, it would think:
 341  *
 342  * * when adding nothing - it is neither a predecessor nor a successor
 343  * * before adding more than 127 to the starting value - it is a predecessor,
 344  * * when adding 128 - it is neither a predecessor nor a successor,
 345  * * after adding more than 127 to the starting value - it is a successor
 346  *
 347  * Return: true when x is a successor of y, false otherwise
 348  */
 349 #define batadv_seq_after(x, y) batadv_seq_before(y, x)
 350 
 351 /**
 352  * batadv_add_counter() - Add to per cpu statistics counter of soft interface
 353  * @bat_priv: the bat priv with all the soft interface information
 354  * @idx: counter index which should be modified
 355  * @count: value to increase counter by
 356  *
 357  * Stop preemption on local cpu while incrementing the counter
 358  */
 359 static inline void batadv_add_counter(struct batadv_priv *bat_priv, size_t idx,
 360                                       size_t count)
 361 {
 362         this_cpu_add(bat_priv->bat_counters[idx], count);
 363 }
 364 
 365 /**
 366  * batadv_inc_counter() - Increase per cpu statistics counter of soft interface
 367  * @b: the bat priv with all the soft interface information
 368  * @i: counter index which should be modified
 369  */
 370 #define batadv_inc_counter(b, i) batadv_add_counter(b, i, 1)
 371 
 372 /**
 373  * BATADV_SKB_CB() - Get batadv_skb_cb from skb control buffer
 374  * @__skb: skb holding the control buffer
 375  *
 376  * The members of the control buffer are defined in struct batadv_skb_cb in
 377  * types.h. The macro is inspired by the similar macro TCP_SKB_CB() in tcp.h.
 378  *
 379  * Return: pointer to the batadv_skb_cb of the skb
 380  */
 381 #define BATADV_SKB_CB(__skb)       ((struct batadv_skb_cb *)&((__skb)->cb[0]))
 382 
 383 unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len);
 384 bool batadv_vlan_ap_isola_get(struct batadv_priv *bat_priv, unsigned short vid);
 385 int batadv_throw_uevent(struct batadv_priv *bat_priv, enum batadv_uev_type type,
 386                         enum batadv_uev_action action, const char *data);
 387 
 388 #endif /* _NET_BATMAN_ADV_MAIN_H_ */

/* [<][>][^][v][top][bottom][index][help] */