From 9552bec02b52590f16664bfa2c41e9c8c544602e Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 30 Apr 2021 10:05:24 +0200 Subject: 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 --- src/if_wg.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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); -- cgit v1.2.3-59-g8ed1b