diff options
author | 2021-03-19 10:29:54 -0600 | |
---|---|---|
committer | 2021-03-19 10:38:03 -0600 | |
commit | ea256bde032e90b95375313bec1fb8fa184e9249 (patch) | |
tree | e9d0d6bda1af6c3e2cf476ce70b75f3f0f2e1a7e | |
parent | if_wg: fix malloc overflows (diff) | |
download | wireguard-freebsd-ea256bde032e90b95375313bec1fb8fa184e9249.tar.xz wireguard-freebsd-ea256bde032e90b95375313bec1fb8fa184e9249.zip |
if_wg: dispatch packets using netisr
Nothing else uses ip_input directly.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | src/if_wg.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/src/if_wg.c b/src/if_wg.c index 68c1d46..b7911aa 100644 --- a/src/if_wg.c +++ b/src/if_wg.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include <net/if_types.h> #include <net/ethernet.h> #include <net/radix.h> +#include <net/netisr.h> #include <netinet/in.h> #include <netinet/in_var.h> @@ -2015,7 +2016,7 @@ wg_deliver_in(struct wg_peer *peer) struct epoch_tracker et; struct wg_tag *t; uint32_t af; - int version; + u_int isr; NET_EPOCH_ENTER(et); sc = peer->p_sc; @@ -2046,22 +2047,26 @@ wg_deliver_in(struct wg_peer *peer) m->m_flags &= ~(M_MCAST | M_BCAST); m->m_pkthdr.rcvif = ifp; - version = mtod(m, struct ip *)->ip_v; - if (version == IPVERSION) { + switch (mtod(m, struct ip *)->ip_v) { + case 4: + isr = NETISR_IP; af = AF_INET; - BPF_MTAP2(ifp, &af, sizeof(af), m); - CURVNET_SET(ifp->if_vnet); - ip_input(m); - CURVNET_RESTORE(); - } else if (version == 6) { + break; + case 6: + isr = NETISR_IPV6; af = AF_INET6; - BPF_MTAP2(ifp, &af, sizeof(af), m); - CURVNET_SET(ifp->if_vnet); - ip6_input(m); - CURVNET_RESTORE(); - } else + break; + default: m_freem(m); + goto done; + } + BPF_MTAP2(ifp, &af, sizeof(af), m); + CURVNET_SET(ifp->if_vnet); + M_SETFIB(m, ifp->if_fib); + netisr_dispatch(isr, m); + CURVNET_RESTORE(); +done: wg_timers_event_data_received(&peer->p_timers); } NET_EPOCH_EXIT(et); |