diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-04-30 10:05:24 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-04-30 10:05:24 +0200 |
commit | 9552bec02b52590f16664bfa2c41e9c8c544602e (patch) | |
tree | 52336d344e3eefac74ee2615ce532d73c692a032 /src/if_wg.c | |
parent | version: bump (diff) | |
download | wireguard-freebsd-9552bec02b52590f16664bfa2c41e9c8c544602e.tar.xz wireguard-freebsd-9552bec02b52590f16664bfa2c41e9c8c544602e.zip |
if_wg: defragment mbufs early on
This makes the crypto a *lot* faster. We might later revert this if we
use opencrypto's fancy page table mapping scheme. But for now, it's
useful. We do it early, rather than before calling decrypt/encrypt, so
that the various other m_pullups that we have wind up being no-ops.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/if_wg.c')
-rw-r--r-- | src/if_wg.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/if_wg.c b/src/if_wg.c index 8ff90fd..727c062 100644 --- a/src/if_wg.c +++ b/src/if_wg.c @@ -1946,6 +1946,11 @@ wg_input(struct mbuf *m, int offset, struct inpcb *inpcb, struct wg_packet *pkt; struct wg_peer *peer; struct wg_softc *sc = _sc; + struct mbuf *defragged; + + defragged = m_defrag(m, M_NOWAIT); + if (defragged) + m = defragged; /* Caller provided us with `sa`, no need for this header. */ m_adj(m, offset + sizeof(struct udphdr)); @@ -2163,6 +2168,11 @@ wg_transmit(struct ifnet *ifp, struct mbuf *m) { sa_family_t af; int ret; + struct mbuf *defragged; + + defragged = m_defrag(m, M_NOWAIT); + if (defragged) + m = defragged; ret = determine_af_and_pullup(&m, &af); if (ret) { @@ -2178,6 +2188,7 @@ wg_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, struct sa_family_t parsed_af; uint32_t af, mtu; int ret; + struct mbuf *defragged; if (dst->sa_family == AF_UNSPEC) memcpy(&af, dst->sa_data, sizeof(af)); @@ -2187,6 +2198,11 @@ wg_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, struct xmit_err(ifp, m, NULL, af); return (EAFNOSUPPORT); } + + defragged = m_defrag(m, M_NOWAIT); + if (defragged) + m = defragged; + ret = determine_af_and_pullup(&m, &parsed_af); if (ret) { xmit_err(ifp, m, NULL, AF_UNSPEC); |