This patch avoid local TQ drop in case of heavy load. In this case, rebroadcast can be delayed more than orig_interval causing the receiver to incorrectly drop old packets without marking them as received.
Signed-off-by: Daniele Furlan daniele.furlan@gmail.com --- routing.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/routing.c b/routing.c index c620d4f..5e99188 100644 --- a/routing.c +++ b/routing.c @@ -720,17 +720,15 @@ void receive_bat_packet(const struct ethhdr *ethhdr,
/* neighbor has to indicate direct link and it has to * come via the corresponding interface */ - /* if received seqno equals last send seqno save new - * seqno for bidirectional check */ + /* save packet seqno for bidirectional check */ if (has_directlink_flag && compare_eth(if_incoming->net_dev->dev_addr, - batman_packet->orig) && - (batman_packet->seqno - if_incoming_seqno + 2 == 0)) { + batman_packet->orig)) { offset = if_incoming->if_num * NUM_WORDS;
spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); word = &(orig_neigh_node->bcast_own[offset]); - bit_mark(word, 0); + bit_mark(word, if_incoming_seqno - batman_packet->seqno - 2); orig_neigh_node->bcast_own_sum[if_incoming->if_num] = bit_packet_count(word); spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);