1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Copyright (C) B.A.T.M.A.N. contributors: |
3 | * |
4 | * Simon Wunderlich, Marek Lindner |
5 | */ |
6 | |
7 | #ifndef _NET_BATMAN_ADV_BITARRAY_H_ |
8 | #define _NET_BATMAN_ADV_BITARRAY_H_ |
9 | |
10 | #include "main.h" |
11 | |
12 | #include <linux/bitops.h> |
13 | #include <linux/compiler.h> |
14 | #include <linux/stddef.h> |
15 | #include <linux/types.h> |
16 | |
17 | /** |
18 | * batadv_test_bit() - check if bit is set in the current window |
19 | * |
20 | * @seq_bits: pointer to the sequence number receive packet |
21 | * @last_seqno: latest sequence number in seq_bits |
22 | * @curr_seqno: sequence number to test for |
23 | * |
24 | * Return: true if the corresponding bit in the given seq_bits indicates true |
25 | * and curr_seqno is within range of last_seqno. Otherwise returns false. |
26 | */ |
27 | static inline bool batadv_test_bit(const unsigned long *seq_bits, |
28 | u32 last_seqno, u32 curr_seqno) |
29 | { |
30 | s32 diff; |
31 | |
32 | diff = last_seqno - curr_seqno; |
33 | if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE) |
34 | return false; |
35 | return test_bit(diff, seq_bits) != 0; |
36 | } |
37 | |
38 | /** |
39 | * batadv_set_bit() - Turn corresponding bit on, so we can remember that we got |
40 | * the packet |
41 | * @seq_bits: bitmap of the packet receive window |
42 | * @n: relative sequence number of newly received packet |
43 | */ |
44 | static inline void batadv_set_bit(unsigned long *seq_bits, s32 n) |
45 | { |
46 | /* if too old, just drop it */ |
47 | if (n < 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE) |
48 | return; |
49 | |
50 | set_bit(nr: n, addr: seq_bits); /* turn the position on */ |
51 | } |
52 | |
53 | bool batadv_bit_get_packet(void *priv, unsigned long *seq_bits, |
54 | s32 seq_num_diff, int set_mark); |
55 | |
56 | #endif /* _NET_BATMAN_ADV_BITARRAY_H_ */ |
57 | |