From 2c9b84f80439fb8b5f7b900c7424087a693df30c Mon Sep 17 00:00:00 2001 From: Pragya Gupta Date: Mon, 11 Jul 2016 12:09:11 +0530 Subject: [PATCH] [7570] wlbt: Support for Roam BSSID Blacklist Changes to add suport for Roam BSSID Blacklist SCSC-Bug-Id: SSB-19140 Change-Id: I6e57478473906cc765465dbf631b654398abd39e Signed-off-by: Pragya Gupta --- common.h | 5 +++- gscan.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++- wifi_hal.cpp | 1 + 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/common.h b/common.h index 61d12dc..dc2cfcf 100755 --- a/common.h +++ b/common.h @@ -76,8 +76,11 @@ typedef enum { SLSI_NL80211_VENDOR_SUBCMD_RESET_SIGNIFICANT_CHANGE, SLSI_NL80211_VENDOR_SUBCMD_SET_GSCAN_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_NODFS, + SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST, + /*Add any GSCAN subcmds before this*/ SLSI_NL80211_VENDOR_SUBCMD_START_KEEP_ALIVE_OFFLOAD, - SLSI_NL80211_VENDOR_SUBCMD_STOP_KEEP_ALIVE_OFFLOAD + SLSI_NL80211_VENDOR_SUBCMD_STOP_KEEP_ALIVE_OFFLOAD, + } WIFI_SUB_COMMAND; typedef enum { diff --git a/gscan.cpp b/gscan.cpp index 46929f0..55c5dbc 100755 --- a/gscan.cpp +++ b/gscan.cpp @@ -82,6 +82,9 @@ typedef enum { GSCAN_ATTRIBUTE_BUCKET_EXPONENT, GSCAN_ATTRIBUTE_BUCKET_MAX_PERIOD, + GSCAN_ATTRIBUTE_NUM_BSSID, + GSCAN_ATTRIBUTE_BLACKLIST_BSSID, + GSCAN_ATTRIBUTE_MAX } GSCAN_ATTRIBUTE; @@ -428,7 +431,7 @@ public: return result; } - + return result; } @@ -1082,3 +1085,72 @@ wifi_error wifi_reset_significant_change_handler(wifi_request_id id, wifi_interf return WIFI_ERROR_INVALID_ARGS; } + +class BssidBlacklistCommand : public WifiCommand +{ +private: + wifi_bssid_params *mParams; +public: + BssidBlacklistCommand(wifi_interface_handle handle, int id, + wifi_bssid_params *params) + : WifiCommand(handle, id), mParams(params) + { } + int createRequest(WifiRequest& request) { + int result = request.create(GOOGLE_OUI, SLSI_NL80211_VENDOR_SUBCMD_SET_BSSID_BLACKLIST); + if (result < 0) { + return result; + } + + nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); + 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() { + ALOGD("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); + wifi_error result = (wifi_error)cmd->start(); + //release the reference of command as well + cmd->releaseRef(); + return result; +} + diff --git a/wifi_hal.cpp b/wifi_hal.cpp index e3b78bf..723d0d3 100755 --- a/wifi_hal.cpp +++ b/wifi_hal.cpp @@ -111,6 +111,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_set_nodfs_flag = wifi_set_nodfs_flag; fn->wifi_start_sending_offloaded_packet = wifi_start_sending_offloaded_packet; fn->wifi_stop_sending_offloaded_packet = wifi_stop_sending_offloaded_packet; + fn->wifi_set_bssid_blacklist = wifi_set_bssid_blacklist; return WIFI_SUCCESS; } -- 2.20.1