summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-03 05:15:12 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-03 05:15:12 -0700
commita146e281c3047419da15e1a9399ee18b33614b2b (patch)
tree8d290c59ee2cf77765143cc678c5a8072c4cb8da
parenta842daa486ad75f3f131a6be64d578f941f08651 (diff)
parent0cc5d43944bf6b206693b74175c08326183e4f23 (diff)
downloadandroid_hardware_qcom_wlan-a146e281c3047419da15e1a9399ee18b33614b2b.tar.gz
android_hardware_qcom_wlan-a146e281c3047419da15e1a9399ee18b33614b2b.tar.bz2
android_hardware_qcom_wlan-a146e281c3047419da15e1a9399ee18b33614b2b.zip
Merge "Wifihal: Fix service instance id from u16 to u32"
-rw-r--r--qcwcn/wifi_hal/nan.cpp498
-rw-r--r--qcwcn/wifi_hal/nan_i.h12
-rw-r--r--qcwcn/wifi_hal/nan_ind.cpp172
-rw-r--r--qcwcn/wifi_hal/nan_req.cpp3
-rw-r--r--qcwcn/wifi_hal/nan_rsp.cpp50
-rw-r--r--qcwcn/wifi_hal/nancommand.h9
-rw-r--r--qcwcn/wifi_hal/vendor_definitions.h37
7 files changed, 702 insertions, 79 deletions
diff --git a/qcwcn/wifi_hal/nan.cpp b/qcwcn/wifi_hal/nan.cpp
index 939a3f9..8498be4 100644
--- a/qcwcn/wifi_hal/nan.cpp
+++ b/qcwcn/wifi_hal/nan.cpp
@@ -45,7 +45,7 @@ wifi_error nan_register_handler(wifi_interface_handle iface,
nanCommand = NanCommand::instance(wifiHandle);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -77,7 +77,7 @@ wifi_error nan_enable_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -92,12 +92,12 @@ wifi_error nan_enable_request(transaction_id id,
ret = nanCommand->putNanEnable(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanEnable Error:%d",__func__, ret);
+ ALOGE("%s: putNanEnable Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -118,7 +118,7 @@ wifi_error nan_disable_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -133,12 +133,12 @@ wifi_error nan_disable_request(transaction_id id,
ret = nanCommand->putNanDisable(id);
if (ret != 0) {
- ALOGE("%s: putNanDisable Error:%d",__func__, ret);
+ ALOGE("%s: putNanDisable Error:%d",__FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d",__FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -160,7 +160,7 @@ wifi_error nan_publish_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -175,12 +175,12 @@ wifi_error nan_publish_request(transaction_id id,
ret = nanCommand->putNanPublish(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanPublish Error:%d",__func__, ret);
+ ALOGE("%s: putNanPublish Error:%d",__FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d",__FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -202,7 +202,7 @@ wifi_error nan_publish_cancel_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -217,12 +217,12 @@ wifi_error nan_publish_cancel_request(transaction_id id,
ret = nanCommand->putNanPublishCancel(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanPublishCancel Error:%d",__func__, ret);
+ ALOGE("%s: putNanPublishCancel Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -244,7 +244,7 @@ wifi_error nan_subscribe_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -259,12 +259,12 @@ wifi_error nan_subscribe_request(transaction_id id,
ret = nanCommand->putNanSubscribe(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanSubscribe Error:%d",__func__, ret);
+ ALOGE("%s: putNanSubscribe Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -286,7 +286,7 @@ wifi_error nan_subscribe_cancel_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -301,12 +301,12 @@ wifi_error nan_subscribe_cancel_request(transaction_id id,
ret = nanCommand->putNanSubscribeCancel(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanSubscribeCancel Error:%d",__func__, ret);
+ ALOGE("%s: putNanSubscribeCancel Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -328,7 +328,7 @@ wifi_error nan_transmit_followup_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -343,12 +343,12 @@ wifi_error nan_transmit_followup_request(transaction_id id,
ret = nanCommand->putNanTransmitFollowup(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanTransmitFollowup Error:%d",__func__, ret);
+ ALOGE("%s: putNanTransmitFollowup Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -370,7 +370,7 @@ wifi_error nan_stats_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -385,12 +385,12 @@ wifi_error nan_stats_request(transaction_id id,
ret = nanCommand->putNanStats(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanStats Error:%d",__func__, ret);
+ ALOGE("%s: putNanStats Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -412,7 +412,7 @@ wifi_error nan_config_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -427,12 +427,12 @@ wifi_error nan_config_request(transaction_id id,
ret = nanCommand->putNanConfig(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanConfig Error:%d",__func__, ret);
+ ALOGE("%s: putNanConfig Error:%d",__FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d",__FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -454,7 +454,7 @@ wifi_error nan_tca_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -469,12 +469,12 @@ wifi_error nan_tca_request(transaction_id id,
ret = nanCommand->putNanTCA(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanTCA Error:%d",__func__, ret);
+ ALOGE("%s: putNanTCA Error:%d",__FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d",__FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -499,7 +499,7 @@ wifi_error nan_beacon_sdf_payload_request(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -514,12 +514,12 @@ wifi_error nan_beacon_sdf_payload_request(transaction_id id,
ret = nanCommand->putNanBeaconSdfPayload(id, msg);
if (ret != 0) {
- ALOGE("%s: putNanBeaconSdfPayload Error:%d",__func__, ret);
+ ALOGE("%s: putNanBeaconSdfPayload Error:%d", __FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
@@ -537,13 +537,13 @@ wifi_error nan_get_sta_parameter(transaction_id id,
nanCommand = NanCommand::instance(wifiHandle);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
ret = nanCommand->getNanStaParameter(iface, msg);
if (ret != 0) {
- ALOGE("%s: getNanStaParameter Error:%d",__func__, ret);
+ ALOGE("%s: getNanStaParameter Error:%d", __FUNCTION__, ret);
goto cleanup;
}
@@ -565,7 +565,7 @@ wifi_error nan_get_capabilities(transaction_id id,
OUI_QCA,
QCA_NL80211_VENDOR_SUBCMD_NAN);
if (nanCommand == NULL) {
- ALOGE("%s: Error NanCommand NULL", __func__);
+ ALOGE("%s: Error NanCommand NULL", __FUNCTION__);
return WIFI_ERROR_UNKNOWN;
}
@@ -580,12 +580,361 @@ wifi_error nan_get_capabilities(transaction_id id,
ret = nanCommand->putNanCapabilities(id);
if (ret != 0) {
- ALOGE("%s: putNanCapabilities Error:%d",__func__, ret);
+ ALOGE("%s: putNanCapabilities Error:%d",__FUNCTION__, ret);
goto cleanup;
}
ret = nanCommand->requestEvent();
if (ret != 0) {
- ALOGE("%s: requestEvent Error:%d",__func__, ret);
+ ALOGE("%s: requestEvent Error:%d",__FUNCTION__, ret);
+ }
+cleanup:
+ delete nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_initialize_vendor_cmd(wifi_interface_handle iface,
+ NanCommand **nanCommand)
+{
+ int ret = 0;
+ interface_info *ifaceInfo = getIfaceInfo(iface);
+ wifi_handle wifiHandle = getWifiHandle(iface);
+
+ if (nanCommand == NULL) {
+ ALOGE("%s: Error nanCommand NULL", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ *nanCommand = new NanCommand(wifiHandle,
+ 0,
+ OUI_QCA,
+ QCA_NL80211_VENDOR_SUBCMD_NDP);
+ if (*nanCommand == NULL) {
+ ALOGE("%s: Object creation failed", __FUNCTION__);
+ return WIFI_ERROR_OUT_OF_MEMORY;
+ }
+
+ /* Create the message */
+ ret = (*nanCommand)->create();
+ if (ret < 0)
+ goto cleanup;
+
+ ret = (*nanCommand)->set_iface_id(ifaceInfo->name);
+ if (ret < 0)
+ goto cleanup;
+
+ return WIFI_SUCCESS;
+cleanup:
+ delete *nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_data_interface_create(transaction_id id,
+ wifi_interface_handle iface,
+ char* iface_name)
+{
+ int ret = WIFI_SUCCESS;
+ struct nlattr *nlData;
+ NanCommand *nanCommand = NULL;
+
+ if (iface_name == NULL) {
+ ALOGE("%s: Invalid Nan Data Interface Name. \n", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ ret = nan_initialize_vendor_cmd(iface,
+ &nanCommand);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Initialization failed", __FUNCTION__);
+ return (wifi_error)ret;
+ }
+
+ /* Add the vendor specific attributes for the NL command. */
+ nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
+ if (!nlData)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD,
+ QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_CREATE) ||
+ nanCommand->put_u16(
+ QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
+ id) ||
+ nanCommand->put_string(
+ QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR,
+ iface_name)) {
+ goto cleanup;
+ }
+
+ nanCommand->attr_end(nlData);
+ ret = nanCommand->requestEvent();
+ if (ret != 0) {
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
+ }
+cleanup:
+ delete nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_data_interface_delete(transaction_id id,
+ wifi_interface_handle iface,
+ char* iface_name)
+{
+ int ret = WIFI_SUCCESS;
+ struct nlattr *nlData;
+ NanCommand *nanCommand = NULL;
+
+ if (iface_name == NULL) {
+ ALOGE("%s: Invalid Nan Data Interface Name. \n", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+ ret = nan_initialize_vendor_cmd(iface,
+ &nanCommand);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Initialization failed", __FUNCTION__);
+ return (wifi_error)ret;
+ }
+
+ /* Add the vendor specific attributes for the NL command. */
+ nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
+ if (!nlData)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD,
+ QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_DELETE) ||
+ nanCommand->put_u16(
+ QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
+ id) ||
+ nanCommand->put_string(
+ QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR,
+ iface_name)) {
+ goto cleanup;
+ }
+
+ nanCommand->attr_end(nlData);
+
+ ret = nanCommand->requestEvent();
+ if (ret != 0) {
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
+ }
+cleanup:
+ delete nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_data_request_initiator(transaction_id id,
+ wifi_interface_handle iface,
+ NanDataPathInitiatorRequest* msg)
+{
+ int ret = WIFI_SUCCESS;
+ struct nlattr *nlData, *nlCfgSecurity, *nlCfgQos;
+ NanCommand *nanCommand = NULL;
+
+ if (msg == NULL)
+ return WIFI_ERROR_INVALID_ARGS;
+
+ ret = nan_initialize_vendor_cmd(iface,
+ &nanCommand);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Initialization failed", __FUNCTION__);
+ return (wifi_error)ret;
+ }
+
+ /* Add the vendor specific attributes for the NL command. */
+ nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
+ if (!nlData)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD,
+ QCA_WLAN_VENDOR_ATTR_NDP_INITIATOR_REQUEST) ||
+ nanCommand->put_u16(
+ QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
+ id) ||
+ nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID,
+ msg->service_instance_id) ||
+ nanCommand->put_bytes(
+ QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR,
+ (char *)msg->peer_disc_mac_addr,
+ NAN_MAC_ADDR_LEN) ||
+ nanCommand->put_string(
+ QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR,
+ msg->ndp_iface)) {
+ goto cleanup;
+ }
+
+ if (msg->channel_request_type != NAN_DP_CHANNEL_NOT_REQUESTED) {
+ if (nanCommand->put_u32 (
+ QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG,
+ msg->channel_request_type) ||
+ nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL,
+ msg->channel))
+ goto cleanup;
+ }
+
+ if (msg->app_info.ndp_app_info_len != 0) {
+ if (nanCommand->put_bytes(
+ QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO,
+ (char *)msg->app_info.ndp_app_info,
+ msg->app_info.ndp_app_info_len)) {
+ goto cleanup;
+ }
+ }
+ if (msg->ndp_cfg.security_cfg == NAN_DP_CONFIG_SECURITY) {
+ nlCfgSecurity =
+ nanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_SECURITY);
+ if (!nlCfgSecurity)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SECURITY_TYPE,
+ 0)) {
+ goto cleanup;
+ }
+ nanCommand->attr_end(nlCfgSecurity);
+ }
+ if (msg->ndp_cfg.qos_cfg == NAN_DP_CONFIG_QOS) {
+ nlCfgQos =
+ nanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS);
+ if (!nlCfgQos)
+ goto cleanup;
+ /* TBD Qos Info */
+ nanCommand->attr_end(nlCfgQos);
+ }
+ nanCommand->attr_end(nlData);
+
+ ret = nanCommand->requestEvent();
+ if (ret != 0) {
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
+ }
+cleanup:
+ delete nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_data_indication_response(transaction_id id,
+ wifi_interface_handle iface,
+ NanDataPathIndicationResponse* msg)
+{
+ int ret = WIFI_SUCCESS;
+ struct nlattr *nlData, *nlCfgSecurity, *nlCfgQos;
+ NanCommand *nanCommand = NULL;
+
+ if (msg == NULL)
+ return WIFI_ERROR_INVALID_ARGS;
+
+ ret = nan_initialize_vendor_cmd(iface,
+ &nanCommand);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Initialization failed", __FUNCTION__);
+ return (wifi_error)ret;
+ }
+
+ /* Add the vendor specific attributes for the NL command. */
+ nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
+ if (!nlData)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD,
+ QCA_WLAN_VENDOR_ATTR_NDP_RESPONDER_REQUEST) ||
+ nanCommand->put_u16(
+ QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
+ id) ||
+ nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID,
+ msg->ndp_instance_id) ||
+ nanCommand->put_string(
+ QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR,
+ msg->ndp_iface) ||
+ nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE,
+ msg->rsp_code)) {
+ goto cleanup;
+ }
+ if (msg->app_info.ndp_app_info_len != 0) {
+ if (nanCommand->put_bytes(
+ QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO,
+ (char *)msg->app_info.ndp_app_info,
+ msg->app_info.ndp_app_info_len)) {
+ goto cleanup;
+ }
+ }
+ if (msg->ndp_cfg.security_cfg == NAN_DP_CONFIG_SECURITY) {
+ nlCfgSecurity =
+ nanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_SECURITY);
+ if (!nlCfgSecurity)
+ goto cleanup;
+ /* Setting value to 0 for now */
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SECURITY_TYPE,
+ 0)) {
+ goto cleanup;
+ }
+ nanCommand->attr_end(nlCfgSecurity);
+ }
+ if (msg->ndp_cfg.qos_cfg == NAN_DP_CONFIG_QOS) {
+ nlCfgQos =
+ nanCommand->attr_start(QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS);
+ if (!nlCfgQos)
+ goto cleanup;
+
+ /* TBD Qos Info */
+ nanCommand->attr_end(nlCfgQos);
+ }
+ nanCommand->attr_end(nlData);
+
+ ret = nanCommand->requestEvent();
+ if (ret != 0) {
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
+ }
+cleanup:
+ delete nanCommand;
+ return (wifi_error)ret;
+}
+
+wifi_error nan_data_end(transaction_id id,
+ wifi_interface_handle iface,
+ NanDataPathEndRequest* msg)
+{
+ int ret = WIFI_SUCCESS;
+ struct nlattr *nlData;
+ NanCommand *nanCommand = NULL;
+
+ if (msg == NULL)
+ return WIFI_ERROR_INVALID_ARGS;
+
+ ret = nan_initialize_vendor_cmd(iface,
+ &nanCommand);
+ if (ret != WIFI_SUCCESS) {
+ ALOGE("%s: Initialization failed", __FUNCTION__);
+ return (wifi_error)ret;
+ }
+
+ /* Add the vendor specific attributes for the NL command. */
+ nlData = nanCommand->attr_start(NL80211_ATTR_VENDOR_DATA);
+ if (!nlData)
+ goto cleanup;
+
+ if (nanCommand->put_u32(
+ QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD,
+ QCA_WLAN_VENDOR_ATTR_NDP_END_REQUEST) ||
+ nanCommand->put_u16(
+ QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
+ id) ||
+ nanCommand->put_bytes(
+ QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY,
+ (char *)msg->ndp_instance_id,
+ msg->num_ndp_instances * sizeof(u32))) {
+ goto cleanup;
+ }
+ nanCommand->attr_end(nlData);
+
+ ret = nanCommand->requestEvent();
+ if (ret != 0) {
+ ALOGE("%s: requestEvent Error:%d", __FUNCTION__, ret);
}
cleanup:
delete nanCommand;
@@ -616,9 +965,7 @@ NanCommand* NanCommand::instance(wifi_handle handle)
QCA_NL80211_VENDOR_SUBCMD_NAN);
ALOGV("NanCommand %p created", mNanCommandInstance);
return mNanCommandInstance;
- }
- else
- {
+ } else {
if (handle != getWifiHandle(mNanCommandInstance->mInfo)) {
/* upper layer must have cleaned up the handle and reinitialized,
so we need to update the same */
@@ -652,13 +999,22 @@ int NanCommand::handleResponse(WifiEvent &reply){
int NanCommand::setCallbackHandler(NanCallbackHandler nHandler)
{
- int res = 0;
+ int res = WIFI_SUCCESS;
mHandler = nHandler;
res = registerVendorHandler(mVendor_id, mSubcmd);
if (res != 0) {
//error case should not happen print log
ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=%u",
- __func__, mVendor_id, mSubcmd);
+ __FUNCTION__, mVendor_id, mSubcmd);
+ return res;
+ }
+
+ res = registerVendorHandler(mVendor_id, QCA_NL80211_VENDOR_SUBCMD_NDP);
+ if (res != 0) {
+ //error case should not happen print log
+ ALOGE("%s: Unable to register Vendor Handler Vendor Id=0x%x subcmd=QCA_NL80211_VENDOR_SUBCMD_NDP",
+ __FUNCTION__, mVendor_id);
+ return res;
}
return res;
}
@@ -710,17 +1066,54 @@ int NanCommand::handleEvent(WifiEvent &event)
//the response callback handler with the populated
//NanResponseMsg
handleNanResponse();
- }
- else {
+ } else {
//handleNanIndication will parse the data and call
//the corresponding Indication callback handler
//with the corresponding populated Indication event
handleNanIndication();
}
- }
- else {
+ } else if (mSubcmd == QCA_NL80211_VENDOR_SUBCMD_NDP) {
+ // Parse the vendordata and get the NAN attribute
+ u32 ndpCmdType;
+ struct nlattr *tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST + 1];
+ nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_NDP_MAX,
+ (struct nlattr *)mVendorData,
+ mDataLen, NULL);
+
+ if (tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD]) {
+ ndpCmdType =
+ nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD]);
+ ALOGD("%s: NDP Cmd Type : val 0x%x",
+ __FUNCTION__, ndpCmdType);
+ switch (ndpCmdType) {
+ case QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_CREATE:
+ handleNdpResponse(NAN_DP_INTERFACE_CREATE, tb_vendor);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_DELETE:
+ handleNdpResponse(NAN_DP_INTERFACE_DELETE, tb_vendor);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_NDP_INITIATOR_RESPONSE:
+ handleNdpResponse(NAN_DP_INITIATOR_RESPONSE, tb_vendor);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_NDP_RESPONDER_RESPONSE:
+ handleNdpResponse(NAN_DP_RESPONDER_RESPONSE, tb_vendor);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_NDP_END_RESPONSE:
+ handleNdpResponse(NAN_DP_END, tb_vendor);
+ break;
+ case QCA_WLAN_VENDOR_ATTR_NDP_DATA_REQUEST_IND:
+ case QCA_WLAN_VENDOR_ATTR_NDP_CONFIRM_IND:
+ case QCA_WLAN_VENDOR_ATTR_NDP_END_IND:
+ handleNdpIndication(ndpCmdType, tb_vendor);
+ break;
+ default:
+ ALOGE("%s: Invalid NDP subcmd response received %d",
+ __FUNCTION__, ndpCmdType);
+ }
+ }
+ } else {
//error case should not happen print log
- ALOGE("%s: Wrong NAN subcmd received %d", __func__, mSubcmd);
+ ALOGE("%s: Wrong NAN subcmd received %d", __FUNCTION__, mSubcmd);
}
return NL_SKIP;
}
@@ -793,13 +1186,10 @@ u16 NANTLV_ReadTlv(u8 *pInTlv, pNanTlv pOutTlv)
ALOGV("READ TLV length %u, readLen %u", pOutTlv->length, readLen);
- if (pOutTlv->length)
- {
+ if (pOutTlv->length) {
pOutTlv->value = pInTlv;
readLen += pOutTlv->length;
- }
- else
- {
+ } else {
pOutTlv->value = NULL;
}
diff --git a/qcwcn/wifi_hal/nan_i.h b/qcwcn/wifi_hal/nan_i.h
index bbff5cb..64089cb 100644
--- a/qcwcn/wifi_hal/nan_i.h
+++ b/qcwcn/wifi_hal/nan_i.h
@@ -103,7 +103,8 @@ typedef enum
NAN_MSG_ID_BEACON_SDF_RSP = 31,
NAN_MSG_ID_BEACON_SDF_IND = 32,
NAN_MSG_ID_CAPABILITIES_REQ = 33,
- NAN_MSG_ID_CAPABILITIES_RSP = 34
+ NAN_MSG_ID_CAPABILITIES_RSP = 34,
+ NAN_MSG_ID_SELF_TRANSMIT_FOLLOWUP_IND = 35
} NanMsgId;
/*
@@ -924,6 +925,7 @@ typedef enum {
NAN_INDICATION_DISABLED =7,
NAN_INDICATION_TCA =8,
NAN_INDICATION_BEACON_SDF_PAYLOAD =9,
+ NAN_INDICATION_SELF_TRANSMIT_FOLLOWUP =10,
NAN_INDICATION_UNKNOWN =0xFFFF
} NanIndicationType;
@@ -964,8 +966,16 @@ typedef struct PACKED
u32 max_ndi_interfaces;
u32 max_ndp_sessions;
u32 max_app_info_len;
+ u32 max_queued_transmit_followup_msgs;
} NanCapabilitiesRspMsg, *pNanCapabilitiesRspMsg;
+/* NAN Self Transmit Followup */
+typedef struct PACKED
+{
+ NanMsgHeader fwHeader;
+ u32 reason;
+} NanSelfTransmitFollowupIndMsg, *pNanSelfTransmitFollowupIndMsg;
+
/*
Function to get the sta_parameter expected by Sigma
as per CAPI spec.
diff --git a/qcwcn/wifi_hal/nan_ind.cpp b/qcwcn/wifi_hal/nan_ind.cpp
index 61608e7..c9bb00b 100644
--- a/qcwcn/wifi_hal/nan_ind.cpp
+++ b/qcwcn/wifi_hal/nan_ind.cpp
@@ -116,6 +116,15 @@ int NanCommand::handleNanIndication()
}
break;
+ case NAN_INDICATION_SELF_TRANSMIT_FOLLOWUP:
+ NanTransmitFollowupInd transmitFollowupInd;
+ memset(&transmitFollowupInd, 0, sizeof(NanTransmitFollowupInd));
+ res = getNanTransmitFollowupInd(&transmitFollowupInd);
+ if (!res && mHandler.EventTransmitFollowup) {
+ (*mHandler.EventTransmitFollowup)(&transmitFollowupInd);
+ }
+ break;
+
default:
ALOGE("handleNanIndication error invalid msg_id:%u", msg_id);
res = (int)WIFI_ERROR_INVALID_REQUEST_ID;
@@ -157,6 +166,8 @@ NanIndicationType NanCommand::getIndicationType()
return NAN_INDICATION_TCA;
case NAN_MSG_ID_BEACON_SDF_IND:
return NAN_INDICATION_BEACON_SDF_PAYLOAD;
+ case NAN_MSG_ID_SELF_TRANSMIT_FOLLOWUP_IND:
+ return NAN_INDICATION_SELF_TRANSMIT_FOLLOWUP;
default:
return NAN_INDICATION_UNKNOWN;
}
@@ -259,8 +270,7 @@ int NanCommand::getNanMatch(NanMatchInd *event)
&event->discovery_attr[idx]);
if (ret == 0) {
event->num_rx_discovery_attr++;
- }
- else {
+ } else {
ALOGE("NAN_TLV_TYPE_POST_NAN_DISCOVERY_ATTRIBUTE_RECEIVE"
"Incorrect");
}
@@ -793,3 +803,161 @@ cleanup:
mStaParam = NULL;
return (int)ret;
}
+
+int NanCommand::getNanTransmitFollowupInd(NanTransmitFollowupInd *event)
+{
+ if (event == NULL || mNanVendorEvent == NULL) {
+ ALOGE("%s: Invalid input argument event:%p mNanVendorEvent:%p",
+ __func__, event, mNanVendorEvent);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ pNanSelfTransmitFollowupIndMsg pRsp = (pNanSelfTransmitFollowupIndMsg)mNanVendorEvent;
+ event->id = pRsp->fwHeader.transactionId;
+ event->reason = (NanStatusType)pRsp->reason;
+ return WIFI_SUCCESS;
+}
+
+//Function which calls the necessaryIndication callback
+//based on the indication type
+int NanCommand::handleNdpIndication(u32 ndpCmdType, struct nlattr **tb_vendor)
+{
+ //Based on the message_id in the header determine the Indication type
+ //and call the necessary callback handler
+ int res = 0;
+
+ ALOGI("handleNdpIndication msg_id:%u", ndpCmdType);
+ switch (ndpCmdType) {
+ case QCA_WLAN_VENDOR_ATTR_NDP_DATA_REQUEST_IND:
+ NanDataPathRequestInd ndpRequestInd;
+ memset(&ndpRequestInd, 0, sizeof(ndpRequestInd));
+
+ res = getNdpRequest(tb_vendor, &ndpRequestInd);
+ if (!res && mHandler.EventDataRequest) {
+ (*mHandler.EventDataRequest)(&ndpRequestInd);
+ }
+ break;
+
+ case QCA_WLAN_VENDOR_ATTR_NDP_CONFIRM_IND:
+ NanDataPathConfirmInd ndpConfirmInd;
+ memset(&ndpConfirmInd, 0, sizeof(ndpConfirmInd));
+
+ res = getNdpConfirm(tb_vendor, &ndpConfirmInd);
+ if (!res && mHandler.EventDataConfirm) {
+ (*mHandler.EventDataConfirm)(&ndpConfirmInd);
+ }
+ break;
+
+ case QCA_WLAN_VENDOR_ATTR_NDP_END_IND:
+ {
+ NanDataPathEndInd *ndpEndInd = NULL;
+ u8 num_ndp_ids = 0;
+
+ if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY]) {
+ ALOGE("%s: QCA_WLAN_VENDOR_ATTR_NDP not found", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ num_ndp_ids = (u8)(nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY])/sizeof(u32));
+ ALOGD("%s: NDP Num Instance Ids : val %d", __FUNCTION__, num_ndp_ids);
+
+ if (num_ndp_ids) {
+ ndpEndInd =
+ (NanDataPathEndInd *)malloc(sizeof(NanDataPathEndInd)+ (sizeof(u32) * num_ndp_ids));
+ if (!ndpEndInd) {
+ ALOGE("%s: ndp_instance_id malloc Failed", __FUNCTION__);
+ return WIFI_ERROR_OUT_OF_MEMORY;
+ }
+ ndpEndInd->num_ndp_instances = num_ndp_ids;
+ nla_memcpy(ndpEndInd->ndp_instance_id,
+ tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY],
+ sizeof(u32) * ndpEndInd->num_ndp_instances);
+ }
+ if (mHandler.EventDataEnd) {
+ (*mHandler.EventDataEnd)(ndpEndInd);
+ }
+ free(ndpEndInd);
+ break;
+ }
+ default:
+ ALOGE("handleNdpIndication error invalid ndpCmdType:%u", ndpCmdType);
+ res = (int)WIFI_ERROR_INVALID_REQUEST_ID;
+ break;
+ }
+ return res;
+}
+
+int NanCommand::getNdpRequest(struct nlattr **tb_vendor,
+ NanDataPathRequestInd *event)
+{
+ u32 len = 0;
+
+ if (event == NULL || tb_vendor == NULL) {
+ ALOGE("%s: Invalid input argument event:%p tb_vendor:%p",
+ __FUNCTION__, event, tb_vendor);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+ if ((!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID])) {
+ ALOGE("%s: QCA_WLAN_VENDOR_ATTR_NDP not found", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ event->service_instance_id = nla_get_u16(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID]);
+ ALOGD("%s: Service Instance id : val %d", __FUNCTION__, event->service_instance_id);
+
+ len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR]);
+ len = ((sizeof(event->peer_disc_mac_addr) <= len) ? sizeof(event->peer_disc_mac_addr) : len);
+ memcpy(&event->peer_disc_mac_addr[0], nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR]), len);
+
+ event->ndp_instance_id = nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID]);
+ ALOGD("%s: Ndp Instance id: %d", __FUNCTION__, event->ndp_instance_id);
+ if (tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]) {
+ len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]);
+ len = ((sizeof(event->app_info.ndp_app_info) <= len) ? sizeof(event->app_info.ndp_app_info) : len);
+ memcpy(&event->app_info.ndp_app_info[0], nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]), len);
+ event->app_info.ndp_app_info_len = len;
+ } else {
+ ALOGD("%s: NDP App Info not present", __FUNCTION__);
+ }
+ return WIFI_SUCCESS;
+}
+
+int NanCommand::getNdpConfirm(struct nlattr **tb_vendor,
+ NanDataPathConfirmInd *event)
+{
+ u32 len = 0;
+
+ if (event == NULL || tb_vendor == NULL) {
+ ALOGE("%s: Invalid input argument event:%p tb_vendor:%p",
+ __FUNCTION__, event, tb_vendor);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+ if ((!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE])) {
+ ALOGE("%s: QCA_WLAN_VENDOR_ATTR_NDP not found", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ event->ndp_instance_id = nla_get_u16(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID]);
+ ALOGD("%s: Service Instance id : val %d", __FUNCTION__, event->ndp_instance_id);
+
+ len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR]);
+ len = ((sizeof(event->peer_ndi_mac_addr) <= len) ? sizeof(event->peer_ndi_mac_addr) : len);
+ memcpy(&event->peer_ndi_mac_addr[0], nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR]), len);
+
+ event->rsp_code = (NanDataPathResponseCode)nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE]);
+ ALOGD("%s: Response code %d", __FUNCTION__, event->rsp_code);
+
+ if (tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]) {
+ len = nla_len(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]);
+ len = ((sizeof(event->app_info.ndp_app_info) <= len) ? sizeof(event->app_info.ndp_app_info) : len);
+ memcpy(&event->app_info.ndp_app_info[0], nla_data(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]), len);
+ event->app_info.ndp_app_info_len = len;
+ } else {
+ ALOGD("%s: NDP App Info not present", __FUNCTION__);
+ }
+ return WIFI_SUCCESS;
+}
diff --git a/qcwcn/wifi_hal/nan_req.cpp b/qcwcn/wifi_hal/nan_req.cpp
index 854e905..6c46733 100644
--- a/qcwcn/wifi_hal/nan_req.cpp
+++ b/qcwcn/wifi_hal/nan_req.cpp
@@ -858,8 +858,7 @@ int NanCommand::putNanTCA(transaction_id id, const NanTCARequest *pReq)
if (pReq->tca_type == NAN_TCA_ID_CLUSTER_SIZE) {
tlvs = addTlv(NAN_TLV_TYPE_CLUSTER_SIZE_REQ, sizeof(tcaReqParams),
(const u8*)&tcaReqParams[0], tlvs);
- }
- else {
+ } else {
ALOGE("%s: Unrecognized tca_type:%u", __FUNCTION__, pReq->tca_type);
cleanup();
return WIFI_ERROR_INVALID_ARGS;
diff --git a/qcwcn/wifi_hal/nan_rsp.cpp b/qcwcn/wifi_hal/nan_rsp.cpp
index 9183baa..33a1a7f 100644
--- a/qcwcn/wifi_hal/nan_rsp.cpp
+++ b/qcwcn/wifi_hal/nan_rsp.cpp
@@ -168,8 +168,7 @@ int NanCommand::getNanResponse(transaction_id *id, NanResponseMsg *pRsp)
(char *)outputTlv.value,
&pRsp->body.stats_response);
}
- }
- else
+ } else
ALOGV("%s: No TLV's present",__func__);
break;
}
@@ -245,6 +244,8 @@ int NanCommand::getNanResponse(transaction_id *id, NanResponseMsg *pRsp)
pFwRsp->max_ndp_sessions;
pRsp->body.nan_capabilities.max_app_info_len = \
pFwRsp->max_app_info_len;
+ pRsp->body.nan_capabilities.max_queued_transmit_followup_msgs = \
+ pFwRsp->max_queued_transmit_followup_msgs;
break;
}
default:
@@ -513,3 +514,48 @@ void NanCommand::handleNanStatsResponse(NanStatsType stats_type,
ALOGE("Unknown stats_type:%d\n", stats_type);
}
}
+
+int NanCommand::handleNdpResponse(NanResponseType ndpCmdType,
+ struct nlattr **tb_vendor)
+{
+ //parse the data and call
+ //the response callback handler with the populated
+ //NanResponseMsg
+ NanResponseMsg rsp_data;
+ transaction_id id;
+
+ memset(&rsp_data, 0, sizeof(rsp_data));
+
+ if ((!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE]) ||
+ (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE]))
+ {
+ ALOGE("%s: QCA_WLAN_VENDOR_ATTR_NDP not found", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+
+ id = nla_get_u16(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID]);
+ ALOGD("%s: Transaction id : val %d", __FUNCTION__, id);
+ rsp_data.status =
+ (NanStatusType)nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE]);
+ ALOGD("%s: Status : %d", __FUNCTION__, rsp_data.status);
+ rsp_data.value =
+ nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE]);
+ ALOGD("%s: Value : %d", __FUNCTION__, rsp_data.value);
+ rsp_data.response_type = ndpCmdType;
+ if (ndpCmdType == NAN_DP_INITIATOR_RESPONSE)
+ {
+ if (!tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID])
+ {
+ ALOGE("%s: QCA_WLAN_VENDOR_ATTR_NDP not found", __FUNCTION__);
+ return WIFI_ERROR_INVALID_ARGS;
+ }
+ rsp_data.body.data_request_response.ndp_instance_id =
+ nla_get_u32(tb_vendor[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID]);
+ }
+ //Call the NotifyResponse Handler
+ if (mHandler.NotifyResponse) {
+ (*mHandler.NotifyResponse)(id, &rsp_data);
+ }
+ return WIFI_SUCCESS;
+}
diff --git a/qcwcn/wifi_hal/nancommand.h b/qcwcn/wifi_hal/nancommand.h
index f6311c8..b546dca 100644
--- a/qcwcn/wifi_hal/nancommand.h
+++ b/qcwcn/wifi_hal/nancommand.h
@@ -20,6 +20,8 @@
#include "common.h"
#include "cpp_bindings.h"
#include "wifi_hal.h"
+#include "qca-vendor.h"
+#include "vendor_definitions.h"
class NanCommand : public WifiVendorCommand
{
@@ -89,6 +91,13 @@ private:
char* rspBuf,
NanStatsResponse *pRsp);
+ //Function which unparses the data and calls the NotifyResponse
+ int handleNdpResponse(NanResponseType ndpCmdtyp, struct nlattr **tb_vendor);
+ int handleNdpIndication(u32 ndpCmdType, struct nlattr **tb_vendor);
+ int getNdpRequest(struct nlattr **tb_vendor, NanDataPathRequestInd *event);
+ int getNdpConfirm(struct nlattr **tb_vendor, NanDataPathConfirmInd *event);
+ int getNdpEnd(struct nlattr **tb_vendor, NanDataPathEndInd *event);
+ int getNanTransmitFollowupInd(NanTransmitFollowupInd *event);
public:
NanCommand(wifi_handle handle, int id, u32 vendor_id, u32 subcmd);
static NanCommand* instance(wifi_handle handle);
diff --git a/qcwcn/wifi_hal/vendor_definitions.h b/qcwcn/wifi_hal/vendor_definitions.h
index 46a1b83..82635b5 100644
--- a/qcwcn/wifi_hal/vendor_definitions.h
+++ b/qcwcn/wifi_hal/vendor_definitions.h
@@ -1220,10 +1220,10 @@ enum qca_wlan_vendor_attr_ndp_params
/* Unsigned 16-bit value */
QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
/* NL attributes for data used NDP SUB cmds */
- /* Unsigned 16-bit value indicating a service info */
+ /* Unsigned 32-bit value indicating a service info */
QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID,
/* Unsigned 32-bit value; channel frequency */
- QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_SPEC_CHANNEL,
+ QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL,
/* Interface Discovery MAC address. An array of 6 Unsigned int8 */
QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR,
/* Interface name on which NDP is being created */
@@ -1232,22 +1232,26 @@ enum qca_wlan_vendor_attr_ndp_params
QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_SECURITY,
/* Unsigned 32-bit value for Qos */
QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS,
- /* Unsigned 16-bit value for app info length */
- QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO_LEN,
/* Array of u8: len = QCA_WLAN_VENDOR_ATTR_NAN_DP_APP_INFO_LEN */
QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO,
/* Unsigned 32-bit value for NDP instance Id */
QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID,
- /* Unsigned 32-bit value for schedule update response code accept/reject */
- QCA_WLAN_VENDOR_ATTR_NDP_SCHEDULE_RESPONSE_CODE,
- /* Unsigned 32-bit value for schedule status success/fail */
- QCA_WLAN_VENDOR_ATTR_NDP_SCHEDULE_STATUS_CODE,
+ /* Array of instance Ids */
+ QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY,
+ /* Unsigned 32-bit value for initiator/responder ndp response code accept/reject */
+ QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE,
/* NDI MAC address. An array of 6 Unsigned int8 */
QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR,
-
- /* KEEP LAST */
- QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST,
- QCA_WLAN_VENDOR_ATTR_NDP_MAX =
+ /* Unsigned 32-bit value errors types returned by driver */
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
+ /* Unsigned 32-bit value error values returned by driver */
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE,
+ /* Unsigned 32-bit value for Channel setup configuration */
+ QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG,
+
+ /* KEEP LAST */
+ QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST,
+ QCA_WLAN_VENDOR_ATTR_NDP_MAX =
QCA_WLAN_VENDOR_ATTR_NDP_AFTER_LAST - 1,
};
@@ -1278,12 +1282,9 @@ enum qca_wlan_vendor_attr_ndp_sub_cmd_value
QCA_WLAN_VENDOR_ATTR_NDP_RESPONDER_RESPONSE = 6,
QCA_WLAN_VENDOR_ATTR_NDP_END_REQUEST = 7,
QCA_WLAN_VENDOR_ATTR_NDP_END_RESPONSE = 8,
- QCA_WLAN_VENDOR_ATTR_NDP_SCHEDULE_UPDATE_REQUEST = 9,
- QCA_WLAN_VENDOR_ATTR_NDP_SCHEDULE_UPDATE_RESPONSE = 10,
- QCA_WLAN_VENDOR_ATTR_NDP_DATA_REQUEST_IND = 11,
- QCA_WLAN_VENDOR_ATTR_NDP_CONFIRM_IND = 12,
- QCA_WLAN_VENDOR_ATTR_NDP_SCHEDULE_UPDATE_IND = 13,
- QCA_WLAN_VENDOR_ATTR_NDP_END_IND = 14
+ QCA_WLAN_VENDOR_ATTR_NDP_DATA_REQUEST_IND = 9,
+ QCA_WLAN_VENDOR_ATTR_NDP_CONFIRM_IND = 10,
+ QCA_WLAN_VENDOR_ATTR_NDP_END_IND = 11
};
#define PACKET_FILTER_ID 0