Make the TCP blackbox code committed in r331347 be an optional feature
controlled by the TCP_BLACKBOX option. Enable this as part of amd64 GENERIC. For now, leave it disabled on other platforms. Sponsored by: Netflix, Inc.
This commit is contained in:
parent
c187c03466
commit
e24e568336
@ -32,6 +32,7 @@ options INET6 # IPv6 communications protocols
|
||||
options IPSEC # IP (v4/v6) security
|
||||
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
|
||||
options TCP_OFFLOAD # TCP offload
|
||||
options TCP_BLACKBOX # Enhanced TCP event logging
|
||||
options TCP_HHOOK # hhook(9) framework for TCP
|
||||
options TCP_RFC7413 # TCP Fast Open
|
||||
options SCTP # Stream Control Transmission Protocol
|
||||
|
@ -979,6 +979,8 @@ device lagg
|
||||
# TCPPCAP enables code which keeps the last n packets sent and received
|
||||
# on a TCP socket.
|
||||
#
|
||||
# TCP_BLACKBOX enables enhanced TCP event logging.
|
||||
#
|
||||
# TCP_HHOOK enables the hhook(9) framework hooks for the TCP stack.
|
||||
#
|
||||
# RADIX_MPATH provides support for equal-cost multi-path routing.
|
||||
@ -1000,6 +1002,7 @@ options IPSTEALTH #support for stealth forwarding
|
||||
options PF_DEFAULT_TO_DROP #drop everything by default
|
||||
options TCPDEBUG
|
||||
options TCPPCAP
|
||||
options TCP_BLACKBOX
|
||||
options TCP_HHOOK
|
||||
options RADIX_MPATH
|
||||
|
||||
|
@ -3163,7 +3163,7 @@ dev/syscons/star/star_saver.c optional star_saver
|
||||
dev/syscons/syscons.c optional sc
|
||||
dev/syscons/sysmouse.c optional sc
|
||||
dev/syscons/warp/warp_saver.c optional warp_saver
|
||||
dev/tcp_log/tcp_log_dev.c optional inet | inet6
|
||||
dev/tcp_log/tcp_log_dev.c optional tcp_blackbox inet | tcp_blackbox inet6
|
||||
dev/tdfx/tdfx_linux.c optional tdfx_linux tdfx compat_linux
|
||||
dev/tdfx/tdfx_pci.c optional tdfx pci
|
||||
dev/ti/if_ti.c optional ti pci
|
||||
@ -4312,7 +4312,7 @@ netinet/tcp_debug.c optional tcpdebug
|
||||
netinet/tcp_fastopen.c optional inet tcp_rfc7413 | inet6 tcp_rfc7413
|
||||
netinet/tcp_hostcache.c optional inet | inet6
|
||||
netinet/tcp_input.c optional inet | inet6
|
||||
netinet/tcp_log_buf.c optional inet | inet6
|
||||
netinet/tcp_log_buf.c optional tcp_blackbox inet | tcp_blackbox inet6
|
||||
netinet/tcp_lro.c optional inet | inet6
|
||||
netinet/tcp_output.c optional inet | inet6
|
||||
netinet/tcp_offload.c optional tcp_offload inet | tcp_offload inet6
|
||||
|
@ -452,6 +452,7 @@ SLIP_IFF_OPTS opt_slip.h
|
||||
TCPDEBUG
|
||||
TCPPCAP opt_global.h
|
||||
SIFTR
|
||||
TCP_BLACKBOX opt_global.h
|
||||
TCP_HHOOK opt_inet.h
|
||||
TCP_OFFLOAD opt_inet.h # Enable code to dispatch TCP offloading
|
||||
TCP_RFC7413 opt_inet.h
|
||||
|
@ -81,8 +81,9 @@ struct tcp_log_dev_info {
|
||||
};
|
||||
STAILQ_HEAD(log_infoh, tcp_log_dev_info);
|
||||
|
||||
|
||||
#ifdef TCP_BLACKBOX
|
||||
MALLOC_DECLARE(M_TCPLOGDEV);
|
||||
int tcp_log_dev_add_log(struct tcp_log_dev_queue *entry);
|
||||
#endif /* TCP_BLACKBOX */
|
||||
#endif /* _KERNEL */
|
||||
#endif /* !__tcp_log_dev_h__ */
|
||||
|
@ -331,6 +331,7 @@ struct tcp_log_dev_log_queue {
|
||||
} while (0)
|
||||
|
||||
|
||||
#ifdef TCP_BLACKBOX
|
||||
extern bool tcp_log_verbose;
|
||||
void tcp_log_drain(struct tcpcb *tp);
|
||||
int tcp_log_dump_tp_logbuf(struct tcpcb *tp, char *reason, int how, bool force);
|
||||
@ -348,6 +349,20 @@ int tcp_log_state_change(struct tcpcb *tp, int state);
|
||||
void tcp_log_tcpcbinit(struct tcpcb *tp);
|
||||
void tcp_log_tcpcbfini(struct tcpcb *tp);
|
||||
void tcp_log_flowend(struct tcpcb *tp);
|
||||
#else /* !TCP_BLACKBOX */
|
||||
#define tcp_log_verbose (false)
|
||||
|
||||
static inline struct tcp_log_buffer *
|
||||
tcp_log_event_(struct tcpcb *tp, struct tcphdr *th, struct sockbuf *rxbuf,
|
||||
struct sockbuf *txbuf, uint8_t eventid, int errornum, uint32_t len,
|
||||
union tcp_log_stackspecific *stackinfo, int th_hostorder,
|
||||
const char *output_caller, const char *func, int line,
|
||||
const struct timeval *tv)
|
||||
{
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
#endif /* TCP_BLACKBOX */
|
||||
|
||||
#endif /* _KERNEL */
|
||||
#endif /* __tcp_log_buf_h__ */
|
||||
|
@ -848,8 +848,10 @@ tcp_init(void)
|
||||
/* Setup the tcp function block list */
|
||||
init_tcp_functions();
|
||||
register_tcp_functions(&tcp_def_funcblk, M_WAITOK);
|
||||
#ifdef TCP_BLACKBOX
|
||||
/* Initialize the TCP logging data. */
|
||||
tcp_log_init();
|
||||
#endif
|
||||
|
||||
if (tcp_soreceive_stream) {
|
||||
#ifdef INET
|
||||
@ -1431,8 +1433,10 @@ tcp_newtcpcb(struct inpcb *inp)
|
||||
*/
|
||||
tcp_pcap_tcpcb_init(tp);
|
||||
#endif
|
||||
#ifdef TCP_BLACKBOX
|
||||
/* Initialize the per-TCPCB log data. */
|
||||
tcp_log_tcpcbinit(tp);
|
||||
#endif
|
||||
if (tp->t_fb->tfb_tcp_fb_init) {
|
||||
(*tp->t_fb->tfb_tcp_fb_init)(tp);
|
||||
}
|
||||
@ -1650,7 +1654,9 @@ tcp_discardcb(struct tcpcb *tp)
|
||||
inp->inp_ppcb = NULL;
|
||||
if (tp->t_timers->tt_draincnt == 0) {
|
||||
/* We own the last reference on tcpcb, let's free it. */
|
||||
#ifdef TCP_BLACKBOX
|
||||
tcp_log_tcpcbfini(tp);
|
||||
#endif
|
||||
TCPSTATES_DEC(tp->t_state);
|
||||
if (tp->t_fb->tfb_tcp_fb_fini)
|
||||
(*tp->t_fb->tfb_tcp_fb_fini)(tp, 1);
|
||||
@ -1681,7 +1687,9 @@ tcp_timer_discard(void *ptp)
|
||||
tp->t_timers->tt_draincnt--;
|
||||
if (tp->t_timers->tt_draincnt == 0) {
|
||||
/* We own the last reference on this tcpcb, let's free it. */
|
||||
#ifdef TCP_BLACKBOX
|
||||
tcp_log_tcpcbfini(tp);
|
||||
#endif
|
||||
TCPSTATES_DEC(tp->t_state);
|
||||
if (tp->t_fb->tfb_tcp_fb_fini)
|
||||
(*tp->t_fb->tfb_tcp_fb_fini)(tp, 1);
|
||||
@ -1775,7 +1783,9 @@ tcp_drain(void)
|
||||
if ((tcpb = intotcpcb(inpb)) != NULL) {
|
||||
tcp_reass_flush(tcpb);
|
||||
tcp_clean_sackreport(tcpb);
|
||||
#ifdef TCP_BLACKBOX
|
||||
tcp_log_drain(tcpb);
|
||||
#endif
|
||||
#ifdef TCPPCAP
|
||||
if (tcp_pcap_aggressive_free) {
|
||||
/* Free the TCP PCAP queues. */
|
||||
@ -2957,7 +2967,9 @@ tcp_inptoxtp(const struct inpcb *inp, struct xtcpcb *xt)
|
||||
bcopy(tp->t_fb->tfb_tcp_block_name, xt->xt_stack,
|
||||
TCP_FUNCTION_NAME_LEN_MAX);
|
||||
bzero(xt->xt_logid, TCP_LOG_ID_LEN);
|
||||
#ifdef TCP_BLACKBOX
|
||||
(void)tcp_log_get_id(tp, xt->xt_logid);
|
||||
#endif
|
||||
}
|
||||
|
||||
xt->xt_len = sizeof(struct xtcpcb);
|
||||
|
@ -1837,6 +1837,7 @@ tcp_default_ctloutput(struct socket *so, struct sockopt *sopt, struct inpcb *inp
|
||||
goto unlock_and_done;
|
||||
}
|
||||
|
||||
#ifdef TCP_BLACKBOX
|
||||
case TCP_LOG:
|
||||
INP_WUNLOCK(inp);
|
||||
error = sooptcopyin(sopt, &optval, sizeof optval,
|
||||
@ -1885,6 +1886,7 @@ tcp_default_ctloutput(struct socket *so, struct sockopt *sopt, struct inpcb *inp
|
||||
*/
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
INP_WUNLOCK(inp);
|
||||
@ -1971,6 +1973,7 @@ tcp_default_ctloutput(struct socket *so, struct sockopt *sopt, struct inpcb *inp
|
||||
INP_WUNLOCK(inp);
|
||||
error = sooptcopyout(sopt, &optval, sizeof optval);
|
||||
break;
|
||||
#ifdef TCP_BLACKBOX
|
||||
case TCP_LOG:
|
||||
optval = tp->t_logstate;
|
||||
INP_WUNLOCK(inp);
|
||||
@ -1990,6 +1993,7 @@ tcp_default_ctloutput(struct socket *so, struct sockopt *sopt, struct inpcb *inp
|
||||
INP_WUNLOCK(inp);
|
||||
error = EINVAL;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
INP_WUNLOCK(inp);
|
||||
error = ENOPROTOOPT;
|
||||
|
Loading…
Reference in New Issue
Block a user