2017-11-19 15:05:11 +01:00
// SPDX-License-Identifier: GPL-2.0
2018-12-31 23:59:59 +01:00
/* Copyright (C) 2006-2019 B.A.T.M.A.N. contributors:
2010-12-13 11:19:28 +00:00
*
* Simon Wunderlich , Marek Lindner
*/
# include "bitarray.h"
2015-04-17 19:40:28 +02:00
# include "main.h"
2010-12-13 11:19:28 +00:00
2015-04-17 19:40:28 +02:00
# include <linux/bitmap.h>
2010-12-13 11:19:28 +00:00
2016-05-15 23:48:31 +02:00
# include "log.h"
2010-12-13 11:19:28 +00:00
/* shift the packet array by n places. */
2015-05-26 18:34:26 +02:00
static void batadv_bitmap_shift_left ( unsigned long * seq_bits , s32 n )
2010-12-13 11:19:28 +00:00
{
2012-06-03 22:19:17 +02:00
if ( n < = 0 | | n > = BATADV_TQ_LOCAL_WINDOW_SIZE )
2010-12-13 11:19:28 +00:00
return ;
2012-06-03 22:19:17 +02:00
bitmap_shift_left ( seq_bits , seq_bits , n , BATADV_TQ_LOCAL_WINDOW_SIZE ) ;
2010-12-13 11:19:28 +00:00
}
2015-10-31 12:29:29 +01:00
/**
2017-12-02 19:51:47 +01:00
* batadv_bit_get_packet ( ) - receive and process one packet within the sequence
2015-10-31 12:29:29 +01:00
* 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
2010-12-13 11:19:28 +00:00
*
2016-02-22 21:02:39 +01:00
* Return : true if the window was moved ( either new or very old ) ,
* false if the window was not moved / shifted .
2010-12-13 11:19:28 +00:00
*/
2016-02-22 21:02:39 +01:00
bool batadv_bit_get_packet ( void * priv , unsigned long * seq_bits ,
s32 seq_num_diff , int set_mark )
2010-12-13 11:19:28 +00:00
{
2012-06-05 22:31:31 +02:00
struct batadv_priv * bat_priv = priv ;
2010-12-13 11:19:28 +00:00
/* sequence number is slightly older. We already got a sequence number
2012-05-12 02:09:43 +02:00
* higher than this one , so we just mark it .
*/
2012-06-03 22:19:17 +02:00
if ( seq_num_diff < = 0 & & seq_num_diff > - BATADV_TQ_LOCAL_WINDOW_SIZE ) {
2010-12-13 11:19:28 +00:00
if ( set_mark )
2012-05-12 13:48:53 +02:00
batadv_set_bit ( seq_bits , - seq_num_diff ) ;
2016-02-22 21:02:39 +01:00
return false ;
2010-12-13 11:19:28 +00:00
}
/* sequence number is slightly newer, so we shift the window and
2012-05-12 02:09:43 +02:00
* set the mark if required
*/
2012-06-03 22:19:17 +02:00
if ( seq_num_diff > 0 & & seq_num_diff < BATADV_TQ_LOCAL_WINDOW_SIZE ) {
2012-05-12 02:09:25 +02:00
batadv_bitmap_shift_left ( seq_bits , seq_num_diff ) ;
2010-12-13 11:19:28 +00:00
if ( set_mark )
2012-05-12 13:48:53 +02:00
batadv_set_bit ( seq_bits , 0 ) ;
2016-02-22 21:02:39 +01:00
return true ;
2010-12-13 11:19:28 +00:00
}
/* sequence number is much newer, probably missed a lot of packets */
2012-06-03 22:19:17 +02:00
if ( seq_num_diff > = BATADV_TQ_LOCAL_WINDOW_SIZE & &
seq_num_diff < BATADV_EXPECTED_SEQNO_RANGE ) {
2012-06-03 22:19:22 +02:00
batadv_dbg ( BATADV_DBG_BATMAN , bat_priv ,
2012-05-12 13:48:58 +02:00
" We missed a lot of packets (%i) ! \n " ,
seq_num_diff - 1 ) ;
2012-06-03 22:19:17 +02:00
bitmap_zero ( seq_bits , BATADV_TQ_LOCAL_WINDOW_SIZE ) ;
2010-12-13 11:19:28 +00:00
if ( set_mark )
2012-05-12 13:48:53 +02:00
batadv_set_bit ( seq_bits , 0 ) ;
2016-02-22 21:02:39 +01:00
return true ;
2010-12-13 11:19:28 +00:00
}
/* 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
2012-05-12 02:09:43 +02:00
* seqno window is protected .
2012-08-20 10:26:47 +02:00
*
* seq_num_diff < = - BATADV_TQ_LOCAL_WINDOW_SIZE
* or
* seq_num_diff > = BATADV_EXPECTED_SEQNO_RANGE
2012-05-12 02:09:43 +02:00
*/
2012-08-20 10:26:47 +02:00
batadv_dbg ( BATADV_DBG_BATMAN , bat_priv ,
" Other host probably restarted! \n " ) ;
2010-12-13 11:19:28 +00:00
2012-08-20 10:26:47 +02:00
bitmap_zero ( seq_bits , BATADV_TQ_LOCAL_WINDOW_SIZE ) ;
if ( set_mark )
batadv_set_bit ( seq_bits , 0 ) ;
2010-12-13 11:19:28 +00:00
2016-02-22 21:02:39 +01:00
return true ;
2010-12-13 11:19:28 +00:00
}