diff options
author | Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com> | 2023-11-02 13:51:17 -0400 |
---|---|---|
committer | Isaac Chiou <isaacchiou@google.com> | 2023-11-14 05:47:23 +0000 |
commit | acfc312466e23b7f6e72da6fc5683de56639f38c (patch) | |
tree | e353ed3ef669d1249ac377609585fcf554641973 | |
parent | 512f13bfa0cbeddaf79a81a4483999c75a4e4a32 (diff) | |
download | bcm4389-acfc312466e23b7f6e72da6fc5683de56639f38c.tar.gz |
bcmdhd: Fixed blacklist connection failure
In current design, the blocklist only restricts roaming case, not connection case, which meanings driver still triggers the connection to a bssid which is in the blocklist.
Fix the logic, and let the blocklist for both roaming and connection case.
Bug: 294803097
Bug: 297586285
Test: passed in bench test
Change-Id: Id259be9b3217cf25373dde8eda56c634f5b20757
Signed-off-by: Dennis Jeon <dennis.jeon@broadcom.corp-partner.google.com>
-rw-r--r-- | wl_android.c | 74 | ||||
-rw-r--r-- | wl_android.h | 4 | ||||
-rw-r--r-- | wl_cfg80211.c | 18 | ||||
-rwxr-xr-x | wl_cfgvendor.c | 10 |
4 files changed, 91 insertions, 15 deletions
diff --git a/wl_android.c b/wl_android.c index 3aa7844..6569172 100644 --- a/wl_android.c +++ b/wl_android.c @@ -15094,3 +15094,77 @@ exit: return bytes_written; } #endif /* SUPPORT_AP_INIT_BWCONF */ + +s32 +wl_android_set_blacklist_bssid(struct net_device *dev, maclist_t *blacklist, + uint32 len, uint32 flush) +{ + s32 err; + s32 macmode; + + if (blacklist) { + err = wldev_ioctl_set(dev, WLC_SET_MACLIST, (u8 *)blacklist, len); + if (err != BCME_OK) { + WL_ERR(("WLC_SET_MACLIST failed %d\n", err)); + return err; + } + } + /* By default programming blacklist flushes out old values */ + macmode = (flush && !blacklist) ? WLC_MACMODE_DISABLED : WLC_MACMODE_DENY; + err = wldev_ioctl_set(dev, WLC_SET_MACMODE, (u8 *)&macmode, sizeof(macmode)); + if (err != BCME_OK) { + WL_ERR(("WLC_SET_MACMODE %d failed %d\n", macmode, err)); + } else { + WL_INFORM_MEM(("WLC_SET_MACMODE %d applied\n", macmode)); + } + return err; +} + +s32 +wl_android_set_whitelist_ssid(struct net_device *dev, wl_ssid_whitelist_t *ssid_whitelist, + uint32 len, uint32 flush) +{ + s32 err; + u8 *buf; + u32 buf_len = WLC_IOCTL_MEDLEN; + wl_ssid_whitelist_t whitelist_ssid_flush; + struct bcm_cfg80211 *cfg = wl_get_cfg(dev); + + if (!ssid_whitelist) { + if (flush) { + ssid_whitelist = &whitelist_ssid_flush; + ssid_whitelist->ssid_count = 0; + } else { + WL_ERR(("%s : Nothing to do here\n", __FUNCTION__)); + return BCME_BADARG; + } + } + + buf = (char *)MALLOC(cfg->osh, buf_len); + if (buf == NULL) { + WL_ERR(("failed to allocated memory %d bytes\n", + WLC_IOCTL_MEDLEN)); + return -ENOMEM; + } + + if ((len + strlen("roam_exp_ssid_whitelist")) >= buf_len) { + WL_ERR(("unexpected len for ssid blklist:%d\n", len)); + err = -EINVAL; + goto exit; + } + + ssid_whitelist->version = SSID_WHITELIST_VERSION_1; + ssid_whitelist->flags = flush ? ROAM_EXP_CLEAR_SSID_WHITELIST : 0; + err = wldev_iovar_setbuf(dev, "roam_exp_ssid_whitelist", + (u8 *)ssid_whitelist, len, buf, buf_len, NULL); + if (err != BCME_OK) { + if (err == BCME_UNSUPPORTED) { + WL_ERR(("roam_exp_bssid_pref, UNSUPPORTED \n")); + } else { + WL_ERR(("Failed to execute roam_exp_bssid_pref %d\n", err)); + } + } +exit: + MFREE(cfg->osh, buf, buf_len); + return err; +} diff --git a/wl_android.h b/wl_android.h index 5e330f3..5120c41 100644 --- a/wl_android.h +++ b/wl_android.h @@ -156,6 +156,10 @@ s32 wl_netlink_send_msg(int pid, int type, int seq, const void *data, size_t siz #define APCS_DEFAULT_5G_CH 149 #define APCS_DEFAULT_6G_CH 5 +extern int wl_android_set_whitelist_ssid(struct net_device *dev, + wl_ssid_whitelist_t *ssid_whitelist, uint32 len, uint32 flush); +extern int wl_android_set_blacklist_bssid(struct net_device *dev, maclist_t *blacklist, + uint32 len, uint32 flush); int wl_android_set_ap_mac_list(struct net_device *dev, int macmode, struct maclist *maclist); #ifdef WL_BCNRECV extern int wl_android_bcnrecv_config(struct net_device *ndev, char *data, diff --git a/wl_cfg80211.c b/wl_cfg80211.c index d655e1b..5d36997 100644 --- a/wl_cfg80211.c +++ b/wl_cfg80211.c @@ -6132,17 +6132,6 @@ wl_do_preassoc_ops(struct bcm_cfg80211 *cfg, wl_restore_ap_bw(cfg); } #endif /* SUPPORT_AP_BWCTRL */ -#if defined(ROAMEXP_SUPPORT) - /* Clear Blacklist bssid and Whitelist ssid list before join issue - * This is temporary fix since currently firmware roaming is not - * disabled by android framework before SSID join from framework - */ - /* Flush blacklist bssid content */ - dhd_dev_set_blacklist_bssid(dev, NULL, 0, true); - /* Flush whitelist ssid content */ - dhd_dev_set_whitelist_ssid(dev, NULL, 0, true); -#endif /* ROAMEXP_SUPPORT */ - WL_DBG(("SME IE : len=%zu\n", sme->ie_len)); if (sme->ie != NULL && sme->ie_len > 0 && (wl_dbg_level & WL_DBG_DBG)) { prhex(NULL, sme->ie, sme->ie_len); @@ -12845,6 +12834,13 @@ wl_post_linkdown_ops(struct bcm_cfg80211 *cfg, } #endif /* SUPPORT_SET_TID */ +#if defined(ROAMEXP_SUPPORT) + /* Flush blacklist bssid content */ + wl_android_set_blacklist_bssid(ndev, NULL, 0, TRUE); + /* Flush whitelist ssid content */ + wl_android_set_whitelist_ssid(ndev, NULL, 0, TRUE); +#endif /* ROAMEXP_SUPPORT */ + return ret; } diff --git a/wl_cfgvendor.c b/wl_cfgvendor.c index da8ee12..91bcbcc 100755 --- a/wl_cfgvendor.c +++ b/wl_cfgvendor.c @@ -2845,6 +2845,7 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy, err = -EINVAL; goto exit; } + WL_INFORM_MEM(("blacklist_flush:%d\n", flush)); break; case GSCAN_ATTRIBUTE_BLACKLIST_BSSID: if (num == 0 || !blacklist) { @@ -2863,8 +2864,9 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy, err = -EINVAL; goto exit; } - memcpy(&(blacklist->ea[blacklist->count]), nla_data(iter), - ETHER_ADDR_LEN); + WL_INFORM_MEM(("blacklist mac_addr:" MACDBG "\n", + MAC2STRDBG(nla_data(iter)))); + eacopy(nla_data(iter), &(blacklist->ea[blacklist->count])); blacklist->count++; break; default: @@ -2880,8 +2882,8 @@ wl_cfgvendor_set_bssid_blacklist(struct wiphy *wiphy, goto exit; } - err = dhd_dev_set_blacklist_bssid(bcmcfg_to_prmry_ndev(cfg), - blacklist, mem_needed, flush); + err = wl_android_set_blacklist_bssid(wdev_to_ndev(wdev), blacklist, + mem_needed, flush); exit: MFREE(cfg->osh, blacklist, mem_needed); return err; |