diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2016-10-18 22:36:15 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-10-18 22:36:15 -0700 |
commit | aef8552963028f5140f5c5b9093b6db964ce4f80 (patch) | |
tree | 54dbdf4282186abbe033acb73dda5f33ffc830f2 | |
parent | 2fb339eb7162730efcbe776315e2c3a6074a1706 (diff) | |
parent | 63527eeeb96fa492e8d1fd922e8a6de86ed7e9ca (diff) | |
download | android_hardware_qcom_wlan-aef8552963028f5140f5c5b9093b6db964ce4f80.tar.gz android_hardware_qcom_wlan-aef8552963028f5140f5c5b9093b6db964ce4f80.tar.bz2 android_hardware_qcom_wlan-aef8552963028f5140f5c5b9093b6db964ce4f80.zip |
Merge "Wifi-Hal: Changes related to NAN 1.0 for certification" into wlan-aosp.lnx.2.0-dev
-rw-r--r-- | qcwcn/wifi_hal/nan.cpp | 13 | ||||
-rw-r--r-- | qcwcn/wifi_hal/nan_cert.h | 64 | ||||
-rw-r--r-- | qcwcn/wifi_hal/nan_i.h | 42 | ||||
-rw-r--r-- | qcwcn/wifi_hal/nan_ind.cpp | 62 | ||||
-rw-r--r-- | qcwcn/wifi_hal/nancommand.h | 2 |
5 files changed, 154 insertions, 29 deletions
diff --git a/qcwcn/wifi_hal/nan.cpp b/qcwcn/wifi_hal/nan.cpp index 8498be4..740c392 100644 --- a/qcwcn/wifi_hal/nan.cpp +++ b/qcwcn/wifi_hal/nan.cpp @@ -23,6 +23,7 @@ #include <utils/Log.h> #include "nancommand.h" #include "vendor_definitions.h" + #ifdef __GNUC__ #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) #define STRUCT_PACKED __attribute__ ((packed)) @@ -51,8 +52,6 @@ wifi_error nan_register_handler(wifi_interface_handle iface, ret = nanCommand->setCallbackHandler(handlers); return (wifi_error)ret; - - return (wifi_error)ret; } wifi_error nan_get_version(wifi_handle handle, @@ -1001,19 +1000,19 @@ int NanCommand::setCallbackHandler(NanCallbackHandler nHandler) { int res = WIFI_SUCCESS; mHandler = nHandler; - res = registerVendorHandler(mVendor_id, mSubcmd); + res = registerVendorHandler(mVendor_id, QCA_NL80211_VENDOR_SUBCMD_NAN); if (res != 0) { //error case should not happen print log - ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=%u", - __FUNCTION__, mVendor_id, mSubcmd); + ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x" + " subcmd=QCA_NL80211_VENDOR_SUBCMD_NAN", __FUNCTION__, mVendor_id); return res; } res = registerVendorHandler(mVendor_id, QCA_NL80211_VENDOR_SUBCMD_NDP); if (res != 0) { //error case should not happen print log - ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=QCA_NL80211_VENDOR_SUBCMD_NDP", - __FUNCTION__, mVendor_id); + ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x" + " subcmd=QCA_NL80211_VENDOR_SUBCMD_NDP", __FUNCTION__, mVendor_id); return res; } return res; diff --git a/qcwcn/wifi_hal/nan_cert.h b/qcwcn/wifi_hal/nan_cert.h new file mode 100644 index 0000000..5707fc3 --- /dev/null +++ b/qcwcn/wifi_hal/nan_cert.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __NAN_CERT_H__ +#define __NAN_CERT_H__ + + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +typedef struct { + /* NAN master rank being advertised by DE */ + u64 master_rank; + /* NAN master preference being advertised by DE */ + u8 master_pref; + /* random value being advertised by DE */ + u8 random_factor; + /* hop_count from anchor master */ + u8 hop_count; + u32 beacon_transmit_time; +} NanStaParameter; + + +/* + Function to get the sta_parameter expected by Sigma + as per CAPI spec. +*/ +wifi_error nan_get_sta_parameter(transaction_id id, + wifi_interface_handle iface, + NanStaParameter* msg); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* __NAN_CERT_H__ */ + diff --git a/qcwcn/wifi_hal/nan_i.h b/qcwcn/wifi_hal/nan_i.h index 64089cb..e6a6721 100644 --- a/qcwcn/wifi_hal/nan_i.h +++ b/qcwcn/wifi_hal/nan_i.h @@ -350,6 +350,27 @@ typedef struct PACKED u16 value; } NanPublishServiceCancelRspMsg, *pNanPublishServiceCancelRspMsg; +/* Params for NAN Publish Replied Ind */ +typedef struct PACKED +{ + u32 matchHandle; +} NanPublishRepliedIndParams; + +/* NAN Publish Replied Ind */ +typedef struct PACKED +{ + NanMsgHeader fwHeader; + NanPublishRepliedIndParams publishRepliedIndParams; + /* + * Excludes TLVs + * + * Required: MAC Address + * Optional: Received RSSI Value + * + */ + u8 ptlv[]; +} NanPublishRepliedIndMsg, *pNanPublishRepliedIndMsg; + /* NAN Publish Terminated Ind */ typedef struct PACKED { @@ -916,6 +937,7 @@ typedef struct PACKED Definition of various NanIndication(events) */ typedef enum { + NAN_INDICATION_PUBLISH_REPLIED =0, NAN_INDICATION_PUBLISH_TERMINATED =1, NAN_INDICATION_MATCH =2, NAN_INDICATION_MATCH_EXPIRED =3, @@ -929,18 +951,6 @@ typedef enum { NAN_INDICATION_UNKNOWN =0xFFFF } NanIndicationType; -typedef struct { - /* NAN master rank being advertised by DE */ - u64 master_rank; - /* NAN master preference being advertised by DE */ - u8 master_pref; - /* random value being advertised by DE */ - u8 random_factor; - /* hop_count from anchor master */ - u8 hop_count; - u32 beacon_transmit_time; -} NanStaParameter; - /* NAN Capabilities Req */ typedef struct PACKED { @@ -976,14 +986,6 @@ typedef struct PACKED u32 reason; } NanSelfTransmitFollowupIndMsg, *pNanSelfTransmitFollowupIndMsg; -/* - Function to get the sta_parameter expected by Sigma - as per CAPI spec. -*/ -wifi_error nan_get_sta_parameter(wifi_request_id id, - wifi_interface_handle iface, - NanStaParameter* msg); - #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/qcwcn/wifi_hal/nan_ind.cpp b/qcwcn/wifi_hal/nan_ind.cpp index c9bb00b..3508585 100644 --- a/qcwcn/wifi_hal/nan_ind.cpp +++ b/qcwcn/wifi_hal/nan_ind.cpp @@ -35,6 +35,15 @@ int NanCommand::handleNanIndication() ALOGV("handleNanIndication msg_id:%u", msg_id); switch (msg_id) { + case NAN_INDICATION_PUBLISH_REPLIED: + NanPublishRepliedInd publishRepliedInd; + memset(&publishRepliedInd, 0, sizeof(publishRepliedInd)); + res = getNanPublishReplied(&publishRepliedInd); + if (!res && mHandler.EventPublishReplied) { + (*mHandler.EventPublishReplied)(&publishRepliedInd); + } + break; + case NAN_INDICATION_PUBLISH_TERMINATED: NanPublishTerminatedInd publishTerminatedInd; memset(&publishTerminatedInd, 0, sizeof(publishTerminatedInd)); @@ -147,7 +156,7 @@ NanIndicationType NanCommand::getIndicationType() switch (pHeader->msgId) { case NAN_MSG_ID_PUBLISH_REPLIED_IND: - return NAN_INDICATION_UNKNOWN; + return NAN_INDICATION_PUBLISH_REPLIED; case NAN_MSG_ID_PUBLISH_TERMINATED_IND: return NAN_INDICATION_PUBLISH_TERMINATED; case NAN_MSG_ID_MATCH_IND: @@ -173,6 +182,55 @@ NanIndicationType NanCommand::getIndicationType() } } +int NanCommand::getNanPublishReplied(NanPublishRepliedInd *event) +{ + if (event == NULL || mNanVendorEvent == NULL) { + ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p", + __func__, event, mNanVendorEvent); + return WIFI_ERROR_INVALID_ARGS; + } + + pNanPublishRepliedIndMsg pRsp = (pNanPublishRepliedIndMsg)mNanVendorEvent; + event->requestor_instance_id = pRsp->publishRepliedIndParams.matchHandle; + + event->rssi_value = 0; + u8 *pInputTlv = pRsp->ptlv; + NanTlv outputTlv; + u16 readLen = 0; + int remainingLen = (mNanDataLen - \ + (sizeof(NanMsgHeader))); + + if (remainingLen <= 0) { + ALOGI("%s: No TLV's present",__func__); + return WIFI_SUCCESS; + } + while ((remainingLen > 0) && + (0 != (readLen = NANTLV_ReadTlv(pInputTlv, &outputTlv)))) { + switch (outputTlv.type) { + case NAN_TLV_TYPE_MAC_ADDRESS: + if (outputTlv.length > sizeof(event->addr)) { + outputTlv.length = sizeof(event->addr); + } + memcpy(event->addr, outputTlv.value, outputTlv.length); + break; + case NAN_TLV_TYPE_RECEIVED_RSSI_VALUE: + if (outputTlv.length > sizeof(event->rssi_value)) { + outputTlv.length = sizeof(event->rssi_value); + } + memcpy(&event->rssi_value, outputTlv.value, + outputTlv.length); + break; + default: + ALOGI("Unknown TLV type skipped"); + break; + } + remainingLen -= readLen; + pInputTlv += readLen; + memset(&outputTlv, 0, sizeof(outputTlv)); + } + return WIFI_SUCCESS; +} + int NanCommand::getNanPublishTerminated(NanPublishTerminatedInd *event) { if (event == NULL || mNanVendorEvent == NULL) { @@ -743,7 +801,7 @@ int NanCommand::getNanStaParameter(wifi_interface_handle iface, { int ret = WIFI_ERROR_NONE; int res = -1; - int id = 1; + transaction_id id = 1; NanCommand *nanCommand = NULL; interface_info *ifaceInfo = getIfaceInfo(iface); wifi_handle wifiHandle = getWifiHandle(iface); diff --git a/qcwcn/wifi_hal/nancommand.h b/qcwcn/wifi_hal/nancommand.h index b546dca..20fbc9d 100644 --- a/qcwcn/wifi_hal/nancommand.h +++ b/qcwcn/wifi_hal/nancommand.h @@ -22,6 +22,7 @@ #include "wifi_hal.h" #include "qca-vendor.h" #include "vendor_definitions.h" +#include "nan_cert.h" class NanCommand : public WifiVendorCommand { @@ -46,6 +47,7 @@ private: //based on the indication type int handleNanIndication(); //Various Functions to get the appropriate indications + int getNanPublishReplied(NanPublishRepliedInd *event); int getNanPublishTerminated(NanPublishTerminatedInd *event); int getNanMatch(NanMatchInd *event); int getNanMatchExpired(NanMatchExpiredInd *event); |