diff options
author | George V. Neville-Neil <gnn@FreeBSD.org> | 2016-06-02 17:51:29 +0000 |
---|---|---|
committer | George V. Neville-Neil <gnn@FreeBSD.org> | 2016-06-02 17:51:29 +0000 |
commit | 6d7682268826ca15ed86237eb25286740b952f1c (patch) | |
tree | 35865ebb972dd3afe8974183497a1af7a56b33fc /sys/netinet/if_ether.c | |
parent | 55a87f85cfe1614b1745392afa56177e063eabb5 (diff) | |
download | src-6d7682268826ca15ed86237eb25286740b952f1c.tar.gz src-6d7682268826ca15ed86237eb25286740b952f1c.zip |
This change re-adds L2 caching for TCP and UDP, as originally added in D4306
but removed due to other changes in the system. Restore the llentry pointer
to the "struct route", and use it to cache the L2 lookup (ARP or ND6) as
appropriate.
Submitted by: Mike Karels
Differential Revision: https://reviews.freebsd.org/D6262
Notes
Notes:
svn path=/head/; revision=301217
Diffstat (limited to 'sys/netinet/if_ether.c')
-rw-r--r-- | sys/netinet/if_ether.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index eac3c1d24782..48fae92ae5fe 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -420,7 +420,8 @@ arprequest(struct ifnet *ifp, const struct in_addr *sip, */ static int arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m, - const struct sockaddr *dst, u_char *desten, uint32_t *pflags) + const struct sockaddr *dst, u_char *desten, uint32_t *pflags, + struct llentry **plle) { struct llentry *la = NULL, *la_tmp; struct mbuf *curr = NULL; @@ -431,6 +432,8 @@ arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m, if (pflags != NULL) *pflags = 0; + if (plle != NULL) + *plle = NULL; if ((flags & LLE_CREATE) == 0) { IF_AFDATA_RLOCK(ifp); @@ -483,6 +486,10 @@ arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m, } if (pflags != NULL) *pflags = la->la_flags & (LLE_VALID|LLE_IFADDR); + if (plle) { + LLE_ADDREF(la); + *plle = la; + } LLE_WUNLOCK(la); return (0); } @@ -548,12 +555,12 @@ arpresolve_full(struct ifnet *ifp, int is_gw, int flags, struct mbuf *m, */ int arpresolve_addr(struct ifnet *ifp, int flags, const struct sockaddr *dst, - char *desten, uint32_t *pflags) + char *desten, uint32_t *pflags, struct llentry **plle) { int error; flags |= LLE_ADDRONLY; - error = arpresolve_full(ifp, 0, flags, NULL, dst, desten, pflags); + error = arpresolve_full(ifp, 0, flags, NULL, dst, desten, pflags, plle); return (error); } @@ -576,12 +583,15 @@ arpresolve_addr(struct ifnet *ifp, int flags, const struct sockaddr *dst, */ int arpresolve(struct ifnet *ifp, int is_gw, struct mbuf *m, - const struct sockaddr *dst, u_char *desten, uint32_t *pflags) + const struct sockaddr *dst, u_char *desten, uint32_t *pflags, + struct llentry **plle) { struct llentry *la = NULL; if (pflags != NULL) *pflags = 0; + if (plle != NULL) + *plle = NULL; if (m != NULL) { if (m->m_flags & M_BCAST) { @@ -616,7 +626,7 @@ arpresolve(struct ifnet *ifp, int is_gw, struct mbuf *m, IF_AFDATA_RUNLOCK(ifp); return (arpresolve_full(ifp, is_gw, la == NULL ? LLE_CREATE : 0, m, dst, - desten, pflags)); + desten, pflags, plle)); } /* |