diff options
author | Shawn Guo <shawn.guo@linaro.org> | 2021-09-12 18:36:36 +0200 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2021-09-12 23:31:29 +0200 |
commit | a211890cbe75b99f303ae61ad9291d0c6a1d47e5 (patch) | |
tree | 9480e9bc1622e7d77feed15139f464d4871db0b5 | |
parent | cecede6273504d02aefe8887e6b16cf415de1193 (diff) | |
download | hardware_replicant_wlan-a211890cbe75b99f303ae61ad9291d0c6a1d47e5.tar.gz hardware_replicant_wlan-a211890cbe75b99f303ae61ad9291d0c6a1d47e5.tar.bz2 hardware_replicant_wlan-a211890cbe75b99f303ae61ad9291d0c6a1d47e5.zip |
Remove Wi-Fi Aware / Neighbor Awareness Networking (NAN)
The broadcom HAL we imported use as a base in this repository
doesn't work with the brcmfmac upstream driver in Linux: even
if nonfree firwmares are found on the device (for instance
because users added them manually), Replicant can scan the
networks but it can't connect to WPA2 networks even with the
right password, and when the connection fails we see some
errors with the statistics reporting (from adb logcat -b main):
[...] D WifiNl80211Manager: Scan result ready event
[...] D WifiNative: Scan result ready event
[...] E WifiVendorHal: getWifiLinkLayerStats_1_3_Internal(l.973)
failed {.code = ERROR_UNKNOWN, .description = unknown error}
This might be because for some reasons the Broadcom HAL depends
on the bcmdhd kernel driver that we don't want to use because
it's an out of tree kernel driver and we want to use the upstream
kernel drivers instead.
So we need to modify this Broadcom Wi-Fi HAL not to depend on
the bcmdhd driver.
Since there is also a Wi-Fi hal in the device/linaro/poplar
repository that was derived from this Broadcom Wi-Fi HAL, we
could import it.
That modified Wi-Fi HAL has been imported in device/linaro/poplar[1]
in the android-11.0.0_r17 tag by the following commit:
commit d9bd822cf11ffa4c2813e6027b8172a400f93505
Author: Shawn Guo <shawn.guo@linaro.org>
Date: Wed Oct 10 10:24:47 2018 +0800
Add poplar wifi hal source code
The poplar wifi hal derives from bcmdhd one with a few changes below.
- No GetChannelListCommand support for gscan.
- Use different vendor data structure without internal radio statistics
structure conversion for link_layer_stats.
- Drop BCMDHD_64_BIT_IPC build option support for wpa_supplicant_8_lib.
We should probably consolidate it with bcmdhd at hardware/ folder
level, but let's start from maintaining it at poplar device level before
we find it useful for more devices.
Change-Id: Ibef0f75f02f184b4feb7ba624407ce2f26984962
However the amount of changes are way too big to be reviewed, so we
need to split them up.
Since support Wi-Fi Aware / Neighbor Awareness Networking (NAN)
support was also removed by that commit, we can simply split that
away in order to make review more easy.
This way, if for some reasons the Wi-Fi Aware feature needs to be
bring back, we could simply revert this commit.
More details wifi-aware are available on the wifi-aware[2] page
of Android developers documentation.
[1]https://android.googlesource.com/device/linaro/poplar
[2]https://developer.android.com/guide/topics/connectivity/wifi-aware
GNUtoo: commit message, rebase and split
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rwxr-xr-x | wifi_hal/Android.mk | 1 | ||||
-rwxr-xr-x | wifi_hal/common.h | 48 | ||||
-rwxr-xr-x | wifi_hal/nan.cpp | 5292 | ||||
-rwxr-xr-x | wifi_hal/wifi_hal.cpp | 29 |
4 files changed, 4 insertions, 5366 deletions
diff --git a/wifi_hal/Android.mk b/wifi_hal/Android.mk index a2d3ae2..416abef 100755 --- a/wifi_hal/Android.mk +++ b/wifi_hal/Android.mk @@ -47,7 +47,6 @@ LOCAL_SRC_FILES := \ common.cpp \ cpp_bindings.cpp \ gscan.cpp \ - nan.cpp \ link_layer_stats.cpp \ wifi_logger.cpp \ wifi_offload.cpp diff --git a/wifi_hal/common.h b/wifi_hal/common.h index 98801b2..568b5bd 100755 --- a/wifi_hal/common.h +++ b/wifi_hal/common.h @@ -52,7 +52,6 @@ const uint32_t GOOGLE_OUI = 0x001A11; #define NMR2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5], (a)[6], (a)[7] #define NMRSTR "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x" -#define NAN_MASTER_RANK_LEN 8 /* @@ -89,14 +88,14 @@ typedef enum { ANDROID_NL80211_SUBCMD_DEBUG_RANGE_START = 0x1400, ANDROID_NL80211_SUBCMD_DEBUG_RANGE_END = 0x14FF, - /* define all wifi offload related commands between 0x1600 and 0x16FF */ - ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_START = 0x1600, - ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_END = 0x16FF, - /* define all NAN related commands between 0x1700 and 0x17FF */ ANDROID_NL80211_SUBCMD_NAN_RANGE_START = 0x1700, ANDROID_NL80211_SUBCMD_NAN_RANGE_END = 0x17FF, + /* define all wifi offload related commands between 0x1600 and 0x16FF */ + ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_START = 0x1600, + ANDROID_NL80211_SUBCMD_WIFI_OFFLOAD_RANGE_END = 0x16FF, + /* define all Android Packet Filter related commands between 0x1800 and 0x18FF */ ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_START = 0x1800, ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_END = 0x18FF, @@ -150,26 +149,6 @@ typedef enum { GSCAN_SUBCMD_MAX, - /* NAN related */ - NAN_SUBCMD_ENABLE = ANDROID_NL80211_SUBCMD_NAN_RANGE_START, - NAN_SUBCMD_DISABLE, /* 0x1701 */ - NAN_SUBCMD_PUBLISH, /* 0x1702 */ - NAN_SUBCMD_SUBSCRIBE, /* 0x1703 */ - NAN_SUBCMD_PUBLISH_CANCEL, /* 0x1704 */ - NAN_SUBCMD_SUBSCRIBE_CANCEL, /* 0x1705 */ - NAN_SUBCMD_TRANSMIT_FOLLOWUP, /* 0x1706 */ - NAN_SUBCMD_CONFIG, /* 0x1707 */ - NAN_SUBCMD_TCA, /* 0x1708 */ - NAN_SUBCMD_STATS, /* 0x1709 */ - NAN_SUBCMD_GET_CAPABILITIES, /* 0x170A */ - NAN_SUBCMD_DATA_PATH_IFACE_CREATE, /* 0x170B */ - NAN_SUBCMD_DATA_PATH_IFACE_DELETE, /* 0x170C */ - NAN_SUBCMD_DATA_PATH_REQUEST, /* 0x170D */ - NAN_SUBCMD_DATA_PATH_RESPONSE, /* 0x170E */ - NAN_SUBCMD_DATA_PATH_END, /* 0x170F */ - NAN_SUBCMD_DATA_PATH_SEC_INFO, /* 0x1710 */ - NAN_SUBCMD_VERSION_INFO, /* 0x1711 */ - NAN_SUBCMD_ENABLE_MERGE, /* 0x1712 */ APF_SUBCMD_GET_CAPABILITIES = ANDROID_NL80211_SUBCMD_PKT_FILTER_RANGE_START, APF_SUBCMD_SET_FILTER, WIFI_SUBCMD_TX_POWER_SCENARIO = ANDROID_NL80211_SUBCMD_TX_POWER_RANGE_START, @@ -196,26 +175,8 @@ typedef enum { * BRCM specific events should be placed after the Generic events * in order to match between the DHD and HAL */ - NAN_EVENT_ENABLED = 15, - NAN_EVENT_DISABLED = 16, - NAN_EVENT_SUBSCRIBE_MATCH = 17, - NAN_EVENT_PUBLISH_REPLIED_IND = 18, - NAN_EVENT_PUBLISH_TERMINATED = 19, - NAN_EVENT_SUBSCRIBE_TERMINATED = 20, - NAN_EVENT_DE_EVENT = 21, - NAN_EVENT_FOLLOWUP = 22, - NAN_EVENT_TRANSMIT_FOLLOWUP_IND = 23, - NAN_EVENT_DATA_REQUEST = 24, - NAN_EVENT_DATA_CONFIRMATION = 25, - NAN_EVENT_DATA_END = 26, - NAN_EVENT_BEACON = 27, - NAN_EVENT_SDF = 28, - NAN_EVENT_TCA = 29, - NAN_EVENT_SUBSCRIBE_UNMATCH = 30, - NAN_EVENT_UNKNOWN, ROAM_EVENT_START, GOOGLE_FILE_DUMP_EVENT = 37, - NAN_ASYNC_RESPONSE_DISABLED = 40 } WIFI_EVENT; typedef void (*wifi_internal_event_handler) (wifi_handle handle, int events); @@ -321,7 +282,6 @@ hal_info *getHalInfo(wifi_interface_handle handle); wifi_handle getWifiHandle(hal_info *info); wifi_interface_handle getIfaceHandle(interface_info *info); wifi_error wifi_cancel_cmd(wifi_request_id id, wifi_interface_handle iface); -wifi_error nan_deinit_handler(); wifi_error wifi_start_hal(wifi_interface_handle iface); wifi_error wifi_stop_hal(wifi_interface_handle iface); wifi_interface_handle wifi_get_wlan_interface(wifi_handle info, diff --git a/wifi_hal/nan.cpp b/wifi_hal/nan.cpp deleted file mode 100755 index cfabfa8..0000000 --- a/wifi_hal/nan.cpp +++ /dev/null @@ -1,5292 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Portions copyright (C) 2019 Broadcom Limited - * - * 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. - */ - -#include <stdint.h> -#include <fcntl.h> -#include <sys/socket.h> -#include <netlink/genl/genl.h> -#include <netlink/genl/family.h> -#include <netlink/genl/ctrl.h> -#include <linux/rtnetlink.h> -#include <netpacket/packet.h> -#include <linux/filter.h> -#include <linux/errqueue.h> -#include <ctype.h> -#include <linux/pkt_sched.h> -#include <netlink/object-api.h> -#include <netlink/netlink.h> -#include <netlink/socket.h> - -#include "nl80211_copy.h" - -#include "sync.h" - -#define LOG_TAG "WifiHAL" - -#include <utils/Log.h> -#include <log/log.h> -#include "wifi_hal.h" -#include "common.h" -#include "cpp_bindings.h" -#include "netinet/in.h" -#include "arpa/inet.h" -#include <openssl/sha.h> -#include <openssl/evp.h> -#include <sys/ioctl.h> - -/* Changes between incompatible Version of NAN */ -#define NAN_MAJOR_REL_VERSION 1 -/* Changes between Source and Binary compatible Version of NAN */ -#define NAN_MINOR_REL_VERSION 2 -/* Changes between perfectly compatible Version of NAN */ -#define NAN_PATCH_REL_VERSION 3 - -#define SVC_NAME_TO_HASH 1 -#define NAN_SVC_HASH_SIZE 6 -#define C2S(x) case x: return #x; -#define NAN_PUB_RECV_FLAG_MAX 15 -#define NAN_SUB_RECV_FLAG_MAX 7 -#define NAN_DISC_IND_MAX 7 -#define NAN_MAX 255 -#define NAN_MIN 0 -#define INVALID 0xFF -#define NAN_MAX_PERIOD 16 -#define ISGREATER(i, x) (i > x) ? 1 : 0 -#define NAN_MAX_RSSI 90 -#define NAN_SECURITY_SALT_SIZE 14 -#define NAN_MAC_INVALID_TRANSID 0xFFFF - -#define SVCHASH_ISNULL(svc_hash) ((((u8 *)(svc_hash))[0] | \ - ((u8 *)(svc_hash))[1] | \ - ((u8 *)(svc_hash))[2] | \ - ((u8 *)(svc_hash))[3] | \ - ((u8 *)(svc_hash))[4] | \ - ((u8 *)(svc_hash))[5]) == 0) -#define ETHER_ISNULLADDR(ea) ((((u8 *)(ea))[0] | \ - ((u8 *)(ea))[1] | \ - ((u8 *)(ea))[2] | \ - ((u8 *)(ea))[3] | \ - ((u8 *)(ea))[4] | \ - ((u8 *)(ea))[5]) == 0) - -/* NAN structs versioning b/w DHD and HAL - * TODO:add versions for each struct*/ -#define NAN_HAL_VERSION_1 0x2 -struct nan_dbg_cntrs { - u32 dp_req; /* cmd */ - u32 dp_resp; /* cmd */ - u32 dp_req_evt; - u32 dp_confirm_evt; - u32 transmit_req; /* cmd */ - u32 transmit_txs; /* event */ - u32 transmit_recv; /* event */ -}; -nan_dbg_cntrs counters; - -u32 current_dhd_hal_ver = 0; - -/* TODO: Known bug in Android which was discovered too late and then left in for backward compatibility. - * The issue is that the Service Name selected by the framework is invalid - it contains a space. - * Therefore, the underlying implementation partially converts it to lower case and uses the results for PMK generation. - * I.e. the PMK is generated based on the following service name: "Wi-Fi Aware Data Path" - */ -/* SVC Hash generated for svc name string "Wi-Fi Aware Data Path" */ -u8 NAN_OOB_INTEROP_SVC_HASH[NAN_SVC_HASH_SIZE] = {0x05, 0x9e, 0xd4, 0xcf, 0x89, 0x1a}; -#define NAN_OOB_INTEROP_SVC_NAME "Wi-Fi Aware Data Path" - -static const char *NanStatusToString(NanStatusType status) -{ - switch (status) { - C2S(NAN_STATUS_SUCCESS) - C2S(NAN_STATUS_INTERNAL_FAILURE) - C2S(NAN_STATUS_PROTOCOL_FAILURE) - C2S(NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID) - C2S(NAN_STATUS_NO_RESOURCE_AVAILABLE) - C2S(NAN_STATUS_INVALID_PARAM) - C2S(NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID) - C2S(NAN_STATUS_INVALID_NDP_ID) - C2S(NAN_STATUS_NAN_NOT_ALLOWED) - C2S(NAN_STATUS_NO_OTA_ACK) - C2S(NAN_STATUS_ALREADY_ENABLED) - C2S(NAN_STATUS_FOLLOWUP_QUEUE_FULL) - C2S(NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED) - - default: - return "NAN_STATUS_INTERNAL_FAILURE"; - } -} - -/* Nan Data Path Security Information */ -typedef struct { - /* - Unique Instance Id identifying the Responder's service. - This is same as publish_id notified on the subscribe side - in a publish/subscribe scenario - */ - u32 requestor_instance_id; /* Value 0 for no publish/subscribe */ - /* - Discovery MAC addr of the publisher/peer - */ - u8 peer_disc_mac_addr[NAN_MAC_ADDR_LEN]; - /* - Unique token Id generated on the initiator/responder - side used for a NDP session between two NAN devices - */ - NanDataPathId ndp_instance_id; -} NanDataPathSecInfoRequest; -/* - * Note: NAN_ATTRIBUTE should match with one that on driver side, wl_cfgnan.h and - * NanAttrToString as well for enum to string. - */ -typedef enum { - NAN_ATTRIBUTE_HEADER = 100, - NAN_ATTRIBUTE_HANDLE = 101, - NAN_ATTRIBUTE_TRANSAC_ID = 102, - - /* NAN Enable request attributes */ - NAN_ATTRIBUTE_2G_SUPPORT = 103, - NAN_ATTRIBUTE_5G_SUPPORT = 104, - NAN_ATTRIBUTE_CLUSTER_LOW = 105, - NAN_ATTRIBUTE_CLUSTER_HIGH = 106, - NAN_ATTRIBUTE_SID_BEACON = 107, - NAN_ATTRIBUTE_SYNC_DISC_2G_BEACON = 108, - NAN_ATTRIBUTE_SYNC_DISC_5G_BEACON = 109, - NAN_ATTRIBUTE_SDF_2G_SUPPORT = 110, - NAN_ATTRIBUTE_SDF_5G_SUPPORT = 111, - NAN_ATTRIBUTE_RSSI_CLOSE = 112, - NAN_ATTRIBUTE_RSSI_MIDDLE = 113, - NAN_ATTRIBUTE_RSSI_PROXIMITY = 114, - NAN_ATTRIBUTE_HOP_COUNT_LIMIT = 115, - NAN_ATTRIBUTE_RANDOM_FACTOR = 116, - NAN_ATTRIBUTE_MASTER_PREF = 117, - NAN_ATTRIBUTE_PERIODIC_SCAN_INTERVAL = 118, - - /* Nan Publish/Subscribe request attributes */ - NAN_ATTRIBUTE_PUBLISH_ID = 119, - NAN_ATTRIBUTE_TTL = 120, - NAN_ATTRIBUTE_PERIOD = 121, - NAN_ATTRIBUTE_REPLIED_EVENT_FLAG = 122, - NAN_ATTRIBUTE_PUBLISH_TYPE = 123, - NAN_ATTRIBUTE_TX_TYPE = 124, - NAN_ATTRIBUTE_PUBLISH_COUNT = 125, - NAN_ATTRIBUTE_SERVICE_NAME_LEN = 126, - NAN_ATTRIBUTE_SERVICE_NAME = 127, - NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN = 128, - NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO = 129, - NAN_ATTRIBUTE_RX_MATCH_FILTER_LEN = 130, - NAN_ATTRIBUTE_RX_MATCH_FILTER = 131, - NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN = 132, - NAN_ATTRIBUTE_TX_MATCH_FILTER = 133, - NAN_ATTRIBUTE_SUBSCRIBE_ID = 134, - NAN_ATTRIBUTE_SUBSCRIBE_TYPE = 135, - NAN_ATTRIBUTE_SERVICERESPONSEFILTER = 136, - NAN_ATTRIBUTE_SERVICERESPONSEINCLUDE = 137, - NAN_ATTRIBUTE_USESERVICERESPONSEFILTER = 138, - NAN_ATTRIBUTE_SSIREQUIREDFORMATCHINDICATION = 139, - NAN_ATTRIBUTE_SUBSCRIBE_MATCH = 140, - NAN_ATTRIBUTE_SUBSCRIBE_COUNT = 141, - NAN_ATTRIBUTE_MAC_ADDR = 142, - NAN_ATTRIBUTE_MAC_ADDR_LIST = 143, - NAN_ATTRIBUTE_MAC_ADDR_LIST_NUM_ENTRIES = 144, - NAN_ATTRIBUTE_PUBLISH_MATCH = 145, - - /* Nan Event attributes */ - NAN_ATTRIBUTE_ENABLE_STATUS = 146, - NAN_ATTRIBUTE_JOIN_STATUS = 147, - NAN_ATTRIBUTE_ROLE = 148, - NAN_ATTRIBUTE_MASTER_RANK = 149, - NAN_ATTRIBUTE_ANCHOR_MASTER_RANK = 150, - NAN_ATTRIBUTE_CNT_PEND_TXFRM = 151, - NAN_ATTRIBUTE_CNT_BCN_TX = 152, - NAN_ATTRIBUTE_CNT_BCN_RX = 153, - NAN_ATTRIBUTE_CNT_SVC_DISC_TX = 154, - NAN_ATTRIBUTE_CNT_SVC_DISC_RX = 155, - NAN_ATTRIBUTE_AMBTT = 156, - NAN_ATTRIBUTE_CLUSTER_ID = 157, - NAN_ATTRIBUTE_INST_ID = 158, - NAN_ATTRIBUTE_OUI = 159, - NAN_ATTRIBUTE_STATUS = 160, - NAN_ATTRIBUTE_DE_EVENT_TYPE = 161, - NAN_ATTRIBUTE_MERGE = 162, - NAN_ATTRIBUTE_IFACE = 163, - NAN_ATTRIBUTE_CHANNEL = 164, - NAN_ATTRIBUTE_PEER_ID = 165, - NAN_ATTRIBUTE_NDP_ID = 167, - NAN_ATTRIBUTE_SECURITY = 168, - NAN_ATTRIBUTE_QOS = 169, - NAN_ATTRIBUTE_RSP_CODE = 170, - NAN_ATTRIBUTE_INST_COUNT = 171, - NAN_ATTRIBUTE_PEER_DISC_MAC_ADDR = 172, - NAN_ATTRIBUTE_PEER_NDI_MAC_ADDR = 173, - NAN_ATTRIBUTE_IF_ADDR = 174, - NAN_ATTRIBUTE_WARMUP_TIME = 175, - NAN_ATTRIBUTE_RECV_IND_CFG = 176, - NAN_ATTRIBUTE_RSSI_CLOSE_5G = 177, - NAN_ATTRIBUTE_RSSI_MIDDLE_5G = 178, - NAN_ATTRIBUTE_RSSI_PROXIMITY_5G = 179, - NAN_ATTRIBUTE_CONNMAP = 180, - NAN_ATTRIBUTE_24G_CHANNEL = 181, - NAN_ATTRIBUTE_5G_CHANNEL = 182, - NAN_ATTRIBUTE_DWELL_TIME = 183, - NAN_ATTRIBUTE_SCAN_PERIOD = 184, - NAN_ATTRIBUTE_RSSI_WINDOW_SIZE = 185, - NAN_ATTRIBUTE_CONF_CLUSTER_VAL = 186, - NAN_ATTRIBUTE_AVAIL_BIT_MAP = 187, - NAN_ATTRIBUTE_ENTRY_CONTROL = 188, - NAN_ATTRIBUTE_CIPHER_SUITE_TYPE = 189, - NAN_ATTRIBUTE_KEY_TYPE = 190, - NAN_ATTRIBUTE_KEY_LEN = 191, - NAN_ATTRIBUTE_SCID = 192, - NAN_ATTRIBUTE_SCID_LEN = 193, - NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP = 194, - NAN_ATTRIBUTE_SDE_CONTROL_SECURITY = 195, - NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE = 196, - NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT = 197, - NAN_ATTRIBUTE_NO_CONFIG_AVAIL = 198, - NAN_ATTRIBUTE_2G_AWAKE_DW = 199, - NAN_ATTRIBUTE_5G_AWAKE_DW = 200, - NAN_ATTRIBUTE_RANGING_INTERVAL = 201, - NAN_ATTRIBUTE_RANGING_INDICATION = 202, - NAN_ATTRIBUTE_RANGING_INGRESS_LIMIT = 203, - NAN_ATTRIBUTE_RANGING_EGRESS_LIMIT = 204, - NAN_ATTRIBUTE_RANGING_AUTO_ACCEPT = 205, - NAN_ATTRIBUTE_RANGING_RESULT = 206, - NAN_ATTRIBUTE_DISC_IND_CFG = 207, - NAN_ATTRIBUTE_RSSI_THRESHOLD_FLAG = 208, - NAN_ATTRIBUTE_KEY_DATA = 209, - NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN = 210, - NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO = 211, - NAN_ATTRIBUTE_REASON = 212, - NAN_ATTRIBUTE_MATCH_OCCURRED_FLAG = 213, - NAN_ATTRIBUTE_OUT_OF_RESOURCE_FLAG = 214, - NAN_ATTRIBUTE_DWELL_TIME_5G = 215, - NAN_ATTRIBUTE_SCAN_PERIOD_5G = 216, - NAN_ATTRIBUTE_SVC_RESPONDER_POLICY = 217, - NAN_ATTRIBUTE_EVENT_MASK = 218, - NAN_ATTRIBUTE_SUB_SID_BEACON = 219, - NAN_ATTRIBUTE_RANDOMIZATION_INTERVAL = 220, - NAN_ATTRIBUTE_CMD_RESP_DATA = 221, - NAN_ATTRIBUTE_CMD_USE_NDPE = 222, - NAN_ATTRIBUTE_ENABLE_MERGE = 223, - NAN_ATTRIBUTE_DISCOVERY_BEACON_INTERVAL = 224, - NAN_ATTRIBUTE_NSS = 225, - NAN_ATTRIBUTE_ENABLE_RANGING = 226, - NAN_ATTRIBUTE_DW_EARLY_TERM = 227 -} NAN_ATTRIBUTE; - -typedef enum { - NAN_REQUEST_ENABLE = 0, - NAN_REQUEST_DISABLE = 1, - NAN_REQUEST_PUBLISH = 2, - NAN_REQUEST_PUBLISH_CANCEL = 3, - NAN_REQUEST_TRANSMIT_FOLLOWUP = 4, - NAN_REQUEST_SUBSCRIBE = 5, - NAN_REQUEST_SUBSCRIBE_CANCEL = 6, - NAN_REQUEST_STATS = 7, - NAN_REQUEST_CONFIG = 8, - NAN_REQUEST_TCA = 9, - NAN_REQUEST_EVENT_CHECK = 10, - NAN_REQUEST_GET_CAPABILTIES = 11, - NAN_DATA_PATH_IFACE_CREATE = 12, - NAN_DATA_PATH_IFACE_DELETE = 13, - NAN_DATA_PATH_INIT_REQUEST = 14, - NAN_DATA_PATH_IND_RESPONSE = 15, - NAN_DATA_PATH_END = 16, - NAN_DATA_PATH_IFACE_UP = 17, - NAN_DATA_PATH_SEC_INFO = 18, - NAN_VERSION_INFO = 19, - NAN_REQUEST_ENABLE_MERGE = 20, - NAN_REQUEST_LAST = 0xFFFF -} NanRequestType; - -/* - * The enum is based on the BCME Response defs - * used in the firmware and defined at - * path: src/include/bcmeutils.h - */ -enum nan_response_status { - BCME_OK = 0, - BCME_ERROR = -1, - BCME_BADARG = -2, - BCME_BADRATESET = -12, - BCME_BADBAND = -13, - BCME_BUSY = -16, - BCME_BADCHAN = -20, - BCME_UNSUPPORTED = -23, - BCME_BADLEN = -24, - BCME_NOTREADY = -25, - BCME_NOMEM = -27, - BCME_NOTFOUND = -30, - BCME_TXFAIL = -38, - BCME_RXFAIL = -39, - BCME_SCANREJECT = -43, - BCME_USAGE_ERROR = -44, - BCME_IOCTL_ERROR = -45 -}; - -enum nan_de_event_type { - NAN_EVENT_IFACE = 0, - NAN_EVENT_START = 1, - NAN_EVENT_JOIN = 2, - NAN_EVENT_ROLE_CHANGE = 3, - NAN_EVENT_MERGE = 4 -}; - -typedef struct _nan_hal_resp { - u16 instance_id; - u16 subcmd; - int32_t status; - int32_t value; - /* Identifier for the instance of the NDP */ - u16 ndp_instance_id; - /* Publisher NMI */ - u8 pub_nmi[NAN_MAC_ADDR_LEN]; - /* SVC_HASH */ - u8 svc_hash[NAN_SVC_HASH_SIZE]; - char nan_reason[NAN_ERROR_STR_LEN]; /* Describe the NAN reason type */ - char pad[3]; - NanCapabilities capabilities; -} nan_hal_resp_t; - -typedef int (*match_fn)(void *p1, void *data); - -typedef struct _nan_hal_info { - void *nan_handle; - void *nan_mac_control; - void *nan_disc_control; - void *nan_dp_control; -} nan_hal_info_t; - -u8 mNmi[NAN_MAC_ADDR_LEN]; -/* Static functions */ -static int is_de_event(int cmd); -static int is_dp_event(int cmd); -static int is_cmd_response(int cmd); - -static int get_svc_hash(unsigned char *svc_name, u16 svc_name_len, - u8 *svc_hash, u16 svc_hash_len); -NanResponseType get_response_type(WIFI_SUB_COMMAND nan_subcmd); -static NanStatusType nan_map_term_status(u32 vendor_reason); -static NanStatusType nan_map_response_status(int vendor_status); -static int ioctl_sock = 0; - -static int setFlags(int s, struct ifreq *ifr, int set, int clr) -{ - if(ioctl(s, SIOCGIFFLAGS, ifr) < 0) { - return WIFI_ERROR_UNKNOWN; - } - - ifr->ifr_flags = (ifr->ifr_flags & (~clr)) | set; - if (ioctl(s, SIOCSIFFLAGS, ifr) < 0) { - return WIFI_ERROR_UNKNOWN; - } - - return WIFI_SUCCESS; -} - -static inline void init_sockaddr_in(struct sockaddr_in *sin, const char *addr) -{ - sin->sin_family = AF_INET; - sin->sin_port = 0; - sin->sin_addr.s_addr = inet_addr(addr); -} - -static int setAddr(int s, struct ifreq *ifr, const char *addr) -{ - init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr); - - if (ioctl(s, SIOCSIFADDR, ifr) < 0) { - return WIFI_ERROR_UNKNOWN; - } - - return WIFI_SUCCESS; -} - -/* Function to separate the common events to NAN1.0 events */ -static int is_de_event(int cmd) { - bool is_de_evt = false; - - switch(cmd) { - case NAN_EVENT_SUBSCRIBE_UNMATCH: - case NAN_EVENT_SUBSCRIBE_TERMINATED: - case NAN_EVENT_PUBLISH_TERMINATED: - case NAN_EVENT_SUBSCRIBE_MATCH: - case NAN_EVENT_FOLLOWUP: - case NAN_EVENT_TRANSMIT_FOLLOWUP_IND: - case NAN_EVENT_PUBLISH_REPLIED_IND: - is_de_evt = true; - break; - default: - /* Not used */ - break; - } - return is_de_evt; -} - -/* Function to separate NAN2.0 events */ -static int is_dp_event(int cmd) { - bool is_dp_evt = false; - - switch(cmd) { - case NAN_EVENT_DATA_REQUEST: - case NAN_EVENT_DATA_CONFIRMATION: - case NAN_EVENT_DATA_END: - is_dp_evt = true; - break; - default: - /* Not used */ - break; - } - return is_dp_evt; -} - -static int is_cmd_response(int cmd) { - bool is_cmd_resp = false; - - switch(cmd) { - case NAN_ASYNC_RESPONSE_DISABLED: - is_cmd_resp = true; - break; - default: - break; - } - return is_cmd_resp; -} - -static NanStatusType nan_map_response_status (int vendor_status) { - NanStatusType hal_status; - - switch(vendor_status) { - case BCME_OK: - hal_status = NAN_STATUS_SUCCESS; - break; - case BCME_BUSY: - hal_status = NAN_STATUS_NO_RESOURCE_AVAILABLE; - break; - case BCME_NOTREADY: - hal_status = NAN_STATUS_NAN_NOT_ALLOWED; - break; - case BCME_BADLEN: - case BCME_BADBAND: - hal_status = NAN_STATUS_INVALID_PARAM; - break; - case BCME_NOMEM: - hal_status = NAN_STATUS_NO_RESOURCE_AVAILABLE; - break; - case NAN_STATUS_INTERNAL_FAILURE: - case NAN_STATUS_PROTOCOL_FAILURE: - case NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID: - case NAN_STATUS_NO_RESOURCE_AVAILABLE: - case NAN_STATUS_INVALID_PARAM: - case NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID: - case NAN_STATUS_INVALID_NDP_ID: - case NAN_STATUS_NAN_NOT_ALLOWED: - case NAN_STATUS_NO_OTA_ACK: - case NAN_STATUS_ALREADY_ENABLED: - case NAN_STATUS_FOLLOWUP_QUEUE_FULL: - case NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED: - hal_status = (NanStatusType)vendor_status; - break; - default: - ALOGE("%s Unknown vendor status, status = %d\n", - __func__, vendor_status); - /* Generic error */ - hal_status = NAN_STATUS_INTERNAL_FAILURE; - } - return hal_status; -} - -static void prhex(const char *msg, u8 *buf, u32 nbytes); -static const char *NanAttrToString(u16 cmd); -static const char *NanCmdToString(int cmd); -static const char *NanRspToString(int cmd); - -#define NAN_DBG_ENTER() {ALOGI("Enter: %s\n", __func__);} -#define NAN_DBG_EXIT() {ALOGI("Exit: %s\n", __func__);} - -static int passphrase_to_pmk(u8 *peer_mac, u32 cipher_type, - u8 *svc_hash, NanSecurityKeyInfo *key_info, u8 *pmk_hex) { - int result = NAN_STATUS_SUCCESS; - u8 salt[NAN_SECURITY_SALT_SIZE]; - - NAN_DBG_ENTER(); - salt[0] = 0; /* salt_version */ - salt[1] = cipher_type; - if (svc_hash && peer_mac) { - memcpy(&salt[2], svc_hash, NAN_SVC_HASH_SIZE); - memcpy(&salt[2 + NAN_SVC_HASH_SIZE], peer_mac, - ETHER_ADDR_LEN); - prhex("Salt", salt, NAN_SECURITY_SALT_SIZE); - } else { - ALOGE("Mandory parameters are not present\n"); - return WIFI_ERROR_INVALID_ARGS; - } - if (key_info->body.passphrase_info.passphrase_len < NAN_SECURITY_MIN_PASSPHRASE_LEN || - key_info->body.passphrase_info.passphrase_len > NAN_SECURITY_MAX_PASSPHRASE_LEN) { - ALOGE("passphrase must be between %d and %d characters long\n", - NAN_SECURITY_MIN_PASSPHRASE_LEN, - NAN_SECURITY_MAX_PASSPHRASE_LEN); - return WIFI_ERROR_INVALID_ARGS; - } - - result = PKCS5_PBKDF2_HMAC((const char *) key_info->body.passphrase_info.passphrase, - key_info->body.passphrase_info.passphrase_len, salt, sizeof(salt), - 4096, ((cipher_type == NAN_CIPHER_SUITE_SHARED_KEY_128_MASK) ? - (const EVP_MD *)EVP_sha256():(const EVP_MD *)EVP_sha384()), NAN_PMK_INFO_LEN, pmk_hex); - prhex("PMK_HEX", pmk_hex, 32); - NAN_DBG_EXIT(); - return result; -} - -typedef void *NanRequest; -nan_hal_info_t info; - -#define SVC_LIST(info) ((info).svc_list) -#define SVC_LIST_SIZE(info) ((info).svc_list.total_items) -#define DP_SVC_LIST(info) ((info).dp_svc_list) -#define DP_SVC_LIST_SIZE(info) ((info).dp_svc_list.total_items) -#define NAN_HANDLE(info) ((info).nan_handle) -#define GET_NAN_HANDLE(info) ((NanHandle *)info.nan_handle) -#define NAN_MAC_CONTROL(info) ((info).nan_mac_control) - -/////////////////////////////////////////////////////////////////////////////// -class NanHandle -{ - public: - NanCallbackHandler mHandlers; - NanHandle(wifi_handle handle, NanCallbackHandler handlers):mHandlers(handlers) - {} - -}; - - -/////////////////////////////////////////////////////////////////////////////// -class NanDiscEnginePrimitive : public WifiCommand -{ - NanRequest mParams; - NanRequestType mType; - u16 mInstId; - u32 mPeerId; - u16 mTxId; - - public: - NanDiscEnginePrimitive(wifi_interface_handle iface, int id, - NanRequest params, NanRequestType cmdType) - : WifiCommand("NanCommand", iface, id), mParams(params), mType(cmdType) - { - mInstId = 0; - mPeerId = 0; - setTransactionId(id); - } - - ~NanDiscEnginePrimitive() { - ALOGE("NanDiscEnginePrimitive destroyed\n"); - } - - void setType(NanRequestType type) { - mType = type; - } - - void setInstId(u16 inst_id) { - mInstId = inst_id; - } - - int getInstanceId() { - return mInstId; - } - - void setTransactionId(u16 tx_id) { - mTxId = tx_id; - } - - int getTransactionId() { - return mTxId; - } - - void setParams(NanRequest params) { - mParams = params; - } - - int createRequest(WifiRequest& request) - { - ALOGI("NAN CMD: %s\n", NanCmdToString(mType)); - if (mType == NAN_REQUEST_SUBSCRIBE) { - return createSubscribeRequest(request, - (NanSubscribeRequest *)mParams); - } else if (mType == NAN_REQUEST_SUBSCRIBE_CANCEL) { - return createSubscribeCancelRequest(request, - (NanSubscribeCancelRequest *)mParams); - } else if (mType == NAN_REQUEST_PUBLISH) { - return createPublishRequest(request, - (NanPublishRequest *)mParams); - } else if (mType == NAN_REQUEST_PUBLISH_CANCEL) { - return createPublishCancelRequest(request, - (NanPublishCancelRequest *)mParams); - } else if (mType == NAN_REQUEST_TRANSMIT_FOLLOWUP) { - return createTransmitFollowupRequest(request, - (NanTransmitFollowupRequest *)mParams); - } else if (mType == NAN_REQUEST_GET_CAPABILTIES) { - return getCapabilitiesRequest(request); - } else { - ALOGE("%s Unknown Nan request\n", __func__); - } - return WIFI_SUCCESS; - } - - int createPublishRequest(WifiRequest& request, NanPublishRequest *mParams) - { - NAN_DBG_ENTER(); - u8 pmk_hex[NAN_PMK_INFO_LEN]; - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_PUBLISH); - if (result < 0) { - ALOGE("%s Failed to create request, result = %d\n", __func__, result); - return result; - } - - /* If handle is 0xFFFF, then update instance_id in response of this request - * otherwise, update not needed - */ - mInstId = mParams->publish_id; - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u16(NAN_ATTRIBUTE_PUBLISH_ID, mInstId); - if (result < 0) { - ALOGE("%s: Failed to fill pub id, result = %d\n", __func__, result); - return result; - } - - result = request.put_u16(NAN_ATTRIBUTE_TTL, mParams->ttl); - if (result < 0) { - ALOGE("%s: Failed to fill ttl, result = %d\n", __func__, result); - return result; - } - - if (ISGREATER(mParams->period, NAN_MAX_PERIOD)) { - ALOGE("%s:Invalid period value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - result = request.put_u16(NAN_ATTRIBUTE_PERIOD, mParams->period); - if (result < 0) { - ALOGE("%s: Failed to fill period, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_PUBLISH_TYPE, mParams->publish_type); - if (result < 0) { - ALOGE("%s: Failed to fill pub type, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_TX_TYPE, mParams->tx_type); - if (result < 0) { - ALOGE("%s: Failed to fill tx type, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_PUBLISH_COUNT, mParams->publish_count); - if (result < 0) { - ALOGE("%s: Failed to fill pub cnt, result = %d\n", __func__, result); - return result; - } - - if (mParams->service_name_len) { - u8 svc_hash[NAN_SVC_HASH_SIZE]; - - result = get_svc_hash(mParams->service_name, mParams->service_name_len, - svc_hash, NAN_SVC_HASH_SIZE); - if (result < 0) { - ALOGE("%s: Failed to get hashed svc name\n", __func__); - return result; - } - - mParams->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(mParams->service_name, svc_hash, mParams->service_name_len); - - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_NAME_LEN, mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name len, result = %d\n", __func__, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_NAME, (void *)mParams->service_name, - mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->service_specific_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN, - mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info len, result = %d\n", __func__, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO, - (void *)mParams->service_specific_info, mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->rx_match_filter_len) { - result = request.put_u16(NAN_ATTRIBUTE_RX_MATCH_FILTER_LEN, - mParams->rx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill rx match filter len, result = %d\n", - __func__, result); - return result; - } - - prhex(NULL, mParams->rx_match_filter, mParams->rx_match_filter_len); - result = request.put(NAN_ATTRIBUTE_RX_MATCH_FILTER, - (void *)mParams->rx_match_filter, mParams->rx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill rx match filter, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->tx_match_filter_len) { - result = request.put_u16(NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN, - mParams->tx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill tx match filter, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->tx_match_filter, mParams->tx_match_filter_len); - result = request.put(NAN_ATTRIBUTE_TX_MATCH_FILTER, - (void *)mParams->tx_match_filter, mParams->tx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill tx match filter, result = %d\n", - __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_PUBLISH_MATCH, mParams->publish_match_indicator); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_PUBLISH_MATCH, result = %d\n", - __func__, result); - return result; - } - - if (ISGREATER(mParams->recv_indication_cfg, NAN_PUB_RECV_FLAG_MAX)) { - ALOGE("%s:Invalid recv_flag value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - result = request.put_u8(NAN_ATTRIBUTE_RECV_IND_CFG, - mParams->recv_indication_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_RECV_IND_CFG, result = %d\n", - __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_CIPHER_SUITE_TYPE, - mParams->cipher_type); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_CIPHER_SUITE_TYPE, result = %d\n", - __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_KEY_TYPE, - mParams->key_info.key_type); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_KEY_TYPE, result = %d\n", - __func__, result); - return result; - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) { - if (mParams->key_info.body.pmk_info.pmk_len) { - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, - (void *)mParams->key_info.body.pmk_info.pmk, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk, result = %d\n", __func__, result); - return result; - } - } - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) { - if (mParams->key_info.body.passphrase_info.passphrase_len < NAN_SECURITY_MIN_PASSPHRASE_LEN || - mParams->key_info.body.passphrase_info.passphrase_len > NAN_SECURITY_MAX_PASSPHRASE_LEN) { - ALOGE("passphrase must be between %d and %d characters long\n", - NAN_SECURITY_MIN_PASSPHRASE_LEN, - NAN_SECURITY_MAX_PASSPHRASE_LEN); - return NAN_STATUS_INVALID_PARAM; - } else { - memset(pmk_hex, 0, NAN_PMK_INFO_LEN); - result = passphrase_to_pmk(mNmi, mParams->cipher_type, - mParams->service_name, &mParams->key_info, pmk_hex); - if (result < 0) { - ALOGE("%s: Failed to convert passphrase to key data, result = %d\n", __func__, result); - return result; - } - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, pmk_hex, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase, result = %d\n", __func__, result); - return result; - } - } - } - - if (mParams->scid_len) { - result = request.put_u32(NAN_ATTRIBUTE_SCID_LEN, - mParams->scid_len); - if (result < 0) { - ALOGE("%s: Failed to fill scid len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->scid, mParams->scid_len); - result = request.put(NAN_ATTRIBUTE_SCID, - (void *)mParams->scid, mParams->scid_len); - if (result < 0) { - ALOGE("%s: Failed to fill scid, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP, - mParams->sdea_params.config_nan_data_path); - - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_SECURITY, - mParams->sdea_params.security_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_SDE_CONTROL_SECURITY, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE, - mParams->sdea_params.ndp_type); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT, - mParams->sdea_params.ranging_state); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_RSSI_THRESHOLD_FLAG, - mParams->rssi_threshold_flag); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_RSSI_THRESHOLD_FLAG, result = %d\n", - __func__, result); - return result; - } - - if (mParams->sdea_service_specific_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN, - mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - result = request.put(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO, - (void *)mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_SVC_RESPONDER_POLICY, - mParams->service_responder_policy); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_SVC_RESPONDER_POLICY, result = %d\n", - __func__, result); - return result; - } - - request.attr_end(data); - - ALOGI("Returning successfully\n"); - NAN_DBG_EXIT(); - return result; - } - - int createPublishCancelRequest(WifiRequest& request, NanPublishCancelRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_PUBLISH_CANCEL); - if (result < 0) { - ALOGE("%s: Failed to create request, result = %d\n", __func__, result); - return result; - } - - NAN_DBG_ENTER(); - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - if (ISGREATER(mInstId, NAN_MAX)) { - ALOGE("%s:Invalid publish count value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - ALOGI("%s: pub id = %d, inst_id = %d\n", __func__, mParams->publish_id, mInstId); - - result = request.put_u16(NAN_ATTRIBUTE_PUBLISH_ID, mInstId); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_PUBLISH_ID, result = %d\n", - __func__, result); - return result; - } - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int createSubscribeRequest(WifiRequest& request, NanSubscribeRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_SUBSCRIBE); - if (result < 0) { - ALOGE("%s Failed to create request\n", __func__); - return result; - } - - NAN_DBG_ENTER(); - - /* If handle is 0xFFFF, then update instance_id in response of this request - * otherwise, update not needed - */ - mInstId = mParams->subscribe_id; - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u16(NAN_ATTRIBUTE_SUBSCRIBE_ID, mInstId); - if (result < 0) { - ALOGE("%s: Failed to fill sub id, result = %d\n", __func__, result); - return result; - } - - result = request.put_u16(NAN_ATTRIBUTE_TTL, mParams->ttl); - if (result < 0) { - ALOGE("%s: Failed to fill ttl, result = %d\n", __func__, result); - return result; - } - - if (ISGREATER(mParams->period, NAN_MAX_PERIOD)) { - ALOGE("%s:Invalid period value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - result = request.put_u16(NAN_ATTRIBUTE_PERIOD, mParams->period); - if (result < 0) { - ALOGE("%s: Failed to fill period, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SUBSCRIBE_TYPE, mParams->subscribe_type); - if (result < 0) { - ALOGE("%s: Failed to fill sub type, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SERVICERESPONSEFILTER, - mParams->serviceResponseFilter); - if (result < 0) { - ALOGE("%s: Failed to fill svc resp filter, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SERVICERESPONSEINCLUDE, - mParams->serviceResponseInclude); - if (result < 0) { - ALOGE("%s: Failed to fill svc resp include, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_USESERVICERESPONSEFILTER, - mParams->useServiceResponseFilter); - if (result < 0) { - ALOGE("%s: Failed to fill use svc resp filter, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SSIREQUIREDFORMATCHINDICATION, - mParams->ssiRequiredForMatchIndication); - if (result < 0) { - ALOGE("%s: Failed to fill ssi req match ind, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SUBSCRIBE_MATCH, - mParams->subscribe_match_indicator); - if (result < 0) { - ALOGE("%s: Failed to fill sub match, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SUBSCRIBE_COUNT, mParams->subscribe_count); - if (result < 0) { - ALOGE("%s: Failed to fill sub cnt, result = %d\n", __func__, result); - return result; - } - - if (mParams->service_name_len) { - u8 svc_hash[NAN_SVC_HASH_SIZE]; - - result = get_svc_hash(mParams->service_name, mParams->service_name_len, - svc_hash, NAN_SVC_HASH_SIZE); - if (result < 0) { - ALOGE("%s: Failed to get hashed svc name\n", __func__); - return result; - } - - mParams->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(mParams->service_name, svc_hash, mParams->service_name_len); - - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_NAME_LEN, mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc hash len, result = %d\n", - __func__, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_NAME, (void *)mParams->service_name, - mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill hashed svc name, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->service_specific_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN, - mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info len, result = %d\n", __func__, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO, - (void *)mParams->service_specific_info, mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->rx_match_filter_len) { - result = request.put_u16(NAN_ATTRIBUTE_RX_MATCH_FILTER_LEN, - mParams->rx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill rx match filter len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->rx_match_filter, mParams->rx_match_filter_len); - result = request.put(NAN_ATTRIBUTE_RX_MATCH_FILTER, - (void *)mParams->rx_match_filter, mParams->rx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill rx match filter, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->tx_match_filter_len) { - result = request.put_u16(NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN, - mParams->tx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill tx match filter len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->tx_match_filter, mParams->tx_match_filter_len); - result = request.put(NAN_ATTRIBUTE_TX_MATCH_FILTER, - (void *)mParams->tx_match_filter, mParams->tx_match_filter_len); - if (result < 0) { - ALOGE("%s: Failed to fill tx match filter, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->num_intf_addr_present > NAN_MAX_SUBSCRIBE_MAX_ADDRESS) { - ALOGE("%s: Number of mac addrs: %d have crossed the threshold, fail to subscribe\n", - __func__, mParams->num_intf_addr_present); - return WIFI_ERROR_NOT_SUPPORTED; - } else if (mParams->num_intf_addr_present) { - result = request.put_u16(NAN_ATTRIBUTE_MAC_ADDR_LIST_NUM_ENTRIES, - mParams->num_intf_addr_present); - if (result < 0) { - ALOGE("%s: Failed to fill mac addr list no, result = %d\n", - __func__, result); - return result; - } - - prhex(NULL, (u8 *)mParams->intf_addr, - (mParams->num_intf_addr_present * NAN_MAC_ADDR_LEN)); - result = request.put(NAN_ATTRIBUTE_MAC_ADDR_LIST, (void *)mParams->intf_addr, - (mParams->num_intf_addr_present * NAN_MAC_ADDR_LEN)); - if (result < 0) { - ALOGE("%s: Failed to fill mac addr list, result = %d\n", __func__, result); - return result; - } - } - - if (ISGREATER(mParams->recv_indication_cfg, NAN_SUB_RECV_FLAG_MAX)) { - ALOGE("%s:Invalid recv_flag value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - result = request.put_u8(NAN_ATTRIBUTE_RECV_IND_CFG, - mParams->recv_indication_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill recv_indication_cfg, result = %d\n", - __func__, result); - return result; - } - - if (mParams->scid_len) { - result = request.put_u32(NAN_ATTRIBUTE_SCID_LEN, - mParams->scid_len); - if (result < 0) { - ALOGE("%s: Failed to fill scid len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->scid, mParams->scid_len); - result = request.put(NAN_ATTRIBUTE_SCID, - (void *)mParams->scid, mParams->scid_len); - if (result < 0) { - ALOGE("%s: Failed to fill scid, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP, - mParams->sdea_params.config_nan_data_path); - if (result < 0) { - ALOGE("%s: Failed to fill config_nan_data_path, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_SECURITY, - mParams->sdea_params.security_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill security_cfg, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE, - mParams->sdea_params.ndp_type); - if (result < 0) { - ALOGE("%s: Failed to fill ndp_type, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT, - mParams->sdea_params.ranging_state); - if (result < 0) { - ALOGE("%s: Failed to fill ranging state, result = %d\n", __func__, result); - return result; - } - - if (mParams->sdea_params.ranging_state == NAN_RANGING_ENABLE) { - result = request.put_u32(NAN_ATTRIBUTE_RANGING_INTERVAL, - mParams->ranging_cfg.ranging_interval_msec); - if (result < 0) { - ALOGE("%s: Failed to fill ranging_interval_msec, result = %d\n", __func__, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_RANGING_EGRESS_LIMIT, - mParams->ranging_cfg.distance_egress_mm); - if (result < 0) { - ALOGE("%s: Failed to fill distance_egress_mm, result = %d\n", __func__, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_RANGING_INDICATION, - mParams->ranging_cfg.config_ranging_indications); - if (result < 0) { - ALOGE("%s: Failed to fill config_ranging_indications, result = %d\n", __func__, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_RANGING_INGRESS_LIMIT, - mParams->ranging_cfg.distance_ingress_mm); - if (result < 0) { - ALOGE("%s: Failed to fill distance_ingress_mm, result = %d\n", __func__, result); - return result; - } - } - - ALOGI("%s:RSSI threshold flag %d", __func__, mParams->rssi_threshold_flag); - result = request.put_u8(NAN_ATTRIBUTE_RSSI_THRESHOLD_FLAG, - mParams->rssi_threshold_flag); - if (result < 0) { - ALOGE("%s: Failed to fill rssi_threshold_flag, result = %d\n", - __func__, result); - return result; - } - - if (mParams->sdea_service_specific_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN, - mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - result = request.put(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO, - (void *)mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info, result = %d\n", __func__, result); - return result; - } - } - - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int createSubscribeCancelRequest(WifiRequest& request, - NanSubscribeCancelRequest *mParams) { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_SUBSCRIBE_CANCEL); - if (result < 0) { - ALOGE("%s Failed to create request \n", __func__); - return result; - } - - NAN_DBG_ENTER(); - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - if (ISGREATER(mInstId, NAN_MAX)) { - ALOGE("%s:Invalid subscribe id value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - ALOGI("%s: sub id = %u\n", __func__, mInstId); - - result = request.put_u16(NAN_ATTRIBUTE_SUBSCRIBE_ID, mInstId); - if (result < 0) { - ALOGE("%s: Failed to fill sub id, result = %d\n", __func__, result); - return result; - } - - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int createTransmitFollowupRequest(WifiRequest& request, - NanTransmitFollowupRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_TRANSMIT_FOLLOWUP); - if (result < 0) { - ALOGE("%s Failed to create request \n", __func__); - return result; - } - - NAN_DBG_ENTER(); - - /* If handle is 0xFFFF, then update instance_id in response of this request - * otherwise, update not needed - */ - mInstId = mParams->publish_subscribe_id; - mPeerId = mParams->requestor_instance_id; - mTxId = getTransactionId(); - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u32(NAN_ATTRIBUTE_PEER_ID, mPeerId); - if (result < 0) { - ALOGE("%s: Failed to fill peer id, result = %d\n", __func__, result); - return result; - } - - result = request.put_u16(NAN_ATTRIBUTE_INST_ID, mInstId); - if (result < 0) { - ALOGE("%s Failed to fill inst id = %d \n", __func__, mInstId); - return result; - } - - result = request.put_addr(NAN_ATTRIBUTE_MAC_ADDR, mParams->addr); - if (result < 0) { - ALOGE("%s: Failed to fill mac addr\n", __func__); - return result; - } - - if (mParams->service_specific_info_len > 0) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN, - mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info len \n", __func__); - return result; - } - - prhex(NULL, mParams->service_specific_info, mParams->service_specific_info_len); - result = request.put(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO, - (void *)mParams->service_specific_info, mParams->service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to put svc info, result = %d", __func__, result); - return result; - } - mParams->service_specific_info[mParams->service_specific_info_len] = '\0'; - ALOGI("Transmit service info string is %s\n", mParams->service_specific_info); - } - - if (ISGREATER(mParams->recv_indication_cfg, NAN_PUB_RECV_FLAG_MAX)) { - ALOGE("%s:Invalid recv_flag value.\n", __FUNCTION__); - return WIFI_ERROR_NOT_SUPPORTED; - } - - result = request.put_u8(NAN_ATTRIBUTE_RECV_IND_CFG, - mParams->recv_indication_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_RECV_IND_CFG, result = %d\n", - __func__, result); - return result; - } - result = request.put_u16(NAN_ATTRIBUTE_TRANSAC_ID, mTxId); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_TRANSAC_ID, result = %d\n", - __func__, result); - return result; - } - - if (mParams->sdea_service_specific_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN, - mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - result = request.put(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO, - (void *)mParams->sdea_service_specific_info, mParams->sdea_service_specific_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill sdea svc info, result = %d\n", __func__, result); - return result; - } - } - - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int getCapabilitiesRequest(WifiRequest& request) { - int result = 0; - NAN_DBG_ENTER(); - - result = request.create(GOOGLE_OUI, NAN_SUBCMD_GET_CAPABILITIES); - if (result < 0) { - ALOGE("%s Failed to create request \n", __func__); - return result; - } - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - request.attr_end(data); - - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int start() - { - int result = 0; - WifiRequest request(familyId(), ifaceId()); - result = createRequest(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to create setup request; result = %d\n", __func__, result); - return result; - } - - result = requestResponse(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to configure setup; result = %d\n", __func__, result); - return result; - } - - request.destroy(); - return WIFI_SUCCESS; - } - - virtual bool valid_disc_response_type(int response_type) { - bool valid = false; - switch(response_type) { - case NAN_RESPONSE_PUBLISH: - case NAN_RESPONSE_SUBSCRIBE: - case NAN_GET_CAPABILITIES: - case NAN_RESPONSE_PUBLISH_CANCEL: - case NAN_RESPONSE_SUBSCRIBE_CANCEL: - case NAN_RESPONSE_TRANSMIT_FOLLOWUP: - valid = true; - break; - default: - ALOGE("NanDiscEnginePrmitive:Unknown cmd Response: %d\n", response_type); - break; - } - return valid; - } - - int handleResponse(WifiEvent& reply) - { - nan_hal_resp_t *rsp_vndr_data = NULL; - NanResponseMsg rsp_data; - if (reply.get_cmd() != NL80211_CMD_VENDOR || reply.get_vendor_data() == NULL) { - ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); - return NL_SKIP; - } - rsp_vndr_data = (nan_hal_resp_t *)reply.get_vendor_data(); - ALOGI("NanDiscEnginePrmitive::handle response\n"); - memset(&rsp_data, 0, sizeof(NanResponseMsg)); - rsp_data.response_type = get_response_type((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd); - if (!valid_disc_response_type(rsp_data.response_type)) - return NL_SKIP; - - rsp_data.status = nan_map_response_status(rsp_vndr_data->status); - ALOGE("Mapped hal status = %d\n", rsp_data.status); - if (rsp_vndr_data->nan_reason[0] == '\0') { - memcpy(rsp_data.nan_error, NanStatusToString(rsp_data.status), - strlen(NanStatusToString(rsp_data.status))); - rsp_data.nan_error[strlen(NanStatusToString(rsp_data.status))] = '\0'; - } - rsp_data.nan_error[NAN_ERROR_STR_LEN - 1] = '\0'; - ALOGI("\n Received nan_error string %s\n", (u8*)rsp_data.nan_error); - - if (mInstId == 0 && - (rsp_data.response_type == NAN_RESPONSE_PUBLISH || - rsp_data.response_type == NAN_RESPONSE_SUBSCRIBE)) { - ALOGI("Received service instance_id %d\n", rsp_vndr_data->instance_id); - mInstId = rsp_vndr_data->instance_id; - } - - if (rsp_data.response_type == NAN_RESPONSE_PUBLISH) { - rsp_data.body.publish_response.publish_id = mInstId; - } else if (rsp_data.response_type == NAN_RESPONSE_SUBSCRIBE) { - rsp_data.body.subscribe_response.subscribe_id = mInstId; - } else if (rsp_data.response_type == NAN_GET_CAPABILITIES) { - memcpy((void *)&rsp_data.body.nan_capabilities, (void *)&rsp_vndr_data->capabilities, - sizeof(rsp_data.body.nan_capabilities)); - } - - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(id(), &rsp_data); - ALOGI("NanDiscEnginePrmitive:Received response for cmd [%s], ret %d\n", - NanRspToString(rsp_data.response_type), rsp_data.status); - - return NL_SKIP; - } - - int handleEvent(WifiEvent& event) { - int cmd = event.get_vendor_subcmd(); - u16 attr_type; - int result; - - ALOGI("Received NanDiscEnginePrimitive event: %d\n", event.get_cmd()); - nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA); - - switch(cmd) { - case NAN_EVENT_PUBLISH_TERMINATED: - NanPublishTerminatedInd pub_term_event; - - memset(&pub_term_event, 0, sizeof(NanPublishTerminatedInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - pub_term_event.publish_id = it.get_u16(); - ALOGI("pub id = %u", pub_term_event.publish_id); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - pub_term_event.reason = (NanStatusType)it.get_u8(); - ALOGI("pub termination status %u", pub_term_event.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(pub_term_event.nan_reason, it.get_data(), - sizeof(pub_term_event.nan_reason)); - ALOGI("pub termination reason: %s", pub_term_event.nan_reason); - } else { - ALOGE("Unknown attr: %u\n", attr_type); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventPublishTerminated(&pub_term_event); - break; - - case NAN_EVENT_SUBSCRIBE_MATCH: - NanMatchInd subscribe_event; - - memset(&subscribe_event, 0, sizeof(NanMatchInd)); - - /* By default FW is unable to cache this match */ - subscribe_event.out_of_resource_flag = true; - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - ALOGI("sub id: %u", it.get_u16()); - subscribe_event.publish_subscribe_id = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - ALOGI("pub id: %u", it.get_u16()); - subscribe_event.requestor_instance_id = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(subscribe_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Publisher mac: " MACSTR, MAC2STR(subscribe_event.addr)); - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("svc length %d", it.get_u16()); - subscribe_event.service_specific_info_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(subscribe_event.service_specific_info, it.get_data(), - subscribe_event.service_specific_info_len); - subscribe_event.service_specific_info - [subscribe_event.service_specific_info_len] = '\0'; - ALOGI("service info: %s", subscribe_event.service_specific_info); - } else if (attr_type == NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN) { - ALOGI("sdf match filter length: %d", subscribe_event.sdf_match_filter_len); - subscribe_event.sdf_match_filter_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_TX_MATCH_FILTER) { - memcpy(subscribe_event.sdf_match_filter, it.get_data(), - subscribe_event.sdf_match_filter_len); - subscribe_event.sdf_match_filter - [subscribe_event.sdf_match_filter_len] = '\0'; - ALOGI("sdf match filter: %s", subscribe_event.sdf_match_filter); - } else if (attr_type == NAN_ATTRIBUTE_CIPHER_SUITE_TYPE) { - ALOGI("Peer Cipher suite type: %u", it.get_u8()); - subscribe_event.peer_cipher_type = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SCID_LEN) { - ALOGI("scid length %d", it.get_u32()); - subscribe_event.scid_len= it.get_u32(); - } else if (attr_type == NAN_ATTRIBUTE_SCID) { - memcpy(subscribe_event.scid, it.get_data(), - subscribe_event.scid_len); - subscribe_event.scid - [subscribe_event.scid_len] = '\0'; - ALOGI("scid: %s", subscribe_event.scid); - } else if (attr_type == NAN_ATTRIBUTE_RANGING_INDICATION) { - subscribe_event.range_info.ranging_event_type = it.get_u32(); - ALOGI("ranging indication %d", it.get_u32()); - } else if (attr_type == NAN_ATTRIBUTE_RANGING_RESULT) { - subscribe_event.range_info.range_measurement_mm = it.get_u32(); - ALOGI("ranging result %d", it.get_u32()); - } else if (attr_type == NAN_ATTRIBUTE_RSSI_PROXIMITY) { - subscribe_event.rssi_value = it.get_u8(); - ALOGI("rssi value : %u", it.get_u8()); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("sdea svc length %d", it.get_u16()); - subscribe_event.sdea_service_specific_info_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO) { - memcpy(subscribe_event.sdea_service_specific_info, it.get_data(), - subscribe_event.sdea_service_specific_info_len); - subscribe_event.sdea_service_specific_info - [subscribe_event.sdea_service_specific_info_len] = '\0'; - ALOGI("sdea service info: %s", subscribe_event.sdea_service_specific_info); - } else if (attr_type == NAN_ATTRIBUTE_MATCH_OCCURRED_FLAG) { - ALOGI("match occurred flag: %u", it.get_u8()); - subscribe_event.match_occured_flag = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_OUT_OF_RESOURCE_FLAG) { - ALOGI("Out of resource flag: %u", it.get_u8()); - subscribe_event.out_of_resource_flag = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP) { - ALOGI("Peer config for data path needed: %u", it.get_u8()); - subscribe_event.peer_sdea_params.config_nan_data_path = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE) { - ALOGI("Data Path type: %u", it.get_u8()); - subscribe_event.peer_sdea_params.ndp_type = (NdpType)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_SECURITY) { - ALOGI("Security configuration: %u", it.get_u8()); - subscribe_event.peer_sdea_params.security_cfg = - (NanDataPathSecurityCfgStatus)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT) { - ALOGI("Ranging report state: %u", it.get_u8()); - subscribe_event.peer_sdea_params.range_report = (NanRangeReport)it.get_u8(); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventMatch(&subscribe_event); - break; - - case NAN_EVENT_SUBSCRIBE_UNMATCH: - ALOGE("%s: Not applicable yet\n", __func__); - break; - - case NAN_EVENT_SUBSCRIBE_TERMINATED: - NanSubscribeTerminatedInd sub_term_event; - memset(&sub_term_event, 0, sizeof(NanSubscribeTerminatedInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - sub_term_event.subscribe_id = it.get_u16(); - ALOGI("sub id = %u", sub_term_event.subscribe_id); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - sub_term_event.reason = (NanStatusType)it.get_u16(); - ALOGI("sub termination status %u", sub_term_event.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(sub_term_event.nan_reason, it.get_data(), - sizeof(sub_term_event.nan_reason)); - ALOGI("sub termination reason: %s", sub_term_event.nan_reason); - } else { - ALOGI("Unknown attr: %d\n", attr_type); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventSubscribeTerminated(&sub_term_event); - break; - - case NAN_EVENT_FOLLOWUP: - NanFollowupInd followup_event; - memset(&followup_event, 0, sizeof(NanFollowupInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(followup_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - } else if (attr_type == NAN_ATTRIBUTE_PEER_ID) { - followup_event.publish_subscribe_id = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_INST_ID) { - followup_event.requestor_instance_id = it.get_u32(); - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - followup_event.service_specific_info_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(followup_event.service_specific_info, it.get_data(), - followup_event.service_specific_info_len); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO) { - memcpy(followup_event.sdea_service_specific_info, it.get_data(), - followup_event.sdea_service_specific_info_len); - } - } - counters.transmit_recv++; - GET_NAN_HANDLE(info)->mHandlers.EventFollowup(&followup_event); - break; - - case NAN_EVENT_TRANSMIT_FOLLOWUP_IND: - NanTransmitFollowupInd followup_ind; - counters.transmit_txs++; - memset(&followup_ind, 0, sizeof(NanTransmitFollowupInd)); - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_TRANSAC_ID) { - followup_ind.id = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - followup_ind.reason = (NanStatusType)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(followup_ind.nan_reason, it.get_data(), - sizeof(followup_ind.nan_reason)); - ALOGI("nan transmit followup ind: reason: %s", followup_ind.nan_reason); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventTransmitFollowup(&followup_ind); - break; -#ifdef NOT_YET - case NAN_EVENT_PUBLISH_REPLIED_IND: - NanPublishRepliedInd pub_reply_event; - memset(&pub_reply_event, 0, sizeof(pub_reply_event)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - ALOGI("sub id: %u", it.get_u16()); - pub_reply_event.requestor_instance_id = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(pub_reply_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Subscriber mac: " MACSTR, MAC2STR(pub_reply_event.addr)); - } else if (attr_type == NAN_ATTRIBUTE_RSSI_PROXIMITY) { - pub_reply_event.rssi_value = it.get_u8(); - ALOGI("Received rssi value : %u", it.get_u8()); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventPublishReplied(&pub_reply_event); - break; -#endif /* NOT_YET */ - } // end-of-switch-case - return NL_SKIP; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -class NanDataPathPrimitive : public WifiCommand -{ - NanRequest reqContext; - u32 mNdpId; - NanRequestType mType; - u8 count; - - public: - NanDataPathPrimitive(wifi_interface_handle iface, int id, - NanRequest params, NanRequestType cmdType) - : WifiCommand("NanCommand", iface, id), reqContext(params), mType(cmdType) - { - mNdpId = 0; - count = 0; - } - ~NanDataPathPrimitive() { - ALOGE("NanDataPathPrimitive destroyed\n"); - } - u8 mSvcHash[NAN_SVC_HASH_SIZE]; - u8 mPubNmi[NAN_MAC_ADDR_LEN]; - - void setType(NanRequestType type ) { - mType = type; - } - - int getNdpId() { - return mNdpId; - } - - int createRequest(WifiRequest& request) - { - ALOGI("NAN CMD: %s\n", NanCmdToString(mType)); - if (mType == NAN_DATA_PATH_IFACE_CREATE) { - return createDataPathIfaceRequest(request, (char *)reqContext); - } else if (mType == NAN_DATA_PATH_IFACE_DELETE) { - return deleteDataPathIfaceRequest(request, (char *)reqContext); - } else if (mType == NAN_DATA_PATH_INIT_REQUEST) { - return createDataPathInitRequest(request, - (NanDataPathInitiatorRequest *)reqContext); - } else if (mType == NAN_DATA_PATH_IND_RESPONSE) { - return createDataPathIndResponse(request, - (NanDataPathIndicationResponse *)reqContext); - } else if (mType == NAN_DATA_PATH_END) { - return createDataPathEndRequest(request, - (NanDataPathEndRequest *)reqContext); - } else if (mType == NAN_DATA_PATH_SEC_INFO) { - return createDataPathSecInfoRequest(request, - (NanDataPathSecInfoRequest *)reqContext); - } else { - ALOGE("%s: Unknown NDP request: %d\n", __func__, mType); - } - - return WIFI_SUCCESS; - } - - int createDataPathIfaceRequest(WifiRequest& request, char *iface_name) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_IFACE_CREATE); - if (result < 0) { - ALOGE("%s Failed to create request\n", __func__); - return result; - } - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - result = request.put_string(NAN_ATTRIBUTE_IFACE, (char *)iface_name); - if (result < 0) { - ALOGE("%s: Failed to fill iface, result = %d\n", __func__, result); - return result; - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int deleteDataPathIfaceRequest(WifiRequest& request, char *iface_name) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_IFACE_DELETE); - if (result < 0) { - ALOGE("%s: Failed to create request, result = %d\n", __func__, result); - return result; - } - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_string(NAN_ATTRIBUTE_IFACE, (char *)iface_name); - if (result < 0) { - ALOGE("%s: Failed to fill iface, result = %d\n", __func__, result); - return result; - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int createDataPathSecInfoRequest(WifiRequest& request, NanDataPathSecInfoRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_SEC_INFO); - if (result < 0) { - ALOGE("%s Failed to create request\n", __func__); - return result; - } - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u8(NAN_ATTRIBUTE_PUBLISH_ID, mParams->requestor_instance_id); - if (result < 0) { - ALOGE("%s: Failed to fill instance id = %d, result = %d\n", - __func__, mParams->requestor_instance_id, result); - return result; - } - - result = request.put_addr(NAN_ATTRIBUTE_MAC_ADDR, mParams->peer_disc_mac_addr); - if (result < 0) { - ALOGE("%s: Failed to fill mac addr, result = %d\n", __func__, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_NDP_ID, mParams->ndp_instance_id); - if (result < 0) { - ALOGE("%s: Failed to fill ndp_instance_id = %d, result = %d\n", - __func__, mParams->ndp_instance_id, result); - return result; - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int createDataPathInitRequest(WifiRequest& request, NanDataPathInitiatorRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_REQUEST); - u8 pmk_hex[NAN_PMK_INFO_LEN]; - if (result < 0) { - ALOGE("%s: Failed to create request, result = %d\n", __func__, result); - return result; - } - - mNdpId = mParams->requestor_instance_id; - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u32(NAN_ATTRIBUTE_PUBLISH_ID, mParams->requestor_instance_id); - if (result < 0) { - ALOGE("%s: Failed to fill pub id = %d, result = %d\n", - __func__, mParams->requestor_instance_id, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_CHANNEL, (u32)mParams->channel); - if (result < 0) { - ALOGE("%s: Failed to fill channel = %d, result = %d\n", - __func__, mParams->channel, result); - return result; - } - - result = request.put_addr(NAN_ATTRIBUTE_MAC_ADDR, mParams->peer_disc_mac_addr); - if (result < 0) { - ALOGE("%s: Failed to fill mac addr, result = %d\n", __func__, result); - return result; - } - - result = request.put_string(NAN_ATTRIBUTE_IFACE, mParams->ndp_iface); - if (result < 0) { - ALOGE("%s: Failed to fill ndp_iface, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SECURITY, - (NanDataPathSecurityCfgStatus)mParams->ndp_cfg.security_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill security, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_QOS, - (NanDataPathQosCfg) mParams->ndp_cfg.qos_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill QoS, result = %d\n", __func__, result); - return result; - } - - if (mParams->app_info.ndp_app_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN, - mParams->app_info.ndp_app_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info len = %d, result = %d\n", - __func__, mParams->app_info.ndp_app_info_len, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO, - (void *)mParams->app_info.ndp_app_info, mParams->app_info.ndp_app_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_CIPHER_SUITE_TYPE, - mParams->cipher_type); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_CIPHER_SUITE_TYPE, result = %d\n", - __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_KEY_TYPE, - mParams->key_info.key_type); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_KEY_TYPE, result = %d\n", - __func__, result); - return result; - } - - - if (mParams->service_name_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_NAME_LEN, mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->service_name, mParams->service_name_len); - result = request.put(NAN_ATTRIBUTE_SERVICE_NAME, (void *)mParams->service_name, - mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) { - if (mParams->key_info.body.pmk_info.pmk_len) { - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, - (void *)mParams->key_info.body.pmk_info.pmk, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk, result = %d\n", __func__, result); - return result; - } - } - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) { - if (mParams->key_info.body.passphrase_info.passphrase_len < NAN_SECURITY_MIN_PASSPHRASE_LEN || - mParams->key_info.body.passphrase_info.passphrase_len > NAN_SECURITY_MAX_PASSPHRASE_LEN) { - ALOGE("passphrase must be between %d and %d characters long\n", - NAN_SECURITY_MIN_PASSPHRASE_LEN, - NAN_SECURITY_MAX_PASSPHRASE_LEN); - return NAN_STATUS_INVALID_PARAM; - } else { - memset(pmk_hex, 0, NAN_PMK_INFO_LEN); - result = passphrase_to_pmk(mParams->peer_disc_mac_addr, mParams->cipher_type, - mParams->service_name, &mParams->key_info, pmk_hex); - if (result < 0) { - ALOGE("%s: Failed to convert passphrase to key data, result = %d\n", __func__, result); - return result; - } - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, pmk_hex, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase, result = %d\n", __func__, result); - return result; - } - prhex("PMK", pmk_hex, NAN_PMK_INFO_LEN); - } - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int createDataPathIndResponse(WifiRequest& request, - NanDataPathIndicationResponse *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_RESPONSE); - u8 pmk_hex[NAN_PMK_INFO_LEN]; - if (result < 0) { - ALOGE("%s: Failed to create request, result = %d\n", __func__, result); - return result; - } - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u32(NAN_ATTRIBUTE_NDP_ID, mParams->ndp_instance_id); - if (result < 0) { - ALOGE("%s: Failed to fill ndp_instance_id = %d, result = %d\n", - __func__, mParams->ndp_instance_id, result); - return result; - } - - result = request.put_string(NAN_ATTRIBUTE_IFACE, mParams->ndp_iface); - if (result < 0) { - ALOGE("%s: Failed to fill ndp_iface, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_SECURITY, - (NanDataPathSecurityCfgStatus)mParams->ndp_cfg.security_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill security_cfg, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_QOS, - (NanDataPathQosCfg)mParams->ndp_cfg.qos_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill qos_cfg, result = %d\n", __func__, result); - return result; - } - - if (mParams->app_info.ndp_app_info_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN, - mParams->app_info.ndp_app_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info len = %d, result = %d\n", - __func__, mParams->app_info.ndp_app_info_len, result); - return result; - } - - result = request.put(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO, - (void *)mParams->app_info.ndp_app_info, mParams->app_info.ndp_app_info_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc info, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_RSP_CODE, mParams->rsp_code); - if (result < 0) { - ALOGE("%s: Failed to fill resp code = %d, result = %d\n", - __func__, mParams->rsp_code, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_CIPHER_SUITE_TYPE, - mParams->cipher_type); - if (result < 0) { - ALOGE("%s: Failed to fill cipher_type, result = %d\n", - __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_KEY_TYPE, - mParams->key_info.key_type); - if (result < 0) { - ALOGE("%s: Failed to fill key type, result = %d\n", - __func__, result); - return result; - } - - if (mParams->service_name_len) { - result = request.put_u16(NAN_ATTRIBUTE_SERVICE_NAME_LEN, mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name len, result = %d\n", __func__, result); - return result; - } - - prhex(NULL, mParams->service_name, mParams->service_name_len); - result = request.put(NAN_ATTRIBUTE_SERVICE_NAME, (void *)mParams->service_name, - mParams->service_name_len); - if (result < 0) { - ALOGE("%s: Failed to fill svc name, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PMK) { - if (mParams->key_info.body.pmk_info.pmk_len) { - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, - (void *)mParams->key_info.body.pmk_info.pmk, - mParams->key_info.body.pmk_info.pmk_len); - if (result < 0) { - ALOGE("%s: Failed to fill pmk, result = %d\n", __func__, result); - return result; - } - } - } - - if (mParams->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) { - if (mParams->key_info.body.passphrase_info.passphrase_len < NAN_SECURITY_MIN_PASSPHRASE_LEN || - mParams->key_info.body.passphrase_info.passphrase_len > NAN_SECURITY_MAX_PASSPHRASE_LEN) { - ALOGE("passphrase must be between %d and %d characters long\n", - NAN_SECURITY_MIN_PASSPHRASE_LEN, - NAN_SECURITY_MAX_PASSPHRASE_LEN); - return NAN_STATUS_INVALID_PARAM; - } else { - memset(pmk_hex, 0, NAN_PMK_INFO_LEN); - result = passphrase_to_pmk(mPubNmi, mParams->cipher_type, - mParams->service_name, &mParams->key_info, pmk_hex); - if (result < 0) { - ALOGE("%s: Failed to convert passphrase to key data, result = %d\n", __func__, result); - return result; - } - result = request.put_u32(NAN_ATTRIBUTE_KEY_LEN, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase len, result = %d\n", __func__, result); - return result; - } - result = request.put(NAN_ATTRIBUTE_KEY_DATA, pmk_hex, NAN_PMK_INFO_LEN); - if (result < 0) { - ALOGE("%s: Failed to fill passphrase, result = %d\n", __func__, result); - return result; - } - } - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int createDataPathEndRequest(WifiRequest& request, NanDataPathEndRequest *mParams) - { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DATA_PATH_END); - if (result < 0) { - ALOGE("%s: Failed to create request, result = %d\n", __func__, result); - return result; - } - - count = mParams->num_ndp_instances; - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - result = request.put_u8(NAN_ATTRIBUTE_INST_COUNT, mParams->num_ndp_instances); - if (result < 0) { - ALOGE("%s: Failed to fill num_ndp_instances = %d, result = %d\n", - __func__, mParams->num_ndp_instances, result); - return result; - } - - while (count) { - result = request.put_u32(NAN_ATTRIBUTE_NDP_ID, mParams->ndp_instance_id[count-1]); - if (result < 0) { - ALOGE("%s: Failed to fill ndp id = %d, result = %d\n", - __func__, mParams->ndp_instance_id[count-1], result); - return result; - } - ALOGE("%s:NDP ID = %d\n", __func__, mParams->ndp_instance_id[count-1]); - count -= 1; - } - - request.attr_end(data); - return WIFI_SUCCESS; - } - - int open() - { - WifiRequest request(familyId(), ifaceId()); - int result = createRequest(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: failed to create setup request; result = %d", __func__, result); - return result; - } - - result = requestResponse(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: failed to configure setup; result = %d", __func__, result); - return result; - } - - request.destroy(); - return WIFI_SUCCESS; - } - - virtual bool valid_dp_response_type(int response_type) { - bool valid = false; - switch(response_type) { - case NAN_DP_INTERFACE_CREATE: - case NAN_DP_INTERFACE_DELETE: - case NAN_DP_INITIATOR_RESPONSE: - case NAN_DP_RESPONDER_RESPONSE: - case NAN_DP_END: - valid = true; - break; - default: - ALOGE("NanDataPathPrmitive::Unknown cmd Response: %d\n", response_type); - break; - } - return valid; - } - - int handleResponse(WifiEvent& reply) - { - nan_hal_resp_t *rsp_vndr_data = NULL; - - if (reply.get_cmd() != NL80211_CMD_VENDOR || reply.get_vendor_data() == NULL) { - ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); - return NL_SKIP; - } - - rsp_vndr_data = (nan_hal_resp_t *)reply.get_vendor_data(); - ALOGI("NanDataPathPrmitive::handle response\n"); - int32_t result = rsp_vndr_data->value; - NanResponseMsg rsp_data; - - memset(&rsp_data, 0, sizeof(NanResponseMsg)); - rsp_data.response_type = get_response_type((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd); - - if ((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd == NAN_SUBCMD_DATA_PATH_SEC_INFO) { - /* Follow through */ - } else if (!valid_dp_response_type(rsp_data.response_type)) { - return NL_SKIP; - } - rsp_data.status = nan_map_response_status(rsp_vndr_data->status); - ALOGE("Mapped hal status = %d\n", rsp_data.status); - - if (rsp_vndr_data->nan_reason[0] == '\0') { - memcpy(rsp_data.nan_error, NanStatusToString(rsp_data.status), - strlen(NanStatusToString(rsp_data.status))); - rsp_data.nan_error[strlen(NanStatusToString(rsp_data.status))] = '\0'; - } - rsp_data.nan_error[NAN_ERROR_STR_LEN - 1] = '\0'; - ALOGI("\n Received nan_error string %s\n", (u8*)rsp_data.nan_error); - - if (rsp_data.response_type == NAN_DP_INITIATOR_RESPONSE) { - ALOGI("received ndp instance_id %d and ret = %d\n", rsp_vndr_data->ndp_instance_id, result); - rsp_data.body.data_request_response.ndp_instance_id = rsp_vndr_data->ndp_instance_id; - mNdpId = rsp_vndr_data->ndp_instance_id; - } else if ((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd == NAN_SUBCMD_DATA_PATH_SEC_INFO) { - memcpy(mPubNmi, rsp_vndr_data->pub_nmi, NAN_MAC_ADDR_LEN); - memcpy(mSvcHash, rsp_vndr_data->svc_hash, NAN_SVC_HASH_SIZE); - return NL_SKIP; - } - - ALOGI("NanDataPathPrmitive:Received response for cmd [%s], ret %d\n", - NanRspToString(rsp_data.response_type), rsp_data.status); - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(id(), &rsp_data); - return NL_SKIP; - } - - int handleEvent(WifiEvent& event) - { - int cmd = event.get_vendor_subcmd(); - u16 attr_type; - - nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA); - - switch(cmd) { - case NAN_EVENT_DATA_REQUEST: { - NanDataPathRequestInd ndp_request_event; - memset(&ndp_request_event, 0, sizeof(NanDataPathRequestInd)); - u16 ndp_ind_app_info_len = 0; - counters.dp_req_evt++; - ALOGI("Received NAN_EVENT_DATA_REQUEST_INDICATION\n"); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - ALOGI("publish_id: %u", it.get_u16()); - ndp_request_event.service_instance_id = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(ndp_request_event.peer_disc_mac_addr, - it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Discovery MAC addr of the peer/initiator: " MACSTR "\n", - MAC2STR(ndp_request_event.peer_disc_mac_addr)); - - } else if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - ALOGI("ndp id: %u", it.get_u32()); - ndp_request_event.ndp_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_SECURITY) { - ALOGI("security: %u", - (NanDataPathSecurityCfgStatus)it.get_u8()); - ndp_request_event.ndp_cfg.security_cfg = - (NanDataPathSecurityCfgStatus)it.get_u8(); - - } else if (attr_type == NAN_ATTRIBUTE_QOS) { - ALOGI("QoS: %u", (NanDataPathQosCfg)it.get_u8()); - ndp_request_event.ndp_cfg.qos_cfg = (NanDataPathQosCfg)it.get_u8(); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ndp_request_event.app_info.ndp_app_info_len = it.get_u16(); - ndp_ind_app_info_len = ndp_request_event.app_info.ndp_app_info_len; - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(ndp_request_event.app_info.ndp_app_info, it.get_data(), - ndp_ind_app_info_len); - ndp_request_event.app_info.ndp_app_info - [ndp_ind_app_info_len] = '\0'; - ALOGI("service info: %s", ndp_request_event.app_info.ndp_app_info); - - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataRequest(&ndp_request_event); - break; - } - case NAN_EVENT_DATA_CONFIRMATION: { - NanDataPathConfirmInd ndp_create_confirmation_event; - memset(&ndp_create_confirmation_event, 0, sizeof(NanDataPathConfirmInd)); - u16 ndp_conf_app_info_len = 0; - counters.dp_confirm_evt++; - ALOGI("Received NAN_EVENT_DATA_CONFIRMATION\n"); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - ALOGI("ndp id: %u", it.get_u32()); - ndp_create_confirmation_event.ndp_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_PEER_NDI_MAC_ADDR) { - memcpy(ndp_create_confirmation_event.peer_ndi_mac_addr, it.get_data(), - NAN_MAC_ADDR_LEN); - ALOGI("NDI mac address of the peer: " MACSTR "\n", - MAC2STR(ndp_create_confirmation_event.peer_ndi_mac_addr)); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("service info len: %d", it.get_u16()); - ndp_create_confirmation_event.app_info.ndp_app_info_len = it.get_u16(); - ndp_conf_app_info_len = ndp_create_confirmation_event.app_info.ndp_app_info_len; - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(ndp_create_confirmation_event.app_info.ndp_app_info, - it.get_data(), ndp_conf_app_info_len); - ndp_create_confirmation_event.app_info.ndp_app_info[ndp_conf_app_info_len] - = '\0'; - ALOGI("service info: %s", - ndp_create_confirmation_event.app_info.ndp_app_info); - - } else if (attr_type == NAN_ATTRIBUTE_RSP_CODE) { - ALOGI("response code: %u", (NanDataPathResponseCode)it.get_u8()); - ndp_create_confirmation_event.rsp_code = - (NanDataPathResponseCode)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - ALOGI("reason code %u", (NanDataPathResponseCode)it.get_u8()); - ndp_create_confirmation_event.rsp_code = - (NanDataPathResponseCode)it.get_u8(); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataConfirm(&ndp_create_confirmation_event); - break; - } - case NAN_EVENT_DATA_END: { - NanDataPathEndInd ndp_end_event; - memset(&ndp_end_event, 0, sizeof(NanDataPathEndInd)); - u16 attr_type; - ALOGI("Received NAN_EVENT_DATA_END\n"); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_INST_COUNT) { - ALOGI("ndp count: %u\n", it.get_u8()); - ndp_end_event.num_ndp_instances = it.get_u8(); - count = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - while (count) { - ndp_end_event.ndp_instance_id[count-1] = it.get_u32(); - ALOGI("NDP Id from the Event = %u\n", ndp_end_event.ndp_instance_id[count-1]); - count -= 1; - } - } else { - ALOGI("Unknown attr_type: %s\n", NanAttrToString(attr_type)); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataEnd(&ndp_end_event); - break; - } - } // end-of-switch - return NL_SKIP; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -class NanMacControl : public WifiCommand -{ - NanRequest mParams; - transaction_id mId = NAN_MAC_INVALID_TRANSID; - wifi_interface_handle mIface; - NanRequestType mType; - u32 mVersion; - - public: - NanMacControl(wifi_interface_handle iface, int id, - NanRequest params, NanRequestType cmdType) - : WifiCommand("NanCommand", iface, id), mParams(params), mType(cmdType) - { - mVersion = 0; - setIface(iface); - setId(id); - } - ~NanMacControl() { - ALOGE("NanMacControl destroyed\n"); - } - - void setIface(wifi_interface_handle iface ) { - mIface = iface; - } - - void setId(transaction_id id) { - if (id != NAN_MAC_INVALID_TRANSID) { - mId = id; - } - } - - transaction_id getId() { - return mId; - } - - void setType(NanRequestType type) { - mType = type; - } - u32 getVersion() { - return mVersion; - } - - void setMsg(NanRequest params) { - mParams = params; - } - - int createRequest(WifiRequest& request) { - ALOGI("NAN CMD: %s\n", NanCmdToString(mType)); - if (mType == NAN_REQUEST_ENABLE) { - return createEnableRequest(request, (NanEnableRequest *)mParams); - } else if (mType == NAN_REQUEST_DISABLE) { - return createDisableRequest(request); - } else if (mType == NAN_REQUEST_CONFIG) { - return createConfigRequest(request, (NanConfigRequest*)mParams); - } else if (mType == NAN_REQUEST_STATS) { - /* TODO: Not yet implemented */ - } else if (mType == NAN_REQUEST_TCA) { - /* TODO: Not yet implemented */ - } else if (mType == NAN_VERSION_INFO) { - return createVersionRequest(request); -#ifdef NAN_CLUSTER_MERGE - } else if (mType == NAN_REQUEST_ENABLE_MERGE) { - return createEnableMergeRequest(request, (NanEnableMergeRequest *)mParams); -#endif /* NAN_CLUSTER_MERGE */ - } else { - ALOGE("Unknown Nan request\n"); - } - - return WIFI_SUCCESS; - } - - int createVersionRequest(WifiRequest& request) { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_VERSION_INFO); - if (result < 0) { - ALOGE("%s: Fail to create request\n", __func__); - return result; - } - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int createEnableRequest(WifiRequest& request, NanEnableRequest *mParams) { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_ENABLE); - s8 rssi; - if (result < 0) { - ALOGE("%s: Fail to create request\n", __func__); - return result; - } - - NAN_DBG_ENTER(); - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - if (mParams->config_2dot4g_support) { - result = request.put_u8(NAN_ATTRIBUTE_2G_SUPPORT, mParams->support_2dot4g_val); - if (result < 0) { - ALOGE("%s: Failing in 2g support, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_support_5g) { - result = request.put_u8(NAN_ATTRIBUTE_5G_SUPPORT, mParams->support_5g_val); - if (result < 0) { - ALOGE("%s: Failing in 5g support, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u16(NAN_ATTRIBUTE_CLUSTER_LOW, mParams->cluster_low); - if (result < 0) { - ALOGE("%s: Failing in cluster low, result = %d\n", __func__, result); - return result; - } - - result = request.put_u16(NAN_ATTRIBUTE_CLUSTER_HIGH, mParams->cluster_high); - if (result < 0) { - ALOGE("%s: Failing in cluster high, result = %d\n", __func__, result); - return result; - } - - if (mParams->config_sid_beacon) { - result = request.put_u8(NAN_ATTRIBUTE_SID_BEACON, mParams->sid_beacon_val); - if (result < 0) { - ALOGE("%s: Failing in sid beacon, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_subscribe_sid_beacon) { - result = request.put_u8(NAN_ATTRIBUTE_SUB_SID_BEACON, mParams->subscribe_sid_beacon_val); - if (result < 0) { - ALOGE("%s: Failing in sub sid beacon, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_2dot4g_beacons) { - result = request.put_u8(NAN_ATTRIBUTE_SYNC_DISC_2G_BEACON, mParams->beacon_2dot4g_val); - if (result < 0) { - ALOGE("%s: Failing in beacon_2dot4g_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_beacons) { - result = request.put_u8(NAN_ATTRIBUTE_SYNC_DISC_5G_BEACON, mParams->beacon_5g_val); - if (result < 0) { - ALOGE("%s: Failing in 5g beacon, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_2dot4g_sdf) { - result = request.put_u8(NAN_ATTRIBUTE_SDF_2G_SUPPORT, mParams->sdf_2dot4g_val); - if (result < 0) { - ALOGE("%s: Failing in 2dot4g sdf, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_sdf) { - result = request.put_u8(NAN_ATTRIBUTE_SDF_5G_SUPPORT, mParams->sdf_5g_val); - if (result < 0) { - ALOGE("%s: Failing in 5g sdf, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_2dot4g_rssi_close) { - if (ISGREATER(mParams->rssi_close_2dot4g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_close_2dot4g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_CLOSE, rssi); - if (result < 0) { - ALOGE("%s: Failing in 2g rssi close, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_2dot4g_rssi_middle) { - if (ISGREATER(mParams->rssi_middle_2dot4g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_middle_2dot4g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_MIDDLE, rssi); - if (result < 0) { - ALOGE("%s: Failing in 2g rssi middle, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_2dot4g_rssi_proximity) { - if (ISGREATER(mParams->rssi_proximity_2dot4g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_proximity_2dot4g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_PROXIMITY, rssi); - if (result < 0) { - ALOGE("%s: Failing in 2g rssi proximity, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_rssi_close) { - if (ISGREATER(mParams->rssi_close_5g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_close_5g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_CLOSE_5G, rssi); - if (result < 0) { - ALOGE("%s: Failing in 5g rssi close, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_rssi_middle) { - if (ISGREATER(mParams->rssi_middle_5g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_middle_5g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_MIDDLE_5G, rssi); - if (result < 0) { - ALOGE("%s: Failing in 5g rssi middle, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_rssi_close_proximity) { - if (ISGREATER(mParams->rssi_close_proximity_5g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_close_proximity_5g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_PROXIMITY_5G, rssi); - if (result < 0) { - ALOGE("%s: Failing in rssi_close_proximity_5g_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_cluster_attribute_val) { - result = request.put_u8(NAN_ATTRIBUTE_CONF_CLUSTER_VAL, mParams->config_cluster_attribute_val); - if (result < 0) { - ALOGE("%s: Failing in config_cluster_attribute_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_hop_count_limit) { - result = request.put_u8(NAN_ATTRIBUTE_HOP_COUNT_LIMIT, - mParams->hop_count_limit_val); - if (result < 0) { - ALOGE("%s: Failing in hop cnt limit, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_oui) { - ALOGI("%s: oui = 0x%04x\n", __func__, mParams->oui_val); - result = request.put_u32(NAN_ATTRIBUTE_OUI, mParams->oui_val); - if (result < 0) { - ALOGE("%s: Failing in oui, result = %d\n", __func__, result); - return result; - } - } - - result = request.put_u8(NAN_ATTRIBUTE_MASTER_PREF, mParams->master_pref); - if (result < 0) { - ALOGE("%s: Failing in master pref, result = %d\n", __func__, result); - return result; - } - if (mParams->config_random_factor_force) { - result = request.put_u8(NAN_ATTRIBUTE_RANDOM_FACTOR, mParams->random_factor_force_val); - if (result < 0) { - ALOGE("%s: Failing in random factor, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_24g_channel) { - result = request.put_u32(NAN_ATTRIBUTE_24G_CHANNEL, mParams->channel_24g_val); - if (result < 0) { - ALOGE("%s: Failing in 2.4g channel, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_channel) { - result = request.put_u32(NAN_ATTRIBUTE_5G_CHANNEL, mParams->channel_5g_val); - if (result < 0) { - ALOGE("%s: Failing in 5g channel, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_intf_addr) { - result = request.put_addr(NAN_ATTRIBUTE_IF_ADDR, mParams->intf_addr_val); - if (result < 0) { - ALOGE("%s: Failing in intf addr val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_dw.config_2dot4g_dw_band) { - result = request.put_u32(NAN_ATTRIBUTE_2G_AWAKE_DW, mParams->config_dw.dw_2dot4g_interval_val); - if (result < 0) { - ALOGE("%s: Failing in 2dot4g awake dw, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_dw.config_5g_dw_band) { - result = request.put_u32(NAN_ATTRIBUTE_5G_AWAKE_DW, mParams->config_dw.dw_5g_interval_val); - if (result < 0) { - ALOGE("%s: Failing in 5g awake dw, result = %d\n", __func__, result); - return result; - } - } - - if (ISGREATER(mParams->discovery_indication_cfg, NAN_DISC_IND_MAX)) { - ALOGE("%s:Invalid disc_ind_cfg value.\n", __FUNCTION__); - return WIFI_ERROR_INVALID_ARGS; - } - - result = request.put_u8(NAN_ATTRIBUTE_DISC_IND_CFG, - mParams->discovery_indication_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_DISC_IND_CFG, result = %d\n", - __func__, result); - return result; - } - - if (mParams->config_rssi_window_size) { - result = request.put_u8(NAN_ATTRIBUTE_RSSI_WINDOW_SIZE, - mParams->rssi_window_size_val); - if (result < 0) { - ALOGE("%s: Failing in rssi_window_size_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_scan_params) { - result = request.put_u8(NAN_ATTRIBUTE_DWELL_TIME, - mParams->scan_params_val.dwell_time[0]); - if (result < 0) { - ALOGE("%s: Failing in dwell time, result = %d\n", __func__, result); - return result; - } - result = request.put_u8(NAN_ATTRIBUTE_DWELL_TIME_5G, - mParams->scan_params_val.dwell_time[1]); - if (result < 0) { - ALOGE("%s: Failing in 5g dwell time, result = %d\n", __func__, result); - return result; - } - result = request.put_u16(NAN_ATTRIBUTE_SCAN_PERIOD, - mParams->scan_params_val.scan_period[0]); - if (result < 0) { - ALOGE("%s: Failing in scan_period, result = %d\n", __func__, result); - return result; - } - result = request.put_u16(NAN_ATTRIBUTE_SCAN_PERIOD_5G, - mParams->scan_params_val.scan_period[1]); - if (result < 0) { - ALOGE("%s: Failing in 5g scan_period, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_disc_mac_addr_randomization) { - result = request.put_u32(NAN_ATTRIBUTE_RANDOMIZATION_INTERVAL, - mParams->disc_mac_addr_rand_interval_sec); - if (result < 0) { - ALOGE("%s: Failing to fill rand mac address interval, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_discovery_beacon_int) { - result = request.put_u32(NAN_ATTRIBUTE_DISCOVERY_BEACON_INTERVAL, - mParams->discovery_beacon_interval); - if (result < 0) { - ALOGE("%s: Failing to fill disc beacon interval, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_nss) { - result = request.put_u32(NAN_ATTRIBUTE_NSS, mParams->nss); - if (result < 0) { - ALOGE("%s: Failing to fill nss, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_enable_ranging) { - result = request.put_u32(NAN_ATTRIBUTE_ENABLE_RANGING, mParams->enable_ranging); - if (result < 0) { - ALOGE("%s: Failing to fill enable ranging value, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_dw_early_termination) { - result = request.put_u32(NAN_ATTRIBUTE_DW_EARLY_TERM, mParams->enable_dw_termination); - if (result < 0) { - ALOGE("%s: Failing to fill enable dw termination value, result = %d\n", - __func__, result); - return result; - } - } - - if (mParams->config_ndpe_attr) { - result = request.put_u32(NAN_ATTRIBUTE_CMD_USE_NDPE, - mParams->use_ndpe_attr); - if (result < 0) { - ALOGE("%s: Failing to fill use_ndpe, result = %d\n", __func__, result); - return result; - } - } - - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int createDisableRequest(WifiRequest& request) { - NAN_DBG_ENTER(); - - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_DISABLE); - if (result < 0) { - ALOGE("%s: Fail to create request, result = %d\n", __func__, result); - return result; - } - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - request.attr_end(data); - - NAN_DBG_EXIT(); - return result; - } - -#ifdef NAN_CLUSTER_MERGE - int createEnableMergeRequest(WifiRequest& request, - NanEnableMergeRequest *mParams) { - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_ENABLE_MERGE); - if (result < 0) { - ALOGE("%s: Fail to create request\n", __func__); - return result; - } - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - result = request.put_u8(NAN_ATTRIBUTE_ENABLE_MERGE, mParams->enable); - if (result < 0) { - ALOGE("%s: Failing in enable merge, result = %d\n", __func__, result); - return result; - } - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } -#endif /* NAN_CLUSTER_MERGE */ - - int createConfigRequest(WifiRequest& request, NanConfigRequest *mParams) { - - int result = request.create(GOOGLE_OUI, NAN_SUBCMD_CONFIG); - s8 rssi; - if (result < 0) { - ALOGE("%s: Fail to create config request\n", __func__); - return result; - } - - NAN_DBG_ENTER(); - - nlattr *data = request.attr_start(NL80211_ATTR_VENDOR_DATA); - - if (mParams->config_sid_beacon) { - result = request.put_u8(NAN_ATTRIBUTE_SID_BEACON, mParams->sid_beacon); - if (result < 0) { - ALOGE("%s: Failing in sid beacon, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_subscribe_sid_beacon) { - result = request.put_u8(NAN_ATTRIBUTE_SUB_SID_BEACON, mParams->subscribe_sid_beacon_val); - if (result < 0) { - ALOGE("%s: Failing in sub sid beacon, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_rssi_proximity) { - if (ISGREATER(mParams->rssi_proximity, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_proximity; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_PROXIMITY, rssi); - if (result < 0) { - ALOGE("%s: Failing in rssi_proximity, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_master_pref) { - ALOGI("%s: master pref = %u\n", __func__, mParams->master_pref); - result = request.put_u8(NAN_ATTRIBUTE_MASTER_PREF, mParams->master_pref); - if (result < 0) { - ALOGE("%s: Failing in master pref, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_5g_rssi_close_proximity) { - if (ISGREATER(mParams->rssi_close_proximity_5g_val, NAN_MAX_RSSI)) { - ALOGI("%s: Invalid rssi param \n", __func__); - return WIFI_ERROR_INVALID_ARGS; - } - rssi = -mParams->rssi_close_proximity_5g_val; - result = request.put_s8(NAN_ATTRIBUTE_RSSI_PROXIMITY_5G, rssi); - if (result < 0) { - ALOGE("%s: Failing in rssi_close_proximity_5g_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_rssi_window_size) { - result = request.put_u8(NAN_ATTRIBUTE_RSSI_WINDOW_SIZE, - mParams->rssi_window_size_val); - if (result < 0) { - ALOGE("%s: Failing in rssi_window_size_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_scan_params) { - result = request.put_u8(NAN_ATTRIBUTE_DWELL_TIME, - mParams->scan_params_val.dwell_time[0]); - if (result < 0) { - ALOGE("%s: Failing in dwell time, result = %d\n", __func__, result); - return result; - } - - result = request.put_u8(NAN_ATTRIBUTE_DWELL_TIME_5G, - mParams->scan_params_val.dwell_time[1]); - if (result < 0) { - ALOGE("%s: Failing in 5g dwell time, result = %d\n", __func__, result); - return result; - } - result = request.put_u16(NAN_ATTRIBUTE_SCAN_PERIOD, - mParams->scan_params_val.scan_period[0]); - if (result < 0) { - ALOGE("%s: Failing in scan_period, result = %d\n", __func__, result); - return result; - } - - result = request.put_u16(NAN_ATTRIBUTE_SCAN_PERIOD_5G, - mParams->scan_params_val.scan_period[1]); - if (result < 0) { - ALOGE("%s: Failing in 5g scan_period, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_random_factor_force) { - result = request.put_u8(NAN_ATTRIBUTE_RANDOM_FACTOR, mParams->random_factor_force_val); - if (result < 0) { - ALOGE("%s: Failing in random factor, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_hop_count_force) { - result = request.put_u8(NAN_ATTRIBUTE_HOP_COUNT_LIMIT, - mParams->hop_count_force_val); - if (result < 0) { - ALOGE("%s: Failing in hop cnt limit, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_cluster_attribute_val) { - result = request.put_u8(NAN_ATTRIBUTE_CONF_CLUSTER_VAL, mParams->config_cluster_attribute_val); - if (result < 0) { - ALOGE("%s: Failing in config_cluster_attribute_val, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_fam) { - while (mParams->fam_val.numchans) { - result = request.put_u8(NAN_ATTRIBUTE_ENTRY_CONTROL, - mParams->fam_val.famchan[mParams->fam_val.numchans].entry_control); - if (result < 0) { - ALOGE("%s: Failing in entry control, result = %d\n", __func__, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_CHANNEL, - (u32)mParams->fam_val.famchan[mParams->fam_val.numchans].channel); - if (result < 0) { - ALOGE("%s: Failed to fill channel = %d, result = %d\n", __func__, - mParams->fam_val.famchan[mParams->fam_val.numchans].channel, result); - return result; - } - - result = request.put_u32(NAN_ATTRIBUTE_AVAIL_BIT_MAP, - (u32)mParams->fam_val.famchan[mParams->fam_val.numchans].avail_interval_bitmap); - if (result < 0) { - ALOGE("%s: Failed to fill avail interval bitmap = %d, result = %d\n", __func__, - mParams->fam_val.famchan[mParams->fam_val.numchans].avail_interval_bitmap, result); - return result; - } - mParams->fam_val.numchans -= 1; - } - - } - - if (mParams->config_dw.config_2dot4g_dw_band) { - result = request.put_u32(NAN_ATTRIBUTE_2G_AWAKE_DW, mParams->config_dw.dw_2dot4g_interval_val); - if (result < 0) { - ALOGE("%s: Failing in 2dot4g awake dw, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_dw.config_5g_dw_band) { - result = request.put_u32(NAN_ATTRIBUTE_5G_AWAKE_DW, mParams->config_dw.dw_5g_interval_val); - if (result < 0) { - ALOGE("%s: Failing in 5g awake dw, result = %d\n", __func__, result); - return result; - } - } - if (ISGREATER(mParams->discovery_indication_cfg, NAN_DISC_IND_MAX)) { - ALOGE("%s:Invalid disc_ind_cfg value.\n", __FUNCTION__); - return WIFI_ERROR_INVALID_ARGS; - } - result = request.put_u8(NAN_ATTRIBUTE_DISC_IND_CFG, - mParams->discovery_indication_cfg); - if (result < 0) { - ALOGE("%s: Failed to fill NAN_ATTRIBUTE_DISC_IND_CFG, result = %d\n", - __func__, result); - return result; - } - if (mParams->config_disc_mac_addr_randomization) { - result = request.put_u32(NAN_ATTRIBUTE_RANDOMIZATION_INTERVAL, - mParams->disc_mac_addr_rand_interval_sec); - if (result < 0) { - ALOGE("%s: Failing in 5g scan_period, result = %d\n", __func__, result); - return result; - } - } - if (mParams->config_ndpe_attr) { - result = request.put_u32(NAN_ATTRIBUTE_CMD_USE_NDPE, - mParams->use_ndpe_attr); - if (result < 0) { - ALOGE("%s: Failing to fill use_ndpe, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_disc_mac_addr_randomization) { - result = request.put_u32(NAN_ATTRIBUTE_RANDOMIZATION_INTERVAL, - mParams->disc_mac_addr_rand_interval_sec); - if (result < 0) { - ALOGE("%s: Failing to fill rand mac interval, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_discovery_beacon_int) { - result = request.put_u32(NAN_ATTRIBUTE_DISCOVERY_BEACON_INTERVAL, - mParams->discovery_beacon_interval); - if (result < 0) { - ALOGE("%s: Failing to fill disc beacon interval, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_nss) { - result = request.put_u32(NAN_ATTRIBUTE_NSS, mParams->nss); - if (result < 0) { - ALOGE("%s: Failing to fill nss, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_enable_ranging) { - result = request.put_u32(NAN_ATTRIBUTE_ENABLE_RANGING, mParams->enable_ranging); - if (result < 0) { - ALOGE("%s: Failing to fill enable ranging value, result = %d\n", __func__, result); - return result; - } - } - - if (mParams->config_dw_early_termination) { - result = request.put_u32(NAN_ATTRIBUTE_DW_EARLY_TERM, mParams->enable_dw_termination); - if (result < 0) { - ALOGE("%s: Failing to fill enable dw termination value, result = %d\n", - __func__, result); - return result; - } - } - request.attr_end(data); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int start() - { - NAN_DBG_ENTER(); - - WifiRequest request(familyId(), ifaceId()); - int result = createRequest(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to create setup request; result = %d", __func__, result); - return result; - } - - result = requestResponse(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to configure setup; result = %d", __func__, result); - return result; - } - - request.destroy(); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int cancel() - { - NAN_DBG_ENTER(); - - WifiRequest request(familyId(), ifaceId()); - int result = createRequest(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to create setup request; result = %d", __func__, result); - return result; - } - - result = requestResponse(request); - if (result != WIFI_SUCCESS) { - ALOGE("%s: Failed to configure setup; result = %d", __func__, result); - return result; - } - - request.destroy(); - NAN_DBG_EXIT(); - return WIFI_SUCCESS; - } - - int handleResponse(WifiEvent& reply) { - nan_hal_resp_t *rsp_vndr_data = NULL; - - if (reply.get_cmd() != NL80211_CMD_VENDOR || reply.get_vendor_data() == NULL) { - ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); - return NL_SKIP; - } - - rsp_vndr_data = (nan_hal_resp_t *)reply.get_vendor_data(); - ALOGI("NanMacControl::handleResponse\n"); - if (mType == NAN_VERSION_INFO) { - mVersion = *((u32*)reply.get_vendor_data()); - ALOGI("Response not required for version cmd %d\n", mVersion); - return NL_SKIP; - } - if (rsp_vndr_data->subcmd == NAN_SUBCMD_CONFIG) { - NanResponseMsg rsp_data; - memset(&rsp_data, 0, sizeof(NanResponseMsg)); - rsp_data.response_type = get_response_type((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd); - rsp_data.status = nan_map_response_status(rsp_vndr_data->status); - - ALOGI("NanMacControl:Received response for cmd [%s], TxID %d ret %d\n", - NanRspToString(rsp_data.response_type), id(), rsp_data.status); - - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(id(), &rsp_data); - } - if (rsp_vndr_data->subcmd == NAN_SUBCMD_ENABLE) { - NanResponseMsg rsp_data; - memset(&rsp_data, 0, sizeof(NanResponseMsg)); - rsp_data.response_type = get_response_type((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd); - rsp_data.status = nan_map_response_status(rsp_vndr_data->status); - - ALOGI("NanMacControl:Received response for cmd [%s], TxID %d ret %d\n", - NanRspToString(rsp_data.response_type), mId, rsp_data.status); - - if( rsp_data.status != NAN_STATUS_SUCCESS) { - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(mId, &rsp_data); - } - } - return NL_SKIP; - } - - int handleAsyncResponse(nan_hal_resp_t *rsp_vndr_data) { - NanResponseMsg rsp_data; - ALOGI("NanMacControl::handleAsyncResponse\n"); - /* Enable response will be provided to framework in event path */ - if (rsp_vndr_data->subcmd == NAN_SUBCMD_ENABLE) { - return NL_SKIP; - } - memset(&rsp_data, 0, sizeof(NanResponseMsg)); - rsp_data.response_type = get_response_type((WIFI_SUB_COMMAND)rsp_vndr_data->subcmd); - rsp_data.status = nan_map_response_status(rsp_vndr_data->status); - ALOGE("Mapped hal status = %d\n", rsp_data.status); - - /* populate error string if not coming from DHD */ - if (rsp_vndr_data->nan_reason[0] == '\0') { - memcpy(rsp_data.nan_error, NanStatusToString(rsp_data.status), - strlen(NanStatusToString(rsp_data.status))); - rsp_data.nan_error[strlen(NanStatusToString(rsp_data.status))] = '\0'; - } - rsp_data.nan_error[NAN_ERROR_STR_LEN - 1] = '\0'; - ALOGI("\n Received nan_error string %s\n", (u8*)rsp_data.nan_error); - ALOGI("Retrieved ID = %d\n", mId); - - if ((rsp_vndr_data->subcmd == NAN_SUBCMD_DISABLE) && - (mId != NAN_MAC_INVALID_TRANSID)) { - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(mId, &rsp_data); - mId = NAN_MAC_INVALID_TRANSID; - } - return NL_SKIP; - } - - int handleEvent(WifiEvent& event) { - u16 inst_id; - u32 ndp_instance_id = 0; - int event_id = event.get_vendor_subcmd(); - nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA); - int len = event.get_vendor_data_len(); - u16 attr_type; - nan_hal_resp_t *rsp_vndr_data = NULL; - - ALOGI("%s: Received NanMacControl event = %d (len=%d)\n", - __func__, event.get_cmd(), len); - if (!vendor_data || len == 0) { - ALOGE("No event data found"); - return NL_SKIP; - } - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (it.get_type() == NAN_ATTRIBUTE_HANDLE) { - inst_id = it.get_u8(); - } else if (it.get_type() == NAN_ATTRIBUTE_NDP_ID) { - ndp_instance_id = it.get_u32(); - ALOGI("handleEvent: ndp_instance_id = [%d]\n", ndp_instance_id); - } else if (attr_type == NAN_ATTRIBUTE_CMD_RESP_DATA) { - ALOGI("sizeof cmd response data: %d, it.get_len() = %d\n", - sizeof(nan_hal_resp_t), it.get_len()); - if (it.get_len() == sizeof(nan_hal_resp_t)) { - rsp_vndr_data = (nan_hal_resp_t*)it.get_data(); - } else { - ALOGE("Wrong cmd response data received\n"); - return NL_SKIP; - } - } - } - - ALOGI("Received vendor sub cmd %d\n", event_id); - if (is_de_event(event_id)) { - - NanDiscEnginePrimitive *de_prim = - (NanDiscEnginePrimitive *)(info.nan_disc_control); - if (de_prim != NULL) { - de_prim->handleEvent(event); - } else { - ALOGE("%s: de_primitive is no more available\n", __func__); - } - return NL_SKIP; - - } else if (is_dp_event(event_id)) { - - NanDataPathPrimitive *dp_prim = - (NanDataPathPrimitive *)(info.nan_dp_control); - ALOGI("ndp_instance_id = [%d]\n", ndp_instance_id); - if (dp_prim != NULL) { - dp_prim->handleEvent(event); - } else { - ALOGE("%s: dp_primitive is no more available\n", __func__); - } - return NL_SKIP; - } else { - if (is_cmd_response(event_id)) { - ALOGE("Handling cmd response asynchronously\n"); - handleAsyncResponse(rsp_vndr_data); - } - } - - switch(event_id) { - case NAN_EVENT_DE_EVENT: - NanDiscEngEventInd de_event; - memset(&de_event, 0, sizeof(de_event)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_CLUSTER_ID) { - memcpy(&de_event.data.cluster.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("cluster id = " MACSTR "\n", MAC2STR(de_event.data.cluster.addr)); - } else if (attr_type == NAN_ATTRIBUTE_ENABLE_STATUS) { - ALOGI("nan enable status = %u\n", it.get_u16()); - } else if (attr_type == NAN_ATTRIBUTE_JOIN_STATUS) { - ALOGI("nan joined status = %u\n", it.get_u16()); - } else if (attr_type == NAN_ATTRIBUTE_DE_EVENT_TYPE) { - u8 de_type = it.get_u8(); - ALOGI("nan de event type = %u\n", de_type); - if (de_type == NAN_EVENT_IFACE) { - de_event.event_type = NAN_EVENT_ID_DISC_MAC_ADDR; - ALOGI("received NAN_EVENT_ID_DISC_MAC_ADDR event\n"); - } else if (de_type == NAN_EVENT_START) { - de_event.event_type = NAN_EVENT_ID_STARTED_CLUSTER; - ALOGI("received NAN cluster started event\n"); - } else if (de_type == NAN_EVENT_JOIN) { - /* To be deprecated */ - de_event.event_type = NAN_EVENT_ID_JOINED_CLUSTER; - ALOGI("received join event\n"); - } else if (de_type == NAN_EVENT_ROLE_CHANGE) { - ALOGI("received device role change event\n"); - } else if (de_type == NAN_EVENT_MERGE) { - ALOGI("received merge event\n"); - } else { - ALOGI("received unknown DE event, [%d]\n", de_type); - } - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(&de_event.data.mac_addr.addr, it.get_data(), NAN_MAC_ADDR_LEN); - memcpy(mNmi, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Primary discovery mac address = " MACSTR "\n", - MAC2STR(mNmi)); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventDiscEngEvent(&de_event); - /* XXX: WAR for sending intf addr to generate Identity - * change callback in framework - * Also WAR for enable response - */ - if (de_event.event_type == NAN_EVENT_ID_STARTED_CLUSTER) { - NanResponseMsg rsp_data; - memcpy(&de_event.data.mac_addr.addr, mNmi, NAN_MAC_ADDR_LEN); - de_event.event_type = NAN_EVENT_ID_DISC_MAC_ADDR; - GET_NAN_HANDLE(info)->mHandlers.EventDiscEngEvent(&de_event); - rsp_data.response_type = NAN_RESPONSE_ENABLED; - rsp_data.status = NAN_STATUS_SUCCESS; - memcpy(rsp_data.nan_error, NanStatusToString(rsp_data.status), - strlen(NanStatusToString(rsp_data.status))); - GET_NAN_HANDLE(info)->mHandlers.NotifyResponse(mId, &rsp_data); - /* clean up mId to distinguish duplciated disable command */ - mId = NAN_MAC_INVALID_TRANSID; - } - break; - - case NAN_EVENT_DISABLED: - ALOGI("Received NAN_EVENT_DISABLED\n"); - NanDisabledInd disabled_ind; - memset(&disabled_ind, 0, sizeof(NanDisabledInd)); - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_STATUS) { - disabled_ind.reason = (NanStatusType)it.get_u8(); - ALOGI("Nan Disable:status %u", disabled_ind.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(disabled_ind.nan_reason, it.get_data(), - sizeof(disabled_ind.nan_reason)); - ALOGI("Disable nan reason: %s", disabled_ind.nan_reason); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDisabled(&disabled_ind); - /* unregister Nan vendor events */ - unRegisterNanVendorEvents(); - break; - - case NAN_EVENT_SDF: - ALOGI("Received NAN_EVENT_SDF:\n"); - NanBeaconSdfPayloadInd sdfInd; - memset(&sdfInd, 0, sizeof(sdfInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - sdfInd.data.frame_len = it.get_u32(); - if (sdfInd.data.frame_len > NAN_MAX_FRAME_DATA_LEN) { - sdfInd.data.frame_len = NAN_MAX_FRAME_DATA_LEN; - } - ALOGI("Received NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN: 0x%x(%d)\n", - sdfInd.data.frame_len, sdfInd.data.frame_len); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - ALOGI("Received NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO\n"); - memcpy(&sdfInd.data.frame_data, it.get_data(), sdfInd.data.frame_len); - prhex("sdfInd.data.frame_data: ", (u8*)sdfInd.data.frame_data, - sdfInd.data.frame_len); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventBeaconSdfPayload(&sdfInd); - break; - - case NAN_EVENT_TCA: - ALOGI("Received NAN_EVENT_TCA\n"); - break; - - case NAN_EVENT_UNKNOWN: - ALOGI("Received NAN_EVENT_UNKNOWN\n"); - break; - } // end-of-switch - - return NL_SKIP; - } - void unRegisterNanVendorEvents() - { - int i = 0; - for (i = NAN_EVENT_ENABLED; i <= NAN_EVENT_DATA_END; i++) { - unregisterVendorHandler(GOOGLE_OUI, i); - } - unregisterVendorHandler(GOOGLE_OUI, NAN_ASYNC_RESPONSE_DISABLED); - } - void registerNanVendorEvents() - { - int i = 0; - for (i = NAN_EVENT_ENABLED; i <= NAN_EVENT_DATA_END; i++) { - registerVendorHandler(GOOGLE_OUI, i); - } - registerVendorHandler(GOOGLE_OUI, NAN_ASYNC_RESPONSE_DISABLED); - } -}; - -/* pretty hex print a contiguous buffer */ -static void prhex(const char *msg, u8 *buf, u32 nbytes) -{ - char line[128]; - char *p; - int len = sizeof(line); - int nchar; - u32 i; - - if (msg && (msg[0] != '\0')) { - printf("%s:\n", msg); - } - - p = line; - for (i = 0; i < nbytes; i++) { - if (i % 16 == 0) { - nchar = snprintf(p, len, " %04d: ", i); /* line prefix */ - p += nchar; - len -= nchar; - } - - if (len > 0) { - nchar = snprintf(p, len, "%02x ", buf[i]); - p += nchar; - len -= nchar; - } - - if (i % 16 == 15) { - ALOGE("%s\n", line); /* flush line */ - p = line; - len = sizeof(line); - } - } - - /* flush last partial line */ - if (p != line) { - ALOGE("%s\n", line); - } -} - - -static const char *NanRspToString(int cmd_resp) -{ - switch (cmd_resp) { - C2S(NAN_RESPONSE_ENABLED) - C2S(NAN_RESPONSE_DISABLED) - C2S(NAN_RESPONSE_PUBLISH) - C2S(NAN_RESPONSE_SUBSCRIBE) - C2S(NAN_RESPONSE_PUBLISH_CANCEL) - C2S(NAN_RESPONSE_SUBSCRIBE_CANCEL) - C2S(NAN_RESPONSE_TRANSMIT_FOLLOWUP) - C2S(NAN_RESPONSE_CONFIG) - C2S(NAN_RESPONSE_TCA) - C2S(NAN_RESPONSE_STATS) - C2S(NAN_DP_INTERFACE_CREATE) - C2S(NAN_DP_INTERFACE_DELETE) - C2S(NAN_DP_INITIATOR_RESPONSE) - C2S(NAN_DP_RESPONDER_RESPONSE) - C2S(NAN_DP_END) - C2S(NAN_GET_CAPABILITIES) - - default: - return "UNKNOWN_NAN_CMD_RESPONSE"; - } -} - -static const char *NanCmdToString(int cmd) -{ - switch (cmd) { - C2S(NAN_REQUEST_ENABLE) - C2S(NAN_REQUEST_DISABLE) - C2S(NAN_REQUEST_PUBLISH) - C2S(NAN_REQUEST_PUBLISH_CANCEL) - C2S(NAN_REQUEST_TRANSMIT_FOLLOWUP) - C2S(NAN_REQUEST_SUBSCRIBE) - C2S(NAN_REQUEST_SUBSCRIBE_CANCEL) - C2S(NAN_REQUEST_STATS) - C2S(NAN_REQUEST_CONFIG) - C2S(NAN_REQUEST_TCA) - C2S(NAN_REQUEST_EVENT_CHECK) - C2S(NAN_REQUEST_GET_CAPABILTIES) - C2S(NAN_DATA_PATH_IFACE_CREATE) - C2S(NAN_DATA_PATH_IFACE_DELETE) - C2S(NAN_DATA_PATH_INIT_REQUEST) - C2S(NAN_DATA_PATH_IND_RESPONSE) - C2S(NAN_DATA_PATH_END) - C2S(NAN_DATA_PATH_IFACE_UP) - C2S(NAN_DATA_PATH_SEC_INFO) - C2S(NAN_VERSION_INFO) - C2S(NAN_REQUEST_ENABLE_MERGE) - - default: - return "UNKNOWN_NAN_CMD"; - } -} - -static const char *NanAttrToString(u16 cmd) -{ - switch (cmd) { - C2S(NAN_ATTRIBUTE_HEADER) - C2S(NAN_ATTRIBUTE_HANDLE) - C2S(NAN_ATTRIBUTE_TRANSAC_ID) - C2S(NAN_ATTRIBUTE_5G_SUPPORT) - C2S(NAN_ATTRIBUTE_CLUSTER_LOW) - C2S(NAN_ATTRIBUTE_CLUSTER_HIGH) - C2S(NAN_ATTRIBUTE_SID_BEACON) - C2S(NAN_ATTRIBUTE_SYNC_DISC_5G_BEACON) - C2S(NAN_ATTRIBUTE_RSSI_CLOSE) - C2S(NAN_ATTRIBUTE_RSSI_MIDDLE) - C2S(NAN_ATTRIBUTE_RSSI_PROXIMITY) - C2S(NAN_ATTRIBUTE_HOP_COUNT_LIMIT) - C2S(NAN_ATTRIBUTE_RANDOM_FACTOR) - C2S(NAN_ATTRIBUTE_MASTER_PREF) - C2S(NAN_ATTRIBUTE_PERIODIC_SCAN_INTERVAL) - C2S(NAN_ATTRIBUTE_PUBLISH_ID) - C2S(NAN_ATTRIBUTE_TTL) - C2S(NAN_ATTRIBUTE_PERIOD) - C2S(NAN_ATTRIBUTE_REPLIED_EVENT_FLAG) - C2S(NAN_ATTRIBUTE_PUBLISH_TYPE) - C2S(NAN_ATTRIBUTE_TX_TYPE) - C2S(NAN_ATTRIBUTE_PUBLISH_COUNT) - C2S(NAN_ATTRIBUTE_SERVICE_NAME_LEN) - C2S(NAN_ATTRIBUTE_SERVICE_NAME) - C2S(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) - C2S(NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) - C2S(NAN_ATTRIBUTE_RX_MATCH_FILTER_LEN) - C2S(NAN_ATTRIBUTE_RX_MATCH_FILTER) - C2S(NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN) - C2S(NAN_ATTRIBUTE_TX_MATCH_FILTER) - C2S(NAN_ATTRIBUTE_SUBSCRIBE_ID) - C2S(NAN_ATTRIBUTE_SUBSCRIBE_TYPE) - C2S(NAN_ATTRIBUTE_SERVICERESPONSEFILTER) - C2S(NAN_ATTRIBUTE_SERVICERESPONSEINCLUDE) - C2S(NAN_ATTRIBUTE_USESERVICERESPONSEFILTER) - C2S(NAN_ATTRIBUTE_SSIREQUIREDFORMATCHINDICATION) - C2S(NAN_ATTRIBUTE_SUBSCRIBE_MATCH) - C2S(NAN_ATTRIBUTE_SUBSCRIBE_COUNT) - C2S(NAN_ATTRIBUTE_MAC_ADDR) - C2S(NAN_ATTRIBUTE_MAC_ADDR_LIST) - C2S(NAN_ATTRIBUTE_MAC_ADDR_LIST_NUM_ENTRIES) - C2S(NAN_ATTRIBUTE_PUBLISH_MATCH) - C2S(NAN_ATTRIBUTE_ENABLE_STATUS) - C2S(NAN_ATTRIBUTE_JOIN_STATUS) - C2S(NAN_ATTRIBUTE_ROLE) - C2S(NAN_ATTRIBUTE_MASTER_RANK) - C2S(NAN_ATTRIBUTE_ANCHOR_MASTER_RANK) - C2S(NAN_ATTRIBUTE_CNT_PEND_TXFRM) - C2S(NAN_ATTRIBUTE_CNT_BCN_TX) - C2S(NAN_ATTRIBUTE_CNT_BCN_RX) - C2S(NAN_ATTRIBUTE_CNT_SVC_DISC_TX) - C2S(NAN_ATTRIBUTE_CNT_SVC_DISC_RX) - C2S(NAN_ATTRIBUTE_AMBTT) - C2S(NAN_ATTRIBUTE_CLUSTER_ID) - C2S(NAN_ATTRIBUTE_INST_ID) - C2S(NAN_ATTRIBUTE_OUI) - C2S(NAN_ATTRIBUTE_STATUS) - C2S(NAN_ATTRIBUTE_DE_EVENT_TYPE) - C2S(NAN_ATTRIBUTE_MERGE) - C2S(NAN_ATTRIBUTE_IFACE) - C2S(NAN_ATTRIBUTE_CHANNEL) - C2S(NAN_ATTRIBUTE_PEER_ID) - C2S(NAN_ATTRIBUTE_NDP_ID) - C2S(NAN_ATTRIBUTE_SECURITY) - C2S(NAN_ATTRIBUTE_QOS) - C2S(NAN_ATTRIBUTE_RSP_CODE) - C2S(NAN_ATTRIBUTE_INST_COUNT) - C2S(NAN_ATTRIBUTE_PEER_DISC_MAC_ADDR) - C2S(NAN_ATTRIBUTE_PEER_NDI_MAC_ADDR) - C2S(NAN_ATTRIBUTE_IF_ADDR) - C2S(NAN_ATTRIBUTE_WARMUP_TIME) - C2S(NAN_ATTRIBUTE_RANGING_RESULT) - C2S(NAN_ATTRIBUTE_RANGING_INDICATION) - C2S(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN) - C2S(NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO) - C2S(NAN_ATTRIBUTE_RANDOMIZATION_INTERVAL) - C2S(NAN_ATTRIBUTE_ENABLE_MERGE) - - default: - return "NAN_ATTRIBUTE_UNKNOWN"; - } -} - -NanResponseType get_response_type(WIFI_SUB_COMMAND nan_subcmd) -{ - NanResponseType response_type; - - switch(nan_subcmd) { - case NAN_SUBCMD_ENABLE: - response_type = NAN_RESPONSE_ENABLED; - break; - case NAN_SUBCMD_DISABLE: - response_type = NAN_RESPONSE_DISABLED; - break; - case NAN_SUBCMD_PUBLISH: - response_type = NAN_RESPONSE_PUBLISH; - break; - case NAN_SUBCMD_SUBSCRIBE: - response_type = NAN_RESPONSE_SUBSCRIBE; - break; - case NAN_SUBCMD_PUBLISH_CANCEL: - response_type = NAN_RESPONSE_PUBLISH_CANCEL; - break; - case NAN_SUBCMD_SUBSCRIBE_CANCEL: - response_type = NAN_RESPONSE_SUBSCRIBE_CANCEL; - break; - case NAN_SUBCMD_TRANSMIT_FOLLOWUP: - response_type = NAN_RESPONSE_TRANSMIT_FOLLOWUP; - break; - case NAN_SUBCMD_CONFIG: - response_type = NAN_RESPONSE_CONFIG; - break; - case NAN_SUBCMD_TCA: - response_type = NAN_RESPONSE_TCA; - break; - case NAN_SUBCMD_STATS: - response_type = NAN_RESPONSE_STATS; - break; - case NAN_SUBCMD_DATA_PATH_IFACE_CREATE: - response_type = NAN_DP_INTERFACE_CREATE; - break; - case NAN_SUBCMD_DATA_PATH_IFACE_DELETE: - response_type = NAN_DP_INTERFACE_DELETE; - break; - case NAN_SUBCMD_DATA_PATH_REQUEST: - response_type = NAN_DP_INITIATOR_RESPONSE; - break; - case NAN_SUBCMD_DATA_PATH_RESPONSE: - response_type = NAN_DP_RESPONDER_RESPONSE; - break; - case NAN_SUBCMD_DATA_PATH_END: - response_type = NAN_DP_END; - break; - case NAN_SUBCMD_GET_CAPABILITIES: - response_type = NAN_GET_CAPABILITIES; - break; - default: - /* unknown response for a command */ - response_type = NAN_RESPONSE_ERROR; - break; - } - - return response_type; -} - -static int get_svc_hash(unsigned char *svc_name, - u16 svc_name_len, u8 *svc_hash, u16 svc_hash_len) -{ - SHA256_CTX sha_ctx; - u8 sha_hash[SHA256_DIGEST_LENGTH]; - unsigned char *p; - int len = svc_name_len; - - if (!svc_name || !svc_hash) { - ALOGE("Bad arguments!!\n"); - return WIFI_ERROR_UNKNOWN; - } - - if (svc_hash_len < NAN_SVC_HASH_SIZE) { - ALOGE("Bad len!!\n"); - return WIFI_ERROR_UNKNOWN; - } - for (p = svc_name; *p; p++) - { - *p = tolower((int)*p); - } - SHA256_Init(&sha_ctx); - SHA256_Update(&sha_ctx, svc_name, len); - SHA256_Final(sha_hash, &sha_ctx); - - memcpy(svc_hash, sha_hash, NAN_SVC_HASH_SIZE); - ALOGI("svc_name: %s\n", svc_name); - prhex("svc_hash:", svc_hash, NAN_SVC_HASH_SIZE); - - return WIFI_SUCCESS; -} - -#ifdef CONFIG_BRCM -static int dump_NanEnableRequest(NanEnableRequest* msg) -{ - ALOGI("%s: Dump NanEnableRequest msg:\n", __func__); - - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - - ALOGI("master_pref=%u\n", msg->master_pref); - ALOGI("cluster_low=%u\n", msg->cluster_low); - ALOGI("cluster_high=%u\n", msg->cluster_high); - ALOGI("config_support_5g=%u\n", msg->config_support_5g); - ALOGI("support_5g_val=%u\n", msg->support_5g_val); - ALOGI("config_sid_beacon=%u\n", msg->config_sid_beacon); - ALOGI("sid beacon=%u\n", msg->sid_beacon_val); - ALOGI("config_sub_sid_beacon=%u\n", msg->config_subscribe_sid_beacon); - ALOGI("sub sid beacon=%u\n", msg->subscribe_sid_beacon_val); - ALOGI("config_2dot4g_rssi_close=%u\n", msg->config_2dot4g_rssi_close); - ALOGI("rssi_close_2dot4g_val=%u\n", msg->rssi_close_2dot4g_val); - ALOGI("config_2dot4g_rssi_middle=%u\n", msg->config_2dot4g_rssi_middle); - ALOGI("rssi_middle_2dot4g_val=%u\n", msg->rssi_middle_2dot4g_val); - ALOGI("config_2dot4g_rssi_proximity=%u\n", msg->config_2dot4g_rssi_proximity); - ALOGI("rssi_proximity_2dot4g_val=%u\n", msg->rssi_proximity_2dot4g_val); - ALOGI("config_hop_count_limit=%u\n", msg->config_hop_count_limit); - ALOGI("hop_count_limit_val=%u\n", msg->hop_count_limit_val); - ALOGI("config_2dot4g_support=%u\n", msg->config_2dot4g_support); - ALOGI("support_2dot4g_val=%u\n", msg->support_2dot4g_val); - ALOGI("config_2dot4g_beacons=%u\n", msg->config_2dot4g_beacons); - ALOGI("beacon_2dot4g_val=%u\n", msg->beacon_2dot4g_val); - ALOGI("config_2dot4g_sdf=%u\n", msg->config_2dot4g_sdf); - ALOGI("sdf_2dot4g_val=%u\n", msg->sdf_2dot4g_val); - ALOGI("config_5g_beacons=%u\n", msg->config_5g_beacons); - ALOGI("beacon_5g_val=%u\n", msg->beacon_5g_val); - ALOGI("config_5g_sdf=%u\n", msg->config_5g_sdf); - ALOGI("config_5g_rssi_close=%u\n", msg->config_5g_rssi_close); - ALOGI("rssi_close_5g_val=%u\n", msg->rssi_close_5g_val); - ALOGI("config_5g_rssi_middle=%u\n", msg->config_5g_rssi_middle); - ALOGI("rssi_middle_5g_val=%u\n", msg->rssi_middle_5g_val); - ALOGI("config_5g_rssi_close_proximity=%u\n", msg->config_5g_rssi_close_proximity); - ALOGI("rssi_close_proximity_5g_val=%u\n", msg->rssi_close_proximity_5g_val); - ALOGI("config_rssi_window_size=%u\n", msg->config_rssi_window_size); - ALOGI("rssi_window_size_val=%u\n", msg->rssi_window_size_val); - ALOGI("config_oui=%u\n", msg->config_oui); - ALOGI("oui_val=%u\n", msg->oui_val); - ALOGI("config_intf_addr=%u\n", msg->config_intf_addr); - ALOGI("intf_addr_val=" MACSTR "\n", MAC2STR(msg->intf_addr_val)); - ALOGI("config_cluster_attribute_val=%u\n", msg->config_cluster_attribute_val); - ALOGI("config_scan_params=%u\n", msg->config_scan_params); - if (msg->config_scan_params) { - ALOGI("dwell_time=%u\n", msg->scan_params_val.dwell_time[0]); - ALOGI("scan_period=%u\n", msg->scan_params_val.scan_period[0]); - } - ALOGI("config_random_factor_force=%u\n", msg->config_random_factor_force); - ALOGI("random_factor_force_val=%u\n", msg->random_factor_force_val); - ALOGI("config_hop_count_force=%u\n", msg->config_hop_count_force); - ALOGI("config_24g_channel=%u\n", msg->config_24g_channel); - ALOGI("channel_24g_val=%u\n", msg->channel_24g_val); - ALOGI("config_5g_channel=%u\n", msg->config_5g_channel); - ALOGI("channel_5g_val=%u\n", msg->channel_5g_val); - ALOGI("config_dw.config_2dot4g_dw_band=%u\n", msg->config_dw.config_2dot4g_dw_band); - if (msg->config_dw.config_2dot4g_dw_band) { - ALOGI("dw_2dot4g_interval_val=%u\n", msg->config_dw.dw_2dot4g_interval_val); - } - ALOGI("config_dw.config_5g_dw_band=%u\n", msg->config_dw.config_5g_dw_band); - if (msg->config_dw.config_5g_dw_band) { - ALOGI("dw_5g_interval_val=%u\n", msg->config_dw.dw_5g_interval_val); - } - ALOGI("discovery_indication_cfg=%u\n", msg->discovery_indication_cfg); - ALOGI("config_ndpe_attr=%u\n", msg->config_ndpe_attr); - if (msg->config_ndpe_attr) { - ALOGI("use_ndpe_attr=%u\n", msg->use_ndpe_attr); - } - ALOGI("config_discovery_beacon_int=%u\n", msg->config_discovery_beacon_int); - if (msg->config_discovery_beacon_int) { - ALOGI("discovery beacon interval =%u\n", msg->discovery_beacon_interval); - } - ALOGI("config_nss=%u\n", msg->config_nss); - if (msg->config_nss) { - ALOGI("nss =%u\n", msg->nss); - } - ALOGI("config_enable_ranging =%u\n", msg->config_enable_ranging); - if (msg->config_enable_ranging) { - ALOGI("enable_ranging =%u\n", msg->enable_ranging); - } - ALOGI("config_dw_early_termination =%u\n", msg->config_dw_early_termination); - if (msg->config_dw_early_termination) { - ALOGI("enable_dw_termination =%u\n", msg->enable_dw_termination); - } - ALOGI("config_disc_mac_addr_randomization=%u\n", msg->config_disc_mac_addr_randomization); - if (msg->config_disc_mac_addr_randomization) { - ALOGI("disc_mac_addr_rand_interval_sec =%u\n", msg->disc_mac_addr_rand_interval_sec); - } - - return WIFI_SUCCESS; -} - -static int dump_NanConfigRequestRequest(NanConfigRequest* msg) -{ - ALOGI("%s: Dump NanConfigRequest msg:\n", __func__); - - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - - ALOGI("master_pref=%u\n", msg->master_pref); - ALOGI("sid beacon=%u\n", msg->sid_beacon); - ALOGI("config_sub_sid_beacon=%u\n", msg->config_subscribe_sid_beacon); - ALOGI("sub sid beacon=%u\n", msg->subscribe_sid_beacon_val); - ALOGI("rssi_proximity=%u\n", msg->rssi_proximity); - ALOGI("rssi_close_proximity_5g_val=%u\n", msg->rssi_close_proximity_5g_val); - ALOGI("rssi_window_size_val=%u\n", msg->rssi_window_size_val); - ALOGI("scan_params_val.dwell_time[0]=%u\n", msg->scan_params_val.dwell_time[0]); - ALOGI("scan_params_val.scan_period[0]=%u\n", msg->scan_params_val.scan_period[0]); - ALOGI("config_scan_params=%u\n", msg->config_scan_params); - ALOGI("random_factor_force_val=%u\n", msg->random_factor_force_val); - ALOGI("hop_count_force_val=%u\n", msg->hop_count_force_val); - ALOGI("fam_val.numchans=%u\n", msg->fam_val.numchans); - ALOGI("fam_val.famchan[0].entry_control=%u\n", msg->fam_val.famchan[0].entry_control); - ALOGI("fam_val.famchan[0].class_val=%u\n", msg->fam_val.famchan[0].class_val); - ALOGI("fam_val.famchan[0].channel=%u\n", msg->fam_val.famchan[0].channel); - ALOGI("fam_val.famchan[0].mapid=%u\n", msg->fam_val.famchan[0].mapid); - ALOGI("fam_val.famchan[0].avail_interval_bitmap=%u\n", msg->fam_val.famchan[0].avail_interval_bitmap); - ALOGI("config_dw.config_2dot4g_dw_band=%u\n", msg->config_dw.config_2dot4g_dw_band); - if (msg->config_dw.config_2dot4g_dw_band) { - ALOGI("dw_2dot4g_interval_val=%u\n", msg->config_dw.dw_2dot4g_interval_val); - } - ALOGI("config_dw.config_5g_dw_band=%u\n", msg->config_dw.config_5g_dw_band); - if (msg->config_dw.config_5g_dw_band) { - ALOGI("dw_5g_interval_val=%u\n", msg->config_dw.dw_5g_interval_val); - } - ALOGI("discovery_indication_cfg=%u\n", msg->discovery_indication_cfg); - ALOGI("config_ndpe_attr=%u\n", msg->config_ndpe_attr); - if (msg->config_ndpe_attr) { - ALOGI("use_ndpe_attr=%u\n", msg->use_ndpe_attr); - } - ALOGI("config_discovery_beacon_int=%u\n", msg->config_discovery_beacon_int); - if (msg->config_discovery_beacon_int) { - ALOGI("discovery beacon interval =%u\n", msg->discovery_beacon_interval); - } - ALOGI("config_nss=%u\n", msg->config_nss); - if (msg->config_nss) { - ALOGI("nss =%u\n", msg->nss); - } - ALOGI("config_enable_ranging =%u\n", msg->config_enable_ranging); - if (msg->config_enable_ranging) { - ALOGI("enable_ranging =%u\n", msg->enable_ranging); - } - ALOGI("config_dw_early_termination =%u\n", msg->config_dw_early_termination); - if (msg->config_dw_early_termination) { - ALOGI("enable_dw_termination =%u\n", msg->enable_dw_termination); - } - - ALOGI("config_disc_mac_addr_randomization=%u\n", msg->config_disc_mac_addr_randomization); - if (msg->config_disc_mac_addr_randomization) { - ALOGI("disc_mac_addr_rand_interval_sec =%u\n", msg->disc_mac_addr_rand_interval_sec); - } - return WIFI_SUCCESS; -} - -static int dump_NanPublishRequest(NanPublishRequest* msg) -{ - ALOGI("%s: Dump NanPublishRequest msg:\n", __func__); - u8 i = 0; - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - ALOGI("publish_id=%u\n", msg->publish_id); - ALOGI("ttl=%u\n", msg->ttl); - ALOGI("period=%u\n", msg->period); - ALOGI("publish_type=%u\n", msg->publish_type); - ALOGI("tx_type=%u\n", msg->tx_type); - ALOGI("publish_count=%u\n", msg->publish_count); - ALOGI("publish_match_indicator=%u\n", msg->publish_match_indicator); - ALOGI("service_responder_policy=%u\n", msg->service_responder_policy); - ALOGI("service_name_len=%u\n", msg->service_name_len); - if (msg->service_name_len) - ALOGI("service_name=%s\n", msg->service_name); - ALOGI("service_specific_info_len=%u\n", msg->service_specific_info_len); - if (msg->service_specific_info_len) - ALOGI("service_specific_info=%s\n", msg->service_specific_info); - ALOGI("rx_match_filter_len=%u\n", msg->rx_match_filter_len); - if (msg->rx_match_filter_len) - prhex("rx_match_filter", msg->rx_match_filter, msg->rx_match_filter_len); - ALOGI("tx_match_filter_len=%u\n", msg->tx_match_filter_len); - if (msg->tx_match_filter_len) - prhex("tx_match_filter", msg->tx_match_filter, msg->tx_match_filter_len); - ALOGI("rssi_threshold_flag=%u\n", msg->rssi_threshold_flag); - ALOGI("connmap=%u\n", msg->connmap); - ALOGI("recv_indication_cfg=%u\n", msg->recv_indication_cfg); - ALOGI("cipher_type=%u\n", msg->cipher_type); - ALOGI("key_info: key_type =%u\n", msg->key_info.key_type); - ALOGI("key_info: pmk info=%s\n", msg->key_info.body.pmk_info.pmk); - ALOGI("key_info: passphrase_info=%s\n", msg->key_info.body.passphrase_info.passphrase); - ALOGI("scid_len=%u\n", msg->scid_len); - if (msg->scid_len) - ALOGI("scid=%s\n", msg->scid); - ALOGI("NanSdeaCtrlParams NdpType=%u\n", msg->sdea_params.ndp_type); - ALOGI("NanSdeaCtrlParams security_cfg=%u\n", msg->sdea_params.security_cfg); - ALOGI("NanSdeaCtrlParams ranging_state=%u\n", msg->sdea_params.ranging_state); - ALOGI("NanSdeaCtrlParams range_report=%u\n", msg->sdea_params.range_report); - ALOGI("NanRangingCfg ranging_interval_msec=%u\n", msg->ranging_cfg.ranging_interval_msec); - ALOGI("NanRangingCfg config_ranging_indications=%u\n", msg->ranging_cfg.config_ranging_indications); - ALOGI("NanRangingCfg distance_ingress_mm=%u\n", msg->ranging_cfg.distance_ingress_mm); - ALOGI("NanRangingCfg distance_egress_mm=%u\n", msg->ranging_cfg.distance_egress_mm); - ALOGI("NanRangingAutoResponse = %u\n", msg->ranging_auto_response); - ALOGI("range_response_cfg=%u\n", msg->range_response_cfg.ranging_response); - - ALOGI("sdea_service_specific_info_len=%u\n", msg->sdea_service_specific_info_len); - if (msg->sdea_service_specific_info_len) - ALOGI("sdea_service_specific_info=%s\n", msg->sdea_service_specific_info); - - return WIFI_SUCCESS; -} - -static int dump_NanSubscribeRequest(NanSubscribeRequest* msg) -{ - ALOGI("%s: Dump NanSubscribeRequest msg:\n", __func__); - u8 i = 0; - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - ALOGI("subscribe_id=%u\n", msg->subscribe_id); - ALOGI("ttl=%u\n", msg->ttl); - ALOGI("period=%u\n", msg->period); - ALOGI("subscribe_type=%u\n", msg->subscribe_type); - ALOGI("serviceResponseFilter=%u\n", msg->serviceResponseFilter); - ALOGI("serviceResponseInclude=%u\n", msg->serviceResponseInclude); - ALOGI("useServiceResponseFilter=%u\n", msg->useServiceResponseFilter); - ALOGI("ssiRequiredForMatchIndication=%u\n", msg->ssiRequiredForMatchIndication); - ALOGI("subscribe_count=%u\n", msg->subscribe_count); - ALOGI("subscribe_match_indicator=%u\n", msg->subscribe_match_indicator); - ALOGI("service_name_len=%u\n", msg->service_name_len); - if (msg->service_name_len) - ALOGI("service_name=%s\n", msg->service_name); - ALOGI("service_specific_info_len=%u\n", msg->service_specific_info_len); - if (msg->service_specific_info_len) - ALOGI("service_specific_info=%s\n", msg->service_specific_info); - ALOGI("rx_match_filter_len=%u\n", msg->rx_match_filter_len); - if (msg->rx_match_filter_len) - prhex("rx_match_filter", msg->rx_match_filter, msg->rx_match_filter_len); - ALOGI("tx_match_filter_len=%u\n", msg->tx_match_filter_len); - if (msg->tx_match_filter_len) - prhex("tx_match_filter", msg->tx_match_filter, msg->tx_match_filter_len); - ALOGI("rssi_threshold_flag=%u\n", msg->rssi_threshold_flag); - ALOGI("connmap=%u\n", msg->connmap); - ALOGI("num_intf_addr_present=%u\n", msg->num_intf_addr_present); - if (msg->num_intf_addr_present) { - for (i = 0; i < NAN_MAX_SUBSCRIBE_MAX_ADDRESS; i++) { - ALOGI("peer_disc_mac_addr=" MACSTR "\n", MAC2STR(msg->intf_addr[i])); - } - } - ALOGI("recv_indication_cfg=%u\n", msg->recv_indication_cfg); - ALOGI("cipher_type=%u\n", msg->cipher_type); - ALOGI("key_info: key_type =%u\n", msg->key_info.key_type); - ALOGI("key_info: pmk info=%s\n", msg->key_info.body.pmk_info.pmk); - ALOGI("key_info: passphrase_info=%s\n", msg->key_info.body.passphrase_info.passphrase); - ALOGI("scid_len=%u\n", msg->scid_len); - if (msg->scid_len) - ALOGI("scid=%s\n", msg->scid); - ALOGI("NanSdeaCtrlParams NdpType=%u\n", msg->sdea_params.ndp_type); - ALOGI("NanSdeaCtrlParams security_cfg=%u\n", msg->sdea_params.security_cfg); - ALOGI("NanSdeaCtrlParams ranging_state=%u\n", msg->sdea_params.ranging_state); - ALOGI("NanSdeaCtrlParams range_report=%u\n", msg->sdea_params.range_report); - ALOGI("NanRangingCfg ranging_interval_msec=%u\n", msg->ranging_cfg.ranging_interval_msec); - ALOGI("NanRangingCfg config_ranging_indications=%u\n", msg->ranging_cfg.config_ranging_indications); - ALOGI("NanRangingCfg distance_ingress_mm=%u\n", msg->ranging_cfg.distance_ingress_mm); - ALOGI("NanRangingCfg distance_egress_mm=%u\n", msg->ranging_cfg.distance_egress_mm); - ALOGI("NanRangingAutoResponse = %u\n", msg->ranging_auto_response); - ALOGI("range_response = %u\n", msg->range_response_cfg.ranging_response); - - ALOGI("sdea_service_specific_info_len=%u\n", msg->sdea_service_specific_info_len); - if (msg->sdea_service_specific_info_len) - ALOGI("sdea_service_specific_info=%s\n", msg->sdea_service_specific_info); - - return WIFI_SUCCESS; -} - -static int dump_NanTransmitFollowupRequest(NanTransmitFollowupRequest* msg) -{ - ALOGI("%s: Dump NanTransmitFollowupRequest msg:\n", __func__); - u8 i = 0; - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - ALOGI("publish_subscribe_id=%u\n", msg->publish_subscribe_id); - ALOGI("requestor_instance_id=%u\n", msg->requestor_instance_id); - ALOGI("addr=" MACSTR "\n", MAC2STR(msg->addr)); - ALOGI("priority=%u\n", msg->priority); - ALOGI("dw_or_faw=%u\n", msg->dw_or_faw); - ALOGI("service_specific_info_len=%u\n", msg->service_specific_info_len); - if (msg->service_specific_info_len) - ALOGI("service_specific_info=%s\n", msg->service_specific_info); - ALOGI("recv_indication_cfg=%u\n", msg->recv_indication_cfg); - ALOGI("sdea_service_specific_info_len=%u\n", msg->sdea_service_specific_info_len); - if (msg->sdea_service_specific_info_len) - ALOGI("sdea_service_specific_info=%s\n", msg->sdea_service_specific_info); - - return WIFI_SUCCESS; -} - -static int dump_NanDataPathInitiatorRequest(NanDataPathInitiatorRequest* msg) -{ - ALOGI("%s: Dump NanDataPathInitiatorRequest msg:\n", __func__); - - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - - ALOGI("requestor_instance_id=%d\n", msg->requestor_instance_id); - ALOGI("channel_request_type=%d\n", msg->channel_request_type); - ALOGI("channel=%u\n", msg->channel); - ALOGI("peer_disc_mac_addr=" MACSTR "\n", MAC2STR(msg->peer_disc_mac_addr)); - ALOGI("ndp_iface=%s\n", msg->ndp_iface); - ALOGI("ndp_cfg: security_cfg =%u\n", msg->ndp_cfg.security_cfg); - ALOGI("ndp_cfg: qos_cfg=%u\n", msg->ndp_cfg.qos_cfg); - ALOGI("dp app info len=%u\n", msg->app_info.ndp_app_info_len); - if (msg->app_info.ndp_app_info_len) { - prhex("dp app info=: ", (u8*)msg->app_info.ndp_app_info, - msg->app_info.ndp_app_info_len); - } - ALOGI("cipher_type=%u\n", msg->cipher_type); - ALOGI("key_info: key_type =%u\n", msg->key_info.key_type); - ALOGI("key_info: pmk info=%s\n", msg->key_info.body.pmk_info.pmk); - ALOGI("key_info: passphrase_info=%s\n", msg->key_info.body.passphrase_info.passphrase); - if (msg->service_name_len) { - ALOGI("service_name=%s\n", msg->service_name); - } - return WIFI_SUCCESS; -} - -static int dump_NanDataPathIndicationResponse(NanDataPathIndicationResponse* msg) -{ - ALOGI("%s: Dump NanDataPathIndicationResponse msg:\n", __func__); - - if (msg == NULL) { - ALOGE("Invalid msg\n"); - return WIFI_ERROR_UNKNOWN; - } - - ALOGI("ndp_instance_id=%d\n", msg->ndp_instance_id); - ALOGI("ndp_iface=%s\n", msg->ndp_iface); - ALOGI("ndp_cfg: security_cfg =%u\n", msg->ndp_cfg.security_cfg); - ALOGI("response code =%u\n", msg->rsp_code); - ALOGI("ndp_cfg: qos_cfg=%u\n", msg->ndp_cfg.qos_cfg); - ALOGI("dp app info len=%u\n", msg->app_info.ndp_app_info_len); - if (msg->app_info.ndp_app_info_len) { - prhex("dp app info=: ", (u8*)msg->app_info.ndp_app_info, - msg->app_info.ndp_app_info_len); - } - ALOGI("cipher_type=%u\n", msg->cipher_type); - ALOGI("key_info: key_type =%u\n", msg->key_info.key_type); - ALOGI("key_info: pmk info=%s\n", msg->key_info.body.pmk_info.pmk); - ALOGI("key_info: passphrase_info=%s\n", msg->key_info.body.passphrase_info.passphrase); - ALOGI("service_name_len=%u\n", msg->service_name_len); - if (msg->service_name_len) { - ALOGI("service_name=%s\n", msg->service_name); - } - return WIFI_SUCCESS; -} -#endif /* CONFIG_BRCM */ - -void nan_reset_dbg_counters() -{ - memset(&counters, 0, sizeof(counters)); -} - -/////////////////////////////////////////////////////////////////////////////// -wifi_error nan_enable_request(transaction_id id, - wifi_interface_handle iface, NanEnableRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_ENABLE; - - ALOGI("Enabling Nan, Handle = %p\n", handle); - -#ifdef CONFIG_BRCM - // check up nan enable params from Nan manager level - dump_NanEnableRequest(msg); -#endif /* CONFIG_BRCM */ - nan_reset_dbg_counters(); - /* XXX: WAR posting async enable response */ - //NanMacControl *cmd = new NanMacControl(iface, id, (void *)msg, cmdType); - NanMacControl *cmd = (NanMacControl*)(info.nan_mac_control); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - cmd->setType(cmdType); - cmd->setId(id); - cmd->setMsg((void *)msg); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - //cmd->releaseRef(); - return ret; -} - -void nan_dump_dbg_counters() -{ - ALOGI("Num Data Path Requests %d\n", counters.dp_req); - ALOGI("Num Data Path Responses %d\n", counters.dp_resp); - ALOGI("Num Data Path Confirms %d\n", counters.dp_confirm_evt); - ALOGI("Num Data Path Request Events %d\n", counters.dp_req_evt); - ALOGI("Num Transmit Requests %d\n", counters.transmit_req); - ALOGI("Num Followup Transmits Recvd %d\n", counters.transmit_recv); - ALOGI("Num Transmit Success %d\n", counters.transmit_txs); -} - -wifi_error nan_disable_request(transaction_id id, - wifi_interface_handle iface) -{ - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_DISABLE; - wifi_error ret = WIFI_SUCCESS; - - ALOGI("Disabling Nan, Handle = %p\n", handle); - NanMacControl *cmd = new NanMacControl(iface, id, NULL, cmdType); - NanMacControl *mac_prim = (NanMacControl*)(info.nan_mac_control); - - if (id != NAN_MAC_INVALID_TRANSID) { - ALOGE("Disable NAN MAC transId= %d\n", id); - mac_prim->setId(id); - } else { - ALOGE("Invalid transId= %d cur= %d\n", id, mac_prim->getId()); - } - - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - nan_dump_dbg_counters(); - - ret = (wifi_error)cmd->cancel(); - if (ret != WIFI_SUCCESS) { - ALOGE("cancel failed, error = %d\n", ret); - } else { - ALOGE("Deinitializing Nan Mac Control = %p\n", cmd); - } - cmd->releaseRef(); - return ret; -} - -wifi_error nan_publish_request(transaction_id id, - wifi_interface_handle iface, NanPublishRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - - ALOGI("Publish Nan, halHandle = %p\n", handle); -#ifdef CONFIG_BRCM - dump_NanPublishRequest(msg); -#endif /* CONFIG_BRCM */ - - NanRequestType cmdType = NAN_REQUEST_PUBLISH; - NanDiscEnginePrimitive *cmd = new NanDiscEnginePrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -} - -/* Function to send NAN request to the wifi driver */ -wifi_error nan_publish_cancel_request(transaction_id id, - wifi_interface_handle iface, NanPublishCancelRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - NanDiscEnginePrimitive *cmd; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_PUBLISH_CANCEL; - - ALOGE("Cancellling publish request %d\n", msg->publish_id); - cmd = new NanDiscEnginePrimitive(iface, id, (void *)msg, cmdType); - cmd->setInstId(msg->publish_id); - cmd->setType(cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -} - -/* Function to send NAN request to the wifi driver */ -wifi_error nan_subscribe_request(transaction_id id, - wifi_interface_handle iface, NanSubscribeRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - ALOGI("Subscribe Nan, halHandle = %p handle[%d]\n", handle, msg->subscribe_id); - NanDiscEnginePrimitive *cmd; -#ifdef CONFIG_BRCM - dump_NanSubscribeRequest(msg); -#endif /* CONFIG_BRCM */ - - NanRequestType cmdType = NAN_REQUEST_SUBSCRIBE; - cmd = new NanDiscEnginePrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; - -} - -/* Function to send NAN request to the wifi driver.*/ -wifi_error nan_subscribe_cancel_request(transaction_id id, - wifi_interface_handle iface, NanSubscribeCancelRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - NanDiscEnginePrimitive *cmd; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_SUBSCRIBE_CANCEL; - - ALOGE("creating new instance + %d\n", msg->subscribe_id); - cmd = new NanDiscEnginePrimitive(iface, id, (void *)msg, cmdType); - cmd->setInstId(msg->subscribe_id); - cmd->setType(cmdType); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - - return ret; -} - -#ifdef NAN_CLUSTER_MERGE -/* Function to send NAN cluster merge enable/disable request to the wifi driver.*/ -wifi_error nan_enable_cluster_merge_request(transaction_id id, - wifi_interface_handle iface, NanEnableMergeRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_ENABLE_MERGE; - - NanMacControl *cmd = new NanMacControl(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - cmd->setType(cmdType); - cmd->setId(id); - cmd->setMsg((void *)msg); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s :enable nan cluster merge failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - - return ret; -} -#endif /* NAN_CLUSTER_MERGE */ - -/* Function to send nan transmit followup Request to the wifi driver.*/ -wifi_error nan_transmit_followup_request(transaction_id id, - wifi_interface_handle iface, NanTransmitFollowupRequest* msg) -{ - NanDiscEnginePrimitive *cmd = NULL; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_TRANSMIT_FOLLOWUP; - wifi_error ret = WIFI_SUCCESS; - -#ifdef CONFIG_BRCM - dump_NanTransmitFollowupRequest(msg); -#endif /* CONFIG_BRCM */ - counters.transmit_req++; - cmd = new NanDiscEnginePrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - cmd->setTransactionId(id); - - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -} - -/* Function to send NAN statistics request to the wifi driver */ -wifi_error nan_stats_request(transaction_id id, - wifi_interface_handle iface, NanStatsRequest* msg) -{ - wifi_handle handle = getWifiHandle(iface); - - ALOGI("Nan Stats, halHandle = %p", handle); - NanRequestType cmdType = NAN_REQUEST_STATS; - -#ifdef NOT_SUPPORTED - wifi_error ret = WIFI_SUCCESS; - NanCommand *cmd = new NanCommand(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -#else - return WIFI_ERROR_NOT_SUPPORTED; -#endif -} - -/* Function to send NAN configuration request to the wifi driver */ -wifi_error nan_config_request(transaction_id id, - wifi_interface_handle iface, NanConfigRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_REQUEST_CONFIG; - - ALOGI("Configuring Nan, halHandle = %p\n", handle); - -#ifdef CONFIG_BRCM - /* check up nan config params from Nan manager level */ - dump_NanConfigRequestRequest(msg); -#endif /* CONFIG_BRCM */ - - NanMacControl *cmd = new NanMacControl(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - cmd->setType(cmdType); - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("start failed, error = %d\n", ret); - } else { - ALOGE("Initializing Nan Mac Control = %p\n", cmd); - } - cmd->releaseRef(); - return ret; -} - -/* Function to send NAN request to the wifi driver */ -wifi_error nan_tca_request(transaction_id id, - wifi_interface_handle iface, NanTCARequest* msg) -{ - wifi_handle handle = getWifiHandle(iface); - - ALOGI("Nan TCA, halHandle = %p", handle); - NanRequestType cmdType = NAN_REQUEST_TCA; - -#ifdef NOT_SUPPORTED - wifi_error ret = WIFI_SUCCESS; - NanCommand *cmd = new NanCommand(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -#else - return WIFI_ERROR_NOT_SUPPORTED; -#endif -} - -wifi_error nan_beacon_sdf_payload_request(transaction_id id, - wifi_interface_handle iface, NanBeaconSdfPayloadRequest* msg) -{ - ALOGI("Nan Beacon Sdf Payload Request"); - return WIFI_ERROR_NOT_SUPPORTED; -} - -wifi_error nan_get_capabilities(transaction_id id, wifi_interface_handle iface) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - ALOGI("Get Nan Capabilties, id=%d, halHandle=%p\n", id, handle); - - NanRequestType cmdType = NAN_REQUEST_GET_CAPABILTIES; - NanDiscEnginePrimitive *cmd = new NanDiscEnginePrimitive(iface, id, NULL, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - return ret; -} -wifi_error nan_check_dhd_hal_version(wifi_interface_handle iface, - wifi_handle handle) -{ - NanRequestType cmdType = NAN_VERSION_INFO; - NanMacControl *cmd = new NanMacControl(iface, 0, NULL, cmdType); - wifi_error ret = WIFI_SUCCESS; - u32 version; - - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - cmd->setType(cmdType); - - ret = (wifi_error)cmd->start(); - if (ret != WIFI_SUCCESS) { - ALOGI("\nVersion subcmd failed ret = %x\n", ret); - ret = WIFI_ERROR_NOT_SUPPORTED; - goto done; - } - version = cmd->getVersion(); - /* check if version handled..can support multiple versions */ - if (version == NAN_HAL_VERSION_1) { - ALOGI("\nGot the supported version %d\n", version); - current_dhd_hal_ver = version; - ret = WIFI_SUCCESS; - goto done; - } else { - ALOGI("\nGot the unsupported version %d\n", version); - ret = WIFI_ERROR_NOT_SUPPORTED; - goto done; - } -done: - cmd->releaseRef(); - return ret; -} -wifi_error nan_deinit_handler() -{ - if (info.nan_mac_control) { - /* register for Nan vendor events with info mac class*/ - NanMacControl *cmd_event = (NanMacControl*)(info.nan_mac_control); - cmd_event->unRegisterNanVendorEvents(); - delete (NanMacControl*)info.nan_mac_control; - info.nan_mac_control = NULL; - } - if (info.nan_disc_control) { - delete (NanDiscEnginePrimitive*)info.nan_disc_control; - info.nan_disc_control = NULL; - } - if (info.nan_dp_control) { - delete (NanDataPathPrimitive*)info.nan_dp_control; - info.nan_dp_control = NULL; - } - if (NAN_HANDLE(info)) { - delete GET_NAN_HANDLE(info); - NAN_HANDLE(info) = NULL; - } - return WIFI_SUCCESS; -} -wifi_error nan_register_handler(wifi_interface_handle iface, - NanCallbackHandler handlers) -{ - wifi_handle handle = getWifiHandle(iface); - if (NAN_HANDLE(info)) { - /* cleanup and re-register */ - nan_deinit_handler(); - } - ALOGI("\nChecking version compat\n"); - /* checking version compat b/w DHD and HAL */ - if (nan_check_dhd_hal_version(iface, handle) != WIFI_SUCCESS) { - ALOGE("\n Get version failed..check DHD\n"); - return WIFI_ERROR_NOT_SUPPORTED; - } - memset(&info, 0, sizeof(info)); - NAN_HANDLE(info) = new NanHandle(handle, handlers); - info.nan_mac_control = - (void*)new NanMacControl(iface, 0, NULL, NAN_REQUEST_LAST); - NULL_CHECK_RETURN(info.nan_mac_control, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - info.nan_disc_control = - (void*)new NanDiscEnginePrimitive(iface, 0, NULL, NAN_REQUEST_LAST); - NULL_CHECK_RETURN(info.nan_disc_control, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - info.nan_dp_control = - (void*)new NanDataPathPrimitive(iface, 0, NULL, NAN_REQUEST_LAST); - NULL_CHECK_RETURN(info.nan_dp_control, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - /* register for Nan vendor events with info mac class*/ - NanMacControl *cmd_event = (NanMacControl*)(info.nan_mac_control); - cmd_event->registerNanVendorEvents(); - return WIFI_SUCCESS; -} - -wifi_error nan_get_version(wifi_handle handle, NanVersion* version) -{ - wifi_error ret = WIFI_SUCCESS; - if (version) { - *version = (NAN_MAJOR_REL_VERSION << 16 | NAN_MINOR_REL_VERSION << 8 | - NAN_PATCH_REL_VERSION); - } else { - ret = WIFI_ERROR_INVALID_ARGS; - } - - return ret; -} - - -/////////////////////////////////////////////////////////////////////////////// -class NanEventCap : public WifiCommand -{ - public: - NanEventCap(wifi_interface_handle iface, int id) - : WifiCommand("NanCommand", iface, id) - {} - - int start() - { - registerNanVendorEvents(); - return WIFI_SUCCESS; - } - - int handleResponse(WifiEvent& reply) { - return NL_SKIP; - } - void unRegisterNanVendorEvents() - { - int i = 0; - for (i = NAN_EVENT_ENABLED; i <= NAN_EVENT_DATA_END; i++) { - unregisterVendorHandler(GOOGLE_OUI, i); - } - unregisterVendorHandler(GOOGLE_OUI, NAN_ASYNC_RESPONSE_DISABLED); - } - void registerNanVendorEvents() - { - int i = 0; - for (i = NAN_EVENT_ENABLED; i <= NAN_EVENT_DATA_END; i++) { - registerVendorHandler(GOOGLE_OUI, i); - } - registerVendorHandler(GOOGLE_OUI, NAN_ASYNC_RESPONSE_DISABLED); - } - - int handleEvent(WifiEvent& event) { - int cmd = event.get_vendor_subcmd(); - u16 attr_type; - nlattr *vendor_data = event.get_attribute(NL80211_ATTR_VENDOR_DATA); - - switch(cmd) { - case NAN_EVENT_DE_EVENT: { - u16 attr_type; - NanDiscEngEventInd de_event; - memset(&de_event, 0, sizeof(NanDiscEngEventInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_CLUSTER_ID) { - memcpy(&de_event.data.cluster.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("cluster id = " MACSTR "\n", MAC2STR(de_event.data.cluster.addr)); - } else if (attr_type == NAN_ATTRIBUTE_ENABLE_STATUS) { - ALOGI("nan enable status = %u\n", it.get_u16()); - } else if (attr_type == NAN_ATTRIBUTE_JOIN_STATUS) { - ALOGI("nan joined status = %u\n", it.get_u16()); - } else if (attr_type == NAN_ATTRIBUTE_DE_EVENT_TYPE) { - u8 de_type = it.get_u8(); - ALOGI("nan de event type = %u\n", de_type); - if (de_type == NAN_EVENT_IFACE) { - de_event.event_type = NAN_EVENT_ID_DISC_MAC_ADDR; - ALOGI("received NAN_EVENT_ID_DISC_MAC_ADDR event\n"); - } else if (de_type == NAN_EVENT_START) { - de_event.event_type = NAN_EVENT_ID_STARTED_CLUSTER; - ALOGI("received NAN cluster started event\n"); - } else if (de_type == NAN_EVENT_JOIN) { - /* To be deprecated */ - de_event.event_type = NAN_EVENT_ID_JOINED_CLUSTER; - ALOGI("received join event\n"); - } else if (de_type == NAN_EVENT_ROLE_CHANGE) { - ALOGI("received device role change event\n"); - } else if (de_type == NAN_EVENT_MERGE) { - ALOGI("received Merge Event\n"); - } else { - ALOGI("received unknown DE event, [%d]\n", de_type); - } - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(&de_event.data.cluster.addr, it.get_data(), NAN_MAC_ADDR_LEN); - memcpy(mNmi, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Primary discovery mac address = " MACSTR "\n", - MAC2STR(mNmi)); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDiscEngEvent(&de_event); - break; - } - case NAN_EVENT_DISABLED: { - ALOGI("Received NAN_EVENT_DISABLED\n"); - NanDisabledInd disabled_ind; - memset(&disabled_ind, 0, sizeof(NanDisabledInd)); - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_STATUS) { - disabled_ind.reason = (NanStatusType)it.get_u8(); - ALOGI("Nan Disable:status %u", disabled_ind.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(disabled_ind.nan_reason, it.get_data(), - sizeof(disabled_ind.nan_reason)); - ALOGI("nan disable reason: %s", disabled_ind.nan_reason); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDisabled(&disabled_ind); - unRegisterNanVendorEvents(); - break; - } - case NAN_EVENT_PUBLISH_TERMINATED: { - ALOGI("Received NAN_EVENT_PUBLISH_TERMINATED\n"); - NanPublishTerminatedInd pub_term_event; - memset(&pub_term_event, 0, sizeof(NanPublishTerminatedInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - pub_term_event.publish_id = it.get_u16(); - ALOGI("pub id %u", pub_term_event.publish_id); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - pub_term_event.reason = (NanStatusType)it.get_u8(); - ALOGI("pub termination status %u", pub_term_event.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(pub_term_event.nan_reason, it.get_data(), - sizeof(pub_term_event.nan_reason)); - ALOGI("Pub termination nan reason: %s", pub_term_event.nan_reason); - } else { - ALOGE("Unknown attr\n"); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventPublishTerminated(&pub_term_event); - break; - } - case NAN_EVENT_SUBSCRIBE_MATCH: { - NanMatchInd subscribe_event; - memset(&subscribe_event, 0, sizeof(NanMatchInd)); - ALOGI("Received NAN_EVENT_SUBSCRIBE_MATCH\n"); - - /* By default FW is unable to cache this match */ - subscribe_event.out_of_resource_flag = true; - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - ALOGI("sub id: %u", it.get_u16()); - subscribe_event.publish_subscribe_id = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - ALOGI("pub id %u", it.get_u32()); - subscribe_event.requestor_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(subscribe_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("publisher mac: " MACSTR, MAC2STR(subscribe_event.addr)); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("svc length: %d", it.get_u16()); - subscribe_event.service_specific_info_len = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(subscribe_event.service_specific_info, it.get_data(), - subscribe_event.service_specific_info_len); - subscribe_event.service_specific_info - [subscribe_event.service_specific_info_len] = '\0'; - ALOGI("service info: %s", subscribe_event.service_specific_info); - - } else if (attr_type == NAN_ATTRIBUTE_TX_MATCH_FILTER_LEN) { - ALOGI("sdf match filter length: %d", subscribe_event.sdf_match_filter_len); - subscribe_event.sdf_match_filter_len = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_TX_MATCH_FILTER) { - memcpy(subscribe_event.sdf_match_filter, it.get_data(), - subscribe_event.sdf_match_filter_len); - subscribe_event.sdf_match_filter - [subscribe_event.sdf_match_filter_len] = '\0'; - ALOGI("sdf match filter: %s", subscribe_event.sdf_match_filter); - } else if (attr_type == NAN_ATTRIBUTE_CIPHER_SUITE_TYPE) { - ALOGI("Peer Cipher suite type: %u", it.get_u8()); - subscribe_event.peer_cipher_type = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SCID_LEN) { - ALOGI("scid length %d", it.get_u32()); - subscribe_event.scid_len= it.get_u32(); - } else if (attr_type == NAN_ATTRIBUTE_SCID) { - memcpy(subscribe_event.scid, it.get_data(), - subscribe_event.scid_len); - subscribe_event.scid - [subscribe_event.scid_len] = '\0'; - ALOGI("scid: %s", subscribe_event.scid); - } else if (attr_type == NAN_ATTRIBUTE_RANGING_INDICATION) { - subscribe_event.range_info.ranging_event_type = it.get_u32(); - ALOGI("ranging indication %d", it.get_u32()); - } else if (attr_type == NAN_ATTRIBUTE_RANGING_RESULT) { - subscribe_event.range_info.range_measurement_mm = it.get_u32(); - ALOGI("ranging result %d", it.get_u32()); - } else if (attr_type == NAN_ATTRIBUTE_RSSI_PROXIMITY) { - subscribe_event.rssi_value = it.get_u8(); - ALOGI("rssi value : %u", it.get_u8()); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("sdea svc length %d", it.get_u16()); - subscribe_event.sdea_service_specific_info_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO) { - memcpy(subscribe_event.sdea_service_specific_info, it.get_data(), - subscribe_event.sdea_service_specific_info_len); - subscribe_event.sdea_service_specific_info - [subscribe_event.sdea_service_specific_info_len] = '\0'; - ALOGI("sdea service info: %s", subscribe_event.sdea_service_specific_info); - } else if (attr_type == NAN_ATTRIBUTE_MATCH_OCCURRED_FLAG) { - ALOGI("match occurred flag: %u", it.get_u8()); - subscribe_event.match_occured_flag = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_OUT_OF_RESOURCE_FLAG) { - ALOGI("Out of resource flag: %u", it.get_u8()); - subscribe_event.out_of_resource_flag = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_CONFIG_DP) { - ALOGI("Peer config for data path needed: %u", it.get_u8()); - subscribe_event.peer_sdea_params.config_nan_data_path = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_DP_TYPE) { - ALOGI("Data Path type: %u", it.get_u8()); - subscribe_event.peer_sdea_params.ndp_type = (NdpType)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_SECURITY) { - ALOGI("Security configuration: %u", it.get_u8()); - subscribe_event.peer_sdea_params.security_cfg = - (NanDataPathSecurityCfgStatus)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_SDE_CONTROL_RANGE_SUPPORT) { - ALOGI("Ranging report state: %u", it.get_u8()); - subscribe_event.peer_sdea_params.range_report = (NanRangeReport)it.get_u8(); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventMatch(&subscribe_event); - break; - } - case NAN_EVENT_SUBSCRIBE_UNMATCH: { - ALOGI("Received NAN_EVENT_SUBSCRIBE_UNMATCH\n"); - ALOGE("%s: Not applicable yet\n", __func__); - break; - } - case NAN_EVENT_SUBSCRIBE_TERMINATED: { - NanSubscribeTerminatedInd sub_term_event; - memset(&sub_term_event, 0, sizeof(NanSubscribeTerminatedInd)); - ALOGI("Received NAN_EVENT_SUBSCRIBE_TERMINATED\n"); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - sub_term_event.subscribe_id = it.get_u16(); - ALOGI("sub id: %u", sub_term_event.subscribe_id); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - sub_term_event.reason = (NanStatusType)it.get_u8(); - ALOGI("sub termination status %u", sub_term_event.reason); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(sub_term_event.nan_reason, it.get_data(), - sizeof(sub_term_event.nan_reason)); - ALOGI("sub termination nan reason: %s", sub_term_event.nan_reason); - } else { - ALOGE("Unknown attr: %u\n", attr_type); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventSubscribeTerminated(&sub_term_event); - break; - } - case NAN_EVENT_FOLLOWUP: { - NanFollowupInd followup_event; - memset(&followup_event, 0, sizeof(NanFollowupInd)); - ALOGI("Received NAN_EVENT_FOLLOWUP\n"); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(followup_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - - } else if (attr_type == NAN_ATTRIBUTE_PEER_ID) { - followup_event.publish_subscribe_id = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_INST_ID) { - followup_event.requestor_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - followup_event.service_specific_info_len = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(followup_event.service_specific_info, it.get_data(), - followup_event.service_specific_info_len); - followup_event.service_specific_info[followup_event.service_specific_info_len] = - '\0'; - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("sdea svc length %d", it.get_u16()); - followup_event.sdea_service_specific_info_len = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_SDEA_SERVICE_SPECIFIC_INFO) { - memcpy(followup_event.sdea_service_specific_info, it.get_data(), - followup_event.sdea_service_specific_info_len); - followup_event.sdea_service_specific_info[followup_event.sdea_service_specific_info_len] = '\0'; - ALOGI("sdea service info: %s", followup_event.sdea_service_specific_info); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventFollowup(&followup_event); - break; - } - case NAN_EVENT_SDF: { - ALOGI("Received NAN_EVENT_SDF:\n"); - NanBeaconSdfPayloadInd sdfInd; - memset(&sdfInd, 0, sizeof(sdfInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - sdfInd.data.frame_len = it.get_u32(); - if (sdfInd.data.frame_len > NAN_MAX_FRAME_DATA_LEN) { - sdfInd.data.frame_len = NAN_MAX_FRAME_DATA_LEN; - } - ALOGI("Received NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN: 0x%x(%d)\n", - sdfInd.data.frame_len, sdfInd.data.frame_len); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - ALOGI("Received NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO\n"); - memcpy(&sdfInd.data.frame_data, it.get_data(), sdfInd.data.frame_len); - prhex("sdfInd.data.frame_data: ", (u8*)sdfInd.data.frame_data, - sdfInd.data.frame_len); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventBeaconSdfPayload(&sdfInd); - break; - } -#ifdef NOT_YET - case NAN_EVENT_PUBLISH_REPLIED_IND: { - ALOGI("Received NAN_EVENT_PUBLISH_REPLIED_IND\n"); - NanPublishRepliedInd pub_reply_event; - memset(&pub_reply_event, 0, sizeof(pub_reply_event)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_SUBSCRIBE_ID) { - ALOGI("sub id: %u", it.get_u32()); - pub_reply_event.requestor_instance_id = it.get_u32(); - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(pub_reply_event.addr, it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Subscriber mac: " MACSTR, MAC2STR(pub_reply_event.addr)); - } else if (attr_type == NAN_ATTRIBUTE_RSSI_PROXIMITY) { - pub_reply_event.rssi_value = it.get_u8(); - ALOGI("Received rssi value : %u", it.get_u8()); - } - } - GET_NAN_HANDLE(info)->mHandlers.EventPublishReplied(&pub_reply_event); - break; - } -#endif /* NOT_YET */ - case NAN_EVENT_TCA: { - ALOGI("Received NAN_EVENT_TCA\n"); - //GET_NAN_HANDLE(info)->mHandlers.EventTca(&sdfPayload); - break; - } - case NAN_EVENT_DATA_REQUEST: { - ALOGI("Received NAN_EVENT_DATA_REQUEST_INDICATION\n"); - NanDataPathRequestInd ndp_request_event; - memset(&ndp_request_event, 0, sizeof(NanDataPathRequestInd)); - u16 ndp_ind_app_info_len = 0; - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_PUBLISH_ID) { - ALOGI("publish_id: %u\n", it.get_u16()); - ndp_request_event.service_instance_id = it.get_u16(); - - } else if (attr_type == NAN_ATTRIBUTE_MAC_ADDR) { - memcpy(ndp_request_event.peer_disc_mac_addr, - it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("Discovery MAC addr of the peer/initiator: " MACSTR "\n", - MAC2STR(ndp_request_event.peer_disc_mac_addr)); - - } else if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - ALOGI("ndp id: %u\n", it.get_u32()); - ndp_request_event.ndp_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_SECURITY) { - ALOGI("security: %u\n", (NanDataPathSecurityCfgStatus) it.get_u8()); - ndp_request_event.ndp_cfg.security_cfg = - (NanDataPathSecurityCfgStatus)it.get_u8(); - - } else if (attr_type == NAN_ATTRIBUTE_QOS) { - ALOGI("QoS: %u", (NanDataPathQosCfg)it.get_u8()); - ndp_request_event.ndp_cfg.qos_cfg = (NanDataPathQosCfg)it.get_u8(); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("service info len: %d\n", it.get_u16()); - ndp_ind_app_info_len = it.get_u16(); - ndp_request_event.app_info.ndp_app_info_len = ndp_ind_app_info_len; - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(ndp_request_event.app_info.ndp_app_info, - it.get_data(), ndp_ind_app_info_len); - ndp_request_event.app_info.ndp_app_info[ndp_ind_app_info_len] = '\0'; - ALOGI("service info: %s\n", ndp_request_event.app_info.ndp_app_info); - - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataRequest(&ndp_request_event); - break; - } - case NAN_EVENT_DATA_CONFIRMATION: { - ALOGI("Received NAN_EVENT_DATA_CONFIRMATION\n"); - NanDataPathConfirmInd ndp_create_confirmation_event; - memset(&ndp_create_confirmation_event, 0, sizeof(NanDataPathConfirmInd)); - u16 ndp_conf_app_info_len = 0; - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - - if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - ALOGI("ndp id: %u", it.get_u32()); - ndp_create_confirmation_event.ndp_instance_id = it.get_u32(); - - } else if (attr_type == NAN_ATTRIBUTE_PEER_NDI_MAC_ADDR) { - memcpy(ndp_create_confirmation_event.peer_ndi_mac_addr, - it.get_data(), NAN_MAC_ADDR_LEN); - ALOGI("NDI mac address of the peer: " MACSTR "\n", - MAC2STR(ndp_create_confirmation_event.peer_ndi_mac_addr)); - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO_LEN) { - ALOGI("service info string len: %d\n", it.get_u16()); - ndp_conf_app_info_len = it.get_u16(); - ndp_create_confirmation_event.app_info.ndp_app_info_len = - ndp_conf_app_info_len; - - } else if (attr_type == NAN_ATTRIBUTE_SERVICE_SPECIFIC_INFO) { - memcpy(ndp_create_confirmation_event.app_info.ndp_app_info, it.get_data(), - ndp_conf_app_info_len); - ndp_create_confirmation_event.app_info.ndp_app_info[ndp_conf_app_info_len] = - '\0'; - ALOGI("service info string: %s\n", - ndp_create_confirmation_event.app_info.ndp_app_info); - - } else if (attr_type == NAN_ATTRIBUTE_RSP_CODE) { - ALOGI("response code %u\n", (NanDataPathResponseCode) it.get_u8()); - ndp_create_confirmation_event.rsp_code = - (NanDataPathResponseCode)it.get_u8(); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataConfirm(&ndp_create_confirmation_event); - break; - } - case NAN_EVENT_DATA_END: { - ALOGI("Received NAN_EVENT_DATA_END\n"); - NanDataPathEndInd ndp_end_event; - memset(&ndp_end_event, 0, sizeof(NanDataPathEndInd)); - u8 count = 0; - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_INST_COUNT) { - ALOGI("ndp count: %u\n", it.get_u8()); - ndp_end_event.num_ndp_instances = it.get_u8(); - count = it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_NDP_ID) { - ALOGI("count: %u\n", count); - while (count) { - ndp_end_event.ndp_instance_id[count-1] = it.get_u32(); - ALOGI("ndp id: %u\n", ndp_end_event.ndp_instance_id[count-1]); - count -= 1; - } - } else { - ALOGI("Unknown attr_type: %s\n", NanAttrToString(attr_type)); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventDataEnd(&ndp_end_event); - break; - } - case NAN_EVENT_TRANSMIT_FOLLOWUP_IND: { - ALOGI("Received NAN_EVENT_TRANSMIT_FOLLOWUP_IND\n"); - NanTransmitFollowupInd followup_ind; - memset(&followup_ind, 0, sizeof(NanTransmitFollowupInd)); - - for (nl_iterator it(vendor_data); it.has_next(); it.next()) { - attr_type = it.get_type(); - if (attr_type == NAN_ATTRIBUTE_TRANSAC_ID) { - followup_ind.id = it.get_u16(); - } else if (attr_type == NAN_ATTRIBUTE_STATUS) { - followup_ind.reason = (NanStatusType)it.get_u8(); - } else if (attr_type == NAN_ATTRIBUTE_REASON) { - memcpy(followup_ind.nan_reason, it.get_data(), - sizeof(followup_ind.nan_reason)); - ALOGI("nan transmit followup ind: reason: %s", followup_ind.nan_reason); - } - } - - GET_NAN_HANDLE(info)->mHandlers.EventTransmitFollowup(&followup_ind); - break; - } - case NAN_EVENT_UNKNOWN: - ALOGI("Received NAN_EVENT_UNKNOWN\n"); - break; - } // end-of-switch - return NL_SKIP; - } -}; - -/* To see event prints in console */ -wifi_error nan_event_check_request(transaction_id id, wifi_interface_handle iface) -{ - wifi_handle handle = getWifiHandle(iface); - NanEventCap *cmd = new NanEventCap(iface, id); - if (cmd == NULL) { - return WIFI_ERROR_NOT_SUPPORTED; - } - return (wifi_error)cmd->start(); -} - -/* Create NAN Data Interface */ -wifi_error nan_data_interface_create(transaction_id id, - wifi_interface_handle iface, char* iface_name) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NAN_DBG_ENTER(); - - NanRequestType cmdType = NAN_DATA_PATH_IFACE_CREATE; - NanDataPathPrimitive *cmd = - new NanDataPathPrimitive(iface, id, (void *)iface_name, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in open, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - - NAN_DBG_EXIT(); - return ret; -} - -/* Delete NAN Data Interface */ -wifi_error nan_data_interface_delete(transaction_id id, - wifi_interface_handle iface, char* iface_name) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NAN_DBG_ENTER(); - - NanRequestType cmdType = NAN_DATA_PATH_IFACE_DELETE; - NanDataPathPrimitive *cmd = - new NanDataPathPrimitive(iface, id, (void *)iface_name, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in open, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - - NAN_DBG_EXIT(); - return ret; -} - -/* Initiate a NDP session: Initiator */ -wifi_error nan_data_request_initiator(transaction_id id, - wifi_interface_handle iface, NanDataPathInitiatorRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - - NAN_DBG_ENTER(); - NanRequestType cmdType; - NanDataPathPrimitive *cmd = NULL; - -#ifdef CONFIG_BRCM - dump_NanDataPathInitiatorRequest(msg); -#endif /* CONFIG_BRCM */ - counters.dp_req++; - if (msg->service_name_len) { - if (strncmp(NAN_OOB_INTEROP_SVC_NAME, - (char*)msg->service_name, msg->service_name_len) == 0) { - ALOGI("Use Hardcoded svc_hash\n"); - msg->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(msg->service_name, NAN_OOB_INTEROP_SVC_HASH, NAN_SVC_HASH_SIZE); - } else { - u8 svc_hash[NAN_SVC_HASH_SIZE]; - - ret = (wifi_error)get_svc_hash(msg->service_name, msg->service_name_len, - svc_hash, NAN_SVC_HASH_SIZE); - if (ret < 0) { - ALOGE("%s: Failed to get hashed svc name\n", __func__); - goto done; - } - - ALOGI("Created svc_hash\n"); - msg->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(msg->service_name, svc_hash, msg->service_name_len); - } - } else if (msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) { - NanDataPathSecInfoRequest msg_sec_info; - if (msg->requestor_instance_id == 0) { - ALOGE("Invalid Pub ID = %d, Mandatory param is missing\n", msg->requestor_instance_id); - ret = WIFI_ERROR_INVALID_ARGS; - goto done; - } else { - ALOGI("Pub ID = %d, Mandatory param is present\n", msg->requestor_instance_id); - } - if (ETHER_ISNULLADDR(msg->peer_disc_mac_addr)) { - ALOGE("Invalid Pub NMI, Mandatory param is missing\n"); - ret = WIFI_ERROR_INVALID_ARGS; - goto done; - } - - msg_sec_info.requestor_instance_id = msg->requestor_instance_id; - memcpy(msg_sec_info.peer_disc_mac_addr, msg->peer_disc_mac_addr, NAN_MAC_ADDR_LEN); - msg_sec_info.ndp_instance_id = 0; - cmdType = NAN_DATA_PATH_SEC_INFO; - cmd = new NanDataPathPrimitive(iface, id, (void *)&msg_sec_info, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - goto done; - } - memcpy(msg->service_name, cmd->mSvcHash, NAN_SVC_HASH_SIZE); - } - /* free old command */ - if (cmd) { - cmd->releaseRef(); - } - cmdType = NAN_DATA_PATH_INIT_REQUEST; - cmd = new NanDataPathPrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in open, error = %d\n", __func__, ret); - goto done; - } -done: - if (cmd) { - cmd->releaseRef(); - } - - NAN_DBG_EXIT(); - return ret; -} - -/* Response to a data indication received corresponding to a NDP session. - * An indication is received with a data request and the responder will send a data response - */ -wifi_error nan_data_indication_response(transaction_id id, - wifi_interface_handle iface, NanDataPathIndicationResponse* msg) -{ - wifi_error ret = WIFI_SUCCESS; - wifi_handle handle = getWifiHandle(iface); - NAN_DBG_ENTER(); - NanRequestType cmdType; - u8 pub_nmi[NAN_MAC_ADDR_LEN] = {0}; - NanDataPathPrimitive *cmd = NULL; - -#ifdef CONFIG_BRCM - dump_NanDataPathIndicationResponse(msg); -#endif /* CONFIG_BRCM */ - counters.dp_resp++; - if (msg->service_name_len) { - if (strncmp(NAN_OOB_INTEROP_SVC_NAME, - (char*)msg->service_name, msg->service_name_len) == 0) { - ALOGI("Use Hardcoded svc_hash\n"); - msg->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(msg->service_name, NAN_OOB_INTEROP_SVC_HASH, NAN_SVC_HASH_SIZE); - } else { - u8 svc_hash[NAN_SVC_HASH_SIZE]; - - ret = (wifi_error)get_svc_hash(msg->service_name, msg->service_name_len, - svc_hash, NAN_SVC_HASH_SIZE); - if (ret < 0) { - ALOGE("%s: Failed to get hashed svc name\n", __func__); - goto done; - } - ALOGI("Created svc_hash\n"); - msg->service_name_len = NAN_SVC_HASH_SIZE; - memcpy(msg->service_name, svc_hash, msg->service_name_len); - } - } - if (msg->key_info.key_type == NAN_SECURITY_KEY_INPUT_PASSPHRASE) { - NanDataPathSecInfoRequest msg_sec_info; - - if (msg->ndp_instance_id == 0) { - ALOGE("Invalid NDP ID, Mandatory info is not present\n"); - ret = WIFI_ERROR_INVALID_ARGS; - goto done; - } else { - ALOGI("NDP ID = %d, Mandatory info is present\n", msg->ndp_instance_id); - } - msg_sec_info.ndp_instance_id = msg->ndp_instance_id; - msg_sec_info.requestor_instance_id = 0; - cmdType = NAN_DATA_PATH_SEC_INFO; - cmd = new NanDataPathPrimitive(iface, id, (void *)&msg_sec_info, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in start, error = %d\n", __func__, ret); - goto done; - } - - if (ETHER_ISNULLADDR(cmd->mPubNmi)) { - ALOGE("Invalid Pub NMI\n"); - ret = WIFI_ERROR_INVALID_ARGS; - goto done; - } - memcpy(pub_nmi, cmd->mPubNmi, NAN_MAC_ADDR_LEN); - - if (!msg->service_name_len) { - if (SVCHASH_ISNULL(cmd->mSvcHash)) { - ALOGE("Invalid svc_hash\n"); - ret = WIFI_ERROR_INVALID_ARGS; - goto done; - } - memcpy(msg->service_name, cmd->mSvcHash, NAN_SVC_HASH_SIZE); - } - } - /* free old command */ - if (cmd) { - cmd->releaseRef(); - } - cmdType = NAN_DATA_PATH_IND_RESPONSE; - cmd = new NanDataPathPrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - memcpy(cmd->mPubNmi, pub_nmi, NAN_MAC_ADDR_LEN); - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in open, error = %d\n", __func__, ret); - goto done; - } - -done: - if (cmd) { - cmd->releaseRef(); - } - NAN_DBG_EXIT(); - return ret; -} - -/* NDL termination request: from either Initiator/Responder */ -wifi_error nan_data_end(transaction_id id, - wifi_interface_handle iface, NanDataPathEndRequest* msg) -{ - wifi_error ret = WIFI_SUCCESS; - NanDataPathPrimitive *cmd; - wifi_handle handle = getWifiHandle(iface); - NanRequestType cmdType = NAN_DATA_PATH_END; - NAN_DBG_ENTER(); - - cmd = new NanDataPathPrimitive(iface, id, (void *)msg, cmdType); - NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); - - ret = (wifi_error)cmd->open(); - if (ret != WIFI_SUCCESS) { - ALOGE("%s : failed in open, error = %d\n", __func__, ret); - } - cmd->releaseRef(); - NAN_DBG_EXIT(); - return ret; -} diff --git a/wifi_hal/wifi_hal.cpp b/wifi_hal/wifi_hal.cpp index 258725c..8c2cb9f 100755 --- a/wifi_hal/wifi_hal.cpp +++ b/wifi_hal/wifi_hal.cpp @@ -222,29 +222,6 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_enable_firmware_roaming = wifi_enable_firmware_roaming; fn->wifi_get_roaming_capabilities = wifi_get_roaming_capabilities; fn->wifi_configure_roaming = wifi_configure_roaming; - fn->wifi_nan_register_handler = nan_register_handler; - fn->wifi_nan_enable_request = nan_enable_request; - fn->wifi_nan_disable_request = nan_disable_request; - fn->wifi_nan_publish_request = nan_publish_request; - fn->wifi_nan_publish_cancel_request = nan_publish_cancel_request; - fn->wifi_nan_subscribe_request = nan_subscribe_request; - fn->wifi_nan_subscribe_cancel_request = nan_subscribe_cancel_request; - fn->wifi_nan_transmit_followup_request = nan_transmit_followup_request; - fn->wifi_nan_stats_request = nan_stats_request; - fn->wifi_nan_config_request = nan_config_request; - fn->wifi_nan_tca_request = nan_tca_request; - fn->wifi_nan_beacon_sdf_payload_request = nan_beacon_sdf_payload_request; - fn->wifi_nan_get_version = nan_get_version; - fn->wifi_nan_get_capabilities = nan_get_capabilities; - fn->wifi_nan_data_interface_create = nan_data_interface_create; - fn->wifi_nan_data_interface_delete = nan_data_interface_delete; - fn->wifi_nan_data_request_initiator = nan_data_request_initiator; - fn->wifi_nan_data_indication_response = nan_data_indication_response; - fn->wifi_nan_data_end = nan_data_end; - fn->wifi_set_latency_mode = wifi_set_latency_mode; -#ifdef NAN_CLUSTER_MERGE - fn->wifi_nan_enable_merge_request = nan_enable_cluster_merge_request; -#endif /* NAN_CLUSTER_MERGE */ fn->wifi_select_tx_power_scenario = wifi_select_tx_power_scenario; fn->wifi_reset_tx_power_scenario = wifi_reset_tx_power_scenario; @@ -500,10 +477,6 @@ static void internal_cleaned_up_handler(wifi_handle handle) ALOGI("Internal cleanup completed"); } -void wifi_internal_module_cleanup() -{ - nan_deinit_handler(); -} void wifi_cleanup(wifi_handle handle, wifi_cleaned_up_handler handler) { @@ -559,8 +532,6 @@ void wifi_cleanup(wifi_handle handle, wifi_cleaned_up_handler handler) } } info->clean_up = true; - wifi_internal_module_cleanup(); - ALOGI("wifi nan internal clean up done"); pthread_mutex_lock(&info->cb_lock); int bad_commands = 0; |