}
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;
const u8 *mgmt_pos;
const u8 *ssid;
int i;
+ int band;
if (!SLSI_IS_VIF_INDEX_WLAN(ndev_vif))
return NULL;
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);
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 {
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;
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')
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);
}
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.
*/
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);
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;
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;
}