17db7d9f3SSven Eckelmann /* SPDX-License-Identifier: GPL-2.0 */
2*cfa55c6dSSven Eckelmann /* Copyright (C) B.A.T.M.A.N. contributors:
3c6c8fea2SSven Eckelmann *
4c6c8fea2SSven Eckelmann * Simon Wunderlich, Marek Lindner
5c6c8fea2SSven Eckelmann */
6c6c8fea2SSven Eckelmann
7c6c8fea2SSven Eckelmann #ifndef _NET_BATMAN_ADV_BITARRAY_H_
8c6c8fea2SSven Eckelmann #define _NET_BATMAN_ADV_BITARRAY_H_
9c6c8fea2SSven Eckelmann
101e2c2a4fSSven Eckelmann #include "main.h"
111e2c2a4fSSven Eckelmann
121e2c2a4fSSven Eckelmann #include <linux/bitops.h>
131e2c2a4fSSven Eckelmann #include <linux/compiler.h>
144b426b10SSven Eckelmann #include <linux/stddef.h>
151e2c2a4fSSven Eckelmann #include <linux/types.h>
161e2c2a4fSSven Eckelmann
1762fe710fSSven Eckelmann /**
187e9a8c2cSSven Eckelmann * batadv_test_bit() - check if bit is set in the current window
197afcbbefSSven Eckelmann *
207afcbbefSSven Eckelmann * @seq_bits: pointer to the sequence number receive packet
217afcbbefSSven Eckelmann * @last_seqno: latest sequence number in seq_bits
227afcbbefSSven Eckelmann * @curr_seqno: sequence number to test for
2362fe710fSSven Eckelmann *
244b426b10SSven Eckelmann * Return: true if the corresponding bit in the given seq_bits indicates true
254b426b10SSven Eckelmann * and curr_seqno is within range of last_seqno. Otherwise returns false.
269cfc7bd6SSven Eckelmann */
batadv_test_bit(const unsigned long * seq_bits,u32 last_seqno,u32 curr_seqno)274b426b10SSven Eckelmann static inline bool batadv_test_bit(const unsigned long *seq_bits,
286b5e971aSSven Eckelmann u32 last_seqno, u32 curr_seqno)
290079d2ceSSven Eckelmann {
306b5e971aSSven Eckelmann s32 diff;
310079d2ceSSven Eckelmann
320079d2ceSSven Eckelmann diff = last_seqno - curr_seqno;
3342d0b044SSven Eckelmann if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE)
344b426b10SSven Eckelmann return false;
35dbd6b11eSLinus Lüssing return test_bit(diff, seq_bits) != 0;
360079d2ceSSven Eckelmann }
37c6c8fea2SSven Eckelmann
38e57acf8eSSven Eckelmann /**
39e57acf8eSSven Eckelmann * batadv_set_bit() - Turn corresponding bit on, so we can remember that we got
40e57acf8eSSven Eckelmann * the packet
41e57acf8eSSven Eckelmann * @seq_bits: bitmap of the packet receive window
42e57acf8eSSven Eckelmann * @n: relative sequence number of newly received packet
43e57acf8eSSven Eckelmann */
batadv_set_bit(unsigned long * seq_bits,s32 n)446b5e971aSSven Eckelmann static inline void batadv_set_bit(unsigned long *seq_bits, s32 n)
450079d2ceSSven Eckelmann {
460079d2ceSSven Eckelmann /* if too old, just drop it */
4742d0b044SSven Eckelmann if (n < 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
480079d2ceSSven Eckelmann return;
49c6c8fea2SSven Eckelmann
500079d2ceSSven Eckelmann set_bit(n, seq_bits); /* turn the position on */
510079d2ceSSven Eckelmann }
52c6c8fea2SSven Eckelmann
534b426b10SSven Eckelmann bool batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
544b426b10SSven Eckelmann s32 seq_num_diff, int set_mark);
55c6c8fea2SSven Eckelmann
56c6c8fea2SSven Eckelmann #endif /* _NET_BATMAN_ADV_BITARRAY_H_ */
57