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