From ea256bde032e90b95375313bec1fb8fa184e9249 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 19 Mar 2021 10:29:54 -0600 Subject: if_wg: dispatch packets using netisr Nothing else uses ip_input directly. Signed-off-by: Jason A. Donenfeld --- src/if_wg.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'src') 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 #include #include +#include #include #include @@ -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); -- cgit v1.2.3-59-g8ed1b