X-Git-Url: https://git.librecmc.org/?p=oweals%2Ftinc.git;a=blobdiff_plain;f=src%2Fnet_packet.c;h=9c5512996784dfe07029e1e3e65ed7849c500243;hp=b35f72d4aa744657ab95691cd6adf6b5d9fb07d7;hb=0d61d4ae1358553fc8dde350747542f137f5cb8b;hpb=23acc19bc090051156ad895caed61848f5afb144 diff --git a/src/net_packet.c b/src/net_packet.c index b35f72d..9c55129 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -298,9 +298,13 @@ static void receive_udppacket(node_t *n, vpn_packet_t *inpkt) { if(replaywin) { if(inpkt->seqno != n->received_seqno + 1) { if(inpkt->seqno >= n->received_seqno + replaywin * 8) { + if(n->farfuture++ < replaywin >> 2) { + logger(LOG_WARNING, "Packet from %s (%s) is %d seqs in the future, dropped (%u)", + n->name, n->hostname, inpkt->seqno - n->received_seqno - 1, n->farfuture); + return; + } logger(LOG_WARNING, "Lost %d packets from %s (%s)", inpkt->seqno - n->received_seqno - 1, n->name, n->hostname); - memset(n->late, 0, replaywin); } else if (inpkt->seqno <= n->received_seqno) { if((n->received_seqno >= replaywin * 8 && inpkt->seqno <= n->received_seqno - replaywin * 8) || !(n->late[(inpkt->seqno / 8) % replaywin] & (1 << inpkt->seqno % 8))) { @@ -313,7 +317,8 @@ static void receive_udppacket(node_t *n, vpn_packet_t *inpkt) { n->late[(i / 8) % replaywin] |= 1 << i % 8; } } - + + n->farfuture = 0; n->late[(inpkt->seqno / 8) % replaywin] &= ~(1 << inpkt->seqno % 8); }