Author: gnn
Date: Sun Sep 13 15:50:55 2015
New Revision: 287759
URL: https://svnweb.freebsd.org/changeset/base/287759

Log:
  dd DTrace probe points, translators and a corresponding script
  to provide the TCPDEBUG functionality with pure DTrace.
  
  Reviewed by:  rwatson
  MFC after:    2 weeks
  Sponsored by: Limelight Networks
  Differential Revision:        D3530

Added:
  head/share/dtrace/tcpdebug   (contents, props changed)
Modified:
  head/cddl/lib/libdtrace/tcp.d
  head/sys/netinet/in_kdtrace.c
  head/sys/netinet/in_kdtrace.h
  head/sys/netinet/tcp_input.c
  head/sys/netinet/tcp_output.c
  head/sys/netinet/tcp_subr.c
  head/sys/netinet/tcp_timer.c
  head/sys/netinet/tcp_usrreq.c

Modified: head/cddl/lib/libdtrace/tcp.d
==============================================================================
--- head/cddl/lib/libdtrace/tcp.d       Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/cddl/lib/libdtrace/tcp.d       Sun Sep 13 15:50:55 2015        
(r287759)
@@ -103,11 +103,15 @@ typedef struct tcpsinfo {
        int32_t tcps_state;             /* TCP state */
        uint32_t tcps_iss;              /* Initial sequence # sent */
        uint32_t tcps_suna;             /* sequence # sent but unacked */
+       uint32_t tcps_smax;             /* highest sequence number sent */
        uint32_t tcps_snxt;             /* next sequence # to send */
        uint32_t tcps_rack;             /* sequence # we have acked */
        uint32_t tcps_rnxt;             /* next sequence # expected */
        uint32_t tcps_swnd;             /* send window size */
        int32_t tcps_snd_ws;            /* send window scaling */
+       uint32_t tcps_swl1;             /* window update seg seq number */
+       uint32_t tcps_swl2;             /* window update seg ack number */
+       uint32_t tcps_rup;              /* receive urgent pointer */
        uint32_t tcps_rwnd;             /* receive window size */
        int32_t tcps_rcv_ws;            /* receive window scaling */
        uint32_t tcps_cwnd;             /* congestion window */
@@ -117,7 +121,8 @@ typedef struct tcpsinfo {
        uint32_t tcps_rto;              /* round-trip timeout, msec */
        uint32_t tcps_mss;              /* max segment size */
        int tcps_retransmit;            /* retransmit send event, boolean */
-       int tcps_srtt;                  /* smoothed RTT in units of 
(TCP_RTT_SCALE*hz) */
+       int tcps_srtt;                  /* smoothed RTT in units of 
(TCP_RTT_SCALE*hz) */
+       int tcps_debug;         /* socket has SO_DEBUG set */
 } tcpsinfo_t;
 
 /*
@@ -188,12 +193,16 @@ translator tcpsinfo_t < struct tcpcb *p 
        tcps_state =            p == NULL ? -1 : p->t_state;
        tcps_iss =              p == NULL ? 0  : p->iss;
        tcps_suna =             p == NULL ? 0  : p->snd_una;
+       tcps_smax =             p == NULL ? 0  : p->snd_max;
        tcps_snxt =             p == NULL ? 0  : p->snd_nxt;
        tcps_rack =             p == NULL ? 0  : p->last_ack_sent;
        tcps_rnxt =             p == NULL ? 0  : p->rcv_nxt;
        tcps_swnd =             p == NULL ? -1  : p->snd_wnd;
        tcps_snd_ws =           p == NULL ? -1  : p->snd_scale;
+       tcps_swl1 =             p == NULL ? -1  : p->snd_wl1;
+       tcps_swl2 =             p == NULL ? -1  : p->snd_wl2;
        tcps_rwnd =             p == NULL ? -1  : p->rcv_wnd;
+       tcps_rup =              p == NULL ? -1  : p->rcv_up;
        tcps_rcv_ws =           p == NULL ? -1  : p->rcv_scale;
        tcps_cwnd =             p == NULL ? -1  : p->snd_cwnd;
        tcps_cwnd_ssthresh =    p == NULL ? -1  : p->snd_ssthresh;
@@ -203,6 +212,8 @@ translator tcpsinfo_t < struct tcpcb *p 
        tcps_mss =              p == NULL ? -1  : p->t_maxseg;
        tcps_retransmit =       p == NULL ? -1 : p->t_rxtshift > 0 ? 1 : 0;
        tcps_srtt =             p == NULL ? -1  : p->t_srtt;   /* smoothed RTT 
in units of (TCP_RTT_SCALE*hz) */
+       tcps_debug =            p == NULL ? 0 :
+           p->t_inpcb->inp_socket->so_options & 1;
 };
 
 #pragma D binding "1.6.3" translator
