svn commit: r318778 - stable/11/sys/netinet
Andrey V. Elsukov
ae at FreeBSD.org
Wed May 24 09:03:48 UTC 2017
Author: ae
Date: Wed May 24 09:03:46 2017
New Revision: 318778
URL: https://svnweb.freebsd.org/changeset/base/318778
Log:
MFC r318399:
Set M_BCAST and M_MCAST flags on mbuf sent via divert socket.
r290383 has changed how mbufs sent by divert socket are handled.
Previously they are always handled by slow path processing in ip_input().
Now ip_tryforward() is invoked from ip_input() before in_broadcast() check.
Since diverted packet lost all mbuf flags, it passes the broadcast check
in ip_tryforward() due to missing M_BCAST flag. In the result the broadcast
packet is forwarded to the wire instead of be consumed by network stack.
Add in_broadcast() check to the div_output() function. And restore the
M_BCAST flag if destination address is broadcast for the given network
interface.
PR: 209491
Modified:
stable/11/sys/netinet/ip_divert.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/netinet/ip_divert.c
==============================================================================
--- stable/11/sys/netinet/ip_divert.c Wed May 24 09:01:54 2017 (r318777)
+++ stable/11/sys/netinet/ip_divert.c Wed May 24 09:03:46 2017 (r318778)
@@ -489,6 +489,14 @@ div_output(struct socket *so, struct mbu
/* Send packet to input processing via netisr */
switch (ip->ip_v) {
case IPVERSION:
+ /*
+ * Restore M_BCAST flag when destination address is
+ * broadcast. It is expected by ip_tryforward().
+ */
+ if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)))
+ m->m_flags |= M_MCAST;
+ else if (in_broadcast(ip->ip_dst, m->m_pkthdr.rcvif))
+ m->m_flags |= M_BCAST;
netisr_queue_src(NETISR_IP, (uintptr_t)so, m);
break;
#ifdef INET6
More information about the svn-src-stable-11
mailing list