Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_hostcache.c
Show First 20 Lines • Show All 622 Lines • ▼ Show 20 Lines | |||||
* Sysctl function: prints the list and values of all hostcache entries in | * Sysctl function: prints the list and values of all hostcache entries in | ||||
* unsorted order. | * unsorted order. | ||||
*/ | */ | ||||
static int | static int | ||||
sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS) | sysctl_tcp_hc_list(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
const int linesize = 128; | const int linesize = 128; | ||||
struct sbuf sb; | struct sbuf sb; | ||||
int i, error; | int i, error, len; | ||||
hselasky: Setting error to 0 is superfluous from what I can see. | |||||
struct hc_metrics *hc_entry; | struct hc_metrics *hc_entry; | ||||
char ip4buf[INET_ADDRSTRLEN]; | char ip4buf[INET_ADDRSTRLEN]; | ||||
#ifdef INET6 | #ifdef INET6 | ||||
char ip6buf[INET6_ADDRSTRLEN]; | char ip6buf[INET6_ADDRSTRLEN]; | ||||
#endif | #endif | ||||
if (jailed_without_vnet(curthread->td_ucred) != 0) | if (jailed_without_vnet(curthread->td_ucred) != 0) | ||||
return (EPERM); | return (EPERM); | ||||
sbuf_new(&sb, NULL, linesize * (V_tcp_hostcache.cache_count + 1), | /* Optimize Buffer length query by sbin/sysctl */ | ||||
SBUF_INCLUDENUL); | if (req->oldptr == NULL) { | ||||
len = (V_tcp_hostcache.cache_count + 1) * linesize; | |||||
return (SYSCTL_OUT(req, NULL, len)); | |||||
} | |||||
error = sysctl_wire_old_buffer(req, 0); | |||||
if (error != 0) { | |||||
return(error); | |||||
} | |||||
/* Use a buffer for 16 lines */ | |||||
sbuf_new_for_sysctl(&sb, NULL, 16 * linesize, req); | |||||
sbuf_printf(&sb, | sbuf_printf(&sb, | ||||
"\nIP address MTU SSTRESH RTT RTTVAR " | "\nIP address MTU SSTRESH RTT RTTVAR " | ||||
" CWND SENDPIPE RECVPIPE HITS UPD EXP\n"); | " CWND SENDPIPE RECVPIPE HITS UPD EXP\n"); | ||||
#define msec(u) (((u) + 500) / 1000) | #define msec(u) (((u) + 500) / 1000) | ||||
for (i = 0; i < V_tcp_hostcache.hashsize; i++) { | for (i = 0; i < V_tcp_hostcache.hashsize; i++) { | ||||
THC_LOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); | THC_LOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); | ||||
TAILQ_FOREACH(hc_entry, &V_tcp_hostcache.hashbase[i].hch_bucket, | TAILQ_FOREACH(hc_entry, &V_tcp_hostcache.hashbase[i].hch_bucket, | ||||
rmx_q) { | rmx_q) { | ||||
sbuf_printf(&sb, | sbuf_printf(&sb, | ||||
Show All 18 Lines | #endif | ||||
hc_entry->rmx_hits, | hc_entry->rmx_hits, | ||||
hc_entry->rmx_updates, | hc_entry->rmx_updates, | ||||
hc_entry->rmx_expire); | hc_entry->rmx_expire); | ||||
} | } | ||||
THC_UNLOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); | THC_UNLOCK(&V_tcp_hostcache.hashbase[i].hch_mtx); | ||||
} | } | ||||
#undef msec | #undef msec | ||||
error = sbuf_finish(&sb); | error = sbuf_finish(&sb); | ||||
if (error == 0) | |||||
error = SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb)); | |||||
sbuf_delete(&sb); | sbuf_delete(&sb); | ||||
return(error); | return(error); | ||||
} | } | ||||
/* | /* | ||||
* Caller has to make sure the curvnet is set properly. | * Caller has to make sure the curvnet is set properly. | ||||
*/ | */ | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines |
Setting error to 0 is superfluous from what I can see.