diff options
author | Matt Dunwoodie <ncon@noconroy.net> | 2021-04-19 11:15:45 +1000 |
---|---|---|
committer | Matt Dunwoodie <ncon@noconroy.net> | 2021-04-19 11:20:45 +1000 |
commit | c7e02531cf82ba2bb692eec68ce98ec42f488f5b (patch) | |
tree | 00e5603b44c3f684758eb08a6043b2aed4a12413 /src/if_wg.c | |
parent | if_wg: replace timer lock with EPOCH (diff) | |
download | wireguard-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.c | 16 |
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; |