summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsanfran <sanfran.shen@broadcom.corp-partner.google.com>2020-04-12 02:41:28 +0800
committerAhmed ElArabawy <arabawy@google.com>2020-04-29 17:57:46 +0000
commit98a8aa1cb4457414bf76bf590acf1395052a20eb (patch)
treeec2eb5d2567ce244f7bb11db33cf3a311c4147b0
parent26c49a560fe93db62f9afaa370b7796fc33be60b (diff)
downloadwlan-98a8aa1cb4457414bf76bf590acf1395052a20eb.tar.gz
Add Support Set Roaming State
Add function wifi_enable_firmware_roaming to enable/disable roaming Bug: 152577756 Test: halutil -set_fw_roaming_state <value> Signed-off-by: sanfran <sanfran.shen@broadcom.corp-partner.google.com> Change-Id: I116f4ca350bef8be03c5fb53d0fe3bfc7f4bac20 Merged-In: I116f4ca350bef8be03c5fb53d0fe3bfc7f4bac20 (cherry picked from commit 8e5479c1a33783171f7e63bf5b6aa6798837179e)
-rwxr-xr-xbcmdhd/wifi_hal/common.h1
-rwxr-xr-xbcmdhd/wifi_hal/gscan.cpp63
-rwxr-xr-xbcmdhd/wifi_hal/wifi_hal.cpp1
3 files changed, 65 insertions, 0 deletions
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h
index e728b54..4deab8a 100755
--- a/bcmdhd/wifi_hal/common.h
+++ b/bcmdhd/wifi_hal/common.h
@@ -131,6 +131,7 @@ typedef enum {
WIFI_SUBCMD_SET_RSSI_MONITOR, /* 0x1016 */
WIFI_SUBCMD_CONFIG_ND_OFFLOAD, /* 0x1017 */
/* Add more sub commands here */
+ WIFI_SUBCMD_FW_ROAM_POLICY = 0x1019, /* 0x1019 */
WIFI_SUBCMD_ROAM_CAPABILITY = 0x101a, /* 0x101a*/
GSCAN_SUBCMD_MAX,
diff --git a/bcmdhd/wifi_hal/gscan.cpp b/bcmdhd/wifi_hal/gscan.cpp
index 2a811c3..f5722f2 100755
--- a/bcmdhd/wifi_hal/gscan.cpp
+++ b/bcmdhd/wifi_hal/gscan.cpp
@@ -159,6 +159,8 @@ typedef enum {
GSCAN_ATTRIBUTE_EPNO_SECURE_BONUS,
GSCAN_ATTRIBUTE_EPNO_5G_BONUS,
+ /* Roaming features */
+ GSCAN_ATTRIBUTE_ROAM_STATE_SET = 140,
GSCAN_ATTRIBUTE_MAX
} GSCAN_ATTRIBUTE;
@@ -1800,6 +1802,67 @@ wifi_error wifi_configure_roaming(wifi_interface_handle iface,
return ret;
}
+
+class FirmwareRoamingStateCommand : public WifiCommand
+{
+ private:
+ fw_roaming_state_t roam_state;
+ public:
+ FirmwareRoamingStateCommand(wifi_interface_handle handle,
+ fw_roaming_state_t state)
+ : WifiCommand("FirmwareRoamingStateCommand", handle, -1), roam_state(state)
+ { }
+ int createRequest(WifiRequest& request) {
+ int result = request.create(GOOGLE_OUI, WIFI_SUBCMD_FW_ROAM_POLICY);
+ if (result < 0) {
+ return result;
+ }
+
+ nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA);
+ result = request.put_u32(GSCAN_ATTRIBUTE_ROAM_STATE_SET, roam_state);
+ if (result < 0) {
+ return result;
+ }
+ request.attr_end(data);
+ return result;
+ }
+
+ int start() {
+ ALOGV("Executing firmware roam state set, state = %d", roam_state);
+ WifiRequest request(familyId(), ifaceId());
+ int result = createRequest(request);
+ if (result < 0) {
+ return result;
+ }
+
+ result = requestResponse(request);
+ if (result < 0) {
+ ALOGE("Failed to execute firmware roam state set, result = %d", result);
+ return result;
+ }
+
+ ALOGI("Successfully set firmware roam state - %d", roam_state);
+ return result;
+ }
+
+ virtual int handleResponse(WifiEvent& reply) {
+ /* Nothing to do on response! */
+ return NL_SKIP;
+ }
+};
+
+wifi_error wifi_enable_firmware_roaming(wifi_interface_handle iface,
+ fw_roaming_state_t state)
+{
+ /* Set firmware roaming state */
+ FirmwareRoamingStateCommand *cmd = new FirmwareRoamingStateCommand(iface, state);
+ 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;
+}
+
////////////////////////////////////////////////////////////////////////////////
class AnqpoConfigureCommand : public WifiCommand
diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp
index 4012af9..6ecd32a 100755
--- a/bcmdhd/wifi_hal/wifi_hal.cpp
+++ b/bcmdhd/wifi_hal/wifi_hal.cpp
@@ -212,6 +212,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn)
fn->wifi_get_rx_pkt_fates = wifi_get_rx_pkt_fates;
fn->wifi_get_packet_filter_capabilities = wifi_get_packet_filter_capabilities;
fn->wifi_set_packet_filter = wifi_set_packet_filter;
+ fn->wifi_enable_firmware_roaming = wifi_enable_firmware_roaming;
fn->wifi_get_roaming_capabilities = wifi_get_roaming_capabilities;
fn->wifi_configure_roaming = wifi_configure_roaming;
return WIFI_SUCCESS;