about summary refs log tree commit diff
path: root/src/engine/e_network.c
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2009-01-10 11:48:24 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2009-01-10 11:48:24 +0000
commit6eefa58b52c4d842aff576e0674b58949f8ad2d7 (patch)
treeaec25abcf5e75a6af21613239170d89afbee638a /src/engine/e_network.c
parentd0d91c412dc8a63cbf2dc0c4f74400a64ad5638b (diff)
downloadzcatch-6eefa58b52c4d842aff576e0674b58949f8ad2d7.tar.gz
zcatch-6eefa58b52c4d842aff576e0674b58949f8ad2d7.zip
fixed resending algorithm
Diffstat (limited to 'src/engine/e_network.c')
-rw-r--r--src/engine/e_network.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/engine/e_network.c b/src/engine/e_network.c
index 2b4ed013..5b6dbf27 100644
--- a/src/engine/e_network.c
+++ b/src/engine/e_network.c
@@ -23,6 +23,26 @@ void recvinfo_start(NETRECVINFO *info, NETADDR *addr, NETCONNECTION *conn, int c
 	info->valid = 1;
 }
 
+
+int seq_in_backroom(int seq, int ack)
+{
+	int bottom = (ack-NET_MAX_SEQUENCE/2);
+	if(bottom < 0)
+	{
+		if(seq <= ack)
+			return 1;
+		if(seq >= (bottom + NET_MAX_SEQUENCE))
+			return 1;
+	}
+	else
+	{
+		if(seq <= ack && seq >= bottom)
+			return 1;
+	}
+	
+	return 0;
+}
+
 /* TODO: rename this function */
 int recvinfo_fetch_chunk(NETRECVINFO *info, NETCHUNK *chunk)
 {
@@ -68,6 +88,10 @@ int recvinfo_fetch_chunk(NETRECVINFO *info, NETCHUNK *chunk)
 			}
 			else
 			{
+				/* old packet that we already got */
+				if(seq_in_backroom(header.sequence, info->conn->ack))
+					continue;
+
 				/* out of sequence, request resend */
 				dbg_msg("conn", "asking for resend %d %d", header.sequence, (info->conn->ack+1)%NET_MAX_SEQUENCE);
 				conn_want_resend(info->conn);