diff options
author | Jonathan Lemon <jlemon@FreeBSD.org> | 2001-09-29 04:34:11 +0000 |
---|---|---|
committer | Jonathan Lemon <jlemon@FreeBSD.org> | 2001-09-29 04:34:11 +0000 |
commit | ca925d9c17044d218daf631f3b733cb19fb36f69 (patch) | |
tree | 9043eb0a3862514449a171c6cb63e1c0ef78e293 /sys/netinet/in_var.h | |
parent | 9a10980e2add22049acce9d4eaa56462f474d8ae (diff) | |
download | src-ca925d9c17044d218daf631f3b733cb19fb36f69.tar.gz src-ca925d9c17044d218daf631f3b733cb19fb36f69.zip |
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.
Notes
Notes:
svn path=/head/; revision=84102
Diffstat (limited to 'sys/netinet/in_var.h')
-rw-r--r-- | sys/netinet/in_var.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index 7cef6ea2b49e..968eb2d5a89a 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -38,6 +38,7 @@ #define _NETINET_IN_VAR_H_ #include <sys/queue.h> +#include <sys/fnv_hash.h> /* * 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. |