summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsanfran <sanfran.shen@broadcom.corp-partner.google.com>2020-04-07 15:03:29 +0800
committerAhmed ElArabawy <arabawy@google.com>2020-04-29 17:52:39 +0000
commit60388f580fe01f153104fd31f6ad2a045baa29cd (patch)
tree857fab575833deeeb18eb4596989de7f67f80416
parente3cd0a1f4275e0d857e3da2c69eebbb1cdfd6706 (diff)
downloadwlan-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-xbcmdhd/wifi_hal/common.h3
-rwxr-xr-xbcmdhd/wifi_hal/gscan.cpp111
-rwxr-xr-xbcmdhd/wifi_hal/wifi_hal.cpp1
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, &params);
+ 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;
}