diff --git a/include/packets.h b/include/packets.h index 4adf2c2..dd3b946 100644 --- a/include/packets.h +++ b/include/packets.h @@ -1,4 +1,4 @@ -/* $Id: packets.h,v 1.33 2006/08/13 21:26:50 stpohle Exp $ +/* $Id: packets.h,v 1.34 2006/08/15 15:00:31 stpohle Exp $ * network packets.. */ #ifndef _PACKETS_H_ @@ -405,7 +405,8 @@ extern void inpkg_delplayer (int pl_nr); /* this functions will be defined in pkgcache.c */ extern void rscache_init (); extern void rscache_add (_net_addr *addr, struct pkg *packet); -extern void rscache_del (_net_addr *addr, unsigned char typ, short unsigned int id); +extern void rscache_delnr (int nr); +extern int rscache_del (_net_addr *addr, unsigned char typ, short unsigned int id); extern void rscache_loop (); extern struct _resend_cache rscache; diff --git a/src/pkgcache.c b/src/pkgcache.c index b072909..b9c015f 100644 --- a/src/pkgcache.c +++ b/src/pkgcache.c @@ -1,4 +1,4 @@ -/* $Id: pkgcache.c,v 1.11 2006/08/15 13:33:32 stpohle Exp $ +/* $Id: pkgcache.c,v 1.12 2006/08/15 15:00:32 stpohle Exp $ * Resendcache work, We need this to resend lost packets over the network. * we will keep every packet with the PKGF_ackreq flag as long as we haven't * got any answer from the destination host. And resend the packet after a givin @@ -38,25 +38,38 @@ void rscache_add (_net_addr *addr, struct pkg *packet) { rscache.count ++; }; +/* delete the entry */ +void rscache_delnr (int nr) { + int a; -/* delete the packet from the cache */ -void rscache_del (_net_addr *addr, unsigned char typ, short unsigned int id) { + if (nr >= 0 && nr < PKG_RESENDCACHE_SIZE) { + for (a = nr; a < rscache.count - 1; a++) + rscache.entry[nr] = rscache.entry[nr+1]; + rscache.count--; + d_printf ("rscache_delnr: element %d deleted.\n", nr); + } + else + d_printf ("rscache_delnr: number is out of range (%d)\n", nr); +} + + +/* find and delete the givin packet. + * Return Value: 0 = nothing deleted, 1 one entry deleted */ +int rscache_del (_net_addr *addr, unsigned char typ, short unsigned int id) { int i; - d_printf ("rscache_del: addr %p\n", addr); + d_printf ("rscache_del: addr %p (pl_nr:%d, typ:%d, id:%d\n", addr, addr->pl_nr, typ, id); for (i = 0; (i < rscache.count) && (i < PKG_RESENDCACHE_SIZE); i++) { if (rscache.entry[i].addr.pl_nr == addr->pl_nr && NTOH16(rscache.entry[i].packet.h.id) == id && - ((struct pkg)rscache.entry[i].packet).h.typ == typ) { // found element - int a; - - for (a = i; a < rscache.count - 1; a++) - rscache.entry[i] = rscache.entry[i+1]; - rscache.count--; - break; + rscache.entry[i].packet.h.typ == typ) { // found element + rscache_delnr (i); + d_printf ("rscache_del: element %d deleted.\n", i); + return 1; } } + return 0; }; /* test for old packets where we haven't got a ackreq packet for. @@ -93,8 +106,7 @@ void rscache_loop () { if (rscache.entry[i].addr.pl_nr >= 0 && rscache.entry[i].addr.pl_nr < MAX_PLAYERS) players[rscache.entry[i].addr.pl_nr].net.pkgopt.to_2sec++; - rscache_del (&rscache.entry[i].addr, rscache.entry[i].packet.h.typ, - NTOH16(rscache.entry[i].packet.h.id)); + rscache_delnr (i); if (i > 0) i--; } }