Index: cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh =================================================================== --- cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh +++ cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh @@ -25,7 +25,7 @@ # # -# Test ip:::{send,receive} of IPv4 UDP to a local address. +# Test {ip,udp}:::{send,receive} of IPv4 UDP to a local address. # # This may fail due to: # @@ -42,11 +42,11 @@ # 1 x ip:::send (UDP sent to UDP port 33434) # 1 x udp:::send (UDP sent to UDP port 33434) # 1 x ip:::receive (UDP received) +# 1 x udp:::receive (UDP received) # -# No udp:::receive event is expected since the UDP packet elicts -# an ICMP PORT_UNREACHABLE response rather than a UDP packet, and locally -# the echo request UDP packet only reaches IP, so the udp:::receive probe -# is not triggered by it. +# A udp:::receive event is expected even if the received UDP packet +# elicts an ICMP PORT_UNREACHABLE message since there is no UDP +# socket for receiving the packet. # if (( $# != 1 )); then @@ -77,7 +77,7 @@ $dtrace -c 'perl test.pl' -qs /dev/stdin <ip_saddr == "$local" && args[2]->ip_daddr == "$local"/ +{ + udpreceive++; +} + END { printf("Minimum UDP events seen\n\n"); printf("ip:::send - %s\n", ipsend >= 1 ? "yes" : "no"); printf("ip:::receive - %s\n", ipreceive >= 1 ? "yes" : "no"); printf("udp:::send - %s\n", udpsend >= 1 ? "yes" : "no"); + printf("udp:::receive - %s\n", udpreceive >= 1 ? "yes" : "no"); } EODTRACE Index: cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh.out =================================================================== --- cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh.out +++ cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh.out @@ -3,4 +3,5 @@ ip:::send - yes ip:::receive - yes udp:::send - yes +udp:::receive - yes Index: share/man/man4/dtrace_udp.4 =================================================================== --- share/man/man4/dtrace_udp.4 +++ share/man/man4/dtrace_udp.4 @@ -24,7 +24,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 18, 2015 +.Dd July 16th, 2018 .Dt DTRACE_UDP 4 .Os .Sh NAME @@ -45,7 +45,10 @@ .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 Index: sys/netinet/udp_usrreq.c =================================================================== --- sys/netinet/udp_usrreq.c +++ sys/netinet/udp_usrreq.c @@ -685,6 +685,7 @@ 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 @@ */ 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); Index: sys/netinet6/udp6_usrreq.c =================================================================== --- sys/netinet6/udp6_usrreq.c +++ sys/netinet6/udp6_usrreq.c @@ -483,6 +483,7 @@ 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");