Blame view

net/batman-adv/bitarray.c 2.58 KB
7db7d9f36   Sven Eckelmann   batman-adv: Add S...
1
  // SPDX-License-Identifier: GPL-2.0
68e039f96   Sven Eckelmann   batman-adv: Updat...
2
  /* Copyright (C) 2006-2020  B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
3
4
   *
   * Simon Wunderlich, Marek Lindner
c6c8fea29   Sven Eckelmann   net: Add batman-a...
5
   */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
6
  #include "bitarray.h"
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
7
  #include "main.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
8

1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
9
  #include <linux/bitmap.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
10

ba412080f   Sven Eckelmann   batman-adv: Conso...
11
  #include "log.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
12
  /* shift the packet array by n places. */
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
13
  static void batadv_bitmap_shift_left(unsigned long *seq_bits, s32 n)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
14
  {
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
15
  	if (n <= 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
16
  		return;
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
17
  	bitmap_shift_left(seq_bits, seq_bits, n, BATADV_TQ_LOCAL_WINDOW_SIZE);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
18
  }
7afcbbef6   Sven Eckelmann   batman-adv: Fix k...
19
  /**
7e9a8c2ce   Sven Eckelmann   batman-adv: Use p...
20
   * batadv_bit_get_packet() - receive and process one packet within the sequence
7afcbbef6   Sven Eckelmann   batman-adv: Fix k...
21
22
23
24
25
26
   *  number window
   * @priv: the bat priv with all the soft interface information
   * @seq_bits: pointer to the sequence number receive packet
   * @seq_num_diff: difference between the current/received sequence number and
   *  the last sequence number
   * @set_mark: whether this packet should be marked in seq_bits
c6c8fea29   Sven Eckelmann   net: Add batman-a...
27
   *
4b426b108   Sven Eckelmann   batman-adv: Use b...
28
29
   * Return: true if the window was moved (either new or very old),
   *  false if the window was not moved/shifted.
c6c8fea29   Sven Eckelmann   net: Add batman-a...
30
   */
4b426b108   Sven Eckelmann   batman-adv: Use b...
31
32
  bool batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
  			   s32 seq_num_diff, int set_mark)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
33
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
34
  	struct batadv_priv *bat_priv = priv;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
35
36
  
  	/* sequence number is slightly older. We already got a sequence number
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
37
38
  	 * higher than this one, so we just mark it.
  	 */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
39
  	if (seq_num_diff <= 0 && seq_num_diff > -BATADV_TQ_LOCAL_WINDOW_SIZE) {
c6c8fea29   Sven Eckelmann   net: Add batman-a...
40
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
41
  			batadv_set_bit(seq_bits, -seq_num_diff);
4b426b108   Sven Eckelmann   batman-adv: Use b...
42
  		return false;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
43
44
45
  	}
  
  	/* sequence number is slightly newer, so we shift the window and
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
46
47
  	 * set the mark if required
  	 */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
48
  	if (seq_num_diff > 0 && seq_num_diff < BATADV_TQ_LOCAL_WINDOW_SIZE) {
0f5f93226   Sven Eckelmann   batman-adv: Prefi...
49
  		batadv_bitmap_shift_left(seq_bits, seq_num_diff);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
50
51
  
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
52
  			batadv_set_bit(seq_bits, 0);
4b426b108   Sven Eckelmann   batman-adv: Use b...
53
  		return true;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
54
55
56
  	}
  
  	/* sequence number is much newer, probably missed a lot of packets */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
57
58
  	if (seq_num_diff >= BATADV_TQ_LOCAL_WINDOW_SIZE &&
  	    seq_num_diff < BATADV_EXPECTED_SEQNO_RANGE) {
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
59
  		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
60
61
62
  			   "We missed a lot of packets (%i) !
  ",
  			   seq_num_diff - 1);
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
63
  		bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
64
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
65
  			batadv_set_bit(seq_bits, 0);
4b426b108   Sven Eckelmann   batman-adv: Use b...
66
  		return true;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
67
68
69
70
71
  	}
  
  	/* received a much older packet. The other host either restarted
  	 * or the old packet got delayed somewhere in the network. The
  	 * packet should be dropped without calling this function if the
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
72
  	 * seqno window is protected.
8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
73
74
75
76
  	 *
  	 * seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE
  	 * or
  	 * seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
77
  	 */
8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
78
79
80
  	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
  		   "Other host probably restarted!
  ");
c6c8fea29   Sven Eckelmann   net: Add batman-a...
81

8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
82
83
84
  	bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
  	if (set_mark)
  		batadv_set_bit(seq_bits, 0);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
85

4b426b108   Sven Eckelmann   batman-adv: Use b...
86
  	return true;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
87
  }