| 1 |
|
| 2 | |
| 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 bitmap of received packets
|
| 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 |
|
| 47 | if (n < 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
|
| 48 | return;
|
| 49 |
|
| 50 | set_bit(n, seq_bits);
|
| 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
|