diff options
author | sanfran <sanfran.shen@broadcom.corp-partner.google.com> | 2020-04-07 15:03:29 +0800 |
---|---|---|
committer | Ahmed ElArabawy <arabawy@google.com> | 2020-04-29 17:52:39 +0000 |
commit | 60388f580fe01f153104fd31f6ad2a045baa29cd (patch) | |
tree | 857fab575833deeeb18eb4596989de7f67f80416 | |
parent | e3cd0a1f4275e0d857e3da2c69eebbb1cdfd6706 (diff) | |
download | wlan-60388f580fe01f153104fd31f6ad2a045baa29cd.tar.gz |
Add Support Wi-Fi Configure Roaming
Add function wifi_configure_raoming to support blacklist.
DHD also needs a change.
Bug: 153244193
Test: Use halutil to verify blacklist
Signed-off-by: sanfran <sanfran.shen@broadcom.corp-partner.google.com>
Change-Id: I13059a34f55d4b81232b6ecaba1ec5ee96981eb6
MERGED-IN: I13059a34f55d4b81232b6ecaba1ec5ee96981eb6
(cherry picked from commit ae4ea00adf3a15b6c2347c53738822165c5177ab)
-rwxr-xr-x | bcmdhd/wifi_hal/common.h | 3 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/gscan.cpp | 111 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/wifi_hal.cpp | 1 |
3 files changed, 114 insertions, 1 deletions
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h index 080cb46..144f859 100755 --- a/bcmdhd/wifi_hal/common.h +++ b/bcmdhd/wifi_hal/common.h @@ -150,7 +150,8 @@ typedef enum { GOOGLE_DEBUG_RING_EVENT, GOOGLE_DEBUG_MEM_DUMP_EVENT, GSCAN_EVENT_ANQPO_HOTSPOT_MATCH, - GOOGLE_RSSI_MONITOR_EVENT + GOOGLE_RSSI_MONITOR_EVENT, + ROAM_EVENT_START = 32, } WIFI_EVENT; typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events); diff --git a/bcmdhd/wifi_hal/gscan.cpp b/bcmdhd/wifi_hal/gscan.cpp index d626ee1..2a811c3 100755 --- a/bcmdhd/wifi_hal/gscan.cpp +++ b/bcmdhd/wifi_hal/gscan.cpp @@ -163,6 +163,10 @@ typedef enum { } GSCAN_ATTRIBUTE; +typedef struct { + int num_bssid; // number of blacklisted BSSIDs + mac_addr bssids[MAX_BLACKLIST_BSSID]; // blacklisted BSSIDs +} wifi_bssid_params; // helper methods wifi_error wifi_enable_full_scan_results(wifi_request_id id, wifi_interface_handle iface, @@ -1688,7 +1692,114 @@ wifi_error wifi_set_epno_list(wifi_request_id id, wifi_interface_handle iface, return result; } +class BssidBlacklistCommand : public WifiCommand +{ + private: + wifi_bssid_params *mParams; + public: + BssidBlacklistCommand(wifi_interface_handle handle, int id, + wifi_bssid_params *params) + : WifiCommand("BssidBlacklistCommand", handle, id), mParams(params) + { } + int createRequest(WifiRequest& request) { + if ((mParams->num_bssid < 0) || (mParams->num_bssid > MAX_BLACKLIST_BSSID)) { + return WIFI_ERROR_INVALID_ARGS; + } + int result = request.create(GOOGLE_OUI, WIFI_SUBCMD_SET_BSSID_BLACKLIST); + if (result < 0) { + return result; + } + + nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); + if (!mParams->num_bssid) { + result = request.put_u32(GSCAN_ATTRIBUTE_BSSID_BLACKLIST_FLUSH, 1); + if (result < 0) { + return result; + } + } else { + result = request.put_u32(GSCAN_ATTRIBUTE_NUM_BSSID, mParams->num_bssid); + if (result < 0) { + return result; + } + for (int i = 0; i < mParams->num_bssid; i++) { + result = request.put_addr(GSCAN_ATTRIBUTE_BLACKLIST_BSSID, mParams->bssids[i]); + if (result < 0) { + return result; + } + } + } + request.attr_end(data); + return result; + } + + int start() { + ALOGV("Executing bssid blacklist request, num = %d", mParams->num_bssid); + WifiRequest request(familyId(), ifaceId()); + int result = createRequest(request); + if (result < 0) { + return result; + } + + result = requestResponse(request); + if (result < 0) { + ALOGE("Failed to execute bssid blacklist request, result = %d", result); + return result; + } + + ALOGI("Successfully added %d blacklist bssids", mParams->num_bssid); + return result; + } + + virtual int handleResponse(WifiEvent& reply) { + /* Nothing to do on response! */ + return NL_SKIP; + } +}; +wifi_error wifi_set_bssid_blacklist(wifi_request_id id, wifi_interface_handle iface, + wifi_bssid_params params) +{ + wifi_handle handle = getWifiHandle(iface); + + BssidBlacklistCommand *cmd = new BssidBlacklistCommand(iface, id, ¶ms); + NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); + wifi_error result = (wifi_error)cmd->start(); + //release the reference of command as well + cmd->releaseRef(); + return result; +} + +wifi_error wifi_configure_roaming(wifi_interface_handle iface, + wifi_roaming_config *roam_config) +{ + wifi_error ret; + wifi_bssid_params bssid_params; + unsigned int i; + wifi_request_id id = 0; + + /* Set bssid blacklist */ + if (roam_config->num_blacklist_bssid == 0) { + /* Flush request */ + ALOGI("%s: num_blacklist_bssid == 0 (flush)", __FUNCTION__); + } + + bssid_params.num_bssid = roam_config->num_blacklist_bssid; + + for (i = 0; i < roam_config->num_blacklist_bssid; i++) { + mac_addr &addr1 = roam_config->blacklist_bssid[i]; + memcpy(&bssid_params.bssids[i], &roam_config->blacklist_bssid[i], + sizeof(mac_addr)); + ALOGI("%02x:%02x:%02x:%02x:%02x:%02x\n", addr1[0], + addr1[1], addr1[2], addr1[3], addr1[4], addr1[5]); + } + ret = wifi_set_bssid_blacklist(id, iface, bssid_params); + if (ret != WIFI_SUCCESS) { + ALOGE("%s: Failed to configure blacklist bssids", __FUNCTION__); + return ret; + } + + return ret; +} //////////////////////////////////////////////////////////////////////////////// class AnqpoConfigureCommand : public WifiCommand diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp index 20df171..4012af9 100755 --- a/bcmdhd/wifi_hal/wifi_hal.cpp +++ b/bcmdhd/wifi_hal/wifi_hal.cpp @@ -213,6 +213,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_get_packet_filter_capabilities = wifi_get_packet_filter_capabilities; fn->wifi_set_packet_filter = wifi_set_packet_filter; fn->wifi_get_roaming_capabilities = wifi_get_roaming_capabilities; + fn->wifi_configure_roaming = wifi_configure_roaming; return WIFI_SUCCESS; } |