From c8d09bd244df058305f3b79b1304e10543ccfb56 Mon Sep 17 00:00:00 2001 From: Rakesh Sunki Date: Wed, 4 Jan 2017 15:14:28 -0800 Subject: 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 --- core/hdd/src/wlan_hdd_nan_datapath.c | 36 ++++++++++++++++++++++-------------- core/hdd/src/wlan_hdd_nan_datapath.h | 4 ++-- core/mac/inc/sir_api.h | 1 + core/mac/src/pe/nan/nan_datapath.c | 3 ++- core/wma/src/wma_nan_datapath.c | 7 +++++++ 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, -- cgit v1.2.3