14af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
24af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *
34af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * Redistribution and use in source and binary forms, with or without
44af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * modification, are permitted provided that the following conditions
54af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * are met:
64af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *  * Redistributions of source code must retain the above copyright
74af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    notice, this list of conditions and the following disclaimer.
84af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *  * Redistributions in binary form must reproduce the above copyright
94af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    notice, this list of conditions and the following disclaimer in
104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    the documentation and/or other materials provided with the
114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    distribution.
124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *  * Neither the name of The Linux Foundation nor the names of its
134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    contributors may be used to endorse or promote products derived
144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *    from this software without specific prior written permission.
154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam *
164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam */
284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "sync.h"
304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#define LOG_TAG  "WifiHAL"
314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include <utils/Log.h>
324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include <time.h>
334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "ifaceeventhandler.h"
354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* Used to handle NL command events from driver/firmware. */
374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamIfaceEventHandlerCommand *mwifiEventHandler = NULL;
384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* Set the interface event monitor handler*/
404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamwifi_error wifi_set_iface_event_handler(wifi_request_id id,
414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                                        wifi_interface_handle iface,
424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                                        wifi_event_handler eh)
434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
440919dfde526ab1f2996334835cbd176906e89d0eSrinivas Girigowda    int ret = 0;
454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    wifi_handle wifiHandle = getWifiHandle(iface);
464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    /* Check if a similar request to set iface event handler was made earlier.
484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam     * Right now we don't differentiate between the case where (i) the new
494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam     * Request Id is different from the current one vs (ii) both new and
504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam     * Request Ids are the same.
514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam     */
524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    if (mwifiEventHandler)
534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        if (id == mwifiEventHandler->get_request_id()) {
554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            ALOGE("%s: Iface Event Handler Set for request Id %d is still"
564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                "running. Exit", __func__, id);
574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            return WIFI_ERROR_TOO_MANY_REQUESTS;
584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        } else {
594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            ALOGE("%s: Iface Event Handler Set for a different Request "
604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                "Id:%d is requested. Not supported. Exit", __func__, id);
614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            return WIFI_ERROR_NOT_SUPPORTED;
624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        }
634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mwifiEventHandler = new IfaceEventHandlerCommand(
664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    wifiHandle,
674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    id,
684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    NL80211_CMD_REG_CHANGE);
694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    if (mwifiEventHandler == NULL) {
704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        ALOGE("%s: Error mwifiEventHandler NULL", __func__);
714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return WIFI_ERROR_UNKNOWN;
724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mwifiEventHandler->setCallbackHandler(eh);
744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return (wifi_error)ret;
764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* Reset monitoring for the NL event*/
794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamwifi_error wifi_reset_iface_event_handler(wifi_request_id id,
804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                                          wifi_interface_handle iface)
814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    int ret = 0;
834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    if (mwifiEventHandler)
854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        if (id == mwifiEventHandler->get_request_id()) {
873ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal            ALOGV("Delete Object mwifiEventHandler for id = %d", id);
884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            delete mwifiEventHandler;
894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            mwifiEventHandler = NULL;
904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        } else {
914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            ALOGE("%s: Iface Event Handler Set for a different Request "
924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                "Id:%d is requested. Not supported. Exit", __func__, id);
934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            return WIFI_ERROR_NOT_SUPPORTED;
944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        }
954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    } else {
963ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal        ALOGV("Object mwifiEventHandler for id = %d already Deleted", id);
974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return (wifi_error)ret;
1004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* This function will be the main handler for the registered incoming
1034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * (from driver) Commads. Calls the appropriate callback handler after
1044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * parsing the vendor data.
1054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam */
1064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint IfaceEventHandlerCommand::handleEvent(WifiEvent &event)
1074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    wifiEventHandler::handleEvent(event);
1094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    switch(mSubcmd)
1114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
1124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        case NL80211_CMD_REG_CHANGE:
1134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        {
1144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            char code[2];
1154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            memset(&code[0], 0, 2);
1164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            if(tb[NL80211_ATTR_REG_ALPHA2])
1174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            {
1184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                memcpy(&code[0], (char *) nla_data(tb[NL80211_ATTR_REG_ALPHA2]), 2);
1194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            } else {
1204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                ALOGE("%s: NL80211_ATTR_REG_ALPHA2 not found", __func__);
1214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            }
1223ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal            ALOGV("Country : %c%c", code[0], code[1]);
1234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            if(mHandler.on_country_code_changed)
1244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            {
1254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                mHandler.on_country_code_changed(code);
1264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            }
1274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        }
1284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        break;
1294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        default:
1303ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal            ALOGV("NL Event : %d Not supported", mSubcmd);
1314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
1324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return NL_SKIP;
1344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamIfaceEventHandlerCommand::IfaceEventHandlerCommand(wifi_handle handle, int id, u32 subcmd)
1374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        : wifiEventHandler(handle, id, subcmd)
1384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
139b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal    ALOGV("wifiEventHandler %p constructed", this);
1404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    registerHandler(mSubcmd);
1414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    memset(&mHandler, 0, sizeof(wifi_event_handler));
1424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mEventData = NULL;
1434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mDataLen = 0;
1444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamIfaceEventHandlerCommand::~IfaceEventHandlerCommand()
1474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
148b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal    ALOGV("IfaceEventHandlerCommand %p destructor", this);
1494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    unregisterHandler(mSubcmd);
1504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid IfaceEventHandlerCommand::setCallbackHandler(wifi_event_handler nHandler)
1534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mHandler = nHandler;
1554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint wifiEventHandler::get_request_id()
1584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return mRequestId;
1604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint IfaceEventHandlerCommand::get_request_id()
1634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return wifiEventHandler::get_request_id();
1654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamwifiEventHandler::wifiEventHandler(wifi_handle handle, int id, u32 subcmd)
1684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        : WifiCommand(handle, id)
1694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mRequestId = id;
1714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSubcmd = subcmd;
1724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    registerHandler(mSubcmd);
173b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal    ALOGV("wifiEventHandler %p constructed", this);
1744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamwifiEventHandler::~wifiEventHandler()
1774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
178b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal    ALOGV("wifiEventHandler %p destructor", this);
1794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    unregisterHandler(mSubcmd);
1804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint wifiEventHandler::handleEvent(WifiEvent &event)
1834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    struct genlmsghdr *gnlh = event.header();
1854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSubcmd = gnlh->cmd;
1864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
1874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            genlmsg_attrlen(gnlh, 0), NULL);
1883ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal    ALOGV("Got NL Event : %d from the Driver.", gnlh->cmd);
1894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return NL_SKIP;
1914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
1924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
1934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamWifihalGeneric::WifihalGeneric(wifi_handle handle, int id, u32 vendor_id,
1944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                                  u32 subcmd)
1954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        : WifiVendorCommand(handle, id, vendor_id, subcmd)
1964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
1974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    /* Initialize the member data variables here */
1984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSet = 0;
1994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSetSizeMax = 0;
2004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSetSizePtr = NULL;
2014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mConcurrencySet = 0;
202cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    filterVersion = 0;
203cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    filterLength = 0;
204cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    firmware_bus_max_size = 0;
2054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
2064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamWifihalGeneric::~WifihalGeneric()
2084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
2094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
2104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifihalGeneric::requestResponse()
2124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
2134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return WifiCommand::requestResponse(mMsg);
2144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
2154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint WifihalGeneric::handleResponse(WifiEvent &reply)
2174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
2183ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal    ALOGV("Got a Wi-Fi HAL module message from Driver");
2194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    int i = 0;
2204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    WifiVendorCommand::handleResponse(reply);
2214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    // Parse the vendordata and get the attribute
2234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    switch(mSubcmd)
2244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GET_SUPPORTED_FEATURES:
2264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            {
2274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                struct nlattr *tb_vendor[QCA_WLAN_VENDOR_ATTR_FEATURE_SET_MAX + 1];
2284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_FEATURE_SET_MAX,
2294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        (struct nlattr *)mVendorData,
2304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        mDataLen, NULL);
2314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_FEATURE_SET])
2334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                {
2344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    ALOGE("%s: QCA_WLAN_VENDOR_ATTR_FEATURE_SET not found", __func__);
2354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    return WIFI_ERROR_INVALID_ARGS;
2364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                }
2374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                mSet = nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_FEATURE_SET]);
2383ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal                ALOGV("Supported feature set : %x", mSet);
2394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                break;
2414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            }
2424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        case QCA_NL80211_VENDOR_SUBCMD_GET_CONCURRENCY_MATRIX:
2434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            {
2444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                struct nlattr *tb_vendor[
2454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_MAX + 1];
2464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                nla_parse(tb_vendor,
2474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_MAX,
2484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    (struct nlattr *)mVendorData,mDataLen, NULL);
2494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                if (tb_vendor[
2514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_RESULTS_SET_SIZE]) {
2524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    u32 val;
2534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    val = nla_get_u32(
2544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        tb_vendor[
2554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_RESULTS_SET_SIZE]);
2564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
257b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal                    ALOGV("%s: Num of concurrency combinations: %d",
2584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        __func__, val);
2594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    val = val > (unsigned int)mSetSizeMax ?
2604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                          (unsigned int)mSetSizeMax : val;
2614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    *mSetSizePtr = val;
2624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    /* Extract the list of channels. */
2644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    if (*mSetSizePtr > 0 &&
2654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        tb_vendor[
2664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_RESULTS_SET]) {
2674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        nla_memcpy(mConcurrencySet,
2684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                            tb_vendor[
2694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        QCA_WLAN_VENDOR_ATTR_GET_CONCURRENCY_MATRIX_RESULTS_SET],
2704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                            sizeof(feature_set) * (*mSetSizePtr));
2714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    }
2724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
273b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal                    ALOGV("%s: Get concurrency matrix response received.",
2744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        __func__);
275b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal                    ALOGV("%s: Num of concurrency combinations : %d",
2764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        __func__, *mSetSizePtr);
277b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal                    ALOGV("%s: List of valid concurrency combinations is: ",
2784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                        __func__);
2794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    for(i = 0; i < *mSetSizePtr; i++)
2804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    {
281b5841f6c19ec690b1fb032a0aee63d5300b19ce4mukesh agrawal                        ALOGV("%x", *(mConcurrencySet + i));
2824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                    }
2834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam                }
2844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            }
2854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            break;
286cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik        case QCA_NL80211_VENDOR_SUBCMD_PACKET_FILTER:
287cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            {
288cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                struct nlattr *tb_vendor[
289cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                        QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_MAX + 1];
290cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_MAX,
291cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                        (struct nlattr *)mVendorData,
292cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                        mDataLen, NULL);
293cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
294cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_VERSION])
295cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                {
296cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    ALOGE("%s: QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_VERSION"
297cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                          " not found", __FUNCTION__);
298cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    return WIFI_ERROR_INVALID_ARGS;
299cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                }
300cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                filterVersion = nla_get_u32(
301cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                       tb_vendor[QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_VERSION]);
3023ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal                ALOGV("Current version : %u", filterVersion);
303cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
304cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_TOTAL_LENGTH])
305cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                {
306cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    ALOGE("%s: QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_TOTAL_LENGTH"
307cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                          " not found", __FUNCTION__);
308cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    return WIFI_ERROR_INVALID_ARGS;
309cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                }
310cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                filterLength = nla_get_u32(
311cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    tb_vendor[QCA_WLAN_VENDOR_ATTR_PACKET_FILTER_TOTAL_LENGTH]);
3123ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal                ALOGV("Max filter length Supported : %u", filterLength);
313cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
314cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            }
315cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            break;
316cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik        case QCA_NL80211_VENDOR_SUBCMD_GET_BUS_SIZE:
317cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            {
318cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                struct nlattr *tb_vendor[
319317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                        QCA_WLAN_VENDOR_ATTR_DRV_INFO_MAX + 1];
320317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_DRV_INFO_MAX,
321317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                          (struct nlattr *)mVendorData, mDataLen, NULL);
322cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
323317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_DRV_INFO_BUS_SIZE])
324cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                {
325317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                    ALOGE("%s: QCA_WLAN_VENDOR_ATTR_DRV_INFO_BUS_SIZE"
326cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                          " not found", __FUNCTION__);
327cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                    return WIFI_ERROR_INVALID_ARGS;
328cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                }
329cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik                firmware_bus_max_size = nla_get_u32(
330317a2d088dc6d75d0db6819a022bcb6b9f01811cSubhani Shaik                       tb_vendor[QCA_WLAN_VENDOR_ATTR_DRV_INFO_BUS_SIZE]);
3313ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal                ALOGV("Max BUS size Supported: %d", firmware_bus_max_size);
332cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            }
333cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik            break;
3344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        default :
3354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam            ALOGE("%s: Wrong Wi-Fi HAL event received %d", __func__, mSubcmd);
3364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
3374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    return NL_SKIP;
3384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
3394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
3404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid WifihalGeneric::getResponseparams(feature_set *pset)
3414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{
3424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    *pset = mSet;
3434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
3444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
3454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid WifihalGeneric::setMaxSetSize(int set_size_max) {
3464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSetSizeMax = set_size_max;
3474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
3484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
3494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid WifihalGeneric::setConcurrencySet(feature_set set[]) {
3504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mConcurrencySet = set;
3514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
3524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
3534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid WifihalGeneric::setSizePtr(int *set_size) {
3544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    mSetSizePtr = set_size;
3554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam}
356cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
357cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaikint WifihalGeneric::getFilterVersion() {
358cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    return filterVersion;
359cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik}
360cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
361cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaikint WifihalGeneric::getFilterLength() {
362cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    return filterLength;
363cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik}
364cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik
365cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaikint WifihalGeneric::getBusSize() {
366cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik    return firmware_bus_max_size;
367cdbde22981846f02ce30a940b22a3f3c44ebba0dSubhani Shaik}
368