Blame view

net/batman-adv/bitarray.c 2.77 KB
e19f9759e   Simon Wunderlich   batman-adv: updat...
1
  /* Copyright (C) 2006-2014 B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
2
3
4
5
6
7
8
9
10
11
12
13
14
   *
   * Simon Wunderlich, Marek Lindner
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of version 2 of the GNU General Public
   * License as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
ebf38fb7a   Antonio Quartulli   batman-adv: remov...
15
   * along with this program; if not, see <http://www.gnu.org/licenses/>.
c6c8fea29   Sven Eckelmann   net: Add batman-a...
16
17
18
19
20
21
   */
  
  #include "main.h"
  #include "bitarray.h"
  
  #include <linux/bitops.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
22
  /* shift the packet array by n places. */
0f5f93226   Sven Eckelmann   batman-adv: Prefi...
23
  static void batadv_bitmap_shift_left(unsigned long *seq_bits, int32_t n)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
24
  {
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
25
  	if (n <= 0 || n >= BATADV_TQ_LOCAL_WINDOW_SIZE)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
26
  		return;
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
27
  	bitmap_shift_left(seq_bits, seq_bits, n, BATADV_TQ_LOCAL_WINDOW_SIZE);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
28
  }
c6c8fea29   Sven Eckelmann   net: Add batman-a...
29
30
31
32
33
34
  /* receive and process one packet within the sequence number window.
   *
   * returns:
   *  1 if the window was moved (either new or very old)
   *  0 if the window was not moved/shifted.
   */
0f5f93226   Sven Eckelmann   batman-adv: Prefi...
35
36
  int batadv_bit_get_packet(void *priv, unsigned long *seq_bits,
  			  int32_t seq_num_diff, int set_mark)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
37
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
38
  	struct batadv_priv *bat_priv = priv;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
39
40
  
  	/* sequence number is slightly older. We already got a sequence number
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
41
42
  	 * higher than this one, so we just mark it.
  	 */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
43
  	if (seq_num_diff <= 0 && seq_num_diff > -BATADV_TQ_LOCAL_WINDOW_SIZE) {
c6c8fea29   Sven Eckelmann   net: Add batman-a...
44
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
45
  			batadv_set_bit(seq_bits, -seq_num_diff);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
46
47
48
49
  		return 0;
  	}
  
  	/* sequence number is slightly newer, so we shift the window and
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
50
51
  	 * set the mark if required
  	 */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
52
  	if (seq_num_diff > 0 && seq_num_diff < BATADV_TQ_LOCAL_WINDOW_SIZE) {
0f5f93226   Sven Eckelmann   batman-adv: Prefi...
53
  		batadv_bitmap_shift_left(seq_bits, seq_num_diff);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
54
55
  
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
56
  			batadv_set_bit(seq_bits, 0);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
57
58
59
60
  		return 1;
  	}
  
  	/* sequence number is much newer, probably missed a lot of packets */
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
61
62
  	if (seq_num_diff >= BATADV_TQ_LOCAL_WINDOW_SIZE &&
  	    seq_num_diff < BATADV_EXPECTED_SEQNO_RANGE) {
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
63
  		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
64
65
66
  			   "We missed a lot of packets (%i) !
  ",
  			   seq_num_diff - 1);
42d0b044b   Sven Eckelmann   batman-adv: Prefi...
67
  		bitmap_zero(seq_bits, BATADV_TQ_LOCAL_WINDOW_SIZE);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
68
  		if (set_mark)
9b4a1159d   Sven Eckelmann   batman-adv: Prefi...
69
  			batadv_set_bit(seq_bits, 0);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
70
71
72
73
74
75
  		return 1;
  	}
  
  	/* 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...
76
  	 * seqno window is protected.
8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
77
78
79
80
  	 *
  	 * seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE
  	 * or
  	 * seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
81
  	 */
8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
82
83
84
  	batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
  		   "Other host probably restarted!
  ");
c6c8fea29   Sven Eckelmann   net: Add batman-a...
85

8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
86
87
88
  	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...
89

8e7c15d6b   Sven Eckelmann   batman-adv: Remov...
90
  	return 1;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
91
  }