@@ -242,3 +253,123 @@ translator tcpinfoh_t < struct tcphdr *p
 translator tcplsinfo_t < int s > {
        tcps_state =    s;
 };
+
+
+/* Support for TCP debug */
+
+#pragma D binding "1.12.1" TA_INPUT
+inline int TA_INPUT =  0;
+#pragma D binding "1.12.1" TA_OUTPUT
+inline int TA_OUTPUT = 1;
+#pragma D binding "1.12.1" TA_USER
+inline int TA_USER =   2;
+#pragma D binding "1.12.1" TA_RESPOND
+inline int TA_RESPOND =        3;
+#pragma D binding "1.12.1" TA_DROP
+inline int TA_DROP =   4;
+
+/* direction strings. */
+
+#pragma D binding "1.12.1" tcpdebug_dir_string
+inline string tcpdebug_dir_string[uint8_t direction] =
+       direction == TA_INPUT ? "input" :
+       direction == TA_OUTPUT ? "output" :
+       direction == TA_USER ? "user" :
+       direction == TA_RESPOND ? "respond" :
+       direction == TA_OUTPUT ? "drop" :
+       "unknown" ;
+
+#pragma D binding "1.12.1" tcpflag_string
+inline string tcpflag_string[uint8_t flags] =
+       flags & TH_FIN ?        "FIN" :
+       flags & TH_SYN ?        "SYN" :
+       flags & TH_RST ?        "RST" :
+       flags & TH_PUSH ?       "PUSH" :
+       flags & TH_ACK ?        "ACK" :
+       flags & TH_URG ?        "URG" :
+       flags & TH_ECE ?        "ECE" :
+       flags & TH_CWR ?        "CWR" :
+       "unknown" ;
+
+#pragma D binding "1.12.1" PRU_ATTACH
+inline int PRU_ATTACH          = 0;
+#pragma D binding "1.12.1" PRU_DETACH
+inline int PRU_DETACH          = 1;
+#pragma D binding "1.12.1" PRU_BIND
+inline int PRU_BIND            = 2;
+#pragma D binding "1.12.1" PRU_LISTEN
+inline int PRU_LISTEN          = 3;
+#pragma D binding "1.12.1" PRU_CONNECT
+inline int PRU_CONNECT         = 4;
+#pragma D binding "1.12.1" PRU_ACCEPT
+inline int PRU_ACCEPT   = 5 ;
+#pragma D binding "1.12.1" PRU_DISCONNECT
+inline int PRU_DISCONNECT=  6;
+#pragma D binding "1.12.1" PRU_SHUTDOWN
+inline int PRU_SHUTDOWN         =  7;
+#pragma D binding "1.12.1" PRU_RCVD
+inline int PRU_RCVD     =  8;
+#pragma D binding "1.12.1" PRU_SEND
+inline int PRU_SEND     =  9;
+#pragma D binding "1.12.1" PRU_ABORT
+inline int PRU_ABORT     = 10;
+#pragma D binding "1.12.1" PRU_CONTROL
+inline int PRU_CONTROL   = 11;
+#pragma D binding "1.12.1" PRU_SENSE
+inline int PRU_SENSE     = 12;
+#pragma D binding "1.12.1" PRU_RCVOOB
+inline int PRU_RCVOOB    = 13;
+#pragma D binding "1.12.1" PRU_SENDOOB
+inline int PRU_SENDOOB   = 14;
+#pragma D binding "1.12.1" PRU_SOCKADDR
+inline int PRU_SOCKADDR          = 15;
+#pragma D binding "1.12.1" PRU_PEERADDR
+inline int PRU_PEERADDR          = 16;
+#pragma D binding "1.12.1" PRU_CONNECT2
+inline int PRU_CONNECT2          = 17;
+#pragma D binding "1.12.1" PRU_FASTTIMO
+inline int PRU_FASTTIMO          = 18;
+#pragma D binding "1.12.1" PRU_SLOWTIMO
+inline int PRU_SLOWTIMO          = 19;
+#pragma D binding "1.12.1" PRU_PROTORCV
+inline int PRU_PROTORCV          = 20;
+#pragma D binding "1.12.1" PRU_PROTOSEND
+inline int PRU_PROTOSEND  = 21;
+#pragma D binding "1.12.1" PRU_SEND_EOF
+inline int PRU_SEND_EOF          = 22;
+#pragma D binding "1.12.1" PRU_SOSETLABEL
+inline int PRU_SOSETLABEL = 23;
+#pragma D binding "1.12.1" PRU_CLOSE
+inline int PRU_CLOSE     = 24;
+#pragma D binding "1.12.1" PRU_FLUSH
+inline int PRU_FLUSH     = 25;
+
+#pragma D binding "1.12.1" prureq_string
+inline string prureq_string[uint8_t req] =
+       req == PRU_ATTACH ? "ATTACH" :
+       req == PRU_DETACH ? "DETACH" :
+       req == PRU_BIND ? "BIND" :
+       req == PRU_LISTEN ? "LISTEN" :
+       req == PRU_CONNECT ? "CONNECT" :
+       req == PRU_ACCEPT ? "ACCEPT" :
+       req == PRU_DISCONNECT ? "DISCONNECT" :
+       req == PRU_SHUTDOWN ? "SHUTDOWN" :
+       req == PRU_RCVD ? "RCVD" :
+       req == PRU_SEND ? "SEND" :
+       req == PRU_ABORT ? "ABORT" :
+       req == PRU_CONTROL ? "CONTROL" :
+       req == PRU_SENSE ? "SENSE" :
+       req == PRU_RCVOOB ? "RCVOOB" :
+       req == PRU_SENDOOB ? "SENDOOB" :
+       req == PRU_SOCKADDR ? "SOCKADDR" :
+       req == PRU_PEERADDR ? "PEERADDR" :
+       req == PRU_CONNECT2 ? "CONNECT2" :
+       req == PRU_FASTTIMO ? "FASTTIMO" :
+       req == PRU_SLOWTIMO ? "SLOWTIMO" :
+       req == PRU_PROTORCV ? "PROTORCV" :
+       req == PRU_PROTOSEND ? "PROTOSEND" :
+       req == PRU_SEND ? "SEND_EOF" :
+       req == PRU_SOSETLABEL ? "SOSETLABEL" :
+       req == PRU_CLOSE ? "CLOSE" :
+       req == PRU_FLUSH ? "FLUSE" :
+       "unknown" ;

