mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-16 19:07:40 +07:00
mac80211: accept public action frames with mismatched BSSID
Arik's patch "mac80211: allow action frames with unknown BSSID in GO mode" allowed any action frames in P2P mode to go through, but only to cooked monitor interfaces as the IEEE80211_RX_RA_MATCH was still cleared. As a result my no-monitor patches broke invitation responses. Instead of allowing any action frames in P2P GO mode to go through with a wrong BSSID like that patch did, allow all public action frames. They will never be processed by mac80211, but can be reported via nl80211 then. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
aa5b549215
commit
3df6eaea76
@ -1694,6 +1694,23 @@ static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_is_public_action - check if frame is a public action frame
|
||||||
|
* @hdr: the frame
|
||||||
|
* @len: length of the frame
|
||||||
|
*/
|
||||||
|
static inline bool ieee80211_is_public_action(struct ieee80211_hdr *hdr,
|
||||||
|
size_t len)
|
||||||
|
{
|
||||||
|
struct ieee80211_mgmt *mgmt = (void *)hdr;
|
||||||
|
|
||||||
|
if (len < IEEE80211_MIN_ACTION_SIZE)
|
||||||
|
return false;
|
||||||
|
if (!ieee80211_is_action(hdr->frame_control))
|
||||||
|
return false;
|
||||||
|
return mgmt->u.action.category == WLAN_CATEGORY_PUBLIC;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ieee80211_fhss_chan_to_freq - get channel frequency
|
* ieee80211_fhss_chan_to_freq - get channel frequency
|
||||||
* @channel: the FHSS channel
|
* @channel: the FHSS channel
|
||||||
|
@ -2797,10 +2797,17 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||||||
return 0;
|
return 0;
|
||||||
} else if (!ieee80211_bssid_match(bssid,
|
} else if (!ieee80211_bssid_match(bssid,
|
||||||
sdata->vif.addr)) {
|
sdata->vif.addr)) {
|
||||||
|
/*
|
||||||
|
* Accept public action frames even when the
|
||||||
|
* BSSID doesn't match, this is used for P2P
|
||||||
|
* and location updates. Note that mac80211
|
||||||
|
* itself never looks at these frames.
|
||||||
|
*/
|
||||||
if (!(status->rx_flags & IEEE80211_RX_IN_SCAN) &&
|
if (!(status->rx_flags & IEEE80211_RX_IN_SCAN) &&
|
||||||
!ieee80211_is_beacon(hdr->frame_control) &&
|
ieee80211_is_public_action(hdr, skb->len))
|
||||||
!(ieee80211_is_action(hdr->frame_control) &&
|
return 1;
|
||||||
sdata->vif.p2p))
|
if (!(status->rx_flags & IEEE80211_RX_IN_SCAN) &&
|
||||||
|
!ieee80211_is_beacon(hdr->frame_control))
|
||||||
return 0;
|
return 0;
|
||||||
status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
|
status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user