14af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam/* 24af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project 34af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * 44af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License"); 54af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * you may not use this file except in compliance with the License. 64af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * You may obtain a copy of the License at 74af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * 84af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * http://www.apache.org/licenses/LICENSE-2.0 94af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * 104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software 114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS, 124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * See the License for the specific language governing permissions and 144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam * limitations under the License. 154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam */ 164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "sync.h" 184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include <utils/Log.h> 1935be86a67db4ed82216c5c6e421ad2a1e386aea5Ahmad Kholaif#include <errno.h> 204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "wifi_hal.h" 214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "nan_i.h" 224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam#include "nancommand.h" 23a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik#include "qca-vendor.h" 24e6f73e2bd528d19dfc6910100f8e5ed82fe905dbVinit Deshpande#include <errno.h> 254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam//Function which calls the necessaryIndication callback 274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam//based on the indication type 284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::handleNanIndication() 294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Based on the message_id in the header determine the Indication type 314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //and call the necessary callback handler 324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 msg_id; 334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int res = 0; 344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam msg_id = getIndicationType(); 364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 373ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("handleNanIndication msg_id:%u", msg_id); 384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (msg_id) { 394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_PUBLISH_TERMINATED: 404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanPublishTerminatedInd publishTerminatedInd; 414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&publishTerminatedInd, 0, sizeof(publishTerminatedInd)); 424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanPublishTerminated(&publishTerminatedInd); 434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventPublishTerminated) { 44a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventPublishTerminated)(&publishTerminatedInd); 454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_MATCH: 494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanMatchInd matchInd; 504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&matchInd, 0, sizeof(matchInd)); 514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanMatch(&matchInd); 524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventMatch) { 53a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventMatch)(&matchInd); 544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5717ee741489e21713642ac29853da176bbd5c4698Subhani Shaik case NAN_INDICATION_MATCH_EXPIRED: 5817ee741489e21713642ac29853da176bbd5c4698Subhani Shaik NanMatchExpiredInd matchExpiredInd; 5917ee741489e21713642ac29853da176bbd5c4698Subhani Shaik memset(&matchExpiredInd, 0, sizeof(matchExpiredInd)); 6017ee741489e21713642ac29853da176bbd5c4698Subhani Shaik res = getNanMatchExpired(&matchExpiredInd); 6117ee741489e21713642ac29853da176bbd5c4698Subhani Shaik if (!res && mHandler.EventMatchExpired) { 6217ee741489e21713642ac29853da176bbd5c4698Subhani Shaik (*mHandler.EventMatchExpired)(&matchExpiredInd); 634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_SUBSCRIBE_TERMINATED: 674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanSubscribeTerminatedInd subscribeTerminatedInd; 684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&subscribeTerminatedInd, 0, sizeof(subscribeTerminatedInd)); 694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanSubscribeTerminated(&subscribeTerminatedInd); 704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventSubscribeTerminated) { 71a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventSubscribeTerminated)(&subscribeTerminatedInd); 724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_DE_EVENT: 764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanDiscEngEventInd discEngEventInd; 774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&discEngEventInd, 0, sizeof(discEngEventInd)); 784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanDiscEngEvent(&discEngEventInd); 794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventDiscEngEvent) { 80a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventDiscEngEvent)(&discEngEventInd); 814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_FOLLOWUP: 854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanFollowupInd followupInd; 864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&followupInd, 0, sizeof(followupInd)); 874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanFollowup(&followupInd); 884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventFollowup) { 89a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventFollowup)(&followupInd); 904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_DISABLED: 944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanDisabledInd disabledInd; 954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&disabledInd, 0, sizeof(disabledInd)); 964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanDisabled(&disabledInd); 974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventDisabled) { 98a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventDisabled)(&disabledInd); 994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 1014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_TCA: 1034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTCAInd tcaInd; 1044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&tcaInd, 0, sizeof(tcaInd)); 1054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanTca(&tcaInd); 1064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (!res && mHandler.EventTca) { 107a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventTca)(&tcaInd); 1084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 1104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_INDICATION_BEACON_SDF_PAYLOAD: 1124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanBeaconSdfPayloadInd beaconSdfPayloadInd; 1134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&beaconSdfPayloadInd, 0, sizeof(beaconSdfPayloadInd)); 1144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = getNanBeaconSdfPayload(&beaconSdfPayloadInd); 115a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (!res && mHandler.EventBeaconSdfPayload) { 116a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*mHandler.EventBeaconSdfPayload)(&beaconSdfPayloadInd); 1174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 1194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 1214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("handleNanIndication error invalid msg_id:%u", msg_id); 1224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = (int)WIFI_ERROR_INVALID_REQUEST_ID; 1234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 1244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return res; 1264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 1274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam//Function which will return the Nan Indication type based on 1294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam//the initial few bytes of mNanVendorEvent 1304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur SubramanyamNanIndicationType NanCommand::getIndicationType() 1314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 1324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (mNanVendorEvent == NULL) { 1334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid argument mNanVendorEvent:%p", 1344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, mNanVendorEvent); 1354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_UNKNOWN; 1364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanMsgHeader *pHeader = (NanMsgHeader *)mNanVendorEvent; 1394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (pHeader->msgId) { 1414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_PUBLISH_REPLIED_IND: 142a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik return NAN_INDICATION_UNKNOWN; 1434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_PUBLISH_TERMINATED_IND: 1444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_PUBLISH_TERMINATED; 1454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_MATCH_IND: 1464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_MATCH; 14717ee741489e21713642ac29853da176bbd5c4698Subhani Shaik case NAN_MSG_ID_MATCH_EXPIRED_IND: 14817ee741489e21713642ac29853da176bbd5c4698Subhani Shaik return NAN_INDICATION_MATCH_EXPIRED; 1494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_FOLLOWUP_IND: 1504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_FOLLOWUP; 1514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_SUBSCRIBE_TERMINATED_IND: 1524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_SUBSCRIBE_TERMINATED; 1534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_DE_EVENT_IND: 1544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_DE_EVENT; 1554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_DISABLE_IND: 1564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_DISABLED; 1574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_TCA_IND: 1584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_TCA; 1594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_MSG_ID_BEACON_SDF_IND: 1604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_BEACON_SDF_PAYLOAD; 1614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 1624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return NAN_INDICATION_UNKNOWN; 1634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 1654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanPublishTerminated(NanPublishTerminatedInd *event) 1674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 1684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 1694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 1704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 1714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanPublishTerminatedIndMsg pRsp = (pNanPublishTerminatedIndMsg)mNanVendorEvent; 175a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->publish_id = pRsp->fwHeader.handle; 176a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->reason = (NanStatusType)pRsp->reason; 1774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 1784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 1794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanMatch(NanMatchInd *event) 1814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 1824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 1834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 1844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 1854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 1864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 1874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanMatchIndMsg pRsp = (pNanMatchIndMsg)mNanVendorEvent; 189a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->publish_subscribe_id = pRsp->fwHeader.handle; 190a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->requestor_instance_id = pRsp->matchIndParams.matchHandle; 1914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->match_occured_flag = pRsp->matchIndParams.matchOccuredFlag; 1924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->out_of_resource_flag = pRsp->matchIndParams.outOfResourceFlag; 1934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 1944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = pRsp->ptlv; 1954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 1964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 1974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (mNanDataLen - \ 1984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (sizeof(NanMsgHeader) + sizeof(NanMatchIndParams))); 199a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik int ret = 0, idx = 0; 2004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 2014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has SDF match filter and service specific info TLV 2024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 2033ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: No TLV's present",__func__); 2044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 2054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2063ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 2074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 2084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 2093ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 2104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 2114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 2124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (outputTlv.type) { 2134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_SERVICE_SPECIFIC_INFO: 2144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > NAN_MAX_SERVICE_NAME_LEN) { 2154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = NAN_MAX_SERVICE_NAME_LEN; 2164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->service_specific_info_len = outputTlv.length; 2184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->service_specific_info, outputTlv.value, 2194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 2204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_SDF_MATCH_FILTER: 2224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > NAN_MAX_MATCH_FILTER_LEN) { 2234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = NAN_MAX_MATCH_FILTER_LEN; 2244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->sdf_match_filter_len = outputTlv.length; 2264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->sdf_match_filter, outputTlv.value, 2274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 2284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_MAC_ADDRESS: 2304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(event->addr)) { 2314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(event->addr); 2324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->addr, outputTlv.value, outputTlv.length); 2344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_RECEIVED_RSSI_VALUE: 2364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(event->rssi_value)) { 2374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(event->rssi_value); 2384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(&event->rssi_value, outputTlv.value, 2404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 2414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_RECEIVE: 2434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length != sizeof(u32)) { 2444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("NAN_TLV_TYPE_POST_NAN_CONNECTIVITY_CAPABILITIES_RECEIVE" 2455c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik "Incorrect size:%d expecting %zu", outputTlv.length, 2464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam sizeof(u32)); 2474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->is_conn_capability_valid = 1; 2504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Populate conn_capability from received TLV */ 2514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam getNanReceivePostConnectivityCapabilityVal(outputTlv.value, 2524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam &event->conn_capability); 2534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE: 2554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Populate receive discovery attribute from 2564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam received TLV */ 257a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik idx = event->num_rx_discovery_attr; 2584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = getNanReceivePostDiscoveryVal(outputTlv.value, 259a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik outputTlv.length, 260a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik &event->discovery_attr[idx]); 2614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret == 0) { 262a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->num_rx_discovery_attr++; 2634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam else { 2654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE" 2664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam "Incorrect"); 2674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_FURTHER_AVAILABILITY_MAP: 2704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* Populate further availability bitmap from 2714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam received TLV */ 2724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = getNanFurtherAvailabilityMap(outputTlv.value, 2734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length, 274a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik &event->num_chans, 275a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik &event->famchan[0]); 276a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (ret < 0) 2774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("NAN_TLV_TYPE_FURTHER_AVAILABILITY_MAP" 2784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam "Incorrect"); 2794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 280a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_CLUSTER_ATTRIBUTE: 2814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(event->cluster_attribute)) { 2824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(event->cluster_attribute); 2834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->cluster_attribute, 2854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.value, outputTlv.length); 2864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->cluster_attribute_len = outputTlv.length; 2874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 2893ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unknown TLV type skipped"); 2904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 2914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 2934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 2944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv, 0, sizeof(outputTlv)); 2954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 2964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 2974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 2984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 29917ee741489e21713642ac29853da176bbd5c4698Subhani Shaikint NanCommand::getNanMatchExpired(NanMatchExpiredInd *event) 3004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 3014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 3024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 3034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 3044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 3054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 30717ee741489e21713642ac29853da176bbd5c4698Subhani Shaik pNanMatchExpiredIndMsg pRsp = (pNanMatchExpiredIndMsg)mNanVendorEvent; 308a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->publish_subscribe_id = pRsp->fwHeader.handle; 30917ee741489e21713642ac29853da176bbd5c4698Subhani Shaik event->requestor_instance_id = pRsp->matchExpiredIndParams.matchHandle; 3104af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 3114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 3124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3134af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanSubscribeTerminated(NanSubscribeTerminatedInd *event) 3144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 3154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 3164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 3174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 3184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 3194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanSubscribeTerminatedIndMsg pRsp = (pNanSubscribeTerminatedIndMsg)mNanVendorEvent; 322a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->subscribe_id = pRsp->fwHeader.handle; 323a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->reason = (NanStatusType)pRsp->reason; 3244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 3254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 3264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanFollowup(NanFollowupInd *event) 3284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 3294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 3304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 3314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 3324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 3334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanFollowupIndMsg pRsp = (pNanFollowupIndMsg)mNanVendorEvent; 336a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->publish_subscribe_id = pRsp->fwHeader.handle; 337a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->requestor_instance_id = pRsp->followupIndParams.matchHandle; 3384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->dw_or_faw = pRsp->followupIndParams.window; 3394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = pRsp->ptlv; 3414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 3424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 3434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (mNanDataLen - \ 3444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (sizeof(NanMsgHeader) + sizeof(NanFollowupIndParams))); 3454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has service specific info and extended service specific info TLV 3474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 3483ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: No TLV's present",__func__); 3494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 3504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3513ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 3524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 3534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 3543ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 3554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 3564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 3574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (outputTlv.type) { 3584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_SERVICE_SPECIFIC_INFO: 3594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_EXT_SERVICE_SPECIFIC_INFO: 3604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) { 3614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = NAN_MAX_SERVICE_SPECIFIC_INFO_LEN; 3624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->service_specific_info_len = outputTlv.length; 3644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->service_specific_info, outputTlv.value, 3654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 3664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 3674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_MAC_ADDRESS: 3684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(event->addr)) { 3694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(event->addr); 3704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->addr, outputTlv.value, outputTlv.length); 3724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 3734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 3743ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unknown TLV type skipped"); 3754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 3764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 3784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 3794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv, 0, sizeof(outputTlv)); 3804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 3824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 3834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanDiscEngEvent(NanDiscEngEventInd *event) 3854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 3864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 3874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 3884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 3894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 3904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 3914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanEventIndMsg pRsp = (pNanEventIndMsg)mNanVendorEvent; 3934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&event->data, 0, sizeof(event->data)); 3944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = pRsp->ptlv; 3964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 3974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 3984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (mNanDataLen - \ 3994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (sizeof(NanMsgHeader))); 4004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has Self-STA Mac TLV 4024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 403fc768f88a159e94f013a1bbbed5754245062f121mukesh agrawal ALOGE("%s: No TLV's present",__func__); 4044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 4054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4073ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 4084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 4094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 4103ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 4114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 4124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 413a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik switch (outputTlv.type) { 414a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_EVENT_SELF_STATION_MAC_ADDRESS: 4154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > NAN_MAC_ADDR_LEN) { 4163ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Reading only first %d bytes of TLV", 4174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, NAN_MAC_ADDR_LEN); 4184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = NAN_MAC_ADDR_LEN; 4194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->data.mac_addr.addr, outputTlv.value, 4214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 422a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->event_type = NAN_EVENT_ID_DISC_MAC_ADDR; 423a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik break; 424a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_EVENT_STARTED_CLUSTER: 425a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (outputTlv.length > NAN_MAC_ADDR_LEN) { 4263ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Reading only first %d bytes of TLV", 427a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik __func__, NAN_MAC_ADDR_LEN); 428a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik outputTlv.length = NAN_MAC_ADDR_LEN; 429a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik } 430a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik memcpy(event->data.cluster.addr, outputTlv.value, 431a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik outputTlv.length); 432a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->event_type = NAN_EVENT_ID_STARTED_CLUSTER; 4334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 434a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_EVENT_JOINED_CLUSTER: 4354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > NAN_MAC_ADDR_LEN) { 4363ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Reading only first %d bytes of TLV", 4374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, NAN_MAC_ADDR_LEN); 4384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = NAN_MAC_ADDR_LEN; 4394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->data.cluster.addr, outputTlv.value, 4414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 442a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->event_type = NAN_EVENT_ID_JOINED_CLUSTER; 4434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 4444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 4453ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unhandled TLV type:%d", outputTlv.type); 4464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 4474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 4494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 4504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv,0, sizeof(outputTlv)); 4514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 4534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 4544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanDisabled(NanDisabledInd *event) 4564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 4574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 4584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 4594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 4604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 4614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanDisableIndMsg pRsp = (pNanDisableIndMsg)mNanVendorEvent; 4644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->reason = (NanStatusType)pRsp->reason; 4654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 4664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 4684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanTca(NanTCAInd *event) 4704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 4714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 4724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 4734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 4744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 4754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanTcaIndMsg pRsp = (pNanTcaIndMsg)mNanVendorEvent; 4784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&event->data, 0, sizeof(event->data)); 4794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = pRsp->ptlv; 4814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 4824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 483a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik 4844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (mNanDataLen - \ 4854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (sizeof(NanMsgHeader))); 4864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has NAN_TCA_ID_CLUSTER_SIZE 4884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 489fc768f88a159e94f013a1bbbed5754245062f121mukesh agrawal ALOGE("%s: No TLV's present",__func__); 4904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 4914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 4924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 4933ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 4944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 4954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 4963ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 4974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 4984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 499a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik switch (outputTlv.type) { 500a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_CLUSTER_SIZE_RSP: 5014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length != 2 * sizeof(u32)) { 5025c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik ALOGE("%s: Wrong length %d in Tca Indication expecting %zu bytes", 5034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, outputTlv.length, 2 * sizeof(u32)); 5044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->rising_direction_evt_flag = outputTlv.value[0] & 0x01; 5074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->falling_direction_evt_flag = (outputTlv.value[0] & 0x02) >> 1; 5084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(&(event->data.cluster.cluster_size), &outputTlv.value[4], 5094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam sizeof(event->data.cluster.cluster_size)); 510a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->tca_type = NAN_TCA_ID_CLUSTER_SIZE; 5114af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5124af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 5133ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unhandled TLV type:%d", outputTlv.type); 5144af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 5174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 5184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv,0, sizeof(outputTlv)); 5194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 5214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 5224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanBeaconSdfPayload(NanBeaconSdfPayloadInd *event) 5244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 5254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (event == NULL || mNanVendorEvent == NULL) { 5264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", 5274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, event, mNanVendorEvent); 5284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_ERROR_INVALID_ARGS; 5294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanBeaconSdfPayloadIndMsg pRsp = (pNanBeaconSdfPayloadIndMsg)mNanVendorEvent; 5324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&event->data, 0, sizeof(event->data)); 5334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = pRsp->ptlv; 5354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 5364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 5374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (mNanDataLen - \ 5384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (sizeof(NanMsgHeader))); 5394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has Mac address 5414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 5423ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: No TLV's present",__func__); 5434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 5444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5463ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 5474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 5484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 5493ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 5504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 5514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 5524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (outputTlv.type) { 553a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_MAC_ADDRESS: 5544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(event->addr)) { 5554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(event->addr); 5564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(event->addr, outputTlv.value, 5584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 5594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_RECEIVE: 5624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam { 5634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanReceiveVendorSpecificAttribute* recvVsaattr = &event->vsa; 5644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length < sizeof(u32)) { 5654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("NAN_TLV_TYPE_VENDOR_SPECIFIC_ATTRIBUTE_RECEIVE" 5664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam "Incorrect length:%d", outputTlv.length); 5674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->is_vsa_received = 1; 5704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam recvVsaattr->vsa_received_on = (outputTlv.value[0] >> 1) & 0x07; 5714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(&recvVsaattr->vendor_oui, &outputTlv.value[1], 5724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 3); 5734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam recvVsaattr->attr_len = outputTlv.length - 4; 5744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (recvVsaattr->attr_len > NAN_MAX_VSA_DATA_LEN) { 5754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam recvVsaattr->attr_len = NAN_MAX_VSA_DATA_LEN; 5764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (recvVsaattr->attr_len) { 5784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(recvVsaattr->vsa, &outputTlv.value[4], 5794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam recvVsaattr->attr_len); 5804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_BEACON_SDF_PAYLOAD_RECEIVE: 5854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->is_beacon_sdf_payload_received = 1; 5864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->data.frame_len = outputTlv.length; 587a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (event->data.frame_len > NAN_MAX_FRAME_DATA_LEN) { 588a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik event->data.frame_len = NAN_MAX_FRAME_DATA_LEN; 5894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(&event->data.frame_data, &outputTlv.value[0], 5914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam event->data.frame_len); 5924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 5944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 5953ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unhandled TLV Type:%d", outputTlv.type); 5964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 5974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 5984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 5994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 6004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv,0, sizeof(outputTlv)); 6014af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6024af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return WIFI_SUCCESS; 6034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 6044af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamvoid NanCommand::getNanReceivePostConnectivityCapabilityVal( 6064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam const u8 *pInValue, 6074af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanReceivePostConnectivityCapability *pRxCapab) 6084af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 6094af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (pInValue && pRxCapab) { 6105c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->is_mesh_supported = (pInValue[0] & (0x01 << 5)); 6115c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->is_ibss_supported = (pInValue[0] & (0x01 << 4)); 6125c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->wlan_infra_field = (pInValue[0] & (0x01 << 3)); 6135c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->is_tdls_supported = (pInValue[0] & (0x01 << 2)); 6145c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->is_wfds_supported = (pInValue[0] & (0x01 << 1)); 6155c63f6a5f46ca95fe003bac5cfae2fc74a0b22a7Subhani Shaik pRxCapab->is_wfd_supported = pInValue[0] & 0x01; 6164af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 6184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanReceivePostDiscoveryVal(const u8 *pInValue, 6204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u32 length, 6214af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanReceivePostDiscovery *pRxDisc) 6224af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 6234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int ret = 0; 6244af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (length <= 8 || pInValue == NULL) { 6264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid Arg TLV Len %d < 4", 6274af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, length); 6284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return -1; 6294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->type = (NanConnectionType) pInValue[0]; 6324af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->role = (NanDeviceRole) pInValue[1]; 6334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->duration = (NanAvailDuration) (pInValue[2] & 0x03); 6344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->mapid = ((pInValue[2] >> 2) & 0x0F); 6354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(&pRxDisc->avail_interval_bitmap, 6364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam &pInValue[4], 6374af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam sizeof(pRxDisc->avail_interval_bitmap)); 6384af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6394af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u8 *pInputTlv = (u8 *)&pInValue[8]; 6404af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanTlv outputTlv; 6414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u16 readLen = 0; 6424af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int remainingLen = (length - 8); 6434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam //Has Mac address 6454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (remainingLen <= 0) { 6464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: No TLV's present",__func__); 6474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return -1; 6484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6503ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: TLV remaining Len:%d",__func__, remainingLen); 6514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam while ((remainingLen > 0) && 6524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { 6533ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: Remaining Len:%d readLen:%d type:%d length:%d", 6544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, remainingLen, readLen, outputTlv.type, 6554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 6564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam switch (outputTlv.type) { 6574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_MAC_ADDRESS: 6584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(pRxDisc->addr)) { 6594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(pRxDisc->addr); 6604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(pRxDisc->addr, outputTlv.value, outputTlv.length); 6624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 6634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam case NAN_TLV_TYPE_WLAN_MESH_ID: 6644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(pRxDisc->mesh_id)) { 6654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(pRxDisc->mesh_id); 6664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(pRxDisc->mesh_id, outputTlv.value, outputTlv.length); 6684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->mesh_id_len = outputTlv.length; 6694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 670a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik case NAN_TLV_TYPE_WLAN_INFRA_SSID: 6714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (outputTlv.length > sizeof(pRxDisc->infrastructure_ssid_val)) { 6724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length = sizeof(pRxDisc->infrastructure_ssid_val); 6734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memcpy(pRxDisc->infrastructure_ssid_val, outputTlv.value, 6754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam outputTlv.length); 6764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRxDisc->infrastructure_ssid_len = outputTlv.length; 6774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam default: 6783ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("Unhandled TLV Type:%d", outputTlv.type); 6794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam break; 6804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam remainingLen -= readLen; 6824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pInputTlv += readLen; 6834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&outputTlv,0, sizeof(outputTlv)); 6844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 6854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return ret; 6864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 6874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6884af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamint NanCommand::getNanFurtherAvailabilityMap(const u8 *pInValue, 6894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam u32 length, 690a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik u8 *num_chans, 691a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik NanFurtherAvailabilityChannel *pFac) 6924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 6934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int idx = 0; 6944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 6954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if ((length == 0) || pInValue == NULL) { 6964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Invalid Arg TLV Len %d or pInValue NULL", 6974af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam __func__, length); 6984af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return -1; 6994af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7004af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 701a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik *num_chans = pInValue[0]; 702a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (*num_chans > NAN_MAX_FAM_CHANNELS) { 7034af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Unable to accommodate numchans %d", 704a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik __func__, *num_chans); 7054af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return -1; 7064af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 707fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam 708fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam if (length < (sizeof(u8) + 709a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik (*num_chans * sizeof(NanFurtherAvailabilityChan)))) { 710fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam ALOGE("%s: Invalid TLV Length", __func__); 711fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam return -1; 712fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam } 713fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam 714a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik for (idx = 0; idx < *num_chans; idx++) { 7154af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pNanFurtherAvailabilityChan pRsp = \ 716fb575446df3ead3b792b7fdade97a27c98bc6eafAmarnath Hullur Subramanyam (pNanFurtherAvailabilityChan)((u8 *)&pInValue[1] + \ 7174af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (idx * sizeof(NanFurtherAvailabilityChan))); 7184af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 719a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik pFac->entry_control = \ 7204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam (NanAvailDuration)(pRsp->entryCtrl.availIntDuration); 721a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik pFac->mapid = pRsp->entryCtrl.mapId; 722a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik pFac->class_val = pRsp->opClass; 723a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik pFac->channel = pRsp->channel; 724a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik memcpy(&pFac->avail_interval_bitmap, 7254af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam &pRsp->availIntBitmap, 726a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik sizeof(pFac->avail_interval_bitmap)); 727a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik pFac++; 7284af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7294af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return 0; 7304af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 7314af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 732a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaikint NanCommand::getNanStaParameter(wifi_interface_handle iface, 733a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik NanStaParameter *pRsp) 7344af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam{ 7354af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int ret = WIFI_ERROR_NONE; 7364af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam int res = -1; 737a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik int id = 1; 738a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik NanCommand *nanCommand = NULL; 739a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik interface_info *ifaceInfo = getIfaceInfo(iface); 740a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik wifi_handle wifiHandle = getWifiHandle(iface); 741a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik 742a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik nanCommand = NanCommand::instance(wifiHandle); 743a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (nanCommand == NULL) { 744a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik ALOGE("%s: Error NanCommand NULL", __func__); 745a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik return WIFI_ERROR_UNKNOWN; 746a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik } 747a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik 748a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik ret = nanCommand->create(); 749a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (ret < 0) 750a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik goto cleanup; 751a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik 752a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik /* Set the interface Id of the message. */ 753a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik ret = nanCommand->set_iface_id(ifaceInfo->name); 754a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik if (ret < 0) 755a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik goto cleanup; 7564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 7574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam /* 7584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam Construct NL message to get the sync stats parameter 7594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam which has all the parameter required by staparameter. 7604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam */ 7614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam NanStatsRequest syncStats; 7624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam memset(&syncStats, 0, sizeof(syncStats)); 763a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik syncStats.stats_type = NAN_STATS_ID_DE_TIMING_SYNC; 7644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam syncStats.clear = 0; 7654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 7664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam mStaParam = pRsp; 767a3c2c8f1bfcddd50047c8ad29e535a54e99acf62Subhani Shaik ret = putNanStats(id, &syncStats); 7684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret != 0) { 7694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: putNanStats Error:%d",__func__, ret); 7704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 7714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = requestEvent(); 7734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (ret != 0) { 7744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: requestEvent Error:%d",__func__, ret); 7754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 7764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam 7784af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam struct timespec abstime; 7794af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam abstime.tv_sec = 4; 7804af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam abstime.tv_nsec = 0; 7814af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam res = mCondition.wait(abstime); 7824af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam if (res == ETIMEDOUT) 7834af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam { 7844af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ALOGE("%s: Time out happened.", __func__); 7854af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam ret = WIFI_ERROR_TIMED_OUT; 7864af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam goto cleanup; 7874af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam } 7883ff76888e8710c8d3d7153f3dbc1c9057effa183mukesh agrawal ALOGV("%s: NanStaparameter Master_pref:%x," \ 7894af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam " Random_factor:%x, hop_count:%x " \ 7904af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam " beacon_transmit_time:%d", __func__, 7914af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRsp->master_pref, pRsp->random_factor, 7924af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam pRsp->hop_count, pRsp->beacon_transmit_time); 7934af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyamcleanup: 7944af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam mStaParam = NULL; 7954af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam return (int)ret; 7964af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam} 797