[PATCH 4/4] Improved handling of queue-jumping packets on receive

Brandon L Black blblack at gmail.com
Sat Nov 13 19:05:51 CET 2010


---
 src/net_packet.c |    9 +++++++--
 src/node.h       |    1 +
 2 files changed, 8 insertions(+), 2 deletions(-)

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);
 	}
 
diff --git a/src/node.h b/src/node.h
index de0f8c8..7bac28e 100644
--- a/src/node.h
+++ b/src/node.h
@@ -77,6 +77,7 @@ typedef struct node_t {
 
 	uint32_t sent_seqno;			/* Sequence number last sent to this node */
 	uint32_t received_seqno;		/* Sequence number last received from this node */
+	uint32_t farfuture;			/* Packets in a row that have arrived from the far future */
 	unsigned char* late;			/* Bitfield marking late packets */
 
 	length_t mtu;				/* Maximum size of packets to send to this node */
-- 
1.7.3.2



More information about the tinc-devel mailing list