| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * Changes from Qualcomm Innovation Center are provided under the following license: |
| * |
| * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted (subject to the limitations in the |
| * disclaimer below) 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 Qualcomm Innovation Center, Inc. nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE |
| * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT |
| * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| * IN NO EVENT SHALL THE COPYRIGHT HOLDER 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 __WIFI_HAL_NAN_COMMAND_H__ |
| #define __WIFI_HAL_NAN_COMMAND_H__ |
| |
| #include "common.h" |
| #include "cpp_bindings.h" |
| #include "wifi_hal.h" |
| #include "nan_cert.h" |
| |
| /* |
| * NAN Salt is a concatenation of salt_version, CSID, Service ID, PeerMac |
| * resulting in a total length of 14 bytes |
| */ |
| #define NAN_SECURITY_SALT_SIZE 14 |
| /* In Service ID calculation SHA-256 hash size is of max. 64 bytes */ |
| #define NAN_SVC_HASH_SIZE 64 |
| /* Service ID is the first 48 bits of the SHA-256 hash of the Service Name */ |
| #define NAN_SVC_ID_SIZE 6 |
| /* Default Service name length is 21 bytes */ |
| #define NAN_DEF_SVC_NAME_LEN 21 |
| /* As per NAN spec, 4096 iterations to be used for PMK calculation */ |
| #define NAN_PMK_ITERATIONS 4096 |
| /* Keep NCS-SK-128 Cipher Suite as default i.e. HMAC-SHA-256 algorithm */ |
| #define NAN_DEFAULT_NCS_SK NAN_CIPHER_SUITE_SHARED_KEY_128_MASK |
| /* Currently by default max 6 Publishes/Subscribes are allowed */ |
| #define NAN_DEF_PUB_SUB 6 |
| /* |
| * First bit of discovery_indication_cfg in NanEnableRequest indicates |
| * disableDiscoveryAddressChangeIndication |
| */ |
| #define NAN_DISC_ADDR_IND_DISABLED 0x01 |
| |
| typedef struct PACKED |
| { |
| u32 instance_id; |
| u16 subscriber_publisher_id; |
| u8 service_id[NAN_SVC_ID_SIZE]; |
| } NanStoreSvcParams; |
| |
| typedef enum |
| { |
| NAN_ROLE_NONE, |
| NAN_ROLE_PUBLISHER, |
| NAN_ROLE_SUBSCRIBER |
| } NanRole; |
| |
| class NanCommand : public WifiVendorCommand |
| { |
| private: |
| NanCallbackHandler mHandler; |
| char *mNanVendorEvent; |
| u32 mNanDataLen; |
| NanStaParameter *mStaParam; |
| u8 mNmiMac[NAN_MAC_ADDR_LEN]; |
| u32 mNanMaxPublishes; |
| u32 mNanMaxSubscribes; |
| NanStoreSvcParams *mStorePubParams; |
| NanStoreSvcParams *mStoreSubParams; |
| bool mNanDiscAddrIndDisabled; |
| |
| //Function to check the initial few bytes of data to |
| //determine whether NanResponse or NanEvent |
| int isNanResponse(); |
| //Function which unparses the data and calls the NotifyResponse |
| int handleNanResponse(); |
| //Function which will parse the mVendorData and gets |
| // the rsp_data appropriately. |
| int getNanResponse(transaction_id *id, NanResponseMsg *pRsp); |
| //Function which will return the Nan Indication type based on |
| //the initial few bytes of mVendorData |
| NanIndicationType getIndicationType(); |
| //Function which calls the necessaryIndication callback |
| //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); |
| int getNanSubscribeTerminated(NanSubscribeTerminatedInd *event); |
| int getNanFollowup(NanFollowupInd *event); |
| int getNanDiscEngEvent(NanDiscEngEventInd *event); |
| int getNanDisabled(NanDisabledInd *event); |
| int getNanTca(NanTCAInd *event); |
| int getNanBeaconSdfPayload(NanBeaconSdfPayloadInd *event); |
| //Internal cleanup function |
| void cleanup(); |
| |
| static NanCommand *mNanCommandInstance; |
| |
| // Other private helper functions |
| int calcNanTransmitPostDiscoverySize( |
| const NanTransmitPostDiscovery *pPostDiscovery); |
| void fillNanSocialChannelParamVal( |
| const NanSocialChannelScanParams *pScanParams, |
| u32* pChannelParamArr); |
| u32 getNanTransmitPostConnectivityCapabilityVal( |
| const NanTransmitPostConnectivityCapability *pCapab); |
| void fillNanTransmitPostDiscoveryVal( |
| const NanTransmitPostDiscovery *pTxDisc, |
| u8 *pOutValue); |
| int calcNanFurtherAvailabilityMapSize( |
| const NanFurtherAvailabilityMap *pFam); |
| void fillNanFurtherAvailabilityMapVal( |
| const NanFurtherAvailabilityMap *pFam, |
| u8 *pOutValue); |
| |
| void getNanReceivePostConnectivityCapabilityVal( |
| const u8* pInValue, |
| NanReceivePostConnectivityCapability *pRxCapab); |
| void getNanReceiveSdeaCtrlParams(const u8* pInValue, |
| NanSdeaCtrlParams *pPeerSdeaParams); |
| int getNanReceivePostDiscoveryVal(const u8 *pInValue, |
| u32 length, |
| NanReceivePostDiscovery *pRxDisc); |
| int getNanFurtherAvailabilityMap(const u8 *pInValue, |
| u32 length, |
| u8* num_chans, |
| NanFurtherAvailabilityChannel *pFac); |
| void handleNanStatsResponse(NanStatsType stats_type, |
| char* rspBuf, |
| NanStatsResponse *pRsp, |
| u32 message_len); |
| |
| //Function which unparses the data and calls the NotifyResponse |
| int handleNdpResponse(NanResponseType ndpCmdtyp, struct nlattr **tb_vendor); |
| int handleNdpIndication(u32 ndpCmdType, struct nlattr **tb_vendor); |
| int getNdpRequest(struct nlattr **tb_vendor, NanDataPathRequestInd *event); |
| int getNdpConfirm(struct nlattr **tb_vendor, NanDataPathConfirmInd *event); |
| int getNdpEnd(struct nlattr **tb_vendor, NanDataPathEndInd *event); |
| int getNanTransmitFollowupInd(NanTransmitFollowupInd *event); |
| int getNanRangeRequestReceivedInd(NanRangeRequestInd *event); |
| int getNanRangeReportInd(NanRangeReportInd *event); |
| int getNdpScheduleUpdate(struct nlattr **tb_vendor, NanDataPathScheduleUpdateInd *event); |
| public: |
| NanCommand(wifi_handle handle, int id, u32 vendor_id, u32 subcmd); |
| static NanCommand* instance(wifi_handle handle); |
| virtual ~NanCommand(); |
| |
| // This function implements creation of NAN specific Request |
| // based on the request type |
| virtual wifi_error create(); |
| virtual wifi_error requestEvent(); |
| virtual int handleResponse(WifiEvent &reply); |
| virtual int handleEvent(WifiEvent &event); |
| wifi_error setCallbackHandler(NanCallbackHandler nHandler); |
| |
| |
| //Functions to fill the vendor data appropriately |
| wifi_error putNanEnable(transaction_id id, const NanEnableRequest *pReq); |
| wifi_error putNanDisable(transaction_id id); |
| wifi_error putNanPublish(transaction_id id, const NanPublishRequest *pReq); |
| wifi_error putNanPublishCancel(transaction_id id, const NanPublishCancelRequest *pReq); |
| wifi_error putNanSubscribe(transaction_id id, const NanSubscribeRequest *pReq); |
| wifi_error putNanSubscribeCancel(transaction_id id, const NanSubscribeCancelRequest *pReq); |
| wifi_error putNanTransmitFollowup(transaction_id id, const NanTransmitFollowupRequest *pReq); |
| wifi_error putNanStats(transaction_id id, const NanStatsRequest *pReq); |
| wifi_error putNanConfig(transaction_id id, const NanConfigRequest *pReq); |
| wifi_error putNanTCA(transaction_id id, const NanTCARequest *pReq); |
| wifi_error putNanBeaconSdfPayload(transaction_id id, const NanBeaconSdfPayloadRequest *pReq); |
| wifi_error getNanStaParameter(wifi_interface_handle iface, NanStaParameter *pRsp); |
| wifi_error putNanCapabilities(transaction_id id); |
| wifi_error putNanDebugCommand(NanDebugParams debug, int debug_msg_length); |
| |
| /* Functions for NAN error translation |
| For NanResponse, NanPublishTerminatedInd, NanSubscribeTerminatedInd, |
| NanDisabledInd, NanTransmitFollowupInd: |
| function to translate firmware specific errors |
| to generic freamework error along with the error string |
| */ |
| void NanErrorTranslation(NanInternalStatusType firmwareErrorRecvd, |
| u32 valueRcvd, |
| void *pRsp, |
| bool is_ndp_rsp); |
| |
| /* Functions for NAN passphrase to PMK calculation */ |
| void saveNmi(u8 *mac); |
| u8 *getNmi(); |
| void saveServiceId(u8 *service_id, u16 sub_pub_handle, |
| u32 instance_id, NanRole Pool); |
| u8 *getServiceId(u32 instance_id, NanRole Pool); |
| void deleteServiceId(u16 sub_handle, u32 instance_id, NanRole pool); |
| void allocSvcParams(); |
| void reallocSvcParams(NanRole pool); |
| void deallocSvcParams(); |
| }; |
| #endif /* __WIFI_HAL_NAN_COMMAND_H__ */ |
| |