summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRakesh Sunki <rsunki@codeaurora.org>2017-01-04 15:14:28 -0800
committerqcabuildsw <qcabuildsw@localhost>2017-01-09 16:52:54 -0800
commitc8d09bd244df058305f3b79b1304e10543ccfb56 (patch)
tree007254e17635febeb98d5ff650551e5f4be7cdb6
parentb73ab97f6a8dcddd3ac1c0d3018f01b8c05d4e99 (diff)
qcacld-3.0: Fix NDP non-auto responder mode
propagation from qcacld-2.0 to qcacld-3.0 In NDP non-auto responder mode, peer create happens despite the response request status is indicated as failure from the framework as the status of the NDP responder request is not saved in the protocol engine. So, later when host receives responder response from the firmware, host does not check responder request status before sending peer create request. Fix by sending ndp peer create request only if the firware request a peer create by setting a flag in responder response message. This way host does not need to save the responder request success/failure status per NAN service. Firmware sets the peer create flag to true only if the status flag in the responder request was indicated as success. Change-Id: I4fc8429e71a10829726990cf218720f6f99b085c CRs-Fixed: 1086217
-rw-r--r--core/hdd/src/wlan_hdd_nan_datapath.c36
-rw-r--r--core/hdd/src/wlan_hdd_nan_datapath.h4
-rw-r--r--core/mac/inc/sir_api.h1
-rw-r--r--core/mac/src/pe/nan/nan_datapath.c3
-rw-r--r--core/wma/src/wma_nan_datapath.c7
5 files changed, 34 insertions, 17 deletions
diff --git a/core/hdd/src/wlan_hdd_nan_datapath.c b/core/hdd/src/wlan_hdd_nan_datapath.c
index 28136fff5109..b40b3cb055c8 100644
--- a/core/hdd/src/wlan_hdd_nan_datapath.c
+++ b/core/hdd/src/wlan_hdd_nan_datapath.c
@@ -57,6 +57,9 @@ qca_wlan_vendor_ndp_policy[QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX + 1] = {
.len = QDF_MAC_ADDR_SIZE },
[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY] = { .type = NLA_BINARY,
.len = NDP_NUM_INSTANCE_ID },
+ [QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE] = { .type =
+ NLA_U32 },
+ [QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] = { .type = NLA_U32 },
[QCA_WLAN_VENDOR_ATTR_NDP_PMK] = { .type = NLA_BINARY,
@@ -804,7 +807,7 @@ static int hdd_ndp_end_req_handler(hdd_context_t *hdd_ctx, struct nlattr **tb)
* QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD =
* QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_CREATE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID (2 bytes)
- * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE
*
* Return: none
@@ -881,7 +884,8 @@ static void hdd_ndp_iface_create_rsp_handler(hdd_adapter_t *adapter,
}
/* Status code */
- if (nla_put_u32(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ if (nla_put_u32(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
create_status)) {
hdd_err("VENDOR_ATTR_NDP_DRV_RETURN_TYPE put fail");
goto nla_put_failure;
@@ -901,7 +905,8 @@ static void hdd_ndp_iface_create_rsp_handler(hdd_adapter_t *adapter,
hdd_info("create transaction id: %d, value: %d",
QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID, create_transaction_id);
hdd_info("status code: %d, value: %d",
- QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE, create_status);
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
+ create_status);
hdd_info("Return value: %d, value: %d",
QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE, create_reason);
@@ -987,7 +992,7 @@ static void hdd_ndp_iface_delete_rsp_handler(hdd_adapter_t *adapter,
* QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD =
* QCA_WLAN_VENDOR_ATTR_NDP_INTERFACE_DELETE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID (2 bytes)
- * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE (4 bytes)
*
* Return: none
@@ -1049,7 +1054,7 @@ void hdd_ndp_session_end_handler(hdd_adapter_t *adapter)
/* Status code */
if (nla_put_u32(vendor_event,
- QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
ndp_ctx->ndi_delete_rsp_status)) {
hdd_err("VENDOR_ATTR_NDP_DRV_RETURN_TYPE put fail");
goto failure;
@@ -1069,7 +1074,7 @@ void hdd_ndp_session_end_handler(hdd_adapter_t *adapter)
QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID,
ndp_ctx->ndp_delete_transaction_id);
hdd_info("status code: %d, value: %d",
- QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
ndp_ctx->ndi_delete_rsp_status);
hdd_info("Return value: %d, value: %d",
QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE,
@@ -1098,7 +1103,7 @@ failure:
* QCA_WLAN_VENDOR_ATTR_NDP_INITIATOR_RESPONSE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID (2 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID (4 bytes)
- * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE (4 bytes)
*
* Return: none
@@ -1143,7 +1148,8 @@ static void hdd_ndp_initiator_rsp_handler(hdd_adapter_t *adapter,
rsp->ndp_instance_id))
goto ndp_initiator_rsp_nla_failed;
- if (nla_put_u32(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ if (nla_put_u32(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
rsp->status))
goto ndp_initiator_rsp_nla_failed;
@@ -1520,8 +1526,8 @@ ndp_indication_nla_failed:
* QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD =
* QCA_WLAN_VENDOR_ATTR_NDP_RESPONDER_RESPONSE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID (2 bytes)
- * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE (4 bytes)
- * QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE (4 bytes)
*
* Return: none
*/
@@ -1566,12 +1572,13 @@ static void hdd_ndp_responder_rsp_handler(hdd_adapter_t *adapter,
rsp->transaction_id))
goto ndp_responder_rsp_nla_failed;
- if (nla_put_u32(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ if (nla_put_u32(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
rsp->status))
goto ndp_responder_rsp_nla_failed;
if (nla_put_u32(vendor_event,
- QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE,
rsp->reason))
goto ndp_responder_rsp_nla_failed;
@@ -1592,7 +1599,7 @@ ndp_responder_rsp_nla_failed:
* Following vendor event is sent to cfg80211:
* QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD =
* QCA_WLAN_VENDOR_ATTR_NDP_END_RESPONSE(4 bytest)
- * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE (4 bytes)
+ * QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE (4 bytes)
* QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID (2 bytes)
*
@@ -1630,7 +1637,8 @@ static void hdd_ndp_end_rsp_handler(hdd_adapter_t *adapter, void *rsp_params)
QCA_WLAN_VENDOR_ATTR_NDP_END_RESPONSE))
goto ndp_end_rsp_nla_failed;
- if (nla_put_u32(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ if (nla_put_u32(vendor_event,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
rsp->status))
goto ndp_end_rsp_nla_failed;
diff --git a/core/hdd/src/wlan_hdd_nan_datapath.h b/core/hdd/src/wlan_hdd_nan_datapath.h
index a4b07409e6db..4f29c3089ead 100644
--- a/core/hdd/src/wlan_hdd_nan_datapath.h
+++ b/core/hdd/src/wlan_hdd_nan_datapath.h
@@ -72,7 +72,7 @@ struct wireless_dev;
* @QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY: NDP instance id array
* @QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE: Schedule response
* @QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR: NDI mac address
- * @QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE: Driver return status
+ * @QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE: Driver return status
* @QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE: Driver return value
* @QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG: Channel config request type
* @QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE: Cipher Suit ID
@@ -95,7 +95,7 @@ enum qca_wlan_vendor_attr_ndp_params {
QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY,
QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE,
QCA_WLAN_VENDOR_ATTR_NDP_NDI_MAC_ADDR,
- QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_TYPE,
+ QCA_WLAN_VENDOR_ATTR_NDP_DRV_RESPONSE_STATUS_TYPE,
QCA_WLAN_VENDOR_ATTR_NDP_DRV_RETURN_VALUE,
QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG,
QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE,
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 6f352fa8dbc0..d92dcf726474 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -6552,6 +6552,7 @@ struct ndp_responder_rsp_event {
uint32_t status;
uint32_t reason;
struct qdf_mac_addr peer_mac_addr;
+ bool create_peer;
};
/**
diff --git a/core/mac/src/pe/nan/nan_datapath.c b/core/mac/src/pe/nan/nan_datapath.c
index ebe5c28279f8..0b1950105b5e 100644
--- a/core/mac/src/pe/nan/nan_datapath.c
+++ b/core/mac/src/pe/nan/nan_datapath.c
@@ -197,7 +197,8 @@ static QDF_STATUS lim_ndp_responder_rsp_handler(tpAniSirGlobal mac_ctx,
goto responder_rsp;
}
- if (QDF_STATUS_SUCCESS == rsp_ind->status) {
+ if (QDF_STATUS_SUCCESS == rsp_ind->status &&
+ rsp_ind->create_peer == true) {
ret_val = lim_add_ndi_peer(mac_ctx, rsp_ind->vdev_id,
rsp_ind->peer_mac_addr);
if (QDF_STATUS_SUCCESS != ret_val) {
diff --git a/core/wma/src/wma_nan_datapath.c b/core/wma/src/wma_nan_datapath.c
index 23ed4bea348e..55833f3ab762 100644
--- a/core/wma/src/wma_nan_datapath.c
+++ b/core/wma/src/wma_nan_datapath.c
@@ -520,8 +520,15 @@ static int wma_ndp_responder_rsp_event_handler(void *handle,
rsp.transaction_id = fixed_params->transaction_id;
rsp.reason = fixed_params->reason_code;
rsp.status = fixed_params->rsp_status;
+ rsp.create_peer = fixed_params->create_peer;
WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_ndi_mac_addr,
rsp.peer_mac_addr.bytes);
+
+ WMA_LOGE(FL("WMI_NDP_RESPONDER_RSP_EVENTID(0x%X) received. vdev_id: %d, peer_mac_addr: %pM,transaction_id: %d, status_code %d, reason_code: %d, create_peer: %d"),
+ WMI_NDP_RESPONDER_RSP_EVENTID, rsp.vdev_id,
+ rsp.peer_mac_addr.bytes, rsp.transaction_id,
+ rsp.status, rsp.reason, rsp.create_peer);
+
pe_msg.bodyptr = &rsp;
pe_msg.type = SIR_HAL_NDP_RESPONDER_RSP;
return wma_handle->pe_ndp_event_handler(wma_handle->mac_context,