ath6kl: Use cfg80211_inform_bss instead of cfg80211_inform_bss_frame
authorJouni Malinen <jouni@qca.qualcomm.com>
Wed, 10 Aug 2011 21:32:49 +0000 (00:32 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Wed, 31 Aug 2011 07:10:53 +0000 (10:10 +0300)
There is no point in generating a bogus Beacon frame for
cfg80211_inform_bss_frame when cfg80211_inform_bss can be used
instead.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/cfg80211.c

index 14559ffb1453bb019d6e4300ddd06d032759581a..201398ec4b821e4552ec484f2f5ba65ccf853312 100644 (file)
@@ -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,