Fix handling of devices w/o radiotap support:
o do not attach DLT_IEEE802_11_RADIO unless both tx and rx headers are present; this is assumed in the capture code paths o verify the above with asserts in ieee80211_radiotap_{rx,tx} o add missing checks for active taps before calling ieee80211_radiotap_rx
This commit is contained in:
parent
ac86de8587
commit
a6c3cf3eca
@ -656,7 +656,7 @@ adhoc_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
|
||||
ifp->if_ierrors++;
|
||||
out:
|
||||
if (m != NULL) {
|
||||
if (need_tap)
|
||||
if (need_tap && ieee80211_radiotap_active_vap(vap))
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
m_freem(m);
|
||||
}
|
||||
|
@ -850,7 +850,7 @@ hostap_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
|
||||
ifp->if_ierrors++;
|
||||
out:
|
||||
if (m != NULL) {
|
||||
if (need_tap)
|
||||
if (need_tap && ieee80211_radiotap_active_vap(vap))
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
m_freem(m);
|
||||
}
|
||||
|
@ -128,7 +128,8 @@ monitor_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
|
||||
{
|
||||
struct ieee80211vap *vap = ni->ni_vap;
|
||||
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
if (ieee80211_radiotap_active_vap(vap))
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
m_freem(m);
|
||||
return -1;
|
||||
}
|
||||
|
@ -102,12 +102,12 @@ ieee80211_radiotap_vattach(struct ieee80211vap *vap)
|
||||
struct ieee80211com *ic = vap->iv_ic;
|
||||
struct ieee80211_radiotap_header *th = ic->ic_th;
|
||||
|
||||
KASSERT(th != NULL, ("no radiotap setup"));
|
||||
|
||||
/* radiotap DLT for raw 802.11 frames */
|
||||
bpfattach2(vap->iv_ifp, DLT_IEEE802_11_RADIO,
|
||||
sizeof(struct ieee80211_frame) + le16toh(th->it_len),
|
||||
&vap->iv_rawbpf);
|
||||
if (th != NULL && ic->ic_rh != NULL) {
|
||||
/* radiotap DLT for raw 802.11 frames */
|
||||
bpfattach2(vap->iv_ifp, DLT_IEEE802_11_RADIO,
|
||||
sizeof(struct ieee80211_frame) + le16toh(th->it_len),
|
||||
&vap->iv_rawbpf);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@ -193,6 +193,7 @@ dispatch_radiotap(struct ieee80211vap *vap0, struct mbuf *m,
|
||||
void
|
||||
ieee80211_radiotap_tx(struct ieee80211vap *vap0, struct mbuf *m)
|
||||
{
|
||||
KASSERT(vap0->iv_ic->ic_th != NULL, ("no tx radiotap header"));
|
||||
dispatch_radiotap(vap0, m, vap0->iv_ic->ic_th);
|
||||
}
|
||||
|
||||
@ -202,6 +203,7 @@ ieee80211_radiotap_tx(struct ieee80211vap *vap0, struct mbuf *m)
|
||||
void
|
||||
ieee80211_radiotap_rx(struct ieee80211vap *vap0, struct mbuf *m)
|
||||
{
|
||||
KASSERT(vap0->iv_ic->ic_rh != NULL, ("no rx radiotap header"));
|
||||
dispatch_radiotap(vap0, m, vap0->iv_ic->ic_rh);
|
||||
}
|
||||
|
||||
|
@ -885,7 +885,7 @@ sta_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
|
||||
ifp->if_ierrors++;
|
||||
out:
|
||||
if (m != NULL) {
|
||||
if (need_tap)
|
||||
if (need_tap && ieee80211_radiotap_active_vap(vap))
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
m_freem(m);
|
||||
}
|
||||
|
@ -797,7 +797,7 @@ wds_input(struct ieee80211_node *ni, struct mbuf *m, int rssi, int nf)
|
||||
ifp->if_ierrors++;
|
||||
out:
|
||||
if (m != NULL) {
|
||||
if (need_tap)
|
||||
if (need_tap && ieee80211_radiotap_active_vap(vap))
|
||||
ieee80211_radiotap_rx(vap, m);
|
||||
m_freem(m);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user