diff --git a/sys/net80211/ieee80211_freebsd.h b/sys/net80211/ieee80211_freebsd.h --- a/sys/net80211/ieee80211_freebsd.h +++ b/sys/net80211/ieee80211_freebsd.h @@ -542,6 +542,7 @@ void ieee80211_vap_sync_mac_address(struct ieee80211vap *); void ieee80211_vap_copy_mac_address(struct ieee80211vap *); +void ieee80211_vap_deliver_data(struct ieee80211vap *, struct mbuf *); #endif /* _KERNEL */ diff --git a/sys/net80211/ieee80211_freebsd.c b/sys/net80211/ieee80211_freebsd.c --- a/sys/net80211/ieee80211_freebsd.c +++ b/sys/net80211/ieee80211_freebsd.c @@ -1221,6 +1221,28 @@ NET_EPOCH_EXIT(et); } +/** + * @brief Deliver data into the upper ifp of the VAP interface + * + * This delivers an 802.3 frame from net80211 up to the operating + * system network interface layer. + * + * @param vap the current VAP + * @param m the 802.3 frame to pass up to the VAP interface + * + * Note: this API consumes the mbuf. + */ +void +ieee80211_vap_deliver_data(struct ieee80211vap *vap, struct mbuf *m) +{ + struct ifnet *ifp = vap->iv_ifp; + struct epoch_tracker et; + + NET_EPOCH_ENTER(et); + if_input(ifp, m); + NET_EPOCH_EXIT(et); +} + /** * @brief Initial MAC address setup for a VAP. * diff --git a/sys/net80211/ieee80211_hostap.c b/sys/net80211/ieee80211_hostap.c --- a/sys/net80211/ieee80211_hostap.c +++ b/sys/net80211/ieee80211_hostap.c @@ -416,8 +416,6 @@ (void) ieee80211_vap_xmitpkt(vap, mcopy); } if (m != NULL) { - struct epoch_tracker et; - /* * Mark frame as coming from vap's interface. */ @@ -434,9 +432,8 @@ m->m_pkthdr.ether_vtag = ni->ni_vlan; m->m_flags |= M_VLANTAG; } - NET_EPOCH_ENTER(et); - ifp->if_input(ifp, m); - NET_EPOCH_EXIT(et); + + ieee80211_vap_deliver_data(vap, m); } } diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -274,7 +274,6 @@ ieee80211_deliver_data(struct ieee80211vap *vap, struct ieee80211_node *ni, struct mbuf *m) { - struct epoch_tracker et; struct ether_header *eh = mtod(m, struct ether_header *); struct ifnet *ifp = vap->iv_ifp; @@ -305,9 +304,8 @@ m->m_pkthdr.ether_vtag = ni->ni_vlan; m->m_flags |= M_VLANTAG; } - NET_EPOCH_ENTER(et); - ifp->if_input(ifp, m); - NET_EPOCH_EXIT(et); + + ieee80211_vap_deliver_data(vap, m); } struct mbuf *