Added: head/share/dtrace/tcpdebug
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/share/dtrace/tcpdebug  Sun Sep 13 15:50:55 2015        (r287759)
@@ -0,0 +1,165 @@
+#!/usr/sbin/dtrace -s
+/*
+ * Copyright (c) 2015 George V. Neville-Neil
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ *
+ * The tcpdebug D script uses the tcp:kernel::debug tracepoints
+ * to replicate the action of turning on TCPDEBUG in a kernel configuration.
+ *
+ * A TCP debug statement shows a connection's
+ *
+ * direction:  input, output, user, drop
+ * state:      CLOSED, LISTEN, SYN_SENT, SYN_RCVD, ESTABLISHED,
+ *             CLOSE_WAIT, FIN_WAIT_1, CLOSING, LAST_ACK, FIN_WAIT_2,TIME_WAIT
+ * sequence:   sequence space
+ *
+ * congestion: rcv_nxt, rcv_wnd, rcv_up, snd_una, snd_nxt, snx_max,
+ *             snd_wl1, snd_wl2, snd_wnd
+ *
+ * NOTE: Only sockets with SO_DEBUG set will be shown.
+ * 
+ * Usage: tcpdebug
+ */
+
+#pragma D option quiet
+tcp:kernel::debug-input
+/args[0]->tcps_debug/
+{
+       seq = args[1]->tcp_seq;
+       ack = args[1]->tcp_ack;
+       len = args[2]->ip_plength - sizeof(struct tcphdr);
+       flags = args[1]->tcp_flags;
+       
+       printf("%p %s: input [%xu..%xu]", arg0,
+              tcp_state_string[args[0]->tcps_state], seq, seq + len);
+
+       printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
+
+       printf("%s", flags != 0 ? "<" : "");
+       printf("%s", flags & TH_SYN ? "SYN," :"");
+       printf("%s", flags & TH_ACK ? "ACK," :"");
+       printf("%s", flags & TH_FIN ? "FIN," :"");
+       printf("%s", flags & TH_RST ? "RST," :"");
+       printf("%s", flags & TH_PUSH ? "PUSH," :"");
+       printf("%s", flags & TH_URG ? "URG," :"");
+       printf("%s", flags & TH_ECE ? "ECE," :"");
+       printf("%s", flags & TH_CWR ? "CWR" :"");
+       printf("%s", flags != 0 ? ">" : "");
+
+       printf("\n");
+       printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
+              args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
+              args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
+       printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
+              args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
+
+}
+
+tcp:kernel::debug-output
+/args[0]->tcps_debug/
+{
+       seq = args[1]->tcp_seq;
+       ack = args[1]->tcp_ack;
+       len = args[2]->ip_plength - 20;
+
+       printf("%p %s: output [%x..%x]", arg0,
+              tcp_state_string[args[0]->tcps_state], seq, seq + len);
+
+       printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
+
+       printf("%s", flags != 0 ? "<" : "");
+       printf("%s", flags & TH_SYN ? "SYN," :"");
+       printf("%s", flags & TH_ACK ? "ACK," :"");
+       printf("%s", flags & TH_FIN ? "FIN," :"");
+       printf("%s", flags & TH_RST ? "RST," :"");
+       printf("%s", flags & TH_PUSH ? "PUSH," :"");
+       printf("%s", flags & TH_URG ? "URG," :"");
+       printf("%s", flags & TH_ECE ? "ECE," :"");
+       printf("%s", flags & TH_CWR ? "CWR" :"");
+       printf("%s", flags != 0 ? ">" : "");
+
+       printf("\n");
+       printf("\trcv_(nxt,wnd,up) (%u,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
+              args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
+              args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
+       printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
+              args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
+
+}
+
+tcp:kernel::debug-drop
+/args[0]->tcps_debug/
+{
+       printf("%p %s: output [x..x] @%x, urp=%x\n", arg0,
+              tcp_state_string[args[0]->tcps_state],
+              args[1]->tcp_ack,
+              args[1]->tcp_urgent);
+
+       seq = args[1]->tcp_seq;
+       ack = args[1]->tcp_ack;
+       len = args[2]->ip_plength;
+
+       printf("%p %s: drop [%x..%x]", arg0,
+              tcp_state_string[args[0]->tcps_state], seq, seq + len);
+
+       printf("@%x, urp=%x", ack, args[1]->tcp_urgent);
+
+       printf("%s", flags != 0 ? "<" : "");
+       printf("%s", flags & TH_SYN ? "SYN," :"");
+       printf("%s", flags & TH_ACK ? "ACK," :"");
+       printf("%s", flags & TH_FIN ? "FIN," :"");
+       printf("%s", flags & TH_RST ? "RST," :"");
+       printf("%s", flags & TH_PUSH ? "PUSH," :"");
+       printf("%s", flags & TH_URG ? "URG," :"");
+       printf("%s", flags & TH_ECE ? "ECE," :"");
+       printf("%s", flags & TH_CWR ? "CWR" :"");
+       printf("%s", flags != 0 ? ">" : "");
+
+       printf("\n");
+       printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
+              args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
+              args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
+       printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
+              args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
+
+}
+
+tcp:kernel::debug-user
+/args[0]->tcps_debug/
+{
+       printf("%p %s: user ", arg0,
+              tcp_state_string[args[0]->tcps_state]);
+
+       printf("%s", prureq_string[arg1]);
+       printf("\n");
+       printf("\trcv_(nxt,wnd,up) (%x,%x,%x) snd_(una,nxt,max) (%x,%x,%x)\n",
+              args[0]->tcps_rnxt, args[0]->tcps_rwnd, args[0]->tcps_rup,
+              args[0]->tcps_suna, args[0]->tcps_snxt, args[0]->tcps_smax);
+       printf("\tsnd_(wl1,wl2,wnd) (%x,%x,%x)\n",
+              args[0]->tcps_swl1, args[0]->tcps_swl2, args[0]->tcps_swnd);
+
+}
+

Modified: head/sys/netinet/in_kdtrace.c
==============================================================================
--- head/sys/netinet/in_kdtrace.c       Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/in_kdtrace.c       Sun Sep 13 15:50:55 2015        
(r287759)
@@ -105,6 +105,25 @@ SDT_PROBE_DEFINE5_XLATE(tcp, , , send,
 SDT_PROBE_DEFINE1_XLATE(tcp, , , siftr,
     "struct pkt_node *", "siftrinfo_t *");
 
+SDT_PROBE_DEFINE3_XLATE(tcp, , , debug__input,
+    "struct tcpcb *", "tcpsinfo_t *" ,
+    "struct tcphdr *", "tcpinfo_t *",
+    "uint8_t *", "ipinfo_t *");
+
+SDT_PROBE_DEFINE3_XLATE(tcp, , , debug__output,
+    "struct tcpcb *", "tcpsinfo_t *" ,
+    "struct tcphdr *", "tcpinfo_t *",
+    "uint8_t *", "ipinfo_t *");
+
+SDT_PROBE_DEFINE2_XLATE(tcp, , , debug__user,
+    "struct tcpcb *", "tcpsinfo_t *" ,
+    "int", "int");
+
+SDT_PROBE_DEFINE3_XLATE(tcp, , , debug__drop,
+    "struct tcpcb *", "tcpsinfo_t *" ,
+    "struct tcphdr *", "tcpinfo_t *",
+    "uint8_t *", "ipinfo_t *")
+
 SDT_PROBE_DEFINE6_XLATE(tcp, , , state__change,
     "void *", "void *",
     "struct tcpcb *", "csinfo_t *",

Modified: head/sys/netinet/in_kdtrace.h
==============================================================================
--- head/sys/netinet/in_kdtrace.h       Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/in_kdtrace.h       Sun Sep 13 15:50:55 2015        
(r287759)
@@ -34,6 +34,12 @@
        SDT_PROBE5(udp, , , probe, arg0, arg1, arg2, arg3, arg4)
 #define        TCP_PROBE1(probe, arg0) \
        SDT_PROBE1(tcp, , , probe, arg0)
+#define        TCP_PROBE2(probe, arg0, arg1)           \
+       SDT_PROBE2(tcp, , , probe, arg0, arg1)
+#define        TCP_PROBE3(probe, arg0, arg1, arg2)             \
+       SDT_PROBE3(tcp, , , probe, arg0, arg1, arg2)
+#define        TCP_PROBE4(probe, arg0, arg1, arg2, arg3)       \
+       SDT_PROBE4(tcp, , , probe, arg0, arg1, arg2, arg3)
 #define        TCP_PROBE5(probe, arg0, arg1, arg2, arg3, arg4)                 
\
        SDT_PROBE5(tcp, , , probe, arg0, arg1, arg2, arg3, arg4)
 #define        TCP_PROBE6(probe, arg0, arg1, arg2, arg3, arg4, arg5)           
\
@@ -55,6 +61,10 @@ SDT_PROBE_DECLARE(tcp, , , receive);
 SDT_PROBE_DECLARE(tcp, , , send);
 SDT_PROBE_DECLARE(tcp, , , siftr);
 SDT_PROBE_DECLARE(tcp, , , state__change);
+SDT_PROBE_DECLARE(tcp, , , debug__input);
+SDT_PROBE_DECLARE(tcp, , , debug__output);
+SDT_PROBE_DECLARE(tcp, , , debug__user);
+SDT_PROBE_DECLARE(tcp, , , debug__drop);
 
 SDT_PROBE_DECLARE(udp, , , receive);
 SDT_PROBE_DECLARE(udp, , , send);

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c        Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/tcp_input.c        Sun Sep 13 15:50:55 2015        
(r287759)
@@ -1377,6 +1377,7 @@ relocked:
                        tcp_trace(TA_INPUT, ostate, tp,
                            (void *)tcp_saveipgen, &tcp_savetcp, 0);
 #endif
+               TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
                tcp_dooptions(&to, optp, optlen, TO_SYN);
                syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL);
                /*
@@ -1779,6 +1780,8 @@ tcp_do_segment(struct mbuf *m, struct tc
                                            (void *)tcp_saveipgen,
                                            &tcp_savetcp, 0);
 #endif
+                               TCP_PROBE3(debug__input, tp, th,
+                                       mtod(m, const char *));
                                if (tp->snd_una == tp->snd_max)
                                        tcp_timer_activate(tp, TT_REXMT, 0);
                                else if (!tcp_timer_active(tp, TT_PERSIST))
@@ -1825,6 +1828,8 @@ tcp_do_segment(struct mbuf *m, struct tc
                                tcp_trace(TA_INPUT, ostate, tp,
                                    (void *)tcp_saveipgen, &tcp_savetcp, 0);
 #endif
+                       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
+
                /*
                 * Automatic sizing of receive socket buffer.  Often the send
                 * buffer size is not optimally adjusted to the actual network
@@ -3022,6 +3027,7 @@ dodata:                                                   
/* XXX */
                tcp_trace(TA_INPUT, ostate, tp, (void *)tcp_saveipgen,
                          &tcp_savetcp, 0);
 #endif
+       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
 
        /*
         * Return any desired output.
@@ -3069,6 +3075,7 @@ dropafterack:
                tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
                          &tcp_savetcp, 0);
 #endif
+       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
        if (ti_locked == TI_RLOCKED)
                INP_INFO_RUNLOCK(&V_tcbinfo);
        ti_locked = TI_UNLOCKED;
@@ -3109,6 +3116,7 @@ drop:
                tcp_trace(TA_DROP, ostate, tp, (void *)tcp_saveipgen,
                          &tcp_savetcp, 0);
 #endif
+       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
        if (tp != NULL)
                INP_WUNLOCK(tp->t_inpcb);
        m_freem(m);

Modified: head/sys/netinet/tcp_output.c
==============================================================================
--- head/sys/netinet/tcp_output.c       Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/tcp_output.c       Sun Sep 13 15:50:55 2015        
(r287759)
@@ -1253,6 +1253,7 @@ send:
                ipov->ih_len = save;
        }
 #endif /* TCPDEBUG */
+       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
 
        /*
         * Fill in IP length and desired time to live and

Modified: head/sys/netinet/tcp_subr.c
==============================================================================
--- head/sys/netinet/tcp_subr.c Sun Sep 13 15:31:55 2015        (r287758)
+++ head/sys/netinet/tcp_subr.c Sun Sep 13 15:50:55 2015        (r287759)
@@ -720,6 +720,7 @@ tcp_respond(struct tcpcb *tp, void *ipge
        if (tp == NULL || (inp->inp_socket->so_options & SO_DEBUG))
                tcp_trace(TA_OUTPUT, 0, tp, mtod(m, void *), th, 0);
 #endif
+       TCP_PROBE3(debug__input, tp, th, mtod(m, const char *));
        if (flags & TH_RST)
                TCP_PROBE5(accept__refused, NULL, NULL, mtod(m, const char *),
                    tp, nth);

Modified: head/sys/netinet/tcp_timer.c
==============================================================================
--- head/sys/netinet/tcp_timer.c        Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/tcp_timer.c        Sun Sep 13 15:50:55 2015        
(r287759)
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
 
 #include <netinet/cc.h>
 #include <netinet/in.h>
+#include <netinet/in_kdtrace.h>
 #include <netinet/in_pcb.h>
 #include <netinet/in_rss.h>
 #include <netinet/in_systm.h>
@@ -369,6 +370,8 @@ tcp_timer_2msl(void *xtp)
                tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
                          PRU_SLOWTIMO);
 #endif
+       TCP_PROBE2(debug__user, tp, PRU_SLOWTIMO);
+
        if (tp != NULL)
                INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
@@ -454,6 +457,7 @@ tcp_timer_keep(void *xtp)
                tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
                          PRU_SLOWTIMO);
 #endif
+       TCP_PROBE2(debug__user, tp, PRU_SLOWTIMO);
        INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
        CURVNET_RESTORE();
@@ -468,6 +472,7 @@ dropit:
                tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
                          PRU_SLOWTIMO);
 #endif
+       TCP_PROBE2(debug__user, tp, PRU_SLOWTIMO);
        if (tp != NULL)
                INP_WUNLOCK(tp->t_inpcb);
        INP_INFO_RUNLOCK(&V_tcbinfo);
@@ -546,6 +551,7 @@ out:
        if (tp != NULL && tp->t_inpcb->inp_socket->so_options & SO_DEBUG)
                tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
 #endif
+       TCP_PROBE2(debug__user, tp, PRU_SLOWTIMO);
        if (tp != NULL)
                INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
@@ -792,6 +798,7 @@ out:
                tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
                          PRU_SLOWTIMO);
 #endif
+       TCP_PROBE2(debug__user, tp, PRU_SLOWTIMO);
        if (tp != NULL)
                INP_WUNLOCK(inp);
        if (headlocked)

Modified: head/sys/netinet/tcp_usrreq.c
==============================================================================
--- head/sys/netinet/tcp_usrreq.c       Sun Sep 13 15:31:55 2015        
(r287758)
+++ head/sys/netinet/tcp_usrreq.c       Sun Sep 13 15:50:55 2015        
(r287759)
@@ -70,6 +70,7 @@ __FBSDID("$FreeBSD$");
 
 #include <netinet/cc.h>
 #include <netinet/in.h>
+#include <netinet/in_kdtrace.h>
 #include <netinet/in_pcb.h>
 #include <netinet/in_systm.h>
 #include <netinet/in_var.h>
@@ -146,6 +147,7 @@ tcp_usr_attach(struct socket *so, int pr
        tp = intotcpcb(inp);
 out:
        TCPDEBUG2(PRU_ATTACH);
+       TCP_PROBE2(debug__user, tp, PRU_ATTACH);
        return error;
 }
 
@@ -295,6 +297,7 @@ tcp_usr_bind(struct socket *so, struct s
        INP_HASH_WUNLOCK(&V_tcbinfo);
 out:
        TCPDEBUG2(PRU_BIND);
+       TCP_PROBE2(debug__user, tp, PRU_BIND);
        INP_WUNLOCK(inp);
 
        return (error);
@@ -355,6 +358,7 @@ tcp6_usr_bind(struct socket *so, struct 
        INP_HASH_WUNLOCK(&V_tcbinfo);
 out:
        TCPDEBUG2(PRU_BIND);
+       TCP_PROBE2(debug__user, tp, PRU_BIND);
        INP_WUNLOCK(inp);
        return (error);
 }
@@ -399,6 +403,7 @@ tcp_usr_listen(struct socket *so, int ba
 
 out:
        TCPDEBUG2(PRU_LISTEN);
+       TCP_PROBE2(debug__user, tp, PRU_LISTEN);
        INP_WUNLOCK(inp);
        return (error);
 }
@@ -444,6 +449,7 @@ tcp6_usr_listen(struct socket *so, int b
 
 out:
        TCPDEBUG2(PRU_LISTEN);
+       TCP_PROBE2(debug__user, tp, PRU_LISTEN);
        INP_WUNLOCK(inp);
        return (error);
 }
@@ -592,6 +598,7 @@ tcp6_usr_connect(struct socket *so, stru
 
 out:
        TCPDEBUG2(PRU_CONNECT);
+       TCP_PROBE2(debug__user, tp, PRU_CONNECT);
        INP_WUNLOCK(inp);
        return (error);
 }
@@ -631,6 +638,7 @@ tcp_usr_disconnect(struct socket *so)
        tcp_disconnect(tp);
 out:
        TCPDEBUG2(PRU_DISCONNECT);
+       TCP_PROBE2(debug__user, tp, PRU_DISCONNECT);
        INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
        return (error);
@@ -674,6 +682,7 @@ tcp_usr_accept(struct socket *so, struct
 
 out:
        TCPDEBUG2(PRU_ACCEPT);
+       TCP_PROBE2(debug__user, tp, PRU_ACCEPT);
        INP_WUNLOCK(inp);
        if (error == 0)
                *nam = in_sockaddr(port, &addr);
@@ -724,6 +733,7 @@ tcp6_usr_accept(struct socket *so, struc
 
 out:
        TCPDEBUG2(PRU_ACCEPT);
+       TCP_PROBE2(debug__user, tp, PRU_ACCEPT);
        INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
        if (error == 0) {
@@ -764,6 +774,7 @@ tcp_usr_shutdown(struct socket *so)
 
 out:
        TCPDEBUG2(PRU_SHUTDOWN);
+       TCP_PROBE2(debug__user, tp, PRU_SHUTDOWN);
        INP_WUNLOCK(inp);
        INP_INFO_RUNLOCK(&V_tcbinfo);
 
@@ -799,6 +810,7 @@ tcp_usr_rcvd(struct socket *so, int flag
 
 out:
        TCPDEBUG2(PRU_RCVD);
+       TCP_PROBE2(debug__user, tp, PRU_RCVD);
        INP_WUNLOCK(inp);
        return (error);
 }
@@ -953,6 +965,8 @@ tcp_usr_send(struct socket *so, int flag
 out:
        TCPDEBUG2((flags & PRUS_OOB) ? PRU_SENDOOB :
                  ((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND));
+       TCP_PROBE2(debug__user, tp, (flags & PRUS_OOB) ? PRU_SENDOOB :
+                  ((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND));
        INP_WUNLOCK(inp);
        if (flags & PRUS_EOF)
                INP_INFO_RUNLOCK(&V_tcbinfo);
@@ -1013,6 +1027,7 @@ tcp_usr_abort(struct socket *so)
                TCPDEBUG1();
                tcp_drop(tp, ECONNABORTED);
                TCPDEBUG2(PRU_ABORT);
+               TCP_PROBE2(debug__user, tp, PRU_ABORT);
        }
        if (!(inp->inp_flags & INP_DROPPED)) {
                SOCK_LOCK(so);
@@ -1052,6 +1067,7 @@ tcp_usr_close(struct socket *so)
                TCPDEBUG1();
                tcp_disconnect(tp);
                TCPDEBUG2(PRU_CLOSE);
+               TCP_PROBE2(debug__user, tp, PRU_CLOSE);
        }
        if (!(inp->inp_flags & INP_DROPPED)) {
                SOCK_LOCK(so);
@@ -1101,6 +1117,7 @@ tcp_usr_rcvoob(struct socket *so, struct
 
 out:
        TCPDEBUG2(PRU_RCVOOB);
+       TCP_PROBE2(debug__user, tp, PRU_RCVOOB);
        INP_WUNLOCK(inp);
        return (error);
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to