bitarray.c (0f5f9322681887ca221707afafe4216b6db5d22f) | bitarray.c (9cfc7bd608b97463993b4f3e4775d99022253f8d) |
---|---|
1/* 2 * Copyright (C) 2006-2012 B.A.T.M.A.N. contributors: | 1/* Copyright (C) 2006-2012 B.A.T.M.A.N. contributors: |
3 * 4 * Simon Wunderlich, Marek Lindner 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of version 2 of the GNU General Public 8 * License as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 * 02110-1301, USA | 2 * 3 * Simon Wunderlich, Marek Lindner 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 17 * 02110-1301, USA |
19 * | |
20 */ 21 22#include "main.h" 23#include "bitarray.h" 24 25#include <linux/bitops.h> 26 27/* shift the packet array by n places. */ --- 13 unchanged lines hidden (view full) --- 41 * 0 if the window was not moved/shifted. 42 */ 43int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, 44 int32_t seq_num_diff, int set_mark) 45{ 46 struct bat_priv *bat_priv = priv; 47 48 /* sequence number is slightly older. We already got a sequence number | 18 */ 19 20#include "main.h" 21#include "bitarray.h" 22 23#include <linux/bitops.h> 24 25/* shift the packet array by n places. */ --- 13 unchanged lines hidden (view full) --- 39 * 0 if the window was not moved/shifted. 40 */ 41int batadv_bit_get_packet(void *priv, unsigned long *seq_bits, 42 int32_t seq_num_diff, int set_mark) 43{ 44 struct bat_priv *bat_priv = priv; 45 46 /* sequence number is slightly older. We already got a sequence number |
49 * higher than this one, so we just mark it. */ 50 | 47 * higher than this one, so we just mark it. 48 */ |
51 if ((seq_num_diff <= 0) && (seq_num_diff > -TQ_LOCAL_WINDOW_SIZE)) { 52 if (set_mark) 53 bat_set_bit(seq_bits, -seq_num_diff); 54 return 0; 55 } 56 57 /* sequence number is slightly newer, so we shift the window and | 49 if ((seq_num_diff <= 0) && (seq_num_diff > -TQ_LOCAL_WINDOW_SIZE)) { 50 if (set_mark) 51 bat_set_bit(seq_bits, -seq_num_diff); 52 return 0; 53 } 54 55 /* sequence number is slightly newer, so we shift the window and |
58 * set the mark if required */ 59 | 56 * set the mark if required 57 */ |
60 if ((seq_num_diff > 0) && (seq_num_diff < TQ_LOCAL_WINDOW_SIZE)) { 61 batadv_bitmap_shift_left(seq_bits, seq_num_diff); 62 63 if (set_mark) 64 bat_set_bit(seq_bits, 0); 65 return 1; 66 } 67 68 /* sequence number is much newer, probably missed a lot of packets */ | 58 if ((seq_num_diff > 0) && (seq_num_diff < TQ_LOCAL_WINDOW_SIZE)) { 59 batadv_bitmap_shift_left(seq_bits, seq_num_diff); 60 61 if (set_mark) 62 bat_set_bit(seq_bits, 0); 63 return 1; 64 } 65 66 /* sequence number is much newer, probably missed a lot of packets */ |
69 | |
70 if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) && 71 (seq_num_diff < EXPECTED_SEQNO_RANGE)) { 72 bat_dbg(DBG_BATMAN, bat_priv, 73 "We missed a lot of packets (%i) !\n", 74 seq_num_diff - 1); 75 bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); 76 if (set_mark) 77 bat_set_bit(seq_bits, 0); 78 return 1; 79 } 80 81 /* received a much older packet. The other host either restarted 82 * or the old packet got delayed somewhere in the network. The 83 * packet should be dropped without calling this function if the | 67 if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) && 68 (seq_num_diff < EXPECTED_SEQNO_RANGE)) { 69 bat_dbg(DBG_BATMAN, bat_priv, 70 "We missed a lot of packets (%i) !\n", 71 seq_num_diff - 1); 72 bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); 73 if (set_mark) 74 bat_set_bit(seq_bits, 0); 75 return 1; 76 } 77 78 /* received a much older packet. The other host either restarted 79 * or the old packet got delayed somewhere in the network. The 80 * packet should be dropped without calling this function if the |
84 * seqno window is protected. */ 85 | 81 * seqno window is protected. 82 */ |
86 if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) || 87 (seq_num_diff >= EXPECTED_SEQNO_RANGE)) { 88 89 bat_dbg(DBG_BATMAN, bat_priv, 90 "Other host probably restarted!\n"); 91 92 bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); 93 if (set_mark) 94 bat_set_bit(seq_bits, 0); 95 96 return 1; 97 } 98 99 /* never reached */ 100 return 0; 101} | 83 if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE) || 84 (seq_num_diff >= EXPECTED_SEQNO_RANGE)) { 85 86 bat_dbg(DBG_BATMAN, bat_priv, 87 "Other host probably restarted!\n"); 88 89 bitmap_zero(seq_bits, TQ_LOCAL_WINDOW_SIZE); 90 if (set_mark) 91 bat_set_bit(seq_bits, 0); 92 93 return 1; 94 } 95 96 /* never reached */ 97 return 0; 98} |