Author: tuexen
Date: Mon Jul 30 20:13:38 2018
New Revision: 336932
URL: https://svnweb.freebsd.org/changeset/base/336932

Log:
  Add missing send/recv dtrace probes for TCP.
  
  These missing probe are mostly in the syncache and timewait code.
  
  Reviewed by:          markj@, rrs@
  MFC after:            1 month
  Sponsored by:         Netflix, Inc.
  Differential Revision:        https://reviews.freebsd.org/D16369

Modified:
  head/sys/netinet/tcp_input.c
  head/sys/netinet/tcp_syncache.c
  head/sys/netinet/tcp_timewait.c

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c        Mon Jul 30 20:00:56 2018        
(r336931)
+++ head/sys/netinet/tcp_input.c        Mon Jul 30 20:13:38 2018        
(r336932)
@@ -1145,6 +1145,7 @@ tfo_socket_result:
                         * contains.  tcp_do_segment() consumes
                         * the mbuf chain and unlocks the inpcb.
                         */
+                       TCP_PROBE5(receive, NULL, tp, m, tp, th);
                        tp->t_fb->tfb_tcp_do_segment(m, th, so, tp, 
drop_hdrlen, tlen,
                            iptos);
                        if (ti_locked == TI_RLOCKED)

Modified: head/sys/netinet/tcp_syncache.c
==============================================================================
--- head/sys/netinet/tcp_syncache.c     Mon Jul 30 20:00:56 2018        
(r336931)
+++ head/sys/netinet/tcp_syncache.c     Mon Jul 30 20:13:38 2018        
(r336932)
@@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$");
 #include <net/vnet.h>
 
 #include <netinet/in.h>
+#include <netinet/in_kdtrace.h>
 #include <netinet/in_systm.h>
 #include <netinet/ip.h>
 #include <netinet/in_var.h>
@@ -1400,6 +1401,7 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *t
                 */
                mac_syncache_destroy(&maclabel);
 #endif
+               TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
                /* Retransmit SYN|ACK and reset retransmit count. */
                if ((s = tcp_log_addrs(&sc->sc_inc, th, NULL, NULL))) {
                        log(LOG_DEBUG, "%s; %s: Received duplicate SYN, "
@@ -1414,7 +1416,7 @@ syncache_add(struct in_conninfo *inc, struct tcpopt *t
                        TCPSTAT_INC(tcps_sndtotal);
                }
                SCH_UNLOCK(sch);
-               goto done;
+               goto donenoprobe;
        }
 
        if (tfo_cookie_valid) {
@@ -1566,6 +1568,7 @@ skip_alloc:
                goto tfo_expanded;
        }
 
+       TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
        /*
         * Do a standard 3-way handshake.
         */
@@ -1581,8 +1584,11 @@ skip_alloc:
                        syncache_free(sc);
                TCPSTAT_INC(tcps_sc_dropped);
        }
+       goto donenoprobe;
 
 done:
+       TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
+donenoprobe:
        if (m) {
                *lsop = NULL;
                m_freem(m);
@@ -1793,6 +1799,7 @@ syncache_respond(struct syncache *sc, struct syncache_
                        return (error);
                }
 #endif
+               TCP_PROBE5(send, NULL, NULL, ip6, NULL, th);
                error = ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL);
        }
 #endif
@@ -1813,6 +1820,7 @@ syncache_respond(struct syncache *sc, struct syncache_
                        return (error);
                }
 #endif
+               TCP_PROBE5(send, NULL, NULL, ip, NULL, th);
                error = ip_output(m, sc->sc_ipopts, NULL, 0, NULL, NULL);
        }
 #endif

Modified: head/sys/netinet/tcp_timewait.c
==============================================================================
--- head/sys/netinet/tcp_timewait.c     Mon Jul 30 20:00:56 2018        
(r336931)
+++ head/sys/netinet/tcp_timewait.c     Mon Jul 30 20:13:38 2018        
(r336932)
@@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
 #include <net/vnet.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>
@@ -450,9 +451,14 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to __unu
         * Acknowledge the segment if it has data or is not a duplicate ACK.
         */
        if (thflags != TH_ACK || tlen != 0 ||
-           th->th_seq != tw->rcv_nxt || th->th_ack != tw->snd_nxt)
+           th->th_seq != tw->rcv_nxt || th->th_ack != tw->snd_nxt) {
+               TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
                tcp_twrespond(tw, TH_ACK);
+               goto dropnoprobe;
+       }
 drop:
+       TCP_PROBE5(receive, NULL, NULL, m, NULL, th);
+dropnoprobe:
        INP_WUNLOCK(inp);
        m_freem(m);
        return (0);
@@ -598,6 +604,7 @@ tcp_twrespond(struct tcptw *tw, int flags)
                th->th_sum = in6_cksum_pseudo(ip6,
                    sizeof(struct tcphdr) + optlen, IPPROTO_TCP, 0);
                ip6->ip6_hlim = in6_selecthlim(inp, NULL);
+               TCP_PROBE5(send, NULL, NULL, ip6, NULL, th);
                error = ip6_output(m, inp->in6p_outputopts, NULL,
                    (tw->tw_so_options & SO_DONTROUTE), NULL, NULL, inp);
        }
@@ -613,6 +620,7 @@ tcp_twrespond(struct tcptw *tw, int flags)
                ip->ip_len = htons(m->m_pkthdr.len);
                if (V_path_mtu_discovery)
                        ip->ip_off |= htons(IP_DF);
+               TCP_PROBE5(send, NULL, NULL, ip, NULL, th);
                error = ip_output(m, inp->inp_options, NULL,
                    ((tw->tw_so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0),
                    NULL, inp);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to