[26/44] Add the "TCP Blackbox Recorder" which we discussed at the developer summits at BSDCan and BSDCam in 2017.

Message ID 20180809060936.9726-27-sebastian.huber@embedded-brains.de
State New
Headers show
  • Update RTEMS-specific header files to latest FreeBSD versions
Related show

Commit Message

Sebastian Huber Aug. 9, 2018, 6:09 a.m.
From: jtl <jtl@FreeBSD.org>

The TCP Blackbox Recorder allows you to capture events on a TCP connection
in a ring buffer. It stores metadata with the event. It optionally stores
the TCP header associated with an event (if the event is associated with a
packet) and also optionally stores information on the sockets.

It supports setting a log ID on a TCP connection and using this to correlate
multiple connections that share a common log ID.

You can log connections in different modes. If you are doing a coordinated
test with a particular connection, you may tell the system to put it in
mode 4 (continuous dump). Or, if you just want to monitor for errors, you
can put it in mode 1 (ring buffer) and dump all the ring buffers associated
with the connection ID when we receive an error signal for that connection
ID. You can set a default mode that will be applied to a particular ratio
of incoming connections. You can also manually set a mode using a socket

This commit includes only basic probes. rrs@ has added quite an abundance
of probes in his TCP development work. He plans to commit those soon.

There are user-space programs which we plan to commit as ports. These read
the data from the log device and output pcapng files, and then let you
analyze the data (and metadata) in the pcapng files.

Reviewed by:	gnn (previous version)
Obtained from:	Netflix, Inc.
Relnotes:	yes
Differential Revision:	https://reviews.freebsd.org/D11085
 newlib/libc/sys/rtems/include/netinet/tcp.h | 9 +++++++++
 1 file changed, 9 insertions(+)



diff --git a/newlib/libc/sys/rtems/include/netinet/tcp.h b/newlib/libc/sys/rtems/include/netinet/tcp.h
index 4c1c9d430..f599c9583 100644
--- a/newlib/libc/sys/rtems/include/netinet/tcp.h
+++ b/newlib/libc/sys/rtems/include/netinet/tcp.h
@@ -168,6 +168,12 @@  struct tcphdr {
 #define TCP_NOOPT	8	/* don't use TCP options */
 #define TCP_MD5SIG	16	/* use MD5 digests (RFC2385) */
 #define	TCP_INFO	32	/* retrieve tcp_info structure */
+#define	TCP_LOG		34	/* configure event logging for connection */
+#define	TCP_LOGBUF	35	/* retrieve event log for connection */
+#define	TCP_LOGID	36	/* configure log ID to correlate connections */
+#define	TCP_LOGDUMP	37	/* dump connection log events to device */
+#define	TCP_LOGDUMPID	38	/* dump events from connections with same ID to
+				   device */
 #define	TCP_CONGESTION	64	/* get/set congestion control algorithm */
 #define	TCP_CCALGOOPT	65	/* get/set cc algorithm specific options */
 #define	TCP_KEEPINIT	128	/* N, time to establish connection */
@@ -189,6 +195,9 @@  struct tcphdr {
 #define	TCPI_OPT_ECN		0x08
 #define	TCPI_OPT_TOE		0x10
+/* Maximum length of log ID. */
+#define TCP_LOG_ID_LEN	64
  * The TCP_INFO socket option comes from the Linux 2.6 TCP API, and permits
  * the caller to query certain information about the state of a TCP