aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-04-30 10:05:24 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2021-04-30 10:05:24 +0200
commit9552bec02b52590f16664bfa2c41e9c8c544602e (patch)
tree52336d344e3eefac74ee2615ce532d73c692a032 /src
parentversion: bump (diff)
downloadwireguard-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')
-rw-r--r--src/if_wg.c16
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);