From 6eefa58b52c4d842aff576e0674b58949f8ad2d7 Mon Sep 17 00:00:00 2001 From: Magnus Auvinen Date: Sat, 10 Jan 2009 11:48:24 +0000 Subject: fixed resending algorithm --- src/engine/e_network.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'src/engine/e_network.c') 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); -- cgit 1.4.1