cfg80211: allow passing frame type to cfg80211_inform_bss()
When using the cfg80211_inform_bss[_width]() functions drivers cannot currently indicate whether the data was received in a beacon or probe response. Fix that by passing a new enum that indicates such (or unknown). For good measure, use it in ath6kl. Acked-by: Kalle Valo <kvalo@qca.qualcomm.com> [ath6kl] Acked-by: Arend van Spriel <arend@broadcom.com> [brcmfmac] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
这个提交包含在:
@@ -1092,7 +1092,6 @@ static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len,
|
||||
u8 *buf;
|
||||
struct ieee80211_channel *channel;
|
||||
struct ath6kl *ar = wmi->parent_dev;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
struct cfg80211_bss *bss;
|
||||
|
||||
if (len <= sizeof(struct wmi_bss_info_hdr2))
|
||||
@@ -1138,39 +1137,15 @@ static int ath6kl_wmi_bssinfo_event_rx(struct wmi *wmi, u8 *datap, int len,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* In theory, use of cfg80211_inform_bss() would be more natural here
|
||||
* since we do not have the full frame. However, at least for now,
|
||||
* cfg80211 can only distinguish Beacon and Probe Response frames from
|
||||
* each other when using cfg80211_inform_bss_frame(), so let's build a
|
||||
* fake IEEE 802.11 header to be able to take benefit of this.
|
||||
*/
|
||||
mgmt = kmalloc(24 + len, GFP_ATOMIC);
|
||||
if (mgmt == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if (bih->frame_type == BEACON_FTYPE) {
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_BEACON);
|
||||
memset(mgmt->da, 0xff, ETH_ALEN);
|
||||
} else {
|
||||
struct net_device *dev = vif->ndev;
|
||||
|
||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||
IEEE80211_STYPE_PROBE_RESP);
|
||||
memcpy(mgmt->da, dev->dev_addr, ETH_ALEN);
|
||||
}
|
||||
mgmt->duration = cpu_to_le16(0);
|
||||
memcpy(mgmt->sa, bih->bssid, ETH_ALEN);
|
||||
memcpy(mgmt->bssid, bih->bssid, ETH_ALEN);
|
||||
mgmt->seq_ctrl = cpu_to_le16(0);
|
||||
|
||||
memcpy(&mgmt->u.beacon, buf, len);
|
||||
|
||||
bss = cfg80211_inform_bss_frame(ar->wiphy, channel, mgmt,
|
||||
24 + len, (bih->snr - 95) * 100,
|
||||
GFP_ATOMIC);
|
||||
kfree(mgmt);
|
||||
bss = cfg80211_inform_bss(ar->wiphy, channel,
|
||||
bih->frame_type == BEACON_FTYPE ?
|
||||
CFG80211_BSS_FTYPE_BEACON :
|
||||
CFG80211_BSS_FTYPE_PRESP,
|
||||
bih->bssid, get_unaligned_le64((__le64 *)buf),
|
||||
get_unaligned_le16(((__le16 *)buf) + 5),
|
||||
get_unaligned_le16(((__le16 *)buf) + 4),
|
||||
buf + 8 + 2 + 2, len - 8 - 2 - 2,
|
||||
(bih->snr - 95) * 100, GFP_ATOMIC);
|
||||
if (bss == NULL)
|
||||
return -ENOMEM;
|
||||
cfg80211_put_bss(ar->wiphy, bss);
|
||||
|
在新工单中引用
屏蔽一个用户