cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

main.h (12397B)


      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 "2022.2"
     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_ */