[NEUS7920-477] [9610] wlbt: Consider band while storing scan results
authorSrishti Piplani <srishti.p@samsung.com>
Mon, 6 May 2019 13:51:01 +0000 (19:21 +0530)
committerKim Gunho <gunho.kim@samsung.com>
Fri, 28 Jun 2019 14:46:15 +0000 (23:46 +0900)
Band needs to be considered while storing scan results
so that while storing information about hidden AP's
in the SSID map , we get the correct results.

SCSC-Bug-Id: SSB-52395
Change-Id: I2e5b9c662303c21f7677611f51d043670df6cb0d
Signed-off-by: Srishti Piplani <srishti.p@samsung.com>
drivers/net/wireless/scsc/dev.h
drivers/net/wireless/scsc/rx.c

index b808dcaa484843cc8652ef6b75457c7f8f65dfe1..bb3ff8363e017e0328089ee67ae3d128171ec59b 100755 (executable)
@@ -308,6 +308,7 @@ struct slsi_scan_result {
        struct sk_buff *probe_resp;
        struct sk_buff *beacon;
        struct slsi_scan_result *next;
+       int band;
 };
 
 /* Per Interface Scan Data
@@ -331,6 +332,7 @@ struct slsi_ssid_map {
        u8 ssid[32];
        u8 ssid_len;
        u8 age;
+       int band;
 };
 
 struct slsi_peer {
index 2044c56548d361df47b24900b4a83787784d8cac..d14049bd9e29afcf8460cccdede85ac29d28d6a1 100755 (executable)
@@ -55,7 +55,8 @@ struct ieee80211_channel *slsi_find_scan_channel(struct slsi_dev *sdev, struct i
 }
 
 static struct ieee80211_mgmt *slsi_rx_scan_update_ssid(struct slsi_dev *sdev, struct net_device *dev,
-                                                      struct ieee80211_mgmt *mgmt, size_t mgmt_len, size_t *new_len)
+                                                      struct ieee80211_mgmt *mgmt, size_t mgmt_len, size_t *new_len,
+                                                      u16 freq)
 {
        struct netdev_vif *ndev_vif = netdev_priv(dev);
        u8 *new_mgmt;
@@ -63,6 +64,7 @@ static struct ieee80211_mgmt *slsi_rx_scan_update_ssid(struct slsi_dev *sdev, st
        const u8 *mgmt_pos;
        const u8 *ssid;
        int     i;
+       int band;
 
        if (!SLSI_IS_VIF_INDEX_WLAN(ndev_vif))
                return NULL;
@@ -81,9 +83,11 @@ static struct ieee80211_mgmt *slsi_rx_scan_update_ssid(struct slsi_dev *sdev, st
        if ((ssid[1] > 0) && (ssid[2] != '\0'))
                return NULL;
 
+       band = (freq / 1000) == 2 ? SLSI_FREQ_BAND_2GHZ : SLSI_FREQ_BAND_5GHZ;
+
        /* check we have a known ssid for a bss */
        for (i = 0; i < SLSI_SCAN_SSID_MAP_MAX; i++) {
-               if (SLSI_ETHER_EQUAL(sdev->ssid_map[i].bssid, mgmt->bssid)) {
+               if (SLSI_ETHER_EQUAL(sdev->ssid_map[i].bssid, mgmt->bssid) && (sdev->ssid_map[i].band == band)) {
                        new_mgmt = kmalloc(mgmt_len + 34, GFP_KERNEL);
                        if (!new_mgmt) {
                                SLSI_ERR_NODEV("malloc failed(len:%ld)\n", mgmt_len + 34);
@@ -130,11 +134,12 @@ void slsi_rx_scan_pass_to_cfg80211(struct slsi_dev *sdev, struct net_device *dev
                struct ieee80211_mgmt *mgmt_new;
                size_t mgmt_new_len = 0;
 
-               mgmt_new = slsi_rx_scan_update_ssid(sdev, dev, mgmt, mgmt_len, &mgmt_new_len);
+               mgmt_new = slsi_rx_scan_update_ssid(sdev, dev, mgmt, mgmt_len, &mgmt_new_len, freq);
                if (mgmt_new)
                        bss = cfg80211_inform_bss_frame(sdev->wiphy, channel, mgmt_new, mgmt_new_len, signal, GFP_KERNEL);
                else
                        bss = cfg80211_inform_bss_frame(sdev->wiphy, channel, mgmt, mgmt_len, signal, GFP_KERNEL);
+
                slsi_cfg80211_put_bss(sdev->wiphy, bss);
                kfree(mgmt_new);
        } else {
@@ -151,15 +156,18 @@ static int slsi_add_to_scan_list(struct slsi_dev *sdev, struct netdev_vif *ndev_
        struct slsi_scan_result *scan_result, *current_result, *prev = NULL;
        struct ieee80211_mgmt *mgmt = fapi_get_mgmt(skb);
        bool found = 0, skb_stored = 0;
-       int current_rssi;
+       int current_rssi, current_band;
 
        SLSI_MUTEX_LOCK(ndev_vif->scan_result_mutex);
        head = ndev_vif->scan[scan_id].scan_results;
        scan_result = head;
        current_rssi =  fapi_get_s16(skb, u.mlme_scan_ind.rssi);
+       current_band = (fapi_get_s16(skb,
+                                    u.mlme_scan_ind.channel_frequency) /
+                       2000) == 2 ? SLSI_FREQ_BAND_2GHZ : SLSI_FREQ_BAND_5GHZ;
 
        while (scan_result) {
-               if (SLSI_ETHER_EQUAL(scan_result->bssid, mgmt->bssid)) {
+               if (SLSI_ETHER_EQUAL(scan_result->bssid, mgmt->bssid) && (scan_result->band == current_band)) {
                        /*entry exists for bssid*/
                        if (!scan_result->probe_resp && ieee80211_is_probe_resp(mgmt->frame_control)) {
                                scan_result->probe_resp = skb;
@@ -222,7 +230,7 @@ static int slsi_add_to_scan_list(struct slsi_dev *sdev, struct netdev_vif *ndev_
                SLSI_ETHER_COPY(current_result->bssid, mgmt->bssid);
 
                current_result->rssi = current_rssi;
-
+               current_result->band = current_band;
                if (ieee80211_is_beacon(mgmt->frame_control)) {
                        current_result->beacon = skb;
                        if (!scan_ssid || !scan_ssid[1] || scan_ssid[2] == '\0')
@@ -376,10 +384,13 @@ static void slsi_scan_update_ssid_map(struct slsi_dev *sdev, struct net_device *
        const u8              *ssid_ie = NULL, *connected_ssid = NULL;
        int                   i, found = 0, is_connected = 0;
        struct slsi_scan_result *scan_result = NULL;
+       int band;
 
        WARN_ON(!SLSI_MUTEX_IS_LOCKED(ndev_vif->scan_result_mutex));
 
        if (ndev_vif->activated && ndev_vif->vif_type == FAPI_VIFTYPE_STATION && ndev_vif->sta.sta_bss) {
+               band = (ndev_vif->sta.sta_bss->channel->center_freq /
+                       1000) == 2 ? SLSI_FREQ_BAND_2GHZ : SLSI_FREQ_BAND_5GHZ;
                is_connected = 1;
                connected_ssid = cfg80211_find_ie(WLAN_EID_SSID, ndev_vif->sta.sta_bss->ies->data, ndev_vif->sta.sta_bss->ies->len);
        }
@@ -391,13 +402,15 @@ static void slsi_scan_update_ssid_map(struct slsi_dev *sdev, struct net_device *
                        continue;
 
                /* We are connected to this hidden AP. So no need to check if this AP is present in scan results */
-               if (is_connected && SLSI_ETHER_EQUAL(ndev_vif->sta.sta_bss->bssid, sdev->ssid_map[i].bssid))
+               if (is_connected && SLSI_ETHER_EQUAL(ndev_vif->sta.sta_bss->bssid, sdev->ssid_map[i].bssid) &&
+                   (sdev->ssid_map[i].band == band))
                        continue;
 
                /* If this entry AP is found to be non-hidden, remove entry. */
                scan_result = ndev_vif->scan[scan_id].scan_results;
                while (scan_result) {
-                       if (SLSI_ETHER_EQUAL(sdev->ssid_map[i].bssid, scan_result->bssid)) {
+                       if (SLSI_ETHER_EQUAL(sdev->ssid_map[i].bssid, scan_result->bssid) &&
+                           (sdev->ssid_map[i].band == scan_result->band)) {
                                /* AP is no more hidden. OR AP is hidden but did not
                                 * receive probe resp. Go for expiry.
                                 */
@@ -425,7 +438,8 @@ static void slsi_scan_update_ssid_map(struct slsi_dev *sdev, struct net_device *
                ssid_ie = NULL;
 
                if (scan_result->hidden) {
-                       if (is_connected && SLSI_ETHER_EQUAL(ndev_vif->sta.sta_bss->bssid, scan_result->bssid)) {
+                       if (is_connected && SLSI_ETHER_EQUAL(ndev_vif->sta.sta_bss->bssid, scan_result->bssid) &&
+                           (scan_result->band == band)) {
                                ssid_ie = connected_ssid;
                        } else if (scan_result->probe_resp) {
                                mgmt = fapi_get_mgmt(scan_result->probe_resp);
@@ -443,7 +457,8 @@ static void slsi_scan_update_ssid_map(struct slsi_dev *sdev, struct net_device *
                for (i = 0; i < SLSI_SCAN_SSID_MAP_MAX; i++) {
                        if (!sdev->ssid_map[i].ssid_len)
                                continue;
-                       if (SLSI_ETHER_EQUAL(scan_result->bssid, sdev->ssid_map[i].bssid)) {
+                       if (SLSI_ETHER_EQUAL(scan_result->bssid, sdev->ssid_map[i].bssid) &&
+                           (scan_result->band == sdev->ssid_map[i].band)) {
                                sdev->ssid_map[i].ssid_len = ssid_ie[1];
                                memcpy(sdev->ssid_map[i].ssid, &ssid_ie[2], ssid_ie[1]);
                                found = 1;
@@ -458,6 +473,7 @@ static void slsi_scan_update_ssid_map(struct slsi_dev *sdev, struct net_device *
                                SLSI_ETHER_COPY(sdev->ssid_map[i].bssid, scan_result->bssid);
                                sdev->ssid_map[i].age = 0;
                                sdev->ssid_map[i].ssid_len = ssid_ie[1];
+                               sdev->ssid_map[i].band = scan_result->band;
                                memcpy(sdev->ssid_map[i].ssid, &ssid_ie[2], ssid_ie[1]);
                                break;
                        }