tcp: Use jenkins_hash32() in hostcache
As other parts of the base tcp stack (eg. tcp fastopen) already use jenkins_hash32, and the properties appear reasonably good, switching to use that. Reviewed By: tuexen, #transport, ae MFC after: 2 weeks Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D29515
This commit is contained in:
parent
373ffc62c1
commit
b878ec024b
@ -34,7 +34,7 @@
|
|||||||
.\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93
|
.\" From: @(#)tcp.4 8.1 (Berkeley) 6/5/93
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd February 13, 2021
|
.Dd April 8, 2021
|
||||||
.Dt TCP 4
|
.Dt TCP 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -628,7 +628,6 @@ Defaults to 60 seconds.
|
|||||||
Enable support for TCP Explicit Congestion Notification (ECN).
|
Enable support for TCP Explicit Congestion Notification (ECN).
|
||||||
ECN allows a TCP sender to reduce the transmission rate in order to
|
ECN allows a TCP sender to reduce the transmission rate in order to
|
||||||
avoid packet drops.
|
avoid packet drops.
|
||||||
Settings:
|
|
||||||
.Bl -tag -compact
|
.Bl -tag -compact
|
||||||
.It 0
|
.It 0
|
||||||
Disable ECN.
|
Disable ECN.
|
||||||
@ -638,6 +637,7 @@ Outgoing connections will request ECN.
|
|||||||
.It 2
|
.It 2
|
||||||
Allow incoming connections to request ECN.
|
Allow incoming connections to request ECN.
|
||||||
Outgoing connections will not request ECN.
|
Outgoing connections will not request ECN.
|
||||||
|
(default)
|
||||||
.El
|
.El
|
||||||
.It Va ecn.maxretries
|
.It Va ecn.maxretries
|
||||||
Number of retries (SYN or SYN/ACK retransmits) before disabling ECN on a
|
Number of retries (SYN or SYN/ACK retransmits) before disabling ECN on a
|
||||||
@ -674,6 +674,54 @@ Enable path MTU blackhole detection only for IPv6.
|
|||||||
MSS to try for IPv4 if PMTU blackhole detection is turned on.
|
MSS to try for IPv4 if PMTU blackhole detection is turned on.
|
||||||
.It Va v6pmtud_blackhole_mss
|
.It Va v6pmtud_blackhole_mss
|
||||||
MSS to try for IPv6 if PMTU blackhole detection is turned on.
|
MSS to try for IPv6 if PMTU blackhole detection is turned on.
|
||||||
|
.It Va hostcache.enable
|
||||||
|
The TCP host cache is used to cache connection details and metrics to
|
||||||
|
improve future performance of connections between the same hosts.
|
||||||
|
At the completion of a TCP connection, a host will cache information
|
||||||
|
for the connection for some defined period of time.
|
||||||
|
.Bl -tag -compact
|
||||||
|
.It 0
|
||||||
|
Disable the host cache.
|
||||||
|
.It 1
|
||||||
|
Enable the host cache. (default)
|
||||||
|
.It Va hostcache.purgenow
|
||||||
|
Immediately purge all entries once set to any value.
|
||||||
|
Setting this to 2 will also reseed the hash salt.
|
||||||
|
.It Va hostcache.purge
|
||||||
|
Expire all entires on next pruning of host cache entries.
|
||||||
|
Any non-zero setting will be reset to zero, once the pruge
|
||||||
|
is running.
|
||||||
|
.Bl -tag -compact
|
||||||
|
.It 0
|
||||||
|
Do not purge all entries when pruning the host cache. (default)
|
||||||
|
.It 1
|
||||||
|
Purge all entries when doing the next pruning.
|
||||||
|
.It 2
|
||||||
|
Purge all entries, and also reseed the hash salt.
|
||||||
|
.It Va hostcache.prune
|
||||||
|
Time in seconds between pruning expired host cache entries.
|
||||||
|
Defaults to 300 (5 minutes).
|
||||||
|
.It Va hostcache.expire
|
||||||
|
Time in seconds, how long a entry should be kept in the
|
||||||
|
host cache since last accessed.
|
||||||
|
Defaults to 3600 (1 hour).
|
||||||
|
.It Va hostcache.count
|
||||||
|
The current number of entries in the host cache.
|
||||||
|
.It Va hostcache.bucketlimit
|
||||||
|
The maximum number of entries for the same hash.
|
||||||
|
Defaults to 30.
|
||||||
|
.It Va hostcache.hashsize
|
||||||
|
Size of TCP hostcache hashtable.
|
||||||
|
This number has to be a power of two, or will be rejected.
|
||||||
|
Defaults to 512.
|
||||||
|
.It Va hostcache.cachelimit
|
||||||
|
Overall entry limit for hostcache.
|
||||||
|
Defaults to hashsize * bucketlimit.
|
||||||
|
.It Va hostcache.histo
|
||||||
|
Provide a Histogram of the hostcache hash utilization.
|
||||||
|
.It Va hostcache.list
|
||||||
|
Provide a complete list of all current entries in the host
|
||||||
|
cache.
|
||||||
.It Va functions_available
|
.It Va functions_available
|
||||||
List of available TCP function blocks (TCP stacks).
|
List of available TCP function blocks (TCP stacks).
|
||||||
.It Va functions_default
|
.It Va functions_default
|
||||||
|
@ -71,6 +71,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#include <sys/hash.h>
|
||||||
#include <sys/jail.h>
|
#include <sys/jail.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
@ -127,6 +128,7 @@ struct tcp_hostcache {
|
|||||||
uma_zone_t zone;
|
uma_zone_t zone;
|
||||||
u_int hashsize;
|
u_int hashsize;
|
||||||
u_int hashmask;
|
u_int hashmask;
|
||||||
|
u_int hashsalt;
|
||||||
u_int bucket_limit;
|
u_int bucket_limit;
|
||||||
u_int cache_count;
|
u_int cache_count;
|
||||||
u_int cache_limit;
|
u_int cache_limit;
|
||||||
@ -210,16 +212,14 @@ SYSCTL_PROC(_net_inet_tcp_hostcache, OID_AUTO, purgenow,
|
|||||||
|
|
||||||
static MALLOC_DEFINE(M_HOSTCACHE, "hostcache", "TCP hostcache");
|
static MALLOC_DEFINE(M_HOSTCACHE, "hostcache", "TCP hostcache");
|
||||||
|
|
||||||
|
/* Use jenkins_hash32(), as in other parts of the tcp stack */
|
||||||
#define HOSTCACHE_HASH(ip) \
|
#define HOSTCACHE_HASH(ip) \
|
||||||
(((ip)->s_addr ^ ((ip)->s_addr >> 7) ^ ((ip)->s_addr >> 17)) & \
|
(jenkins_hash32((uint32_t *)(ip), 1, V_tcp_hostcache.hashsalt) & \
|
||||||
V_tcp_hostcache.hashmask)
|
V_tcp_hostcache.hashmask)
|
||||||
|
|
||||||
/* XXX: What is the recommended hash to get good entropy for IPv6 addresses? */
|
|
||||||
#define HOSTCACHE_HASH6(ip6) \
|
#define HOSTCACHE_HASH6(ip6) \
|
||||||
(((ip6)->s6_addr32[0] ^ \
|
(jenkins_hash32((uint32_t *)&((ip6)->s6_addr32[0]), 4, \
|
||||||
(ip6)->s6_addr32[1] ^ \
|
V_tcp_hostcache.hashsalt) & \
|
||||||
(ip6)->s6_addr32[2] ^ \
|
|
||||||
(ip6)->s6_addr32[3]) & \
|
|
||||||
V_tcp_hostcache.hashmask)
|
V_tcp_hostcache.hashmask)
|
||||||
|
|
||||||
#define THC_LOCK(lp) mtx_lock(lp)
|
#define THC_LOCK(lp) mtx_lock(lp)
|
||||||
@ -239,6 +239,7 @@ tcp_hc_init(void)
|
|||||||
V_tcp_hostcache.bucket_limit = TCP_HOSTCACHE_BUCKETLIMIT;
|
V_tcp_hostcache.bucket_limit = TCP_HOSTCACHE_BUCKETLIMIT;
|
||||||
V_tcp_hostcache.expire = TCP_HOSTCACHE_EXPIRE;
|
V_tcp_hostcache.expire = TCP_HOSTCACHE_EXPIRE;
|
||||||
V_tcp_hostcache.prune = TCP_HOSTCACHE_PRUNE;
|
V_tcp_hostcache.prune = TCP_HOSTCACHE_PRUNE;
|
||||||
|
V_tcp_hostcache.hashsalt = arc4random();
|
||||||
|
|
||||||
TUNABLE_INT_FETCH("net.inet.tcp.hostcache.hashsize",
|
TUNABLE_INT_FETCH("net.inet.tcp.hostcache.hashsize",
|
||||||
&V_tcp_hostcache.hashsize);
|
&V_tcp_hostcache.hashsize);
|
||||||
@ -836,6 +837,8 @@ tcp_hc_purge(void *arg)
|
|||||||
int all = 0;
|
int all = 0;
|
||||||
|
|
||||||
if (V_tcp_hostcache.purgeall) {
|
if (V_tcp_hostcache.purgeall) {
|
||||||
|
if (V_tcp_hostcache.purgeall == 2)
|
||||||
|
V_tcp_hostcache.hashsalt = arc4random();
|
||||||
all = 1;
|
all = 1;
|
||||||
V_tcp_hostcache.purgeall = 0;
|
V_tcp_hostcache.purgeall = 0;
|
||||||
}
|
}
|
||||||
@ -860,6 +863,8 @@ sysctl_tcp_hc_purgenow(SYSCTL_HANDLER_ARGS)
|
|||||||
if (error || !req->newptr)
|
if (error || !req->newptr)
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
|
if (val == 2)
|
||||||
|
V_tcp_hostcache.hashsalt = arc4random();
|
||||||
tcp_hc_purge_internal(1);
|
tcp_hc_purge_internal(1);
|
||||||
|
|
||||||
callout_reset(&V_tcp_hc_callout, V_tcp_hostcache.prune * hz,
|
callout_reset(&V_tcp_hc_callout, V_tcp_hostcache.prune * hz,
|
||||||
|
Loading…
Reference in New Issue
Block a user