aboutsummaryrefslogtreecommitdiffstats
path: root/src/if_wg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/if_wg.c')
-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;