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 16, 2018 .Dt DTRACE_UDP 4 .Os .Sh NAME @@ -45,7 +45,11 @@ .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");