summaryrefslogtreecommitdiff
path: root/server/dispatch.c
diff options
context:
space:
mode:
authorGravatar Karl Ramm <kcr@1ts.org>2009-04-10 01:05:48 +0000
committerGravatar Karl Ramm <kcr@1ts.org>2009-04-10 01:05:48 +0000
commit64aad8a316c242007f4e90e5fd3b87c731d7f42b (patch)
tree1d58709d56458795997fe5bcad73fb6401e48f9f /server/dispatch.c
parent578536337826fc191d30a85fd7e89a78652b40df (diff)
The hash function should probably be unsigned.
Also, the C preprocessor has seen enough abuse; it is the future, so we can abuse inline functions instead.
Diffstat (limited to 'server/dispatch.c')
-rw-r--r--server/dispatch.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/server/dispatch.c b/server/dispatch.c
index e83213f..a77d550 100644
--- a/server/dispatch.c
+++ b/server/dispatch.c
@@ -23,12 +23,18 @@ static const char rcsid_dispatch_c[] =
#endif
#endif
-#define NACKTAB_HASHSIZE 1023
-#define NACKTAB_HASHVAL(sockaddr, uid) (((sockaddr).sin_addr.s_addr ^ \
- (sockaddr).sin_port ^ \
- (uid).zuid_addr.s_addr ^ \
- (uid).tv.tv_sec ^ \
- (uid).tv.tv_usec) % NACKTAB_HASHSIZE)
+enum {
+ NACKTAB_HASHSIZE = 1023
+};
+inline unsigned int
+nacktab_hashval(struct sockaddr_in sa, ZUnique_Id_t uid) {
+ return (sa.sin_addr.s_addr ^
+ sa.sin_port ^
+ uid.zuid_addr.s_addr ^
+ uid.tv.tv_sec ^
+ uid.tv.tv_usec) % NACKTAB_HASHSIZE;
+}
+
#define HOSTS_SIZE_INIT 256
#ifdef DEBUG
@@ -533,7 +539,7 @@ xmit_frag(ZNotice_t *notice,
nacked->packsz = len;
nacked->uid = notice->z_uid;
nacked->timer = timer_set_rel(rexmit_times[0], rexmit, nacked);
- Unacked_insert(&nacktab[NACKTAB_HASHVAL(sin, nacked->uid)], nacked);
+ Unacked_insert(&nacktab[nacktab_hashval(sin, nacked->uid)], nacked);
return(ZERR_NONE);
}
@@ -739,7 +745,7 @@ xmit(ZNotice_t *notice,
nacked->packsz = packlen;
nacked->uid = notice->z_uid;
nacked->timer = timer_set_rel(rexmit_times[0], rexmit, nacked);
- Unacked_insert(&nacktab[NACKTAB_HASHVAL(*dest, nacked->uid)], nacked);
+ Unacked_insert(&nacktab[nacktab_hashval(*dest, nacked->uid)], nacked);
}
/*
@@ -902,7 +908,7 @@ nack_cancel(ZNotice_t *notice,
int hashval;
/* search the not-yet-acked table for this packet, and flush it. */
- hashval = NACKTAB_HASHVAL(*who, notice->z_uid);
+ hashval = nacktab_hashval(*who, notice->z_uid);
for (nacked = nacktab[hashval]; nacked; nacked = nacked->next) {
if (nacked->dest.addr.sin_addr.s_addr == who->sin_addr.s_addr
&& nacked->dest.addr.sin_port == who->sin_port