18abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/*
28abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project
38abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
48abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License");
58abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * you may not use this file except in compliance with the License.
68abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * You may obtain a copy of the License at
78abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
88abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *     http://www.apache.org/licenses/LICENSE-2.0
98abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *
108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software
118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS,
128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * See the License for the specific language governing permissions and
148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * limitations under the License.
158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */
16b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
17b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "sync.h"
18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define LOG_TAG  "WifiHAL"
19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include <utils/Log.h>
208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include <time.h>
21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
22b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "common.h"
23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "cpp_bindings.h"
248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscancommand.h"
258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#include "gscan_event_handler.h"
26b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam#define GSCAN_EVENT_WAIT_TIME_SECONDS 4
28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Used to handle gscan command events from driver/firmware. */
308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanStartCmdEventHandler = NULL;
318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanSetBssidHotlistCmdEventHandler = NULL;
328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommandEventHandler *GScanSetSignificantChangeCmdEventHandler = NULL;
33b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Implementation of the API functions exposed in gscan.h */
358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_valid_channels(wifi_interface_handle handle,
368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam       int band, int max_channels, wifi_channel *channels, int *num_channels)
378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int requestId, ret = 0;
398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(handle);
428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(handle);
438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (channels == NULL) {
458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: NULL channels pointer provided. Exit.",
468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* No request id from caller, so generate one and pass it on to the driver.
518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Generate one randomly.
528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    srand( time(NULL) );
548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    requestId = rand();
558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifiHandle,
588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            requestId,
598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            OUI_QCA,
608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS);
618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand->put_u32(
818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            requestId) ||
838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_WIFI_BAND,
858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            band) ||
868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_GET_VALID_CHANNELS_CONFIG_PARAM_MAX_CHANNELS,
888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            max_channels) )
898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Populate the input received from caller/framework. */
948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->setMaxChannels(max_channels);
958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->setChannels(channels);
968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->setNumChannelsPtr(num_channels);
978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Send the msg and wait for a response. */
998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestResponse();
1008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret) {
1018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error %d happened. ", __func__, ret);
1028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
103b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
1058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
1068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
1078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
1088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
109b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid get_gscan_capabilities_cb(int status, wifi_gscan_capabilities capa)
1118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
1128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
1138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Capabilities. max_ap_cache_per_scan:%d, "
1148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "max_bssid_history_entries:%d, max_hotlist_aps:%d, "
1158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "max_rssi_sample_size:%d, max_scan_buckets:%d, "
1168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "max_scan_cache_size:%d, max_scan_reporting_threshold:%d, "
1178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "max_significant_wifi_change_aps:%d.",
1188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__, capa.max_ap_cache_per_scan,
1198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            capa.max_bssid_history_entries,
1208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            capa.max_hotlist_aps, capa.max_rssi_sample_size,
1218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            capa.max_scan_buckets,
1228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            capa.max_scan_cache_size, capa.max_scan_reporting_threshold,
1238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            capa.max_significant_wifi_change_aps);
1248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
125b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_gscan_capabilities(wifi_interface_handle handle,
1278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                 wifi_gscan_capabilities *capabilities)
1288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
1298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int requestId, ret = 0;
1308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
1318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
1328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_gscan_capabilities tCapabilities;
1338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(handle);
1348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(handle);
1358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (capabilities == NULL) {
1378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: NULL capabilities pointer provided. Exit.",
1388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
1398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
1408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
141b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* No request id from caller, so generate one and pass it on to the driver.
1438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Generate it randomly.
1448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
1458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    srand(time(NULL));
1468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    requestId = rand();
1478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
1498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifiHandle,
1508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            requestId,
1518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            OUI_QCA,
1528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES);
1538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
1548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
1558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
1568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
157b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
1598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
1608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.get_capabilities = get_gscan_capabilities_cb;
1618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
1638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
1648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
1678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
1688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
1698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
1728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
1738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
1748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
1778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
1788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
1798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->put_u32(
1828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
1838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            requestId);
1848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
1858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
1878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
1888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanGetCapabilitiesRspParams);
1898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
1908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory fo response struct. Error:%d",
1918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__, ret);
1928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
194b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
1968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
1978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
1988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
1998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
2008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
201b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getGetCapabilitiesRspParams(capabilities, (u32 *)&ret);
203b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
2058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanGetCapabilitiesRspParams);
2068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
2078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
2088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
2098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
210b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid start_gscan_cb(int status)
2128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
2138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
2148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
215b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_start_gscan(wifi_request_id id,
2178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifi_interface_handle iface,
2188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifi_scan_cmd_params params,
2198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifi_scan_result_handler handler)
220b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
2218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = 0;
2228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 i, j;
2238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
2248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
2258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
2268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
2278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 num_scan_buckets, numChannelSpecs;
2288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_scan_bucket_spec bucketSpec;
2298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlBuckectSpecList;
2308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Check if a similar request to start gscan was made earlier.
2328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Right now we don't differentiate between the case where (i) the new
2338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Request Id is different from the current one vs (ii) case where both
2348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * new and Request IDs are the same.
2358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
2368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanStartCmdEventHandler) {
2378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id == GScanStartCmdEventHandler->get_request_id()) {
2388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("wifi_start_gscan(): GSCAN Start for request Id %d is still "
2398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                 "running. Exit", id);
2408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_TOO_MANY_REQUESTS;
2418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        } else {
2428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("wifi_start_gscan(): GSCAN Start for a different request "
2438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "Id %d is requested. Not supported. Exit", id);
2448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_NOT_SUPPORTED;
2458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
246b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
247b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
2498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                wifiHandle,
2508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                id,
2518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                OUI_QCA,
2528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                QCA_NL80211_VENDOR_SUBCMD_GSCAN_START);
2538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
2548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("wifi_start_gscan(): Error GScanCommand NULL");
2558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
2568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
257b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
2598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
2608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.start = start_gscan_cb;
2618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
2638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
2648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
2658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
2678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
2688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
2698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
2708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
2728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
2738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
2748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
2758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
2778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
2788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
2798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
2808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    num_scan_buckets = (unsigned int)params.num_buckets > MAX_BUCKETS ?
2828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            MAX_BUCKETS : params.num_buckets;
2838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand->put_u32(
2858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
2868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            id) ||
2878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
2888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_BASE_PERIOD,
2898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.base_period) ||
2908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
2918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_MAX_AP_PER_SCAN,
2928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.max_ap_per_scan) ||
2938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u8(
2948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_REPORT_THRESHOLD,
2958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.report_threshold) ||
2968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u8(
2978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SCAN_CMD_PARAMS_NUM_BUCKETS,
2988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            num_scan_buckets))
2998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
3008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
301b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
302b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlBuckectSpecList =
3048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC);
3058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add NL attributes for scan bucket specs . */
3068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    for (i = 0; i < num_scan_buckets; i++) {
3078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        bucketSpec = params.buckets[i];
3088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        numChannelSpecs = (unsigned int)bucketSpec.num_channels > MAX_CHANNELS ?
3098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                MAX_CHANNELS : bucketSpec.num_channels;
3108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct nlattr *nlBucketSpec = gScanCommand->attr_start(i);
3118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (gScanCommand->put_u8(
3128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_INDEX,
3138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                bucketSpec.bucket) ||
3148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u8(
3158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_BAND,
3168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                bucketSpec.band) ||
3178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u32(
3188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_PERIOD,
3198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                bucketSpec.period) ||
3208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u8(
3218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_REPORT_EVENTS,
3228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                bucketSpec.report_events) ||
3238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u32(
3248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_BUCKET_SPEC_NUM_CHANNEL_SPECS,
3258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                numChannelSpecs))
3268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
3278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
3288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
329b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct nlattr *nl_channelSpecList =
3318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC);
3328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
3338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        /* Add NL attributes for scan channel specs . */
3348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        for (j = 0; j < numChannelSpecs; j++) {
3358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            struct nlattr *nl_channelSpec = gScanCommand->attr_start(j);
3368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            wifi_scan_channel_spec channel_spec = bucketSpec.channels[j];
3378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
3388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if ( gScanCommand->put_u32(
3398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_CHANNEL,
3408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    channel_spec.channel) ||
3418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                gScanCommand->put_u32(
3428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_DWELL_TIME,
3438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    channel_spec.dwellTimeMs) ||
3448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                gScanCommand->put_u8(
3458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_CHANNEL_SPEC_PASSIVE,
3468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    channel_spec.passive) )
3478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            {
3488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                goto cleanup;
3498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
350b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->attr_end(nl_channelSpec);
352b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
3538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_end(nl_channelSpecList);
3548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_end(nlBucketSpec);
3558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
3568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlBuckectSpecList);
3578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
3588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
359b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanStartRspParams);
3618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
3628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("wifi_start_gscan(): Failed to allocate memory to the response "
3638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "struct. Error:%d", ret);
3648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
3658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
366b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the callback handler functions for related events. */
3688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.on_scan_results_available =
3698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        handler.on_scan_results_available;
3708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.on_full_scan_result = handler.on_full_scan_result;
3718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.on_scan_event = handler.on_scan_event;
3728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create an object to handle the related events from firmware/driver. */
3738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanStartCmdEventHandler = new GScanCommandEventHandler(
3748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                wifiHandle,
3758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                id,
3768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                OUI_QCA,
3778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                QCA_NL80211_VENDOR_SUBCMD_GSCAN_START,
3788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                callbackHandler);
3798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanStartCmdEventHandler == NULL) {
3808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("wifi_start_gscan(): Error GScanStartCmdEventHandler NULL");
3818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ret = WIFI_ERROR_UNKNOWN;
3828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
3838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
384b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
38586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
3868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
3878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
3888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("wifi_start_gscan(): requestEvent Error:%d", ret);
3898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
3908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
391b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getStartGScanRspParams((u32 *)&ret);
3938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
3948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
3958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
3968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
397b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
3998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanStartRspParams);
4008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("wifi_start_gscan(): Delete object.");
4018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
4028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Delete the command event handler object if ret != 0 */
4038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret && GScanStartCmdEventHandler) {
4048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGI("wifi_start_gscan(): Error ret:%d, delete event handler object.",
4058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ret);
4068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanStartCmdEventHandler;
4078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanStartCmdEventHandler = NULL;
408b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
4098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
410b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
412b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid stop_gscan_cb(int status)
414b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
4158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
416b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
417b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_stop_gscan(wifi_request_id id,
4198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifi_interface_handle iface)
4208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
4218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = 0;
4228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
4238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
424b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
4268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
427b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("Stopping GScan, halHandle = %p", wifiHandle);
429b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanStartCmdEventHandler) {
4318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id != GScanStartCmdEventHandler->get_request_id()) {
4328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("wifi_stop_gscan: GSCAN Stop requested for request Id %d "
4338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not matching that of existing GScan Start:%d. Exit",
4348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                id, GScanStartCmdEventHandler->get_request_id());
4358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_REQUEST_ID;
436b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
4378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
4388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("wifi_stop_gscan: GSCAN isn't running or already stopped. "
4398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Nothing to do. Exit");
4408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_NOT_AVAILABLE;
441b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
442b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
4448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                wifiHandle,
4458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                id,
4468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                OUI_QCA,
4478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                QCA_NL80211_VENDOR_SUBCMD_GSCAN_STOP);
4488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
4498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
4508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
451b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
452b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
4548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
4558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.stop = stop_gscan_cb;
4568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
4588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
4598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
4628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
4638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
4648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
4678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
4688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
4698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
4728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
4738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
4748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->put_u32(
4778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
4788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            id);
4798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
4808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
4838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
4848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanStopRspParams);
4858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
4868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory to the response struct. "
4878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Error:%d", __func__, ret);
4888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
490b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
49186a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
4928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
4938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
4948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
4958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
4968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
497b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
4988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getStopGScanRspParams((u32 *)&ret);
4998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
5008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
5018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
502b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
503b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Delete different GSCAN event handlers for the specified Request ID. */
5058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanStartCmdEventHandler) {
5068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanStartCmdEventHandler;
5078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanStartCmdEventHandler = NULL;
508b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
509b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
5118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanStopRspParams);
5128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
5138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
5148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
515b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
516b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid set_bssid_hotlist_cb(int status)
518b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
5198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
5208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
521b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN BSSID Hotlist. */
5238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_bssid_hotlist(wifi_request_id id,
5248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                    wifi_interface_handle iface,
5258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                    wifi_bssid_hotlist_params params,
5268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                    wifi_hotlist_ap_found_handler handler)
5278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
5288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int i, numAp, ret = 0;
5298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
5308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData, *nlApThresholdParamList;
5318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
5328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
5338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("Setting GScan BSSID Hotlist, halHandle = %p", wifiHandle);
5358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Check if a similar request to set bssid hotlist was made earlier.
5378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Right now we don't differentiate between the case where (i) the new
5388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Request Id is different from the current one vs (ii) case where both
5398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * new and Request IDs are the same.
5408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
5418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetBssidHotlistCmdEventHandler)
5428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id == GScanSetBssidHotlistCmdEventHandler->get_request_id()) {
5438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: GSCAN Set BSSID Hotlist for request Id %d is still"
5448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "running. Exit", __func__, id);
5458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_TOO_MANY_REQUESTS;
5468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        } else {
5478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGD("%s: GSCAN Set BSSID Hotlist for a different Request Id:%d"
5488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "is requested. Not supported. Exit", __func__, id);
5498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_NOT_SUPPORTED;
550b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
551b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand =
5538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        new GScanCommand(
5548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    wifiHandle,
5558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    id,
5568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    OUI_QCA,
5578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST);
5588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
5598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
5608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
561b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
562b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
5648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
5658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.set_bssid_hotlist = set_bssid_hotlist_cb,
5668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
5688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
5698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
5708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
5728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
5738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
5748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
5758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
5778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
5788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
5798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
5808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
5828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
5838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
5848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
5858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
5868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    numAp = (unsigned int)params.num_ap > MAX_HOTLIST_APS ? MAX_HOTLIST_APS : params.num_ap;
5878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand->put_u32(
5888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
5898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            id) ||
5908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
5918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_BSSID_HOTLIST_PARAMS_NUM_AP,
5928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            numAp))
5938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
5948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
5958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
596b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
5978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
5988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlApThresholdParamList =
5998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_start(
6008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM);
6018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlApThresholdParamList)
6028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
6038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
6048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add nested NL attributes for AP Threshold Param. */
6058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    for (i = 0; i < numAp; i++) {
6068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ap_threshold_param apThreshold = params.ap[i];
6078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i);
6088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!nlApThresholdParam)
6098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
6108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (gScanCommand->put_addr(
6118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID,
6128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.bssid) ||
6138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_s32(
6148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW,
6158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.low) ||
6168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_s32(
6178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH,
6188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.high) ||
6198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u32(
6208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_CHANNEL,
6218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.channel))
6228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
6238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
624b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
6258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_end(nlApThresholdParam);
6268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
627b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlApThresholdParamList);
629b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
631b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanSetBssidHotlistRspParams);
6338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
6348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory to the response struct. "
6358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Error:%d", __func__, ret);
6368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
637b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
638b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.on_hotlist_ap_found = handler.on_hotlist_ap_found;
6408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create an object of the event handler class to take care of the
6418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam      * asychronous events on the north-bound.
6428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam      */
6438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanSetBssidHotlistCmdEventHandler = new GScanCommandEventHandler(
6448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifiHandle,
6458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            id,
6468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            OUI_QCA,
6478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST,
6488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            callbackHandler);
6498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetBssidHotlistCmdEventHandler == NULL) {
6508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error instantiating GScanSetBssidHotlistCmdEventHandler.",
6518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
6528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ret = WIFI_ERROR_UNKNOWN;
6538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
654b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
655b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Handler object was created for HOTLIST_AP_FOUND.", __func__);
6578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
65886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
6598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
6608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
6618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
6628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
663b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
664b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getSetBssidHotlistRspParams((u32 *)&ret);
6668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
6678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
6688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
6698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
670b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
6728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanSetBssidHotlistRspParams);
6738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object. ", __func__);
6748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
6758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Delete the command event handler object if ret != 0 */
6768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret && GScanSetBssidHotlistCmdEventHandler) {
6778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanSetBssidHotlistCmdEventHandler;
6788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanSetBssidHotlistCmdEventHandler = NULL;
6798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
6808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
6818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
682b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid reset_bssid_hotlist_cb(int status)
6848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
6858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
6868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
687b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
6888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_bssid_hotlist(wifi_request_id id,
6898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            wifi_interface_handle iface)
6908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
6918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = 0;
6928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
6938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
6948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
6958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
6968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
6978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("Resetting GScan BSSID Hotlist, halHandle = %p", wifiHandle);
6988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
6998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetBssidHotlistCmdEventHandler) {
7008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id != GScanSetBssidHotlistCmdEventHandler->get_request_id()) {
7018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: GSCAN Reset Hotlist BSSID requested for request Id %d"
7028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not matching that of existing GScan Set Hotlist BSSID:%d. "
7038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "Exit", __func__, id,
7048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                GScanSetBssidHotlistCmdEventHandler->get_request_id());
7058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_REQUEST_ID;
706b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
7078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
708b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
7108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        wifiHandle,
7118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        id,
7128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        OUI_QCA,
7138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_BSSID_HOTLIST);
714b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
7168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
7178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
7188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
719b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
7218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
7228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.reset_bssid_hotlist = reset_bssid_hotlist_cb;
7238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
7258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
7268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
7298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
7308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
7318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
7348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
7358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
7368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
7398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
7408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
7418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->put_u32(
7448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID, id);
7458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
7468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
7498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanResetBssidHotlistRspParams);
7518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
7528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory to the response struct. "
7538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Error:%d", __func__, ret);
7548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
756b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
75786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
7588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
7598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
7608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
7618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
763b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getResetBssidHotlistRspParams((u32 *)&ret);
7658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
7668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
7678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
7688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
769b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetBssidHotlistCmdEventHandler) {
7718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanSetBssidHotlistCmdEventHandler;
7728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanSetBssidHotlistCmdEventHandler = NULL;
773b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
774b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
7768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanResetBssidHotlistRspParams);
7778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
7788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
7798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
7808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
7818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid set_significant_change_cb(int status)
7838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
7848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
7858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
786b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
7878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Set the GSCAN Significant AP Change list. */
7888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_set_significant_change_handler(wifi_request_id id,
7898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                            wifi_interface_handle iface,
7908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                    wifi_significant_change_params params,
7918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                    wifi_significant_change_handler handler)
7928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
7938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int i, numAp, ret = 0;
7948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
7958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData, *nlApThresholdParamList;
7968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
7978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
7988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
7998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("Setting GScan Significant Change, halHandle = %p", wifiHandle);
8008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Check if a similar request to set significant change was made earlier.
8028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Right now we don't differentiate between the case where (i) the new
8038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Request Id is different from the current one vs (ii) both new and
8048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Request Ids are the same.
8058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
8068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetSignificantChangeCmdEventHandler)
8078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id == GScanSetSignificantChangeCmdEventHandler->get_request_id()) {
8088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: GSCAN Set Significant Change for request Id %d is still"
8098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "running. Exit", __func__, id);
8108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_TOO_MANY_REQUESTS;
811b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        } else {
8128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: GSCAN Set Significant Change for a different Request "
8138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "Id:%d is requested. Not supported. Exit", __func__, id);
8148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_NOT_SUPPORTED;
815b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
816b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
8178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
8188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    wifiHandle,
8198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    id,
8208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    OUI_QCA,
8218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE);
8228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
8238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
8248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
825b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
826b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
8278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
8288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
8298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.set_significant_change = set_significant_change_cb;
8308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
8328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
8338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
8348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
8368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
8378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
8388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
8398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
8418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
8428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
8438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
8448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
8468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
8478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
8488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
8498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    numAp = (unsigned int)params.num_ap > MAX_SIGNIFICANT_CHANGE_APS ?
8518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        MAX_SIGNIFICANT_CHANGE_APS : params.num_ap;
8528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand->put_u32(
8548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
8558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            id) ||
8568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
8578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_RSSI_SAMPLE_SIZE,
8588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.rssi_sample_size) ||
8598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
8608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_LOST_AP_SAMPLE_SIZE,
8618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.lost_ap_sample_size) ||
8628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
8638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_MIN_BREACHING,
8648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            params.min_breaching) ||
8658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
8668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_SIGNIFICANT_CHANGE_PARAMS_NUM_AP,
8678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            numAp))
8688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
8698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
870b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
871b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
8728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
8738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlApThresholdParamList =
8748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_start(
8758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM);
8768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlApThresholdParamList)
8778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
8788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
8798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add nested NL attributes for AP Threshold Param list. */
8808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    for (i = 0; i < numAp; i++) {
8818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ap_threshold_param apThreshold = params.ap[i];
8828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct nlattr *nlApThresholdParam = gScanCommand->attr_start(i);
8838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!nlApThresholdParam)
8848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
8858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if ( gScanCommand->put_addr(
8868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_BSSID,
8878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.bssid) ||
8888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_s32(
8898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_LOW,
8908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.low) ||
8918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_s32(
8928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_RSSI_HIGH,
8938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.high) ||
8948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            gScanCommand->put_u32(
8958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_AP_THRESHOLD_PARAM_CHANNEL,
8968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                apThreshold.channel) )
8978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
8988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
8998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
9008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->attr_end(nlApThresholdParam);
9018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
902b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlApThresholdParamList);
904b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
906b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanSetSignificantChangeRspParams);
9088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
9098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory to the response struct. "
9108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Error:%d", __func__, ret);
9118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
912b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
913b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.on_significant_change = handler.on_significant_change;
9158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create an object of the event handler class to take care of the
9168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam      * asychronous events on the north-bound.
9178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam      */
9188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanSetSignificantChangeCmdEventHandler = new GScanCommandEventHandler(
9198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     wifiHandle,
9208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     id,
9218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     OUI_QCA,
9228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE,
9238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     callbackHandler);
9248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetSignificantChangeCmdEventHandler == NULL) {
9258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error in instantiating, "
9268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "GScanSetSignificantChangeCmdEventHandler.",
9278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
9288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ret = WIFI_ERROR_UNKNOWN;
9298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
9308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
931b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Event handler object was created for SIGNIFICANT_CHANGE.",
9338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
934b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
93586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
9368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
9378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
9388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
9398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
9408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
941b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getSetSignificantChangeRspParams((u32 *)&ret);
9438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
9448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
9458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
946b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
947b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
9498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanSetSignificantChangeRspParams);
9508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
9518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Delete the command event handler object if ret != 0 */
9528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret && GScanSetSignificantChangeCmdEventHandler) {
9538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanSetSignificantChangeCmdEventHandler;
9548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanSetSignificantChangeCmdEventHandler = NULL;
9558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
9568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
9578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
958b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
959b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid reset_significant_change_cb(int status)
9618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
9628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Status = %d.", __func__, status);
9638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
964b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Clear the GSCAN Significant AP change list. */
9668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_reset_significant_change_handler(wifi_request_id id,
9678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                            wifi_interface_handle iface)
9688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
9698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = 0;
9708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
9718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
9728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
9738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
9748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
9758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("Resetting GScan Significant Change, halHandle = %p", wifiHandle);
9768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
9778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetSignificantChangeCmdEventHandler) {
9788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (id != GScanSetSignificantChangeCmdEventHandler->get_request_id()) {
9798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: GSCAN Reset Significant Change requested for request "
9808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "Id %d not matching that of existing GScan Set Hotlist "
9818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "BSSID:%d. Exit", __func__, id,
9828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                GScanSetSignificantChangeCmdEventHandler->get_request_id());
9838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_REQUEST_ID;
984b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
9858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
986b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand =
9888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        new GScanCommand
9898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (
9908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    wifiHandle,
9918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    id,
9928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    OUI_QCA,
9938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_SIGNIFICANT_CHANGE);
9948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
9958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
9968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
9978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
998b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
9998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
10008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
10018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.reset_significant_change = reset_significant_change_cb;
10028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
10048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
10058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
10088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
10098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
10108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
10138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
10148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
10158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
10188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
10198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
10208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->put_u32(
10238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
10248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    id);
10258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
10268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
10298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanResetSignificantChangeRspParams);
10318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
10328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory to the response struct. "
10338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "Error:%d", __func__, ret);
10348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1035b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1036b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
103786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
10388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
10398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
10408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
10418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1043b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->getResetSignificantChangeRspParams((u32 *)&ret);
10458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0)
10468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
10478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
10488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1049b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (GScanSetSignificantChangeCmdEventHandler) {
10518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        delete GScanSetSignificantChangeCmdEventHandler;
10528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        GScanSetSignificantChangeCmdEventHandler = NULL;
10538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1054b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
10568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanResetSignificantChangeRspParams);
10578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
10588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
10598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
10608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1061b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid get_gscan_cached_results_cb(u8 moreData, u32 numResults)
10638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
10648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: More data = %d.", __func__, moreData);
10658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Number of cached results = %d.", __func__, numResults);
10668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1067b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Get the GSCAN cached scan results. */
10698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error wifi_get_cached_gscan_results(wifi_interface_handle iface,
10708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                byte flush, int max,
10718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                wifi_scan_result *results,
10728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                int *num)
10738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
10748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int requestId, ret = 0;
10758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_scan_result *result = results;
10768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 j = 0;
10778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int i = 0;
10788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u8 moreData = 0;
10798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u16 waitTime = GSCAN_EVENT_WAIT_TIME_SECONDS;
10808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCommand *gScanCommand;
10818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *nlData;
10828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    interface_info *ifaceInfo = getIfaceInfo(iface);
10848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
10858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (results == NULL) {
10878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: NULL results pointer provided. Exit.",
10888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__);
10898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_INVALID_ARGS;
10908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1091b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
10928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* No request id from caller, so generate one and pass it on to the driver. */
10938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Generate it randomly */
10948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    srand(time(NULL));
10958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    requestId = rand();
10968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("Getting GScan Cached Results, halHandle = %p", wifiHandle);
10988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
10998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand = new GScanCommand(
11008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        wifiHandle,
11018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        requestId,
11028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        OUI_QCA,
11038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS);
11048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand == NULL) {
11058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Error GScanCommand NULL", __func__);
11068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
11078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1108b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
11098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    GScanCallbackHandler callbackHandler;
11108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&callbackHandler, 0, sizeof(callbackHandler));
11118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    callbackHandler.get_cached_results = get_gscan_cached_results_cb;
11128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->setCallbackHandler(callbackHandler);
11148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
11158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Create the NL message. */
11188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->create();
11198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
11208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Set the interface Id of the message. */
11238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->set_iface_id(ifaceInfo->name);
11248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
11258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Add the vendor specific attributes for the NL command. */
11288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nlData = gScanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
11298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!nlData)
11308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
11338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
11358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (gScanCommand->put_u32(
11368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         QCA_WLAN_VENDOR_ATTR_GSCAN_SUBCMD_CONFIG_PARAM_REQUEST_ID,
11378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            requestId) ||
11388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u8(
11398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_FLUSH,
11408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            flush) ||
11418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        gScanCommand->put_u32(
11428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         QCA_WLAN_VENDOR_ATTR_GSCAN_GET_CACHED_SCAN_RESULTS_CONFIG_PARAM_MAX,
11438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            max))
11448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
11458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
11478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->attr_end(nlData);
11488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->allocRspParams(eGScanGetCachedResultsRspParams);
11498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
11508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Failed to allocate memory fo response struct. Error:%d",
11518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            __func__, ret);
11528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
1153b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1154b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
115586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    gScanCommand->waitForRsp(true);
11568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->requestEvent();
11578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret != 0) {
11588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: requestEvent Error:%d",__func__, ret);
11598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto cleanup;
11608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1161b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
11628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Read more data flag and number of results of retrieved cached results
11638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * from driver/firmware.
11648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * If more data is 0 or numResults >= max, return with results populated.
11658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     * Otherwise, loop in 4s wait for next results fragment(s).
11668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     */
11678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = gScanCommand->getGetCachedResultsRspParams(max,
11688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                               (u8 *)&moreData,
11698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                               num,
11708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                               results);
11718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    while (!ret && moreData && (*num < max)) {
11728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        int res = gScanCommand->timed_wait(waitTime);
11738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (res == ETIMEDOUT) {
11748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Time out happened.", __func__);
11758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /*Proceed to cleanup & return whatever data avaiable at this time*/
11768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            goto cleanup;
1177b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
11788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: Command invoked return value:%d",__func__, res);
11798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        /* Read the moreData and numResults again and possibly append new
11808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         * cached results to the list.
11818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         */
11828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ret = gScanCommand->getGetCachedResultsRspParams(max,
11838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                   (u8 *)&moreData,
11848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                   num,
11858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                   results);
11868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
11878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!ret) {
11888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        for(i=0; i< *num; i++)
11898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
11908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  Result : %d\n", i+1);
11918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  ts  %lld \n", result->ts);
11928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  SSID  %s \n", result->ssid);
11938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  BSSID: "
11948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam               "%02x:%02x:%02x:%02x:%02x:%02x \n",
11958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam               result->bssid[0], result->bssid[1], result->bssid[2],
11968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam               result->bssid[3], result->bssid[4], result->bssid[5]);
11978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  channel %d \n", result->channel);
11988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  rssi  %d \n", result->rssi);
11998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  rtt  %lld \n", result->rtt);
12008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  rtt_sd  %lld \n", result->rtt_sd);
12018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  beacon period  %d \n",
12028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            result->beacon_period);
12038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  capability  %d \n", result->capability);
12048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  IE length  %d \n", result->ie_length);
12058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGI("HAL:  IE Data \n");
12068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            hexdump(result->ie_data, result->ie_length);
12078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            result = (wifi_scan_result *)
12088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam               ((u8 *)&results[i] + sizeof(wifi_scan_result) +
12098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                result->ie_length);
1210b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
12118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
12128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamcleanup:
12138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    gScanCommand->freeRspParams(eGScanGetCachedResultsRspParams);
12148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("%s: Delete object.", __func__);
12158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    delete gScanCommand;
12168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return (wifi_error)ret;
12178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1218b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::GScanCommand(wifi_handle handle, int id, u32 vendor_id,
12208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                  u32 subcmd)
12218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        : WifiVendorCommand(handle, id, vendor_id, subcmd)
12228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
12238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("GScanCommand %p constructed", this);
12248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Initialize the member data variables here */
12258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mStartGScanRspParams = NULL;
12268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mStopGScanRspParams = NULL;
12278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mSetBssidHotlistRspParams = NULL;
12288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mResetBssidHotlistRspParams = NULL;
12298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mSetSignificantChangeRspParams = NULL;
12308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mResetSignificantChangeRspParams = NULL;
12318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mGetCapabilitiesRspParams = NULL;
12328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mGetCachedResultsRspParams = NULL;
12338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mGetCachedResultsNumResults = 0;
12348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mChannels = NULL;
12358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mMaxChannels = 0;
12368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mNumChannelsPtr = NULL;
123786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    mWaitforRsp = false;
12388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
12398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mRequestId = id;
12408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    memset(&mHandler, 0,sizeof(mHandler));
12418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1242b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur SubramanyamGScanCommand::~GScanCommand()
12448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
12458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("GScanCommand %p destructor", this);
12468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    unregisterVendorHandler(mVendor_id, mSubcmd);
12478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1248b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1249b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* This function implements creation of Vendor command */
12518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::create() {
12528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = mMsg.create(NL80211_CMD_VENDOR, 0, 0);
12538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0) {
12548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        return ret;
1255b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1256b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Insert the oui in the msg */
12588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = mMsg.put_u32(NL80211_ATTR_VENDOR_ID, mVendor_id);
12598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
12608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto out;
12618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Insert the subcmd in the msg */
12628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ret = mMsg.put_u32(NL80211_ATTR_VENDOR_SUBCMD, mSubcmd);
12638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret < 0)
12648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto out;
1265b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam     ALOGI("%s: mVendor_id = %d, Subcmd = %d.",
12678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        __func__, mVendor_id, mSubcmd);
1268b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamout:
12708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return ret;
1271b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
1272b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */
12748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int error_handler_gscan(struct sockaddr_nl *nla, struct nlmsgerr *err,
12758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                   void *arg)
1276b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
12778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct sockaddr_nl *tmp;
12788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int *ret = (int *)arg;
12798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    tmp = nla;
12808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    *ret = err->error;
12818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("%s: Error code:%d (%s)", __func__, *ret, strerror(-(*ret)));
12828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return NL_STOP;
12838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1284b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */
12868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int ack_handler_gscan(struct nl_msg *msg, void *arg)
12878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
12888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int *ret = (int *)arg;
12898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nl_msg * a;
1290b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("%s: called", __func__);
12928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    a = msg;
12938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    *ret = 0;
12948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return NL_STOP;
12958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1296b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
12978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Callback handlers registered for nl message send */
12988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int finish_handler_gscan(struct nl_msg *msg, void *arg)
12998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
13008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  int *ret = (int *)arg;
13018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  struct nl_msg * a;
1302b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  ALOGE("%s: called", __func__);
13048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  a = msg;
13058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  *ret = 0;
13068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam  return NL_SKIP;
13078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1308b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/*
13108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Override base class requestEvent and implement little differently here.
13118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * This will send the request message.
13128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * We don't wait for any response back in case of gscan as it is asynchronous,
13138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * thus no wait for condition.
13148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */
13158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::requestEvent()
13168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
13178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int res = -1;
13188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nl_cb *cb;
1319b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: Entry.", __func__);
1321b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    cb = nl_cb_alloc(NL_CB_DEFAULT);
13238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (!cb) {
13248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Callback allocation failed",__func__);
13258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        res = -1;
13268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto out;
1327b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1328b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Send message */
13308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("%s:Handle:%p Socket Value:%p", __func__, mInfo, mInfo->cmd_sock);
13318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    res = nl_send_auto_complete(mInfo->cmd_sock, mMsg.getMessage());
13328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (res < 0)
13338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        goto out;
13348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    res = 1;
1335b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nl_cb_err(cb, NL_CB_CUSTOM, error_handler_gscan, &res);
13378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler_gscan, &res);
13388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler_gscan, &res);
1339b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Err is populated as part of finish_handler. */
13418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    while (res > 0){
13428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam         nl_recvmsgs(mInfo->cmd_sock, cb);
1343b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1344b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
134586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    ALOGD("%s: Msg sent, res=%d, mWaitForRsp=%d", __func__, res, mWaitforRsp);
13468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Only wait for the asynchronous event if HDD returns success, res=0 */
134786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    if (!res && (mWaitforRsp == true)) {
13488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct timespec abstime;
13498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        abstime.tv_sec = 4;
13508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        abstime.tv_nsec = 0;
13518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        res = mCondition.wait(abstime);
13528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (res == ETIMEDOUT)
13538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
13548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Time out happened.", __func__);
1355b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
135686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam        ALOGD("%s: Command invoked return value:%d, mWaitForRsp=%d",
135786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            __func__, res, mWaitforRsp);
1358b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
13598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamout:
13608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Free the VendorData */
13618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mVendorData) {
13628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        free(mVendorData);
1363b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
13648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mVendorData = NULL;
13658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* Cleanup the mMsg */
13668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mMsg.destroy();
13678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return res;
13688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1369b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::requestResponse()
1371b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
13728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGD("%s: request a response", __func__);
13738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return WifiCommand::requestResponse(mMsg);
1374b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
1375b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::handleResponse(WifiEvent &reply) {
13778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("Received a GScan response message from Driver");
13788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 status;
13798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int i = 0;
13808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    WifiVendorCommand::handleResponse(reply);
1381b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
13828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    switch(mSubcmd)
13838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
13848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_VALID_CHANNELS:
13858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            {
13868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                struct nlattr *tb_vendor[
13878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1];
13888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX,
13898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            (struct nlattr *)mVendorData,mDataLen, NULL);
13908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
13918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (tb_vendor[
13928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]) {
13938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    u32 val;
13948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    val = nla_get_u32(
13958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        tb_vendor[
13968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_CHANNELS]);
13978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
13988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ALOGD("%s: Num channels : %d", __func__, val);
13998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    val = val > (unsigned int)mMaxChannels ?
14008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                          (unsigned int)mMaxChannels : val;
14018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    *mNumChannelsPtr = val;
14028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
14038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    /* Extract the list of channels. */
14048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    if (*mNumChannelsPtr > 0 &&
14058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        tb_vendor[
14068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS]) {
14078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        nla_memcpy(mChannels,
14088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            tb_vendor[
14098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CHANNELS],
14108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            sizeof(wifi_channel) * (*mNumChannelsPtr));
14118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    }
1412b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
14138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ALOGD("%s: Get valid channels response received.",
14148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        __func__);
14158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ALOGD("%s: Num channels : %d",
14168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        __func__, *mNumChannelsPtr);
14178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ALOGD("%s: List of valid channels is: ", __func__);
14188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    for(i = 0; i < *mNumChannelsPtr; i++)
14198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    {
14208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        ALOGD("%u", *(mChannels + i));
14218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    }
14228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                }
14238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
14248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            break;
14258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        default :
14268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Wrong GScan subcmd response received %d",
14278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                __func__, mSubcmd);
14288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
14298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return NL_SKIP;
1430b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
1431b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
14328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* Called to parse and extract cached results. */
14338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamstatic int gscan_get_cached_results(u32 num_results,
14348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                          wifi_scan_result *results,
14358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                          u32 starting_index,
14368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                          struct nlattr **tb_vendor)
1437b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
14388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 i = starting_index;
14398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *scanResultsInfo;
14408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int rem = 0;
14418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 len = 0;
14428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("starting counter: %d", i);
14438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
14448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    for (scanResultsInfo = (struct nlattr *) nla_data(tb_vendor[
14458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST]),
14468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            rem = nla_len(tb_vendor[
14478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_LIST
14488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ]);
14498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        nla_ok(scanResultsInfo, rem);
14508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        scanResultsInfo = nla_next(scanResultsInfo, &(rem)))
14518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
14528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        struct nlattr *tb2[ QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1];
14538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX,
14548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        (struct nlattr *) nla_data(scanResultsInfo),
14558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                nla_len(scanResultsInfo), NULL);
14568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
14578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
14588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
14598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP
14608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
14618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
14628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_TIME_STAMP"
14638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                " not found");
14648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
1465b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
14668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        results[i].ts =
14678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_get_u64(
14688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
14698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_TIME_STAMP
14708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ]);
14718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
14728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
14738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID
14748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
14758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
14768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_SSID "
14778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
14788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
1479b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
14808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        len = nla_len(tb2[
14818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]);
14828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        len =
14838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            sizeof(results->ssid) <= len ? sizeof(results->ssid) : len;
14848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        memcpy((void *)&results[i].ssid,
14858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_data(
14868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_SSID]), len);
14878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
14888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
14898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID
14908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
14918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
14928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_BSSID "
14938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
14948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
1495b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
14968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        len = nla_len(
14978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]);
14988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        len =
14998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            sizeof(results->bssid) <= len ? sizeof(results->bssid) : len;
15008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        memcpy(&results[i].bssid,
15018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_data(
15028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_BSSID]), len);
15038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
15048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
15058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL
15068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
15078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
15088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_CHANNEL "
15098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
15108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
1511b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
15128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        results[i].channel =
15138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_get_u32(
15148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_CHANNEL]);
15158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
15168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
15178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI
15188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
15198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
15208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RSSI "
15218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
15228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
1523b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
15248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        results[i].rssi =
15258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_get_u32(
15268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RSSI]);
15278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
15288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
15298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT
15308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ])
15318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
15328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RTT "
15338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
15348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
15358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
15368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        results[i].rtt =
15378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_get_u32(
15388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT]);
15398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        if (!
15408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[
15418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD
15428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ])
15438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
15448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("gscan_get_cached_results: RESULTS_SCAN_RESULT_RTT_SD "
15458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                "not found");
15468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            return WIFI_ERROR_INVALID_ARGS;
15478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
15488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        results[i].rtt_sd =
15498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            nla_get_u32(
15508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            tb2[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_RTT_SD]);
15518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
15528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: ts  %lld ", results[i].ts);
15538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: SSID  %s ", results[i].ssid);
15548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: "
15558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            "BSSID: %02x:%02x:%02x:%02x:%02x:%02x \n",
15568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            results[i].bssid[0], results[i].bssid[1], results[i].bssid[2],
15578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            results[i].bssid[3], results[i].bssid[4], results[i].bssid[5]);
15588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: channel %d ", results[i].channel);
15598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: rssi  %d ", results[i].rssi);
15608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: rtt  %lld ", results[i].rtt);
15618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("gscan_get_cached_results: rtt_sd  %lld ", results[i].rtt_sd);
15628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        /* Increment loop index for next record */
15638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        i++;
15648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
15658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGE("%s: Exited the for loop", __func__);
15668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return WIFI_SUCCESS;
15678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1568b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
15698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/* This function will be the main handler for incoming (from driver)  GSscan_SUBCMD.
15708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam *  Calls the appropriate callback handler after parsing the vendor data.
15718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */
15728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::handleEvent(WifiEvent &event)
15738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
15748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    ALOGI("Got a GSCAN Event message from the Driver.");
15758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    unsigned i = 0;
15768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    u32 status;
157786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    int ret = WIFI_SUCCESS;
15788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    WifiVendorCommand::handleEvent(event);
15798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
15808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct nlattr *tbVendor[
15818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX + 1];
15828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    nla_parse(tbVendor, QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_MAX,
15838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            (struct nlattr *)mVendorData,
15848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mDataLen, NULL);
15858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
15868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    switch(mSubcmd)
15878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
15888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_START:
15898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
15908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mStartGScanRspParams){
15918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStartGScanRspParams->status =
15928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
15938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.start)
15948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.start)(mStartGScanRspParams->status);
1595b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            }
159686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
15978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
15988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
15998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_STOP:
16018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mStopGScanRspParams){
16038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStopGScanRspParams->status =
16048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.stop)
16068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.stop)(mStopGScanRspParams->status);
1607b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            }
160886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
16098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
16108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
16118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_BSSID_HOTLIST:
16138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mSetBssidHotlistRspParams){
16158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetBssidHotlistRspParams->status =
16168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.set_bssid_hotlist)
16188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.set_bssid_hotlist)
16198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            (mSetBssidHotlistRspParams->status);
1620b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            }
162186a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
16228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        }
16238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
16248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_BSSID_HOTLIST:
16268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mResetBssidHotlistRspParams){
16288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetBssidHotlistRspParams->status =
16298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.reset_bssid_hotlist)
16318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.reset_bssid_hotlist)
16328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            (mResetBssidHotlistRspParams->status);
1633b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            }
163486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
1635b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
16368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
16378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_SET_SIGNIFICANT_CHANGE:
16398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mSetSignificantChangeRspParams){
16418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetSignificantChangeRspParams->status =
16428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.set_significant_change)
16448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.set_significant_change)
16458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            (mSetSignificantChangeRspParams->status);
16468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
164786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
1648b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
16498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
16508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_RESET_SIGNIFICANT_CHANGE:
16528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mResetSignificantChangeRspParams){
16548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetSignificantChangeRspParams->status =
16558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mHandler.reset_significant_change)
16578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (*mHandler.reset_significant_change)
16588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                            (mResetSignificantChangeRspParams->status);
16598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
166086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
1661b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
16628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
1663b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
16648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES:
16658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
16668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mGetCapabilitiesRspParams){
16678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: mGetCapabilitiesRspParams ptr is NULL. Exit. ",
16688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    __func__);
16698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
16708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
1671b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
16728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]) {
16738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS "
16748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "not found", __func__);
16758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
16768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
16778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
16788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->status =
16798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                nla_get_u32(tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_STATUS]);
16808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
16828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE
16838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
16848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_"
16858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "CAPABILITIES_MAX_SCAN_CACHE_SIZE not found", __func__);
16868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
16878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
16888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
16898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_scan_cache_size =
16908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                nla_get_u32(tbVendor[
16918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_CACHE_SIZE]);
16928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
16938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
16948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS
16958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
16968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX"
16978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "_SCAN_BUCKETS not found", __func__);
16988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
16998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_scan_buckets =
17028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                nla_get_u32(tbVendor[
17038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_BUCKETS]
17048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                );
17058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN
17088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX"
17108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "_AP_CACHE_PER_SCAN not found", __func__);
17118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_ap_cache_per_scan =
17158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_AP_CACHE_PER_SCAN]);
17178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE
17208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX"
17228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "_RSSI_SAMPLE_SIZE not found", __func__);
17238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_rssi_sample_size =
17278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_RSSI_SAMPLE_SIZE]);
17298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD
17328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_"
17348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "MAX_SCAN_REPORTING_THRESHOLD not found", __func__);
17358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_scan_reporting_threshold =
17398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SCAN_REPORTING_THRESHOLD
17418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ]);
17428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_APS
17458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_"
17478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "MAX_HOTLIST_APS not found", __func__);
17488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_hotlist_aps =
17528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_HOTLIST_APS]);
17548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS
17578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX"
17598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "_SIGNIFICANT_WIFI_CHANGE_APS not found", __func__);
17608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_significant_wifi_change_aps =
17648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_SIGNIFICANT_WIFI_CHANGE_APS]);
17668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
17688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES
17698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    ]) {
17708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX"
17718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "_BSSID_HISTORY_ENTRIES not found", __func__);
17728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
17738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
17748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
17758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams->capabilities.max_bssid_history_entries =
17768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    nla_get_u32(tbVendor[
17778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_CAPABILITIES_MAX_BSSID_HISTORY_ENTRIES
17788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ]);
17798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Call the call back handler func. */
17808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mHandler.get_capabilities)
17818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                (*mHandler.get_capabilities)
17828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        (mGetCapabilitiesRspParams->status,
17838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        mGetCapabilitiesRspParams->capabilities);
178486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
1785b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
17868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
17878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
17888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS:
17898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
17908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            wifi_request_id id;
17918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            u32 resultsBufSize = 0;
17928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            u32 numResults = 0;
17938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            u32 startingIndex, sizeOfObtainedScanResults;
17948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
179586a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            if (!tbVendor[
179686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID]) {
179786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam                ALOGE("%s: GSCAN_RESULTS_REQUEST_ID not"
179886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam                    "found", __func__);
179986a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam                break;
180086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            }
18018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            id = nla_get_u32(
18028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    tbVendor[QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_REQUEST_ID]
18038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    );
18048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Event has Req. ID:%d, ours:%d",
18058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                __func__, id, mRequestId);
18068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* If this is not for us, just ignore it. */
18078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (id != mRequestId) {
18088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: Event has Req. ID:%d <> ours:%d",
18098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    __func__, id, mRequestId);
18108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
18118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
18128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
18138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]) {
181486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam                ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_AVAILABLE not"
18158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "found", __func__);
18168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
18178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
18188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            numResults = nla_get_u32(tbVendor[
18198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_NUM_RESULTS_AVAILABLE]);
18208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: number of results:%d", __func__,
18218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                numResults);
18228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
18238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mGetCachedResultsRspParams) {
18248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: mGetCachedResultsRspParams is NULL, exit.",
18258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    __func__);
18268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
18278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
1828b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
18298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Get the memory size of previous fragments, if any. */
18308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            sizeOfObtainedScanResults = mGetCachedResultsNumResults *
18318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                              sizeof(wifi_scan_result);
18328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
18338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCachedResultsNumResults += numResults;
18348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            resultsBufSize += mGetCachedResultsNumResults *
18358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                sizeof(wifi_scan_result);
18368abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Check if this chunck of cached scan results is a continuation of
18378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam             * a previous one, i.e., a new results fragment.
18388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam             */
18398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mGetCachedResultsRspParams->more_data) {
18408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->results = (wifi_scan_result *)
18418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    realloc (mGetCachedResultsRspParams->results,
18428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    resultsBufSize);
18438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            } else {
18448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->results = (wifi_scan_result *)
18458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    malloc (resultsBufSize);
18468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
1847b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
18488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Total num of cached results received: %d. \n",
18498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                __func__, mGetCachedResultsNumResults);
1850b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
18518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mGetCachedResultsRspParams->results) {
18528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: Failed to alloc memory for results array. Exit.\n",
18538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    __func__);
18548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_OUT_OF_MEMORY;
18558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
18568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
1857b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
18588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGD("(u8 *)mGetCachedResultsRspParams->results : %p "
18598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     "resultsBufSize :%d oldSizeResults : %d . \n",
18608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     (u8 *)mGetCachedResultsRspParams->results,
18618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                     resultsBufSize, sizeOfObtainedScanResults);
18628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Initialize the newly allocated memory area with 0. */
18638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            memset((u8 *)mGetCachedResultsRspParams->results +
18648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                sizeOfObtainedScanResults,
18658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                0,
18668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                resultsBufSize - sizeOfObtainedScanResults);
18678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
18688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* To support fragmentation from firmware, monitor the
18698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam             * MORE_DTATA flag and cache results until MORE_DATA = 0.
18708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam             */
18718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!tbVendor[
18728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]) {
18738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: GSCAN_RESULTS_NUM_RESULTS_MORE_DATA "
18748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    "not found", __func__);
18758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = WIFI_ERROR_INVALID_ARGS;
18768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                break;
18778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            } else {
18788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->more_data = nla_get_u8(
18798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    tbVendor[
18808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                QCA_WLAN_VENDOR_ATTR_GSCAN_RESULTS_SCAN_RESULT_MORE_DATA]);
18818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: More data = %d. \n", __func__,
18828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                mGetCachedResultsRspParams->more_data);
18838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
1884b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
18858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCachedResultsRspParams->num_results =
18868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        mGetCachedResultsNumResults;
18878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (numResults) {
18888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGD("%s: Extract cached results received.\n", __func__);
18898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                startingIndex =
18908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    mGetCachedResultsNumResults - numResults;
18918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGD("%s: starting_index:%d",
18928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    __func__, startingIndex);
18938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = gscan_get_cached_results(numResults,
18948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        mGetCachedResultsRspParams->results,
18958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        startingIndex,
18968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        tbVendor);
18978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                /* If a parsing error occurred, exit and proceed for cleanup. */
18988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (ret)
18998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    break;
19008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
19018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Send the results if no more result data fragments are expected. */
19028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mHandler.get_cached_results) {
19038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                (*mHandler.get_cached_results)
19048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    (mGetCachedResultsRspParams->more_data,
19058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    mGetCachedResultsRspParams->num_results);
19068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
190786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam            waitForRsp(false);
1908b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
19098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
1910b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        default:
19128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            /* Error case should not happen print log */
19138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGE("%s: Wrong GScan subcmd received %d", __func__, mSubcmd);
1914b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
1915b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    /* A parsing error occurred, do the cleanup of gscan result lists. */
19178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (ret) {
19188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        switch(mSubcmd)
19198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        {
19208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CACHED_RESULTS:
19218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            {
19228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                freeRspParams(eGScanGetCachedResultsRspParams);
19238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
19248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            break;
1925b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            case QCA_NL80211_VENDOR_SUBCMD_GSCAN_GET_CAPABILITIES:
19278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            break;
1928b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            default:
19308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ALOGE("%s: Wrong GScan subcmd received %d", __func__, mSubcmd);
1931b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
19328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
1933b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
193486a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    return NL_SKIP;
19358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1936b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::setCallbackHandler(GScanCallbackHandler nHandler)
19388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
19398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int res = 0;
19408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mHandler = nHandler;
19418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    res = registerVendorHandler(mVendor_id, mSubcmd);
19428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (res != 0) {
19438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        /* Error case: should not happen, so print a log when it does. */
19448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=%u",
19458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam              __func__, mVendor_id, mSubcmd);
1946b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
19478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return res;
19488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
1949b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam/*
19518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam * Allocates memory for the subCmd response struct and initializes status = -1
19528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam */
19538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::allocRspParams(eGScanRspRarams cmd)
19548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
19558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int ret = 0;
19568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    switch(cmd)
19578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
19588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanStartRspParams:
19598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mStartGScanRspParams = (GScanStartRspParams *)
19608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanStartRspParams));
19618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mStartGScanRspParams)
19628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
19638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
19648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStartGScanRspParams->status = -1;
19658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
19668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanStopRspParams:
19678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mStopGScanRspParams = (GScanStopRspParams *)
19688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanStopRspParams));
19698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mStopGScanRspParams)
19708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
19718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
19728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStopGScanRspParams->status = -1;
19738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
19748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanSetBssidHotlistRspParams:
19758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mSetBssidHotlistRspParams = (GScanSetBssidHotlistRspParams *)
19768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanSetBssidHotlistRspParams));
19778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mSetBssidHotlistRspParams)
19788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
19798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
19808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetBssidHotlistRspParams->status = -1;
19818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
19828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanResetBssidHotlistRspParams:
19838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mResetBssidHotlistRspParams = (GScanResetBssidHotlistRspParams *)
19848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanResetBssidHotlistRspParams));
19858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mResetBssidHotlistRspParams)
19868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
19878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
19888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetBssidHotlistRspParams->status = -1;
19898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
19908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanSetSignificantChangeRspParams:
19918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mSetSignificantChangeRspParams =
19928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                (GScanSetSignificantChangeRspParams *)
19938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanSetSignificantChangeRspParams));
19948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mSetSignificantChangeRspParams)
19958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
19968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
19978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetSignificantChangeRspParams->status = -1;
19988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
19998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanResetSignificantChangeRspParams:
20008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mResetSignificantChangeRspParams =
20018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                (GScanResetSignificantChangeRspParams *)
20028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanResetSignificantChangeRspParams));
20038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mResetSignificantChangeRspParams)
20048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
20058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else
20068abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetSignificantChangeRspParams->status = -1;
20078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanGetCapabilitiesRspParams:
20098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCapabilitiesRspParams = (GScanGetCapabilitiesRspParams *)
20108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanGetCapabilitiesRspParams));
20118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mGetCapabilitiesRspParams)
20128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
20138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else  {
20148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                memset(&mGetCapabilitiesRspParams->capabilities, 0,
20158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    sizeof(wifi_gscan_capabilities));
20168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCapabilitiesRspParams->status = -1;
20178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanGetCachedResultsRspParams:
20208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCachedResultsRspParams = (GScanGetCachedResultsRspParams *)
20218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                malloc(sizeof(GScanGetCachedResultsRspParams));
20228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (!mGetCachedResultsRspParams)
20238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                ret = -1;
20248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            else {
20258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->num_results = 0;
20268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->more_data = false;
20278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams->results = NULL;
20288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        default:
20318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGD("%s: Wrong request for alloc.", __func__);
20328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ret = -1;
2033b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
20348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return ret;
20358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2036b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
20378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::freeRspParams(eGScanRspRarams cmd)
20388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
20398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    switch(cmd)
20408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
20418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanStartRspParams:
20428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mStartGScanRspParams) {
20438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mStartGScanRspParams);
20448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStartGScanRspParams = NULL;
20458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20468abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanStopRspParams:
20488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mStopGScanRspParams) {
20498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mStopGScanRspParams);
20508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mStopGScanRspParams = NULL;
20518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanSetBssidHotlistRspParams:
20548abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mSetBssidHotlistRspParams) {
20558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mSetBssidHotlistRspParams);
20568abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetBssidHotlistRspParams = NULL;
20578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20588abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanResetBssidHotlistRspParams:
20608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mResetBssidHotlistRspParams) {
20618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mResetBssidHotlistRspParams);
20628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetBssidHotlistRspParams = NULL;
20638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanSetSignificantChangeRspParams:
20668abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mSetSignificantChangeRspParams) {
20678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mSetSignificantChangeRspParams);
20688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mSetSignificantChangeRspParams = NULL;
20698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanResetSignificantChangeRspParams:
20728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mResetSignificantChangeRspParams) {
20738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mResetSignificantChangeRspParams);
20748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mResetSignificantChangeRspParams = NULL;
20758abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20768abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanGetCapabilitiesRspParams:
20788abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mGetCapabilitiesRspParams) {
20798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mGetCapabilitiesRspParams);
20808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCapabilitiesRspParams = NULL;
20818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
20838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        case eGScanGetCachedResultsRspParams:
20848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            if (mGetCachedResultsRspParams) {
20858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                if (mGetCachedResultsRspParams->results) {
20868abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    free(mGetCachedResultsRspParams->results);
20878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                    mGetCachedResultsRspParams->results = NULL;
20888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                }
20898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                free(mGetCachedResultsRspParams);
20908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                mGetCachedResultsRspParams = NULL;
20918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            }
20928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        break;
2093b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
20948abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        default:
20958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            ALOGD("%s: Wrong request for free.", __func__);
20968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
20978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2098b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
20998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamwifi_error GScanCommand::getGetCachedResultsRspParams(
21008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                    int max,
21018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                    u8 *moreData,
21028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                    int *numResults,
21038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                                    wifi_scan_result *results)
21048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21058abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    wifi_error ret = WIFI_SUCCESS;
2106b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21078abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mGetCachedResultsRspParams && results)
21088abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21098abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *moreData = mGetCachedResultsRspParams->more_data;
21108abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *numResults = mGetCachedResultsRspParams->num_results > (unsigned int)max ?
21118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                        max : mGetCachedResultsRspParams->num_results;
21128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        memcpy(results,
21138abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            mGetCachedResultsRspParams->results,
21148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            *numResults * sizeof(wifi_scan_result));
21158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mGetCachedResultsRspParams is NULL", __func__);
21178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ret = WIFI_ERROR_INVALID_ARGS;
21188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
21198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return ret;
21208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2121b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getGetCapabilitiesRspParams(
21238abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        wifi_gscan_capabilities *capabilities,
21248abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam                                        u32 *status)
21258abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21268abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mGetCapabilitiesRspParams && capabilities)
21278abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21288abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mGetCapabilitiesRspParams->status;
21298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        memcpy(capabilities,
21308abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            &mGetCapabilitiesRspParams->capabilities,
21318abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam            sizeof(wifi_gscan_capabilities));
21328abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21338abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mGetCapabilitiesRspParams is NULL", __func__);
21348abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
21358abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2136b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21378abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getStartGScanRspParams(u32 *status)
21388abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21398abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mStartGScanRspParams)
21408abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21418abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mStartGScanRspParams->status;
21428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21438abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mStartGScanRspParams is NULL", __func__);
21448abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
21458abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2146b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21478abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getStopGScanRspParams(u32 *status)
21488abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21498abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mStopGScanRspParams)
21508abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21518abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mStopGScanRspParams->status;
21528abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21538abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mStopGScanRspParams is NULL", __func__);
2154b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
21558abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2156b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21578abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getSetBssidHotlistRspParams(u32 *status)
2158b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
21598abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mSetBssidHotlistRspParams)
21608abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21618abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mSetBssidHotlistRspParams->status;
21628abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21638abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mSetBssidHotlistRspParams is NULL", __func__);
21648abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
21658abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2166b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21678abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getResetBssidHotlistRspParams(u32 *status)
21688abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21698abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mResetBssidHotlistRspParams)
21708abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21718abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mResetBssidHotlistRspParams->status;
21728abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21738abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mResetBssidHotlistRspParams is NULL", __func__);
21748abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
2175b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
2176b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21778abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getSetSignificantChangeRspParams(u32 *status)
2178b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
21798abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mSetSignificantChangeRspParams)
21808abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21818abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mSetSignificantChangeRspParams->status;
21828abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21838abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mSetSignificantChangeRspParams is NULL", __func__);
21848abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
21858abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2186b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
21878abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::getResetSignificantChangeRspParams(u32 *status)
21888abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21898abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    if (mResetSignificantChangeRspParams)
21908abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    {
21918abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        *status = mResetSignificantChangeRspParams->status;
21928abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    } else {
21938abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam        ALOGD("%s: mResetSignificantChangeRspParams is NULL", __func__);
2194b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
21958abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
21968abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
21978abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamint GScanCommand::timed_wait(u16 wait_time)
21988abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam{
21998abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    struct timespec absTime;
22008abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    int res;
22018abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    absTime.tv_sec = wait_time;
22028abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    absTime.tv_nsec = 0;
22038abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    return mCondition.wait(absTime);
22048abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
2205b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
220686a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyamvoid GScanCommand::waitForRsp(bool wait)
220786a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam{
220886a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam    mWaitforRsp = wait;
220986a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam}
221086a1e6dee88506f2c4947d26ec5ac294d3d72859Amarnath Hullur Subramanyam
22118abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setMaxChannels(int max_channels) {
22128abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mMaxChannels = max_channels;
2213b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde}
22148abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
22158abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setChannels(int *channels) {
22168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mChannels = channels;
22178abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
22188abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
22198abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyamvoid GScanCommand::setNumChannelsPtr(int *num_channels) {
22208abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    mNumChannelsPtr = num_channels;
22218abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam}
22228abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2223