Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Oct 2016 22:11:33 +0000 (UTC)
From:      Ryan Stone <rstone@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r307887 - head/sys/netinet
Message-ID:  <201610242211.u9OMBXia039061@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rstone
Date: Mon Oct 24 22:11:33 2016
New Revision: 307887
URL: https://svnweb.freebsd.org/changeset/base/307887

Log:
  Fix ip_output() on point-to-point links
  
  In r304435, ip_output() was changed to use the result of the route
  lookup to decide whether the outgoing packet was a broadcast or
  not.  This introduced a regression on interfaces where
  IFF_BROADCAST was not set (e.g. point-to-point links), as the
  algorithm could incorrectly treat the destination address as a
  broadcast address, and ip_output() would subsequently drop the
  packet as broadcasting on a non-IFF_BROADCAST interface is not
  allowed.
  
  Differential Revision:	https://reviews.freebsd.org/D8303
  Reviewed by:	jtl
  Reported by:	ambrisko
  MFC after:	2 weeks
  X-MFC-With:	r304435
  Sponsored by:	Dell EMC Isilon

Modified:
  head/sys/netinet/ip_output.c

Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c	Mon Oct 24 21:33:00 2016	(r307886)
+++ head/sys/netinet/ip_output.c	Mon Oct 24 22:11:33 2016	(r307887)
@@ -350,7 +350,8 @@ again:
 		have_ia_ref = 1;
 		ifp = ia->ia_ifp;
 		ip->ip_ttl = 1;
-		isbroadcast = in_ifaddr_broadcast(dst->sin_addr, ia);
+		isbroadcast = ifp->if_flags & IFF_BROADCAST ?
+		    in_ifaddr_broadcast(dst->sin_addr, ia) : 0;
 	} else if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) &&
 	    imo != NULL && imo->imo_multicast_ifp != NULL) {
 		/*
@@ -403,8 +404,10 @@ again:
 			gw = (struct sockaddr_in *)rte->rt_gateway;
 		if (rte->rt_flags & RTF_HOST)
 			isbroadcast = (rte->rt_flags & RTF_BROADCAST);
-		else
+		else if (ifp->if_flags & IFF_BROADCAST)
 			isbroadcast = in_ifaddr_broadcast(gw->sin_addr, ia);
+		else
+			isbroadcast = 0;
 	}
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201610242211.u9OMBXia039061>