From e1526d5a5bf98de1b4ffef7c6cba4dc04be1eb7a Mon Sep 17 00:00:00 2001 From: Michael Tuexen Date: Fri, 20 Jul 2018 15:32:20 +0000 Subject: [PATCH] Add missing dtrace probes for received UDP packets. Fire UDP receive probes when a packet is received and there is no endpoint consuming it. Fire the probe also if the TTL of the received packet is smaller than the minimum required by the endpoint. Clarify also in the man page, when the probe fires. Reviewed by: dteske@, markj@, rrs@ Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D16046 --- share/man/man4/dtrace_udp.4 | 8 ++++++-- sys/netinet/udp_usrreq.c | 2 ++ sys/netinet6/udp6_usrreq.c | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/share/man/man4/dtrace_udp.4 b/share/man/man4/dtrace_udp.4 index 40df6b6fc01b..410651caa2fb 100644 --- a/share/man/man4/dtrace_udp.4 +++ b/share/man/man4/dtrace_udp.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 18, 2015 +.Dd July 20, 2018 .Dt DTRACE_UDP 4 .Os .Sh NAME @@ -45,7 +45,11 @@ The .Fn udp:::send probe fires whenever the kernel prepares to transmit a UDP packet, and the .Fn udp:::receive -probe fires whenever the kernel receives a UDP packet. +probe fires whenever the kernel receives a UDP packet, unless +the UDP header is incomplete, +the destination port is 0, +the length field is invalid, +or the checksum is wrong. The arguments to these probes can be used to obtain detailed information about the IP and UDP headers of the corresponding packet. .Sh ARGUMENTS diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 49bebb2fc7f5..003dcf22918c 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -685,6 +685,7 @@ udp_input(struct mbuf **mp, int *offp, int proto) inet_ntoa_r(ip->ip_dst, dst), ntohs(uh->uh_dport), inet_ntoa_r(ip->ip_src, src), ntohs(uh->uh_sport)); } + UDP_PROBE(receive, NULL, NULL, ip, NULL, uh); UDPSTAT_INC(udps_noport); if (m->m_flags & (M_BCAST | M_MCAST)) { UDPSTAT_INC(udps_noportbcast); @@ -704,6 +705,7 @@ udp_input(struct mbuf **mp, int *offp, int proto) */ INP_RLOCK_ASSERT(inp); if (inp->inp_ip_minttl && inp->inp_ip_minttl > ip->ip_ttl) { + UDP_PROBE(receive, NULL, inp, ip, inp, uh); INP_RUNLOCK(inp); m_freem(m); return (IPPROTO_DONE); diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 5975419df31c..38c6d9cd4a6f 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -483,6 +483,7 @@ udp6_input(struct mbuf **mp, int *offp, int proto) ip6_sprintf(ip6bufs, &ip6->ip6_src), ntohs(uh->uh_sport)); } + UDP_PROBE(receive, NULL, NULL, ip6, NULL, uh); UDPSTAT_INC(udps_noport); if (m->m_flags & M_MCAST) { printf("UDP6: M_MCAST is set in a unicast packet.\n");