37#include <sys/malloc.h>
40#include <sys/socket.h>
41#include <sys/socketvar.h>
42#include <sys/sysctl.h>
44#include <sys/kernel.h>
46#include <sys/rmlock.h>
63#define V_tcp_perconn_stats_enable VNET(tcp_perconn_stats_enable)
64#define V_tcp_perconn_stats_dflt_tpl VNET(tcp_perconn_stats_dflt_tpl)
70#define V_tcp_perconn_stats_sample_rates VNET(tcp_perconn_stats_sample_rates)
71#define V_tcp_stats_nrates VNET(tcp_stats_nrates)
75 struct stats_tpl_sample_rate **rates,
int *nrates,
void *ctx);
78 CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(tcp_perconn_stats_enable), 0,
79 "Enable per-connection TCP stats gathering; 1 enables for all connections, "
80 "2 enables random sampling across log id connection groups");
81SYSCTL_PROC(_net_inet_tcp, OID_AUTO, perconn_stats_sample_rates,
83 sizeof(
struct rm_priotracker), stats_tpl_sample_rates,
"A",
84 "TCP stats per template random sampling rates, in CSV tpl_spec=percent "
85 "key-value pairs (see stats(9) for template spec details)");
93__attribute__ ((constructor))
101 V_tcp_perconn_stats_dflt_tpl = stats_tpl_alloc(
"TCP_DEFAULT", 0);
102 if (V_tcp_perconn_stats_dflt_tpl < 0)
103 return (-V_tcp_perconn_stats_dflt_tpl);
105 struct voistatspec vss_sum[] = {
108 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
110 NVSS(vss_sum), vss_sum, 0);
111 lasterr = err ? err : lasterr;
112 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
114 NVSS(vss_sum), vss_sum, 0);
115 lasterr = err ? err : lasterr;
117 struct voistatspec vss_max[] = {
120 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
122 NVSS(vss_max), vss_max, 0);
123 lasterr = err ? err : lasterr;
124 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
126 NVSS(vss_max), vss_max, 0);
127 lasterr = err ? err : lasterr;
129 struct voistatspec vss_rtt[] = {
132 STATS_VSS_TDGSTCLUST32(20, 4),
134 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
136 NVSS(vss_rtt), vss_rtt, 0);
137 lasterr = err ? err : lasterr;
139 struct voistatspec vss_congsig[] = {
140 STATS_VSS_DVHIST32_USR(HBKTS(DVBKT(
CC_ECN), DVBKT(
CC_RTO),
143 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
145 NVSS(vss_congsig), vss_congsig, 0);
146 lasterr = err ? err : lasterr;
148 struct voistatspec vss_gput[] = {
150 STATS_VSS_TDGSTCLUST32(20, 4),
152 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
154 NVSS(vss_gput), vss_gput, 0);
155 lasterr = err ? err : lasterr;
157 struct voistatspec vss_gput_nd[] = {
158 STATS_VSS_TDGSTCLUST32(10, 4),
160 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
162 NVSS(vss_gput_nd), vss_gput_nd, 0);
163 lasterr = err ? err : lasterr;
165 struct voistatspec vss_windiff[] = {
166 STATS_VSS_CRHIST32_USR(HBKTS(CRBKT(0)), VSD_HIST_LBOUND_INF)
168 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
170 NVSS(vss_windiff), vss_windiff, 0);
171 lasterr = err ? err : lasterr;
173 struct voistatspec vss_acklen[] = {
175 STATS_VSS_CRHIST32_LIN(0, 9, 1, VSD_HIST_UBOUND_INF)
177 err |= stats_tpl_add_voistats(V_tcp_perconn_stats_dflt_tpl,
179 NVSS(vss_acklen), vss_acklen, 0);
180 lasterr = err ? err : lasterr;
190 struct rm_priotracker tracker;
204 stats_blob_destroy(tp->
t_stats);
205 tp->
t_stats = stats_blob_alloc(tpl, 0);
220 struct stats_tpl_sample_rate **rates,
int *nrates,
void *ctx)
222 struct stats_tpl_sample_rate *old_rates;
229 case TPL_SR_RLOCKED_GET:
236 (
struct rm_priotracker *)ctx);
238 case TPL_SR_UNLOCKED_GET:
247 (
struct rm_priotracker *)ctx);
250 KASSERT(rates != NULL && nrates != NULL,
251 (
"%s: PUT without new rates", __func__));
253 if (rates == NULL || nrates == NULL)
262 *nrates = old_nrates;
273 "tcp_stats_tpl_sampling_lock");
#define INP_WLOCK_ASSERT(inp)
struct statsblob * t_stats
#define VOI_TCP_CALCFRWINDIFF
static struct rmlock tcp_stats_tpl_sampling_lock
#define V_tcp_perconn_stats_sample_rates
SYSCTL_INT(_net_inet_tcp, OID_AUTO, perconn_stats_enable, CTLFLAG_VNET|CTLFLAG_RW, &VNET_NAME(tcp_perconn_stats_enable), 0, "Enable per-connection TCP stats gathering; 1 enables for all connections, " "2 enables random sampling across log id connection groups")
int tcp_stats_sample_rollthedice(struct tcpcb *tp, void *seed_bytes, size_t seed_len)
SYSCTL_PROC(_net_inet_tcp, OID_AUTO, perconn_stats_sample_rates, CTLTYPE_STRING|CTLFLAG_RW|CTLFLAG_NEEDGIANT, tcp_stats_tpl_sr_cb, sizeof(struct rm_priotracker), stats_tpl_sample_rates, "A", "TCP stats per template random sampling rates, in CSV tpl_spec=percent " "key-value pairs (see stats(9) for template spec details)")
#define V_tcp_stats_nrates
static int tcp_stats_tpl_sr_cb(enum stats_tpl_sr_cb_action action, struct stats_tpl_sample_rate **rates, int *nrates, void *ctx)
VNET_DEFINE_STATIC(struct stats_tpl_sample_rate *, tcp_perconn_stats_sample_rates)
VNET_DEFINE(int, tcp_perconn_stats_dflt_tpl)
RM_SYSINIT(tcp_stats_tpl_sampling_lock, &tcp_stats_tpl_sampling_lock, "tcp_stats_tpl_sampling_lock")