Commit ee971924 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: report OBSS beacons

If there's an interface in AP mode, OBSS beacons
are needed by hostapd/wpa_s to implement logic to
enable/disable protection etc. Report the frames
and set the capability flag.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 5e760230
...@@ -184,12 +184,15 @@ enum ieee80211_packet_rx_flags { ...@@ -184,12 +184,15 @@ enum ieee80211_packet_rx_flags {
* enum ieee80211_rx_flags - RX data flags * enum ieee80211_rx_flags - RX data flags
* *
* @IEEE80211_RX_CMNTR: received on cooked monitor already * @IEEE80211_RX_CMNTR: received on cooked monitor already
* @IEEE80211_RX_BEACON_REPORTED: This frame was already reported
* to cfg80211_report_obss_beacon().
* *
* These flags are used across handling multiple interfaces * These flags are used across handling multiple interfaces
* for a single frame. * for a single frame.
*/ */
enum ieee80211_rx_flags { enum ieee80211_rx_flags {
IEEE80211_RX_CMNTR = BIT(0), IEEE80211_RX_CMNTR = BIT(0),
IEEE80211_RX_BEACON_REPORTED = BIT(1),
}; };
struct ieee80211_rx_data { struct ieee80211_rx_data {
......
...@@ -593,7 +593,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, ...@@ -593,7 +593,8 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len,
wiphy->flags |= WIPHY_FLAG_NETNS_OK | wiphy->flags |= WIPHY_FLAG_NETNS_OK |
WIPHY_FLAG_4ADDR_AP | WIPHY_FLAG_4ADDR_AP |
WIPHY_FLAG_4ADDR_STATION; WIPHY_FLAG_4ADDR_STATION |
WIPHY_FLAG_REPORTS_OBSS;
if (!ops->set_key) if (!ops->set_key)
wiphy->flags |= WIPHY_FLAG_IBSS_RSN; wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
......
...@@ -2188,6 +2188,18 @@ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx) ...@@ -2188,6 +2188,18 @@ ieee80211_rx_h_mgmt_check(struct ieee80211_rx_data *rx)
if (!ieee80211_is_mgmt(mgmt->frame_control)) if (!ieee80211_is_mgmt(mgmt->frame_control))
return RX_DROP_MONITOR; return RX_DROP_MONITOR;
if (rx->sdata->vif.type == NL80211_IFTYPE_AP &&
ieee80211_is_beacon(mgmt->frame_control) &&
!(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
struct ieee80211_rx_status *status;
status = IEEE80211_SKB_RXCB(rx->skb);
cfg80211_report_obss_beacon(rx->local->hw.wiphy,
rx->skb->data, rx->skb->len,
status->freq, GFP_ATOMIC);
rx->flags |= IEEE80211_RX_BEACON_REPORTED;
}
if (!(status->rx_flags & IEEE80211_RX_RA_MATCH)) if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
return RX_DROP_MONITOR; return RX_DROP_MONITOR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment