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