summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet/tcp_hostcache.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-12-09 14:19:03 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-01-10 09:53:34 +0100
commit75b706fde4cbf82bcd41a1cec319778aa0f8eb2d (patch)
treeea39a351a1f6337b5a5dd6036314693adef5ffe6 /freebsd/sys/netinet/tcp_hostcache.c
parentVMSTAT(8): Port to RTEMS (diff)
downloadrtems-libbsd-75b706fde4cbf82bcd41a1cec319778aa0f8eb2d.tar.bz2
Update to FreeBSD head 2016-12-10
Git mirror commit 80c55f08a05ab3b26a73b226ccb56adc3122a55c.
Diffstat (limited to 'freebsd/sys/netinet/tcp_hostcache.c')
-rw-r--r--freebsd/sys/netinet/tcp_hostcache.c56
1 files changed, 41 insertions, 15 deletions
diff --git a/freebsd/sys/netinet/tcp_hostcache.c b/freebsd/sys/netinet/tcp_hostcache.c
index 4e78b8b2..e0c4b493 100644
--- a/freebsd/sys/netinet/tcp_hostcache.c
+++ b/freebsd/sys/netinet/tcp_hostcache.c
@@ -126,6 +126,12 @@ static void tcp_hc_purge(void *);
static SYSCTL_NODE(_net_inet_tcp, OID_AUTO, hostcache, CTLFLAG_RW, 0,
"TCP Host cache");
+VNET_DEFINE(int, tcp_use_hostcache) = 1;
+#define V_tcp_use_hostcache VNET(tcp_use_hostcache)
+SYSCTL_INT(_net_inet_tcp_hostcache, OID_AUTO, enable, CTLFLAG_VNET | CTLFLAG_RW,
+ &VNET_NAME(tcp_use_hostcache), 0,
+ "Enable the TCP hostcache");
+
SYSCTL_UINT(_net_inet_tcp_hostcache, OID_AUTO, cachelimit, CTLFLAG_VNET | CTLFLAG_RDTUN,
&VNET_NAME(tcp_hostcache.cache_limit), 0,
"Overall entry limit for hostcache");
@@ -278,6 +284,9 @@ tcp_hc_lookup(struct in_conninfo *inc)
struct hc_head *hc_head;
struct hc_metrics *hc_entry;
+ if (!V_tcp_use_hostcache)
+ return NULL;
+
KASSERT(inc != NULL, ("tcp_hc_lookup with NULL in_conninfo pointer"));
/*
@@ -334,6 +343,9 @@ tcp_hc_insert(struct in_conninfo *inc)
struct hc_head *hc_head;
struct hc_metrics *hc_entry;
+ if (!V_tcp_use_hostcache)
+ return NULL;
+
KASSERT(inc != NULL, ("tcp_hc_insert with NULL in_conninfo pointer"));
/*
@@ -423,6 +435,9 @@ tcp_hc_get(struct in_conninfo *inc, struct hc_metrics_lite *hc_metrics_lite)
{
struct hc_metrics *hc_entry;
+ if (!V_tcp_use_hostcache)
+ return;
+
/*
* Find the right bucket.
*/
@@ -454,14 +469,17 @@ tcp_hc_get(struct in_conninfo *inc, struct hc_metrics_lite *hc_metrics_lite)
/*
* External function: look up an entry in the hostcache and return the
- * discovered path MTU. Returns NULL if no entry is found or value is not
+ * discovered path MTU. Returns 0 if no entry is found or value is not
* set.
*/
-u_long
+uint32_t
tcp_hc_getmtu(struct in_conninfo *inc)
{
struct hc_metrics *hc_entry;
- u_long mtu;
+ uint32_t mtu;
+
+ if (!V_tcp_use_hostcache)
+ return 0;
hc_entry = tcp_hc_lookup(inc);
if (hc_entry == NULL) {
@@ -480,10 +498,13 @@ tcp_hc_getmtu(struct in_conninfo *inc)
* Creates a new entry if none was found.
*/
void
-tcp_hc_updatemtu(struct in_conninfo *inc, u_long mtu)
+tcp_hc_updatemtu(struct in_conninfo *inc, uint32_t mtu)
{
struct hc_metrics *hc_entry;
+ if (!V_tcp_use_hostcache)
+ return;
+
/*
* Find the right bucket.
*/
@@ -523,6 +544,9 @@ tcp_hc_update(struct in_conninfo *inc, struct hc_metrics_lite *hcml)
{
struct hc_metrics *hc_entry;
+ if (!V_tcp_use_hostcache)
+ return;
+
hc_entry = tcp_hc_lookup(inc);
if (hc_entry == NULL) {
hc_entry = tcp_hc_insert(inc);
@@ -536,16 +560,16 @@ tcp_hc_update(struct in_conninfo *inc, struct hc_metrics_lite *hcml)
if (hc_entry->rmx_rtt == 0)
hc_entry->rmx_rtt = hcml->rmx_rtt;
else
- hc_entry->rmx_rtt =
- (hc_entry->rmx_rtt + hcml->rmx_rtt) / 2;
+ hc_entry->rmx_rtt = ((uint64_t)hc_entry->rmx_rtt +
+ (uint64_t)hcml->rmx_rtt) / 2;
TCPSTAT_INC(tcps_cachedrtt);
}
if (hcml->rmx_rttvar != 0) {
if (hc_entry->rmx_rttvar == 0)
hc_entry->rmx_rttvar = hcml->rmx_rttvar;
else
- hc_entry->rmx_rttvar =
- (hc_entry->rmx_rttvar + hcml->rmx_rttvar) / 2;
+ hc_entry->rmx_rttvar = ((uint64_t)hc_entry->rmx_rttvar +
+ (uint64_t)hcml->rmx_rttvar) / 2;
TCPSTAT_INC(tcps_cachedrttvar);
}
if (hcml->rmx_ssthresh != 0) {
@@ -560,8 +584,8 @@ tcp_hc_update(struct in_conninfo *inc, struct hc_metrics_lite *hcml)
if (hc_entry->rmx_cwnd == 0)
hc_entry->rmx_cwnd = hcml->rmx_cwnd;
else
- hc_entry->rmx_cwnd =
- (hc_entry->rmx_cwnd + hcml->rmx_cwnd) / 2;
+ hc_entry->rmx_cwnd = ((uint64_t)hc_entry->rmx_cwnd +
+ (uint64_t)hcml->rmx_cwnd) / 2;
/* TCPSTAT_INC(tcps_cachedcwnd); */
}
if (hcml->rmx_sendpipe != 0) {
@@ -569,7 +593,8 @@ tcp_hc_update(struct in_conninfo *inc, struct hc_metrics_lite *hcml)
hc_entry->rmx_sendpipe = hcml->rmx_sendpipe;
else
hc_entry->rmx_sendpipe =
- (hc_entry->rmx_sendpipe + hcml->rmx_sendpipe) /2;
+ ((uint64_t)hc_entry->rmx_sendpipe +
+ (uint64_t)hcml->rmx_sendpipe) /2;
/* TCPSTAT_INC(tcps_cachedsendpipe); */
}
if (hcml->rmx_recvpipe != 0) {
@@ -577,7 +602,8 @@ tcp_hc_update(struct in_conninfo *inc, struct hc_metrics_lite *hcml)
hc_entry->rmx_recvpipe = hcml->rmx_recvpipe;
else
hc_entry->rmx_recvpipe =
- (hc_entry->rmx_recvpipe + hcml->rmx_recvpipe) /2;
+ ((uint64_t)hc_entry->rmx_recvpipe +
+ (uint64_t)hcml->rmx_recvpipe) /2;
/* TCPSTAT_INC(tcps_cachedrecvpipe); */
}
@@ -614,7 +640,7 @@ sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS)
TAILQ_FOREACH(hc_entry, &V_tcp_hostcache.hashbase[i].hch_bucket,
rmx_q) {
sbuf_printf(&sb,
- "%-15s %5lu %8lu %6lums %6lums %8lu %8lu %8lu %4lu "
+ "%-15s %5u %8u %6lums %6lums %8u %8u %8u %4lu "
"%4lu %4i\n",
hc_entry->ip4.s_addr ? inet_ntoa(hc_entry->ip4) :
#ifdef INET6
@@ -624,9 +650,9 @@ sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS)
#endif
hc_entry->rmx_mtu,
hc_entry->rmx_ssthresh,
- msec(hc_entry->rmx_rtt *
+ msec((u_long)hc_entry->rmx_rtt *
(RTM_RTTUNIT / (hz * TCP_RTT_SCALE))),
- msec(hc_entry->rmx_rttvar *
+ msec((u_long)hc_entry->rmx_rttvar *
(RTM_RTTUNIT / (hz * TCP_RTTVAR_SCALE))),
hc_entry->rmx_cwnd,
hc_entry->rmx_sendpipe,