diff --git a/sys/netinet/ip_icmp.c b/sys/netinet/ip_icmp.c index adf69c47aed5..30e5b57f1a26 100644 --- a/sys/netinet/ip_icmp.c +++ b/sys/netinet/ip_icmp.c @@ -160,11 +160,11 @@ SYSCTL_INT(_net_inet_icmp, OID_AUTO, quotelen, CTLFLAG_VNET | CTLFLAG_RW, &VNET_NAME(icmp_quotelen), 0, "Number of bytes from original packet to quote in ICMP reply"); -VNET_DEFINE_STATIC(int, icmpbmcastecho) = 0; -#define V_icmpbmcastecho VNET(icmpbmcastecho) -SYSCTL_INT(_net_inet_icmp, OID_AUTO, bmcastecho, CTLFLAG_VNET | CTLFLAG_RW, - &VNET_NAME(icmpbmcastecho), 0, - "Reply to multicast ICMP Echo Request and Timestamp packets"); +VNET_DEFINE_STATIC(int, icmpbcastecho) = 0; +#define V_icmpbcastecho VNET(icmpbcastecho) +SYSCTL_INT(_net_inet_icmp, OID_AUTO, bcastecho, CTLFLAG_VNET | CTLFLAG_RW, + &VNET_NAME(icmpbcastecho), 0, + "Reply to broadcast ICMP Echo Request and Timestamp packets"); VNET_DEFINE_STATIC(int, icmptstamprepl) = 1; #define V_icmptstamprepl VNET(icmptstamprepl) @@ -595,21 +595,28 @@ icmp_input(struct mbuf **mp, int *offp, int proto) break; case ICMP_ECHO: - if (!V_icmpbmcastecho - && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { + if (!V_icmpbcastecho && (m->m_flags & M_BCAST) != 0) { ICMPSTAT_INC(icps_bmcastecho); break; } if (badport_bandlim(BANDLIM_ICMP_ECHO) < 0) goto freeit; + if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { + struct in_multi *inm; + + inm = inm_lookup(m->m_pkthdr.rcvif, ip->ip_dst); + if (inm == NULL) { + ICMPSTAT_INC(icps_bmcastecho); + break; + } + } icp->icmp_type = ICMP_ECHOREPLY; goto reflect; case ICMP_TSTAMP: if (V_icmptstamprepl == 0) break; - if (!V_icmpbmcastecho - && (m->m_flags & (M_MCAST | M_BCAST)) != 0) { + if (!V_icmpbcastecho && (m->m_flags & M_BCAST) != 0) { ICMPSTAT_INC(icps_bmcasttstamp); break; } @@ -619,6 +626,15 @@ icmp_input(struct mbuf **mp, int *offp, int proto) } if (badport_bandlim(BANDLIM_ICMP_TSTAMP) < 0) goto freeit; + if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) { + struct in_multi *inm; + + inm = inm_lookup(m->m_pkthdr.rcvif, ip->ip_dst); + if (inm == NULL) { + ICMPSTAT_INC(icps_bmcasttstamp); + break; + } + } icp->icmp_type = ICMP_TSTAMPREPLY; icp->icmp_rtime = iptime(); icp->icmp_ttime = icp->icmp_rtime; /* bogus, do later! */