diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-01-10 11:48:24 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2009-01-10 11:48:24 +0000 |
| commit | 6eefa58b52c4d842aff576e0674b58949f8ad2d7 (patch) | |
| tree | aec25abcf5e75a6af21613239170d89afbee638a /src/engine/e_network.c | |
| parent | d0d91c412dc8a63cbf2dc0c4f74400a64ad5638b (diff) | |
| download | zcatch-6eefa58b52c4d842aff576e0674b58949f8ad2d7.tar.gz zcatch-6eefa58b52c4d842aff576e0674b58949f8ad2d7.zip | |
fixed resending algorithm
Diffstat (limited to 'src/engine/e_network.c')
| -rw-r--r-- | src/engine/e_network.c | 24 |
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); |