Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Aug 2016 00:52:30 +0000 (UTC)
From:      Mike Karels <karels@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r304713 - head/sys/netinet6
Message-ID:  <201608240052.u7O0qUJP052048@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: karels
Date: Wed Aug 24 00:52:30 2016
New Revision: 304713
URL: https://svnweb.freebsd.org/changeset/base/304713

Log:
  Fix L2 caching for UDP over IPv6
  
  ip6_output() was missing cache invalidation code analougous to
  ip_output.c. r304545 disabled L2 caching for UDP/IPv6 as a workaround.
  This change adds the missing cache invalidation code and reverts
  r304545.
  
  Reviewed by:	gnn
  Approved by:	gnn (mentor)
  Tested by:	peter@, Mike Andrews
  MFC after:	3 weeks
  Differential Revision:	https://reviews.freebsd.org/D7591

Modified:
  head/sys/netinet6/ip6_output.c
  head/sys/netinet6/udp6_usrreq.c

Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c	Wed Aug 24 00:02:20 2016	(r304712)
+++ head/sys/netinet6/ip6_output.c	Wed Aug 24 00:52:30 2016	(r304713)
@@ -87,6 +87,7 @@ __FBSDID("$FreeBSD$");
 
 #include <net/if.h>
 #include <net/if_var.h>
+#include <net/if_llatbl.h>
 #include <net/netisr.h>
 #include <net/route.h>
 #include <net/pfil.h>
@@ -552,6 +553,9 @@ again:
 		rt = ro->ro_rt;
 		ifp = ro->ro_rt->rt_ifp;
 	} else {
+		if (ro->ro_lle)
+			LLE_FREE(ro->ro_lle);	/* zeros ro_lle */
+		ro->ro_lle = NULL;
 		if (fwd_tag == NULL) {
 			bzero(&dst_sa, sizeof(dst_sa));
 			dst_sa.sin6_family = AF_INET6;
@@ -821,6 +825,9 @@ again:
 		} else {
 			RO_RTFREE(ro);
 			needfiblookup = 1; /* Redo the routing table lookup. */
+			if (ro->ro_lle)
+				LLE_FREE(ro->ro_lle);	/* zeros ro_lle */
+			ro->ro_lle = NULL;
 		}
 	}
 	/* See if fib was changed by packet filter. */
@@ -829,6 +836,9 @@ again:
 		fibnum = M_GETFIB(m);
 		RO_RTFREE(ro);
 		needfiblookup = 1;
+		if (ro->ro_lle)
+			LLE_FREE(ro->ro_lle);	/* zeros ro_lle */
+		ro->ro_lle = NULL;
 	}
 	if (needfiblookup)
 		goto again;

Modified: head/sys/netinet6/udp6_usrreq.c
==============================================================================
--- head/sys/netinet6/udp6_usrreq.c	Wed Aug 24 00:02:20 2016	(r304712)
+++ head/sys/netinet6/udp6_usrreq.c	Wed Aug 24 00:52:30 2016	(r304713)
@@ -898,7 +898,7 @@ udp6_output(struct inpcb *inp, struct mb
 
 		UDP_PROBE(send, NULL, inp, ip6, inp, udp6);
 		UDPSTAT_INC(udps_opackets);
-		error = ip6_output(m, optp, NULL, flags,
+		error = ip6_output(m, optp, &inp->inp_route6, flags,
 		    inp->in6p_moptions, NULL, inp);
 		break;
 	case AF_INET:



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