summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkarels <karels@FreeBSD.org>2016-09-21 00:06:49 +0000
committerkarels <karels@FreeBSD.org>2016-09-21 00:06:49 +0000
commitec9379ac6e3074dbc61ad6186c8ec5c245dda19a (patch)
treefdd21663765cc516454fce30b2e479c7922f3029
parentbca7482346238dcfe2a6ddc1c01263d62e40354b (diff)
downloadFreeBSD-src-ec9379ac6e3074dbc61ad6186c8ec5c245dda19a.zip
FreeBSD-src-ec9379ac6e3074dbc61ad6186c8ec5c245dda19a.tar.gz
MFC r304713:
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 Differential Revision: https://reviews.freebsd.org/D7591
-rw-r--r--sys/netinet6/ip6_output.c10
-rw-r--r--sys/netinet6/udp6_usrreq.c2
2 files changed, 11 insertions, 1 deletions
diff --git a/sys/netinet6/ip6_output.c b/sys/netinet6/ip6_output.c
index f31679e..2b0e50d 100644
--- a/sys/netinet6/ip6_output.c
+++ b/sys/netinet6/ip6_output.c
@@ -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;
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index 0904e86..b44fb9e 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -898,7 +898,7 @@ udp6_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr6,
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:
OpenPOWER on IntegriCloud