diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c index 14559ffb1453bb019d6e4300ddd06d032759581a..201398ec4b821e4552ec484f2f5ba65ccf853312 100644 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c @@ -723,8 +723,6 @@ static inline bool is_ch_11a(u16 ch) /* struct ath6kl_node_table::nt_nodelock is locked when calling this */ void ath6kl_cfg80211_scan_node(struct wiphy *wiphy, struct bss *ni) { - u16 size; - unsigned char *ieeemgmtbuf = NULL; struct ieee80211_mgmt *mgmt; struct ieee80211_channel *channel; struct ieee80211_supported_band *band; @@ -741,37 +739,29 @@ void ath6kl_cfg80211_scan_node(struct wiphy *wiphy, struct bss *ni) else band = wiphy->bands[IEEE80211_BAND_2GHZ]; /* 11b */ - size = ni->ni_framelen + offsetof(struct ieee80211_mgmt, u); - ieeemgmtbuf = kmalloc(size, GFP_ATOMIC); - if (!ieeemgmtbuf) { - ath6kl_err("ieee mgmt buf alloc error\n"); - return; - } - - /* - * TODO: Update target to include 802.11 mac header while sending - * bss info. Target removes 802.11 mac header while sending the bss - * info to host, cfg80211 needs it, for time being just filling the - * da, sa and bssid fields alone. - */ - mgmt = (struct ieee80211_mgmt *)ieeemgmtbuf; - memset(mgmt->da, 0xff, ETH_ALEN); /*broadcast addr */ - memcpy(mgmt->sa, ni->ni_macaddr, ETH_ALEN); - memcpy(mgmt->bssid, ni->ni_macaddr, ETH_ALEN); - memcpy(ieeemgmtbuf + offsetof(struct ieee80211_mgmt, u), - ni->ni_buf, ni->ni_framelen); - freq = cie->ie_chan; channel = ieee80211_get_channel(wiphy, freq); signal = ni->ni_snr * 100; ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: bssid %pM ch %d freq %d size %d\n", __func__, - mgmt->bssid, channel->hw_value, freq, size); - cfg80211_inform_bss_frame(wiphy, channel, mgmt, - size, signal, GFP_ATOMIC); - - kfree(ieeemgmtbuf); + ni->ni_macaddr, channel->hw_value, freq, ni->ni_framelen); + /* + * Both Beacon and Probe Response frames have same payload structure, + * so it is fine to share the parser for both. + */ + if (ni->ni_framelen < 8 + 2 + 2) + return; + mgmt = (struct ieee80211_mgmt *) (ni->ni_buf - + offsetof(struct ieee80211_mgmt, u)); + cfg80211_inform_bss(wiphy, channel, ni->ni_macaddr, + le64_to_cpu(mgmt->u.beacon.timestamp), + le16_to_cpu(mgmt->u.beacon.capab_info), + le16_to_cpu(mgmt->u.beacon.beacon_int), + mgmt->u.beacon.variable, + ni->ni_buf + ni->ni_framelen - + mgmt->u.beacon.variable, + signal, GFP_ATOMIC); } static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,