xref: /openbmc/linux/net/batman-adv/bitarray.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
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