aboutsummaryrefslogtreecommitdiffstats
path: root/src/if_wg.c
diff options
context:
space:
mode:
authorMatt Dunwoodie <ncon@noconroy.net>2021-04-19 11:15:45 +1000
committerMatt Dunwoodie <ncon@noconroy.net>2021-04-19 11:20:45 +1000
commitc7e02531cf82ba2bb692eec68ce98ec42f488f5b (patch)
tree00e5603b44c3f684758eb08a6043b2aed4a12413 /src/if_wg.c
parentif_wg: replace timer lock with EPOCH (diff)
downloadwireguard-freebsd-c7e02531cf82ba2bb692eec68ce98ec42f488f5b.tar.xz
wireguard-freebsd-c7e02531cf82ba2bb692eec68ce98ec42f488f5b.zip
if_wg: add wg_mbuf_reset to clear metadata
Signed-off-by: Matt Dunwoodie <ncon@noconroy.net>
Diffstat (limited to '')
-rw-r--r--src/if_wg.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/if_wg.c b/src/if_wg.c
index 1e7ec9e..ae623cc 100644
--- a/src/if_wg.c
+++ b/src/if_wg.c
@@ -1378,6 +1378,18 @@ wg_softc_handshake_receive(struct wg_softc *sc)
}
static void
+wg_mbuf_reset(struct mbuf *m, int csum_ok)
+{
+ /* TODO a second opinion on what metadata is to be cleared would be
+ * nice. Not many other drivers do this, so there aren't many examples. */
+ m->m_flags &= ~(M_BCAST|M_MCAST|M_VLANTAG)
+ m->m_flags &= ~(M_PROTO1|M_PROTO2|M_PROTO3|M_PROTO4|M_PROTO5|M_PROTO6
+ M_PROTO7|M_PROTO8|M_PROTO9|M_PROTO10|M_PROTO11);
+ m->m_pkthdr.PH_per.sixtyfour[0] = 0;
+ m->m_pkthdr.PH_loc.sixtyfour[0] = 0;
+}
+
+static void
wg_encrypt(struct wg_softc *sc, struct wg_packet *pkt)
{
struct wg_pkt_data data;
@@ -1415,7 +1427,7 @@ wg_encrypt(struct wg_softc *sc, struct wg_packet *pkt)
data.nonce = htole64(pkt->p_nonce);
memcpy(mtod(m, void *), &data, sizeof(struct wg_pkt_data));
- /* TODO reset packet metadata */
+ wg_mbuf_reset(m);
pkt->p_mbuf = m;
pkt->p_state = WG_PACKET_CRYPTED;
GROUPTASK_ENQUEUE(&peer->p_send);
@@ -1497,7 +1509,7 @@ wg_decrypt(struct wg_softc *sc, struct wg_packet *pkt)
goto error;
}
- /* TODO reset packet metadata */
+ wg_mbuf_reset(m);
done:
pkt->p_mbuf = m;
pkt->p_state = WG_PACKET_CRYPTED;