From 3164f24b5544749a98ad715c69b320a68f5e5316 Mon Sep 17 00:00:00 2001 From: jlemon Date: Sat, 29 Sep 2001 04:34:11 +0000 Subject: Add a hash table that contains the list of internet addresses, and use this in place of the in_ifaddr list when appropriate. This improves performance on hosts which have a large number of IP aliases. --- sys/netinet/in_var.h | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'sys/netinet/in_var.h') diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index 7cef6ea..968eb2d 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -38,6 +38,7 @@ #define _NETINET_IN_VAR_H_ #include +#include /* * Interface address, Internet version. One of these structures @@ -55,7 +56,8 @@ struct in_ifaddr { u_long ia_subnet; /* subnet number, including net */ u_long ia_subnetmask; /* mask of subnet part */ struct in_addr ia_netbroadcast; /* to recognize net broadcasts */ - TAILQ_ENTRY(in_ifaddr) ia_link; /* tailq macro glue */ + LIST_ENTRY(in_ifaddr) ia_hash; /* entry in bucket of inet addresses */ + TAILQ_ENTRY(in_ifaddr) ia_link; /* list of internet addresses */ struct sockaddr_in ia_addr; /* reserve space for interface name */ struct sockaddr_in ia_dstaddr; /* reserve space for broadcast addr */ #define ia_broadaddr ia_dstaddr @@ -81,11 +83,25 @@ struct in_aliasreq { #ifdef _KERNEL -extern TAILQ_HEAD(in_ifaddrhead, in_ifaddr) in_ifaddrhead; extern struct ifqueue ipintrq; /* ip packet input queue */ extern struct in_addr zeroin_addr; extern u_char inetctlerrmap[]; +/* + * Hash table for IP addresses. + */ +extern LIST_HEAD(in_ifaddrhashhead, in_ifaddr) *in_ifaddrhashtbl; +extern TAILQ_HEAD(in_ifaddrhead, in_ifaddr) in_ifaddrhead; +extern u_long in_ifaddrhmask; /* mask for hash table */ + +#define INADDR_NHASH_LOG2 9 +#define INADDR_NHASH (1 << INADDR_NHASH_LOG2) +#define INADDR_HMASK (INREASS_NHASH - 1) +#define INADDR_HASHVAL(x) fnv_32_buf((&(x)), sizeof(x), FNV1_32_INIT) +#define INADDR_HASH(x) \ + (&in_ifaddrhashtbl[INADDR_HASHVAL(x) & in_ifaddrhmask]) + + /* * Macro for finding the interface (ifnet structure) corresponding to one * of our IP addresses. -- cgit v1.1