diff --git a/os_if/linux/nan/inc/os_if_nan.h b/os_if/linux/nan/inc/os_if_nan.h index 31e56513fa..151c457bbf 100644 --- a/os_if/linux/nan/inc/os_if_nan.h +++ b/os_if/linux/nan/inc/os_if_nan.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -32,15 +32,6 @@ struct wlan_objmgr_vdev; #ifdef WLAN_FEATURE_NAN_CONVERGENCE -#define NDP_QOS_INFO_LEN 255 -#define NDP_APP_INFO_LEN 255 -#define NDP_PMK_LEN 32 -#define NDP_SCID_BUF_LEN 256 -#define NDP_NUM_INSTANCE_ID 255 -#define NAN_MAX_SERVICE_NAME_LEN 255 -#define NAN_PASSPHRASE_MIN_LEN 8 -#define NAN_PASSPHRASE_MAX_LEN 63 - /** * enum qca_wlan_vendor_attr_ndp_params - vendor attribute parameters * @QCA_WLAN_VENDOR_ATTR_NDP_SUBCMD: NDP Sub command diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c index 23b86fb014..e7d91d46c7 100644 --- a/os_if/linux/nan/src/os_if_nan.c +++ b/os_if/linux/nan/src/os_if_nan.c @@ -206,10 +206,10 @@ static int os_if_nan_parse_security_params(struct nlattr **tb, } if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) { - pmk->pmk_len = - nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); - pmk->pmk = - nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + pmk->pmk_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + qdf_mem_copy(pmk->pmk, + nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]), + pmk->pmk_len); cfg80211_err("pmk len: %d", pmk->pmk_len); QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, pmk->pmk, pmk->pmk_len); @@ -218,8 +218,9 @@ static int os_if_nan_parse_security_params(struct nlattr **tb, if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE]) { passphrase->passphrase_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE]); - passphrase->passphrase = - nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE]); + qdf_mem_copy(passphrase->passphrase, + nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PASSPHRASE]), + passphrase->passphrase_len); cfg80211_err("passphrase len: %d", passphrase->passphrase_len); QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, passphrase->passphrase, passphrase->passphrase_len); @@ -228,8 +229,9 @@ static int os_if_nan_parse_security_params(struct nlattr **tb, if (tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME]) { service_name->service_name_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME]); - service_name->service_name = - nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME]); + qdf_mem_copy(service_name->service_name, + nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_NAME]), + service_name->service_name_len); cfg80211_err("service_name len: %d", service_name->service_name_len); QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_ERROR, @@ -267,7 +269,6 @@ static int os_if_nan_process_ndp_initiator_req(struct wlan_objmgr_psoc *psoc, int ret = 0; char *iface_name; QDF_STATUS status; - uint32_t ndp_qos_cfg; enum nan_datapath_state state; struct wlan_objmgr_vdev *nan_vdev; struct nan_datapath_initiator_req req = {0}; @@ -343,15 +344,15 @@ static int os_if_nan_process_ndp_initiator_req(struct wlan_objmgr_psoc *psoc, if (tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]) { req.ndp_info.ndp_app_info_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]); - req.ndp_info.ndp_app_info = - nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]); + qdf_mem_copy(req.ndp_info.ndp_app_info, + nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]), + req.ndp_info.ndp_app_info_len); } if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]) { /* at present ndp config stores 4 bytes QOS info only */ req.ndp_config.ndp_cfg_len = 4; - req.ndp_config.ndp_cfg = (uint8_t *)&ndp_qos_cfg; - ndp_qos_cfg = + *((uint32_t *)req.ndp_config.ndp_cfg) = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]); } @@ -400,7 +401,6 @@ static int os_if_nan_process_ndp_responder_req(struct wlan_objmgr_psoc *psoc, int ret = 0; char *iface_name; QDF_STATUS status; - uint32_t ndp_qos_cfg; enum nan_datapath_state state; struct wlan_objmgr_vdev *nan_vdev; struct nan_datapath_responder_req req = {0}; @@ -461,19 +461,18 @@ static int os_if_nan_process_ndp_responder_req(struct wlan_objmgr_psoc *psoc, if (tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]) { req.ndp_info.ndp_app_info_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]); - if (req.ndp_info.ndp_app_info_len) { - req.ndp_info.ndp_app_info = - nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]); - } + qdf_mem_copy(req.ndp_info.ndp_app_info, + nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO]), + req.ndp_info.ndp_app_info_len); } else { cfg80211_debug("NDP app info is unavailable"); } + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]) { /* at present ndp config stores 4 bytes QOS info only */ req.ndp_config.ndp_cfg_len = 4; - ndp_qos_cfg = + *((uint32_t *)req.ndp_config.ndp_cfg) = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]); - req.ndp_config.ndp_cfg = (uint8_t *)&ndp_qos_cfg; } else { cfg80211_debug("NDP config data is unavailable"); } @@ -537,7 +536,9 @@ static int os_if_nan_process_ndp_end_req(struct wlan_objmgr_psoc *psoc, cfg80211_err("Num NDP instances is 0"); return -EINVAL; } - req.ndp_ids = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY]); + qdf_mem_copy(req.ndp_ids, + tb[QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID_ARRAY], + req.num_ndp_instances * sizeof(uint32_t)); cfg80211_debug("sending ndp_end_req to SME, transaction_id: %d", req.transaction_id); diff --git a/target_if/nan/src/target_if_nan.c b/target_if/nan/src/target_if_nan.c index 3b5c6642a1..2f0c8305f5 100644 --- a/target_if/nan/src/target_if_nan.c +++ b/target_if/nan/src/target_if_nan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -27,104 +27,113 @@ #include "wmi_unified_api.h" #include "scheduler_api.h" +static QDF_STATUS target_if_nan_event_flush_cb(struct scheduler_msg *msg) +{ + void *ptr = msg->bodyptr; + struct wlan_objmgr_vdev *vdev = NULL; + + switch (msg->type) { + case NDP_INITIATOR_RSP: + vdev = ((struct nan_datapath_initiator_rsp *)ptr)->vdev; + break; + case NDP_INDICATION: + vdev = ((struct nan_datapath_indication_event *)ptr)->vdev; + break; + case NDP_CONFIRM: + vdev = ((struct nan_datapath_confirm_event *)ptr)->vdev; + break; + case NDP_RESPONDER_RSP: + vdev = ((struct nan_datapath_responder_rsp *)ptr)->vdev; + break; + case NDP_END_RSP: + vdev = ((struct nan_datapath_end_rsp_event *)ptr)->vdev; + break; + case NDP_END_IND: + vdev = ((struct nan_datapath_end_indication_event *)ptr)->vdev; + break; + default: + break; + } + + if (vdev) + wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); + qdf_mem_free(msg->bodyptr); + msg->bodyptr = NULL; + + return QDF_STATUS_SUCCESS; +} + static QDF_STATUS target_if_nan_event_dispatcher(struct scheduler_msg *msg) { QDF_STATUS status; - struct wlan_objmgr_vdev *vdev = NULL; + void *ptr = msg->bodyptr; struct wlan_objmgr_psoc *psoc; + struct wlan_objmgr_vdev *vdev = NULL; struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; switch (msg->type) { - case NDP_INITIATOR_RSP: { - struct nan_datapath_initiator_rsp *initiator_rsp = msg->bodyptr; - vdev = initiator_rsp->vdev; + case NDP_INITIATOR_RSP: + vdev = ((struct nan_datapath_initiator_rsp *)ptr)->vdev; break; - } - case NDP_INDICATION: { - struct nan_datapath_indication_event *ind = msg->bodyptr; - vdev = ind->vdev; + case NDP_INDICATION: + vdev = ((struct nan_datapath_indication_event *)ptr)->vdev; break; - } - case NDP_CONFIRM: { - struct nan_datapath_confirm_event *confirm = msg->bodyptr; - vdev = confirm->vdev; + case NDP_CONFIRM: + vdev = ((struct nan_datapath_confirm_event *)ptr)->vdev; break; - } - case NDP_RESPONDER_RSP: { - struct nan_datapath_responder_rsp *rsp = msg->bodyptr; - vdev = rsp->vdev; + case NDP_RESPONDER_RSP: + vdev = ((struct nan_datapath_responder_rsp *)ptr)->vdev; break; - } - case NDP_END_RSP: { - struct nan_datapath_end_rsp_event *rsp = msg->bodyptr; - vdev = rsp->vdev; + case NDP_END_RSP: + vdev = ((struct nan_datapath_end_rsp_event *)ptr)->vdev; break; - } - case NDP_END_IND: { - struct nan_datapath_end_indication_event *rsp = msg->bodyptr; - vdev = rsp->vdev; + case NDP_END_IND: + vdev = ((struct nan_datapath_end_indication_event *)ptr)->vdev; break; - } default: target_if_err("invalid msg type %d", msg->type); - qdf_mem_free(msg->bodyptr); - return QDF_STATUS_E_INVAL; + status = QDF_STATUS_E_INVAL; + goto free_res; } if (!vdev) { target_if_err("vdev is null"); - qdf_mem_free(msg->bodyptr); - return QDF_STATUS_E_NULL_VALUE; - } - - /* try get ref now, if failure, then vdev may have been deleted */ - status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_NAN_ID); - if (QDF_IS_STATUS_ERROR(status)) { - nan_alert("couldn't get ref. vdev maybe deleted"); - qdf_mem_free(msg->bodyptr); - return QDF_STATUS_E_INVAL; + status = QDF_STATUS_E_NULL_VALUE; + goto free_res; } psoc = wlan_vdev_get_psoc(vdev); if (!psoc) { target_if_err("psoc is null"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - qdf_mem_free(msg->bodyptr); - return QDF_STATUS_E_NULL_VALUE; + status = QDF_STATUS_E_NULL_VALUE; + goto free_res; } nan_rx_ops = target_if_nan_get_rx_ops(psoc); if (!nan_rx_ops) { target_if_err("nan_rx_ops is null"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - qdf_mem_free(msg->bodyptr); - return QDF_STATUS_E_NULL_VALUE; + status = QDF_STATUS_E_NULL_VALUE; + goto free_res; } status = nan_rx_ops->nan_event_rx(msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); +free_res: + if (vdev) + wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); qdf_mem_free(msg->bodyptr); - + msg->bodyptr = NULL; return status; } -static QDF_STATUS target_if_nan_ndp_intiaitor_req(void *req) +static QDF_STATUS target_if_nan_ndp_initiator_req( + struct nan_datapath_initiator_req *ndp_req) { - int ret; - uint16_t len; - wmi_buf_t buf; - uint8_t *tlv_ptr; QDF_STATUS status; - wmi_channel *ch_tlv; - wmi_unified_t wmi_handle; + struct wmi_unified *wmi_handle; struct wlan_objmgr_psoc *psoc; struct scheduler_msg pe_msg = {0}; - wmi_ndp_initiator_req_fixed_param *cmd; - uint32_t passphrase_len, service_name_len; struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; - uint32_t ndp_cfg_len, ndp_app_info_len, pmk_len; struct nan_datapath_initiator_rsp ndp_rsp = {0}; - struct nan_datapath_initiator_req *ndp_req = req; if (!ndp_req) { target_if_err("ndp_req is null."); @@ -149,135 +158,17 @@ static QDF_STATUS target_if_nan_ndp_intiaitor_req(void *req) return QDF_STATUS_E_INVAL; } - /* - * WMI command expects 4 byte alligned len: - * round up ndp_cfg_len and ndp_app_info_len to 4 bytes - */ - ndp_cfg_len = qdf_roundup(ndp_req->ndp_config.ndp_cfg_len, 4); - ndp_app_info_len = qdf_roundup(ndp_req->ndp_info.ndp_app_info_len, 4); - pmk_len = qdf_roundup(ndp_req->pmk.pmk_len, 4); - passphrase_len = qdf_roundup(ndp_req->passphrase.passphrase_len, 4); - service_name_len = - qdf_roundup(ndp_req->service_name.service_name_len, 4); - /* allocated memory for fixed params as well as variable size data */ - len = sizeof(*cmd) + sizeof(*ch_tlv) + (5 * WMI_TLV_HDR_SIZE) - + ndp_cfg_len + ndp_app_info_len + pmk_len - + passphrase_len + service_name_len; + status = wmi_unified_ndp_initiator_req_cmd_send(wmi_handle, ndp_req); + if (QDF_IS_STATUS_SUCCESS(status)) + return status; - buf = wmi_buf_alloc(wmi_handle, len); - if (!buf) { - target_if_err("wmi_buf_alloc failed"); - status = QDF_STATUS_E_NOMEM; - goto send_ndp_initiator_fail; - } - cmd = (wmi_ndp_initiator_req_fixed_param *) wmi_buf_data(buf); - WMITLV_SET_HDR(&cmd->tlv_header, - WMITLV_TAG_STRUC_wmi_ndp_initiator_req_fixed_param, - WMITLV_GET_STRUCT_TLVLEN( - wmi_ndp_initiator_req_fixed_param)); - cmd->vdev_id = wlan_vdev_get_id(ndp_req->vdev); - cmd->transaction_id = ndp_req->transaction_id; - cmd->service_instance_id = ndp_req->service_instance_id; - WMI_CHAR_ARRAY_TO_MAC_ADDR(ndp_req->peer_discovery_mac_addr.bytes, - &cmd->peer_discovery_mac_addr); - - cmd->ndp_cfg_len = ndp_req->ndp_config.ndp_cfg_len; - cmd->ndp_app_info_len = ndp_req->ndp_info.ndp_app_info_len; - cmd->ndp_channel_cfg = ndp_req->channel_cfg; - cmd->nan_pmk_len = ndp_req->pmk.pmk_len; - cmd->nan_csid = ndp_req->ncs_sk_type; - cmd->nan_passphrase_len = ndp_req->passphrase.passphrase_len; - cmd->nan_servicename_len = ndp_req->service_name.service_name_len; - - ch_tlv = (wmi_channel *)&cmd[1]; - WMITLV_SET_HDR(ch_tlv, WMITLV_TAG_STRUC_wmi_channel, - WMITLV_GET_STRUCT_TLVLEN(wmi_channel)); - ch_tlv->mhz = ndp_req->channel; - /* - ch_tlv->band_center_freq1 = - cds_chan_to_freq(cds_freq_to_chan(ndp_req->channel)); - */ - tlv_ptr = (uint8_t *)&ch_tlv[1]; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - ndp_req->ndp_config.ndp_cfg, cmd->ndp_cfg_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - ndp_req->ndp_info.ndp_app_info, cmd->ndp_app_info_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], ndp_req->pmk.pmk, - cmd->nan_pmk_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, passphrase_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], ndp_req->passphrase.passphrase, - cmd->nan_passphrase_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + passphrase_len; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, service_name_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - ndp_req->service_name.service_name, - cmd->nan_servicename_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + service_name_len; - - target_if_debug("vdev_id = %d, transaction_id: %d, service_instance_id: %d, ch: %d, ch_cfg: %d, csid: %d", - cmd->vdev_id, cmd->transaction_id, cmd->service_instance_id, - ch_tlv->mhz, cmd->ndp_channel_cfg, cmd->nan_csid); - target_if_debug("peer mac addr: mac_addr31to0: 0x%x, mac_addr47to32: 0x%x", - cmd->peer_discovery_mac_addr.mac_addr31to0, - cmd->peer_discovery_mac_addr.mac_addr47to32); - - target_if_debug("ndp_config len: %d", cmd->ndp_cfg_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - ndp_req->ndp_config.ndp_cfg, - ndp_req->ndp_config.ndp_cfg_len); - - target_if_debug("ndp_app_info len: %d", cmd->ndp_app_info_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - ndp_req->ndp_info.ndp_app_info, - ndp_req->ndp_info.ndp_app_info_len); - - target_if_debug("pmk len: %d", cmd->nan_pmk_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - ndp_req->pmk.pmk, cmd->nan_pmk_len); - - target_if_debug("pass phrase len: %d", cmd->nan_passphrase_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - ndp_req->passphrase.passphrase, - cmd->nan_passphrase_len); - - target_if_debug("service name len: %d", cmd->nan_servicename_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - ndp_req->service_name.service_name, - cmd->nan_servicename_len); - - target_if_debug("sending WMI_NDP_INITIATOR_REQ_CMDID(0x%X)", - WMI_NDP_INITIATOR_REQ_CMDID); - - ret = wmi_unified_cmd_send(wmi_handle, buf, len, - WMI_NDP_INITIATOR_REQ_CMDID); - if (ret < 0) { - target_if_err("WMI_NDP_INITIATOR_REQ_CMDID failed, ret: %d", - ret); - wmi_buf_free(buf); - goto send_ndp_initiator_fail; - } - - return QDF_STATUS_SUCCESS; -send_ndp_initiator_fail: ndp_rsp.vdev = ndp_req->vdev; ndp_rsp.transaction_id = ndp_req->transaction_id; ndp_rsp.ndp_instance_id = ndp_req->service_instance_id; ndp_rsp.status = NAN_DATAPATH_DATA_INITIATOR_REQ_FAILED; pe_msg.type = NDP_INITIATOR_RSP; pe_msg.bodyptr = &ndp_rsp; - /* process even here and call callback */ - if (nan_rx_ops && nan_rx_ops->nan_event_rx) + if (nan_rx_ops->nan_event_rx) nan_rx_ops->nan_event_rx(&pe_msg); return status; @@ -287,12 +178,10 @@ static int target_if_ndp_initiator_rsp_handler(ol_scn_t scn, uint8_t *data, uint32_t len) { QDF_STATUS status; - struct wlan_objmgr_vdev *vdev; + struct wmi_unified *wmi_handle; struct wlan_objmgr_psoc *psoc; struct scheduler_msg msg = {0}; - struct nan_datapath_initiator_rsp *rsp; - WMI_NDP_INITIATOR_RSP_EVENTID_param_tlvs *event; - wmi_ndp_initiator_rsp_event_fixed_param *fixed_params; + struct nan_datapath_initiator_rsp *rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -300,36 +189,24 @@ static int target_if_ndp_initiator_rsp_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - event = (WMI_NDP_INITIATOR_RSP_EVENTID_param_tlvs *)data; - fixed_params = event->fixed_param; - - vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, - fixed_params->vdev_id, WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null"); return -EINVAL; } - rsp = qdf_mem_malloc(sizeof(*rsp)); - if (!rsp) { - target_if_err("malloc failed"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - return -ENOMEM; + status = wmi_extract_ndp_initiator_rsp(wmi_handle, data, &rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); + return -EINVAL; } - rsp->vdev = vdev; - rsp->transaction_id = fixed_params->transaction_id; - rsp->ndp_instance_id = fixed_params->ndp_instance_id; - rsp->status = fixed_params->rsp_status; - rsp->reason = fixed_params->reason_code; - - msg.type = NDP_INITIATOR_RSP; msg.bodyptr = rsp; + msg.type = NDP_INITIATOR_RSP; msg.callback = target_if_nan_event_dispatcher; - - target_if_err("NDP_INITIATOR_RSP sent: %d", msg.type); + msg.flush_callback = target_if_nan_event_flush_cb; + target_if_debug("NDP_INITIATOR_RSP sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); qdf_mem_free(rsp); @@ -340,16 +217,13 @@ static int target_if_ndp_initiator_rsp_handler(ol_scn_t scn, uint8_t *data, } static int target_if_ndp_ind_handler(ol_scn_t scn, uint8_t *data, - uint32_t data_len) + uint32_t data_len) { - int ret; QDF_STATUS status; struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev; + struct wmi_unified *wmi_handle; struct scheduler_msg msg = {0}; - struct nan_datapath_indication_event *rsp; - WMI_NDP_INDICATION_EVENTID_param_tlvs *event; - wmi_ndp_indication_event_fixed_param *fixed_params; + struct nan_datapath_indication_event *rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -357,121 +231,31 @@ static int target_if_ndp_ind_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - event = (WMI_NDP_INDICATION_EVENTID_param_tlvs *)data; - fixed_params = - (wmi_ndp_indication_event_fixed_param *)event->fixed_param; - - vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, - fixed_params->vdev_id, WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null"); return -EINVAL; } - rsp = qdf_mem_malloc(sizeof(*rsp)); - if (!rsp) { - target_if_err("malloc failed"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - return -ENOMEM; + status = wmi_extract_ndp_ind(wmi_handle, data, &rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); + return -EINVAL; } - rsp->vdev = vdev; - rsp->service_instance_id = fixed_params->service_instance_id; - rsp->ndp_instance_id = fixed_params->ndp_instance_id; - rsp->role = fixed_params->self_ndp_role; - rsp->policy = fixed_params->accept_policy; - - WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_ndi_mac_addr, - rsp->peer_mac_addr.bytes); - WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_discovery_mac_addr, - rsp->peer_discovery_mac_addr.bytes); - - target_if_debug("WMI_NDP_INDICATION_EVENTID(0x%X) received. vdev %d,\n" - "service_instance %d, ndp_instance %d, role %d, policy %d,\n" - "csid: %d, scid_len: %d, peer_addr: %pM, peer_disc_addr: %pM", - WMI_NDP_INDICATION_EVENTID, fixed_params->vdev_id, - fixed_params->service_instance_id, - fixed_params->ndp_instance_id, fixed_params->self_ndp_role, - fixed_params->accept_policy, - fixed_params->nan_csid, fixed_params->nan_scid_len, - rsp->peer_mac_addr.bytes, - rsp->peer_discovery_mac_addr.bytes); - - target_if_debug("ndp_cfg - %d bytes", fixed_params->ndp_cfg_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - &event->ndp_cfg, fixed_params->ndp_cfg_len); - - target_if_debug("ndp_app_info - %d bytes", - fixed_params->ndp_app_info_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - &event->ndp_app_info, fixed_params->ndp_app_info_len); - - rsp->ndp_config.ndp_cfg_len = fixed_params->ndp_cfg_len; - rsp->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len; - rsp->ncs_sk_type = fixed_params->nan_csid; - rsp->scid.scid_len = fixed_params->nan_scid_len; - - if (rsp->ndp_config.ndp_cfg_len) { - rsp->ndp_config.ndp_cfg = - qdf_mem_malloc(fixed_params->ndp_cfg_len); - if (!rsp->ndp_config.ndp_cfg) { - target_if_err("malloc failed"); - ret = -ENOMEM; - goto free_ind_resources; - } - qdf_mem_copy(rsp->ndp_config.ndp_cfg, event->ndp_cfg, - rsp->ndp_config.ndp_cfg_len); - } - - if (rsp->ndp_info.ndp_app_info_len) { - rsp->ndp_info.ndp_app_info = - qdf_mem_malloc(rsp->ndp_info.ndp_app_info_len); - if (!rsp->ndp_info.ndp_app_info) { - target_if_err("malloc failed"); - ret = -ENOMEM; - goto free_ind_resources; - } - qdf_mem_copy(rsp->ndp_info.ndp_app_info, - event->ndp_app_info, - rsp->ndp_info.ndp_app_info_len); - } - - if (rsp->scid.scid_len) { - rsp->scid.scid = - qdf_mem_malloc(rsp->scid.scid_len); - if (!rsp->scid.scid) { - target_if_err("malloc failed"); - ret = -ENOMEM; - goto free_ind_resources; - } - qdf_mem_copy(rsp->scid.scid, - event->ndp_scid, rsp->scid.scid_len); - target_if_debug("scid hex dump:"); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - rsp->scid.scid, rsp->scid.scid_len); - } - - msg.type = NDP_INDICATION; msg.bodyptr = rsp; + msg.type = NDP_INDICATION; msg.callback = target_if_nan_event_dispatcher; + msg.flush_callback = target_if_nan_event_flush_cb; target_if_debug("NDP_INDICATION sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); - ret = -EINVAL; - goto free_ind_resources; + qdf_mem_free(rsp); + return -EINVAL; } - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); + return 0; - -free_ind_resources: - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - qdf_mem_free(rsp->ndp_config.ndp_cfg); - qdf_mem_free(rsp->ndp_info.ndp_app_info); - qdf_mem_free(rsp->scid.scid); - qdf_mem_free(rsp); - - return ret; } static int target_if_ndp_confirm_handler(ol_scn_t scn, uint8_t *data, @@ -479,11 +263,9 @@ static int target_if_ndp_confirm_handler(ol_scn_t scn, uint8_t *data, { QDF_STATUS status; struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev; + struct wmi_unified *wmi_handle; struct scheduler_msg msg = {0}; - WMI_NDP_CONFIRM_EVENTID_param_tlvs *event; - wmi_ndp_confirm_event_fixed_param *fixed_params; - struct nan_datapath_confirm_event *rsp; + struct nan_datapath_confirm_event *rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -491,69 +273,26 @@ static int target_if_ndp_confirm_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - rsp = qdf_mem_malloc(sizeof(*rsp)); - if (!rsp) { - target_if_err("malloc failed"); - return -ENOMEM; - } - - event = (WMI_NDP_CONFIRM_EVENTID_param_tlvs *) data; - fixed_params = (wmi_ndp_confirm_event_fixed_param *)event->fixed_param; - target_if_debug("WMI_NDP_CONFIRM_EVENTID(0x%X) recieved. vdev %d, ndp_instance %d, rsp_code %d, reason_code: %d, num_active_ndps_on_peer: %d", - WMI_NDP_CONFIRM_EVENTID, fixed_params->vdev_id, - fixed_params->ndp_instance_id, fixed_params->rsp_code, - fixed_params->reason_code, - fixed_params->num_active_ndps_on_peer); - target_if_debug("ndp_cfg - %d bytes", fixed_params->ndp_cfg_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - &event->ndp_cfg, fixed_params->ndp_cfg_len); - - target_if_debug("ndp_app_info - %d bytes", - fixed_params->ndp_app_info_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - &event->ndp_app_info, fixed_params->ndp_app_info_len); - - vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, - fixed_params->vdev_id, WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null"); return -EINVAL; } - rsp->vdev = vdev; - rsp->ndp_instance_id = fixed_params->ndp_instance_id; - rsp->rsp_code = fixed_params->rsp_code; - rsp->reason_code = fixed_params->reason_code; - rsp->num_active_ndps_on_peer = - fixed_params->num_active_ndps_on_peer; - - WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_ndi_mac_addr, - rsp->peer_ndi_mac_addr.bytes); - - rsp->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len; - - if (rsp->ndp_info.ndp_app_info_len) { - rsp->ndp_info.ndp_app_info = - qdf_mem_malloc(fixed_params->ndp_app_info_len); - if (!rsp->ndp_info.ndp_app_info) { - target_if_err("malloc failed"); - qdf_mem_free(rsp); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - return -ENOMEM; - } - qdf_mem_copy(&rsp->ndp_info.ndp_app_info, - event->ndp_app_info, - rsp->ndp_info.ndp_app_info_len); + status = wmi_extract_ndp_confirm(wmi_handle, data, &rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); + return -EINVAL; } - msg.type = NDP_CONFIRM; + msg.bodyptr = rsp; + msg.type = NDP_CONFIRM; msg.callback = target_if_nan_event_dispatcher; - target_if_err("NDP_CONFIRM sent: %d", msg.type); + msg.flush_callback = target_if_nan_event_flush_cb; + target_if_debug("NDP_CONFIRM sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); - qdf_mem_free(rsp->ndp_info.ndp_app_info); qdf_mem_free(rsp); return -EINVAL; } @@ -564,19 +303,12 @@ static int target_if_ndp_confirm_handler(ol_scn_t scn, uint8_t *data, static QDF_STATUS target_if_nan_ndp_responder_req( struct nan_datapath_responder_req *req) { - int ret; - uint16_t len; - wmi_buf_t buf; - uint8_t *tlv_ptr; QDF_STATUS status; - wmi_unified_t wmi_handle; + struct wmi_unified *wmi_handle; struct wlan_objmgr_psoc *psoc; struct scheduler_msg pe_msg = {0}; - wmi_ndp_responder_req_fixed_param *cmd; - uint32_t passphrase_len, service_name_len; struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; struct nan_datapath_responder_rsp rsp = {0}; - uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len, pmk_len; if (!req) { target_if_err("Invalid req."); @@ -601,130 +333,17 @@ static QDF_STATUS target_if_nan_ndp_responder_req( return QDF_STATUS_E_NULL_VALUE; } - vdev_id = wlan_vdev_get_id(req->vdev); - target_if_debug("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d", - vdev_id, req->transaction_id, - req->ndp_rsp, - req->ndp_instance_id, - req->ndp_info.ndp_app_info_len); + status = wmi_unified_ndp_responder_req_cmd_send(wmi_handle, req); + if (QDF_IS_STATUS_SUCCESS(status)) + return status; - /* - * WMI command expects 4 byte alligned len: - * round up ndp_cfg_len and ndp_app_info_len to 4 bytes - */ - ndp_cfg_len = qdf_roundup(req->ndp_config.ndp_cfg_len, 4); - ndp_app_info_len = qdf_roundup(req->ndp_info.ndp_app_info_len, 4); - pmk_len = qdf_roundup(req->pmk.pmk_len, 4); - passphrase_len = qdf_roundup(req->passphrase.passphrase_len, 4); - service_name_len = - qdf_roundup(req->service_name.service_name_len, 4); - - /* allocated memory for fixed params as well as variable size data */ - len = sizeof(*cmd) + 5*WMI_TLV_HDR_SIZE + ndp_cfg_len + ndp_app_info_len - + pmk_len + passphrase_len + service_name_len; - - buf = wmi_buf_alloc(wmi_handle, len); - if (!buf) { - target_if_err("wmi_buf_alloc failed"); - status = QDF_STATUS_E_NOMEM; - goto send_ndp_responder_fail; - } - cmd = (wmi_ndp_responder_req_fixed_param *) wmi_buf_data(buf); - WMITLV_SET_HDR(&cmd->tlv_header, - WMITLV_TAG_STRUC_wmi_ndp_responder_req_fixed_param, - WMITLV_GET_STRUCT_TLVLEN( - wmi_ndp_responder_req_fixed_param)); - cmd->vdev_id = vdev_id; - cmd->transaction_id = req->transaction_id; - cmd->ndp_instance_id = req->ndp_instance_id; - cmd->rsp_code = req->ndp_rsp; - cmd->ndp_cfg_len = req->ndp_config.ndp_cfg_len; - cmd->ndp_app_info_len = req->ndp_info.ndp_app_info_len; - cmd->nan_pmk_len = req->pmk.pmk_len; - cmd->nan_csid = req->ncs_sk_type; - cmd->nan_passphrase_len = req->passphrase.passphrase_len; - cmd->nan_servicename_len = req->service_name.service_name_len; - - tlv_ptr = (uint8_t *)&cmd[1]; - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - req->ndp_config.ndp_cfg, cmd->ndp_cfg_len); - - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len; - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - req->ndp_info.ndp_app_info, - req->ndp_info.ndp_app_info_len); - - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len; - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], req->pmk.pmk, - cmd->nan_pmk_len); - - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len; - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, passphrase_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - req->passphrase.passphrase, - cmd->nan_passphrase_len); - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + passphrase_len; - - WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, service_name_len); - qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], - req->service_name.service_name, - cmd->nan_servicename_len); - - tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + service_name_len; - - target_if_debug("vdev_id = %d, transaction_id: %d, csid: %d", - cmd->vdev_id, cmd->transaction_id, cmd->nan_csid); - - target_if_debug("ndp_config len: %d", - req->ndp_config.ndp_cfg_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - req->ndp_config.ndp_cfg, - req->ndp_config.ndp_cfg_len); - - target_if_debug("ndp_app_info len: %d", - req->ndp_info.ndp_app_info_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - req->ndp_info.ndp_app_info, - req->ndp_info.ndp_app_info_len); - - target_if_debug("pmk len: %d", cmd->nan_pmk_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - req->pmk.pmk, cmd->nan_pmk_len); - - target_if_debug("pass phrase len: %d", cmd->nan_passphrase_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - req->passphrase.passphrase, - cmd->nan_passphrase_len); - - target_if_debug("service name len: %d", cmd->nan_servicename_len); - QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, - req->service_name.service_name, - cmd->nan_servicename_len); - - target_if_debug("sending WMI_NDP_RESPONDER_REQ_CMDID(0x%X)", - WMI_NDP_RESPONDER_REQ_CMDID); - ret = wmi_unified_cmd_send(wmi_handle, buf, len, - WMI_NDP_RESPONDER_REQ_CMDID); - if (ret < 0) { - target_if_err("WMI_NDP_RESPONDER_REQ_CMDID failed, ret: %d", - ret); - wmi_buf_free(buf); - status = QDF_STATUS_E_FAILURE; - goto send_ndp_responder_fail; - } - return QDF_STATUS_SUCCESS; - -send_ndp_responder_fail: rsp.vdev = req->vdev; rsp.transaction_id = req->transaction_id; rsp.status = NAN_DATAPATH_RSP_STATUS_ERROR; rsp.reason = NAN_DATAPATH_DATA_RESPONDER_REQ_FAILED; pe_msg.bodyptr = &rsp; pe_msg.type = NDP_RESPONDER_RSP; - if (nan_rx_ops && nan_rx_ops->nan_event_rx) + if (nan_rx_ops->nan_event_rx) nan_rx_ops->nan_event_rx(&pe_msg); return status; @@ -735,12 +354,9 @@ static int target_if_ndp_responder_rsp_handler(ol_scn_t scn, uint8_t *data, { QDF_STATUS status; struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev; + struct wmi_unified *wmi_handle; struct scheduler_msg msg = {0}; - struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; - struct nan_datapath_responder_rsp *rsp; - WMI_NDP_RESPONDER_RSP_EVENTID_param_tlvs *event; - wmi_ndp_responder_rsp_event_fixed_param *fixed_params; + struct nan_datapath_responder_rsp *rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -748,49 +364,24 @@ static int target_if_ndp_responder_rsp_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - nan_rx_ops = target_if_nan_get_rx_ops(psoc); - /* process even here and call callback */ - if (!nan_rx_ops || !nan_rx_ops->nan_event_rx) { - target_if_err("lmac callbacks not registered"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null."); return -EINVAL; } - event = (WMI_NDP_RESPONDER_RSP_EVENTID_param_tlvs *)data; - fixed_params = event->fixed_param; - - vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, - fixed_params->vdev_id, WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); + status = wmi_extract_ndp_responder_rsp(wmi_handle, data, &rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); return -EINVAL; } - rsp = qdf_mem_malloc(sizeof(*rsp)); - if (!rsp) { - target_if_err("malloc failed"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - return -ENOMEM; - } - - rsp->vdev = vdev; - 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); - - target_if_debug("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, fixed_params->vdev_id, - rsp->peer_mac_addr.bytes, rsp->transaction_id, - rsp->status, rsp->reason, rsp->create_peer); msg.bodyptr = rsp; msg.type = NDP_RESPONDER_RSP; msg.callback = target_if_nan_event_dispatcher; - + msg.flush_callback = target_if_nan_event_flush_cb; target_if_debug("NDP_INITIATOR_RSP sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); qdf_mem_free(rsp); @@ -802,16 +393,10 @@ static int target_if_ndp_responder_rsp_handler(ol_scn_t scn, uint8_t *data, static QDF_STATUS target_if_nan_ndp_end_req(struct nan_datapath_end_req *req) { - int ret; - uint16_t len; - wmi_buf_t buf; QDF_STATUS status; - wmi_unified_t wmi_handle; - uint32_t ndp_end_req_len, i; + struct wmi_unified *wmi_handle; struct wlan_objmgr_psoc *psoc; struct scheduler_msg msg = {0}; - wmi_ndp_end_req *ndp_end_req_lst; - wmi_ndp_end_req_fixed_param *cmd; struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; struct nan_datapath_end_rsp_event end_rsp = {0}; @@ -838,50 +423,10 @@ static QDF_STATUS target_if_nan_ndp_end_req(struct nan_datapath_end_req *req) return QDF_STATUS_E_NULL_VALUE; } - /* len of tlv following fixed param */ - ndp_end_req_len = sizeof(wmi_ndp_end_req) * req->num_ndp_instances; - /* above comes out to 4 byte alligned already, no need of padding */ - len = sizeof(*cmd) + ndp_end_req_len + WMI_TLV_HDR_SIZE; - buf = wmi_buf_alloc(wmi_handle, len); - if (!buf) { - target_if_err("Malloc failed"); - status = QDF_STATUS_E_NOMEM; - goto send_ndp_end_fail; - } - cmd = (wmi_ndp_end_req_fixed_param *) wmi_buf_data(buf); + status = wmi_unified_ndp_end_req_cmd_send(wmi_handle, req); + if (QDF_IS_STATUS_SUCCESS(status)) + return status; - WMITLV_SET_HDR(&cmd->tlv_header, - WMITLV_TAG_STRUC_wmi_ndp_end_req_fixed_param, - WMITLV_GET_STRUCT_TLVLEN(wmi_ndp_end_req_fixed_param)); - - cmd->transaction_id = req->transaction_id; - - /* set tlv pointer to end of fixed param */ - WMITLV_SET_HDR((uint8_t *)&cmd[1], WMITLV_TAG_ARRAY_STRUC, - ndp_end_req_len); - - ndp_end_req_lst = (wmi_ndp_end_req *)((uint8_t *)&cmd[1] + - WMI_TLV_HDR_SIZE); - for (i = 0; i < req->num_ndp_instances; i++) { - WMITLV_SET_HDR(&ndp_end_req_lst[i], - WMITLV_TAG_ARRAY_FIXED_STRUC, - (sizeof(*ndp_end_req_lst) - WMI_TLV_HDR_SIZE)); - - ndp_end_req_lst[i].ndp_instance_id = req->ndp_ids[i]; - } - - target_if_debug("Sending WMI_NDP_END_REQ_CMDID to FW"); - ret = wmi_unified_cmd_send(wmi_handle, buf, len, - WMI_NDP_END_REQ_CMDID); - if (ret < 0) { - target_if_err("WMI_NDP_END_REQ_CMDID failed, ret: %d", ret); - wmi_buf_free(buf); - status = QDF_STATUS_E_FAILURE; - goto send_ndp_end_fail; - } - return QDF_STATUS_SUCCESS; - -send_ndp_end_fail: end_rsp.vdev = req->vdev; msg.type = NDP_END_RSP; end_rsp.status = NAN_DATAPATH_RSP_STATUS_ERROR; @@ -889,7 +434,7 @@ send_ndp_end_fail: end_rsp.transaction_id = req->transaction_id; msg.bodyptr = &end_rsp; - if (nan_rx_ops && nan_rx_ops->nan_event_rx) + if (nan_rx_ops->nan_event_rx) nan_rx_ops->nan_event_rx(&msg); return status; @@ -898,15 +443,11 @@ send_ndp_end_fail: static int target_if_ndp_end_rsp_handler(ol_scn_t scn, uint8_t *data, uint32_t data_len) { - int ret = 0; QDF_STATUS status; struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev; + struct wmi_unified *wmi_handle; struct scheduler_msg msg = {0}; - WMI_NDP_END_RSP_EVENTID_param_tlvs *event; - struct nan_datapath_end_rsp_event *end_rsp; - struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; - wmi_ndp_end_rsp_event_fixed_param *fixed_params = NULL; + struct nan_datapath_end_rsp_event *end_rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -914,67 +455,41 @@ static int target_if_ndp_end_rsp_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - nan_rx_ops = target_if_nan_get_rx_ops(psoc); - /* process even here and call callback */ - if (!nan_rx_ops || !nan_rx_ops->nan_event_rx) { - target_if_err("lmac callbacks not registered"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null."); return -EINVAL; } - event = (WMI_NDP_END_RSP_EVENTID_param_tlvs *) data; - fixed_params = (wmi_ndp_end_rsp_event_fixed_param *)event->fixed_param; - target_if_debug("WMI_NDP_END_RSP_EVENTID(0x%X) recieved. transaction_id: %d, rsp_status: %d, reason_code: %d", - WMI_NDP_END_RSP_EVENTID, fixed_params->transaction_id, - fixed_params->rsp_status, fixed_params->reason_code); - - vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE, - WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); + status = wmi_extract_ndp_end_rsp(wmi_handle, data, &end_rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); return -EINVAL; } - end_rsp = qdf_mem_malloc(sizeof(*end_rsp)); - if (!end_rsp) { - target_if_err("malloc failed"); - ret = -ENOMEM; - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - goto send_ndp_end_rsp; - } - - end_rsp->vdev = vdev; - end_rsp->transaction_id = fixed_params->transaction_id; - end_rsp->reason = fixed_params->reason_code; - end_rsp->status = fixed_params->rsp_status; - -send_ndp_end_rsp: msg.bodyptr = end_rsp; msg.type = NDP_END_RSP; msg.callback = target_if_nan_event_dispatcher; - target_if_err("NDP_END_RSP sent: %d", msg.type); + msg.flush_callback = target_if_nan_event_flush_cb; + target_if_debug("NDP_END_RSP sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); qdf_mem_free(end_rsp); return -EINVAL; } - return ret; + + return 0; } static int target_if_ndp_end_ind_handler(ol_scn_t scn, uint8_t *data, uint32_t data_len) { - int i, buf_size; QDF_STATUS status; - struct scheduler_msg msg = {0}; - wmi_ndp_end_indication *ind; - struct qdf_mac_addr peer_addr; struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev; - struct wlan_lmac_if_nan_rx_ops *nan_rx_ops; - WMI_NDP_END_INDICATION_EVENTID_param_tlvs *event; - struct nan_datapath_end_indication_event *rsp; + struct wmi_unified *wmi_handle; + struct scheduler_msg msg = {0}; + struct nan_datapath_end_indication_event *rsp = NULL; psoc = target_if_get_psoc_from_scn_hdl(scn); if (!psoc) { @@ -982,75 +497,30 @@ static int target_if_ndp_end_ind_handler(ol_scn_t scn, uint8_t *data, return -EINVAL; } - nan_rx_ops = target_if_nan_get_rx_ops(psoc); - if (!nan_rx_ops || !nan_rx_ops->nan_event_rx) { - target_if_err("lmac callbacks not registered"); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); + if (!wmi_handle) { + target_if_err("wmi_handle is null."); return -EINVAL; } - event = (WMI_NDP_END_INDICATION_EVENTID_param_tlvs *) data; - if (event->num_ndp_end_indication_list == 0) { - target_if_err("Error: Event ignored, 0 ndp instances"); + status = wmi_extract_ndp_end_ind(wmi_handle, data, &rsp); + if (QDF_IS_STATUS_ERROR(status)) { + target_if_err("parsing of event failed, %d", status); return -EINVAL; } - vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE, - WLAN_NAN_ID); - if (!vdev) { - target_if_err("vdev is null"); - return -EINVAL; - } - - target_if_debug("number of ndp instances = %d", - event->num_ndp_end_indication_list); - buf_size = sizeof(*rsp) + event->num_ndp_end_indication_list * - sizeof(rsp->ndp_map[0]); - rsp = qdf_mem_malloc(buf_size); - if (!rsp) { - target_if_err("Failed to allocate memory"); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); - return -ENOMEM; - } - - rsp->vdev = vdev; - rsp->num_ndp_ids = event->num_ndp_end_indication_list; - - ind = event->ndp_end_indication_list; - for (i = 0; i < rsp->num_ndp_ids; i++) { - WMI_MAC_ADDR_TO_CHAR_ARRAY( - &ind[i].peer_ndi_mac_addr, - peer_addr.bytes); - /* add mac address print - TBD */ - target_if_debug( - "ind[%d]: type %d, reason_code %d, instance_id %d num_active %d ", - i, ind[i].type, ind[i].reason_code, - ind[i].ndp_instance_id, ind[i].num_active_ndps_on_peer); - - /* Add each instance entry to the list */ - rsp->ndp_map[i].ndp_instance_id = - ind[i].ndp_instance_id; - rsp->ndp_map[i].vdev_id = ind[i].vdev_id; - WMI_MAC_ADDR_TO_CHAR_ARRAY(&ind[i].peer_ndi_mac_addr, - rsp->ndp_map[i].peer_ndi_mac_addr.bytes); - rsp->ndp_map[i].num_active_ndp_sessions = - ind[i].num_active_ndps_on_peer; - rsp->ndp_map[i].type = ind[i].type; - rsp->ndp_map[i].reason_code = - ind[i].reason_code; - } - - msg.type = NDP_END_IND; msg.bodyptr = rsp; + msg.type = NDP_END_IND; msg.callback = target_if_nan_event_dispatcher; - - target_if_err("NDP_END_IND sent: %d", msg.type); + msg.flush_callback = target_if_nan_event_flush_cb; + target_if_debug("NDP_END_IND sent: %d", msg.type); status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg); - wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID); if (QDF_IS_STATUS_ERROR(status)) { target_if_err("failed to post msg, status: %d", status); qdf_mem_free(rsp); return -EINVAL; } + return 0; } @@ -1059,7 +529,7 @@ static QDF_STATUS target_if_nan_req(void *req, uint32_t req_type) /* send cmd to fw */ switch (req_type) { case NDP_INITIATOR_REQ: - target_if_nan_ndp_intiaitor_req(req); + target_if_nan_ndp_initiator_req(req); break; case NDP_RESPONDER_REQ: target_if_nan_ndp_responder_req(req); diff --git a/umac/nan/core/inc/nan_public_structs.h b/umac/nan/core/inc/nan_public_structs.h index 7f1f15487b..2a473c20b7 100644 --- a/umac/nan/core/inc/nan_public_structs.h +++ b/umac/nan/core/inc/nan_public_structs.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -31,6 +31,15 @@ struct wlan_objmgr_psoc; struct wlan_objmgr_vdev; #define IFACE_NAME_SIZE 64 +#define NDP_QOS_INFO_LEN 255 +#define NDP_APP_INFO_LEN 255 +#define NDP_PMK_LEN 32 +#define NDP_SCID_BUF_LEN 256 +#define NDP_NUM_INSTANCE_ID 255 +#define NAN_MAX_SERVICE_NAME_LEN 255 +#define NAN_PASSPHRASE_MIN_LEN 8 +#define NAN_PASSPHRASE_MAX_LEN 63 + #define NAN_DATAPATH_INF_CREATE_REQ 0 #define NAN_DATAPATH_INF_CREATE_RSP 1 @@ -193,7 +202,7 @@ enum nan_datapath_state { */ struct nan_datapath_app_info { uint32_t ndp_app_info_len; - uint8_t *ndp_app_info; + uint8_t ndp_app_info[NDP_APP_INFO_LEN]; }; /** @@ -204,7 +213,7 @@ struct nan_datapath_app_info { */ struct nan_datapath_cfg { uint32_t ndp_cfg_len; - uint8_t *ndp_cfg; + uint8_t ndp_cfg[NDP_QOS_INFO_LEN]; }; /** @@ -215,7 +224,7 @@ struct nan_datapath_cfg { */ struct nan_datapath_pmk { uint32_t pmk_len; - uint8_t *pmk; + uint8_t pmk[NDP_PMK_LEN]; }; /** @@ -226,7 +235,7 @@ struct nan_datapath_pmk { */ struct nan_datapath_scid { uint32_t scid_len; - uint8_t *scid; + uint8_t scid[NDP_SCID_BUF_LEN]; }; /** @@ -237,7 +246,7 @@ struct nan_datapath_scid { */ struct ndp_passphrase { uint32_t passphrase_len; - uint8_t *passphrase; + uint8_t passphrase[NAN_PASSPHRASE_MAX_LEN]; }; /** @@ -248,7 +257,7 @@ struct ndp_passphrase { */ struct ndp_service_name { uint32_t service_name_len; - uint8_t *service_name; + uint8_t service_name[NAN_MAX_SERVICE_NAME_LEN]; }; /** @@ -306,8 +315,8 @@ struct nan_datapath_inf_delete_rsp { /** * struct nan_datapath_initiator_req - ndp initiator request params + * @vdev: pointer to vdev object * @transaction_id: unique identifier - * @vdev_id: session id of the interface over which ndp is being created * @channel: suggested channel for ndp creation * @channel_cfg: channel config, 0=no channel, 1=optional, 2=mandatory * @service_instance_id: Service identifier @@ -338,8 +347,8 @@ struct nan_datapath_initiator_req { /** * struct nan_datapath_initiator_rsp - response event from FW + * @vdev: pointer to vdev object * @transaction_id: unique identifier - * @vdev_id: session id of the interface over which ndp is being created * @ndp_instance_id: locally created NDP instance ID * @status: status of the ndp request * @reason: reason for failure if any @@ -356,8 +365,8 @@ struct nan_datapath_initiator_rsp { /** * struct nan_datapath_responder_req - responder's response to ndp create * request + * @vdev: pointer to vdev object * @transaction_id: unique identifier - * @vdev_id: session id of the interface over which ndp is being created * @ndp_instance_id: locally created NDP instance ID * @ndp_rsp: response to the ndp create request * @ndp_config: ndp configuration params @@ -383,8 +392,8 @@ struct nan_datapath_responder_req { /** * struct nan_datapath_responder_rsp - response to responder's request + * @vdev: pointer to vdev object * @transaction_id: unique identifier - * @vdev_id: session id of the interface over which ndp is being created * @status: command status * @reason: reason for failure if any * @peer_mac_addr: Peer's mac address @@ -401,20 +410,22 @@ struct nan_datapath_responder_rsp { /** * struct nan_datapath_end_req - ndp end request + * @vdev: pointer to vdev object * @transaction_id: unique transaction identifier * @num_ndp_instances: number of ndp instances to be terminated - * @ndp_ids: pointer to array of ndp_instance_id to be terminated + * @ndp_ids: array of ndp_instance_id to be terminated * */ struct nan_datapath_end_req { struct wlan_objmgr_vdev *vdev; uint32_t transaction_id; uint32_t num_ndp_instances; - uint32_t *ndp_ids; + uint32_t ndp_ids[NDP_NUM_INSTANCE_ID]; }; /** * struct nan_datapath_end_rsp_event - firmware response to ndp end request + * @vdev: pointer to vdev object * @transaction_id: unique identifier for the request * @status: status of operation * @reason: reason(opaque to host driver) @@ -430,6 +441,7 @@ struct nan_datapath_end_rsp_event { /** * struct nan_datapath_end_indication_event - ndp termination notification from * FW + * @vdev: pointer to vdev object * @num_ndp_ids: number of NDP ids * @ndp_map: mapping of NDP instances to peer and vdev * @@ -442,7 +454,7 @@ struct nan_datapath_end_indication_event { /** * struct nan_datapath_confirm_event - ndp confirmation event from FW - * @vdev_id: session id of the interface over which ndp is being created + * @vdev: pointer to vdev object * @ndp_instance_id: ndp instance id for which confirm is being generated * @reason_code : reason code(opaque to driver) * @num_active_ndps_on_peer: number of ndp instances on peer @@ -463,7 +475,7 @@ struct nan_datapath_confirm_event { /** * struct nan_datapath_indication_event - create ndp indication on the responder - * @vdev_id: session id of the interface over which ndp is being created + * @vdev: pointer to vdev object * @service_instance_id: Service identifier * @peer_discovery_mac_addr: Peer's discovery mac address * @peer_mac_addr: Peer's NDI mac address diff --git a/umac/nan/core/src/nan_main.c b/umac/nan/core/src/nan_main.c index 7c0d0b8f88..e5ade7813d 100644 --- a/umac/nan/core/src/nan_main.c +++ b/umac/nan/core/src/nan_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -71,27 +71,16 @@ void nan_release_cmd(void *in_req, uint32_t cmdtype) case WLAN_SER_CMD_NDP_INIT_REQ: { struct nan_datapath_initiator_req *req = in_req; vdev = req->vdev; - qdf_mem_free(req->pmk.pmk); - qdf_mem_free(req->ndp_info.ndp_app_info); - qdf_mem_free(req->ndp_config.ndp_cfg); - qdf_mem_free(req->passphrase.passphrase); - qdf_mem_free(req->service_name.service_name); break; } case WLAN_SER_CMD_NDP_RESP_REQ: { struct nan_datapath_responder_req *req = in_req; vdev = req->vdev; - qdf_mem_free(req->pmk.pmk); - qdf_mem_free(req->ndp_info.ndp_app_info); - qdf_mem_free(req->ndp_config.ndp_cfg); - qdf_mem_free(req->passphrase.passphrase); - qdf_mem_free(req->service_name.service_name); break; } case WLAN_SER_CMD_NDP_DATA_END_INIT_REQ: { struct nan_datapath_end_req *req = in_req; vdev = req->vdev; - qdf_mem_free(req->ndp_ids); break; } default: @@ -261,7 +250,6 @@ static QDF_STATUS nan_handle_confirm( struct nan_datapath_confirm_event *confirm) { uint8_t vdev_id; - QDF_STATUS status = QDF_STATUS_SUCCESS; struct wlan_objmgr_psoc *psoc; struct nan_psoc_priv_obj *psoc_nan_obj; @@ -269,15 +257,13 @@ static QDF_STATUS nan_handle_confirm( psoc = wlan_vdev_get_psoc(confirm->vdev); if (!psoc) { nan_err("psoc is null"); - status = QDF_STATUS_E_NULL_VALUE; - goto free_resource; + return QDF_STATUS_E_NULL_VALUE; } psoc_nan_obj = nan_get_psoc_priv_obj(psoc); if (!psoc_nan_obj) { nan_err("psoc_nan_obj is null"); - status = QDF_STATUS_E_NULL_VALUE; - goto free_resource; + return QDF_STATUS_E_NULL_VALUE; } if (confirm->rsp_code != NAN_DATAPATH_RESPONSE_ACCEPT && @@ -295,10 +281,7 @@ static QDF_STATUS nan_handle_confirm( psoc_nan_obj->cb_obj.os_if_event_handler(psoc, confirm->vdev, NDP_CONFIRM, confirm); -free_resource: - qdf_mem_free(confirm->ndp_info.ndp_app_info); - - return status; + return QDF_STATUS_SUCCESS; } static QDF_STATUS nan_handle_initiator_rsp( @@ -339,15 +322,13 @@ static QDF_STATUS nan_handle_ndp_ind( psoc = wlan_vdev_get_psoc(ndp_ind->vdev); if (!psoc) { nan_err("psoc is null"); - status = QDF_STATUS_E_NULL_VALUE; - goto ndp_indication_failed; + return QDF_STATUS_E_NULL_VALUE; } psoc_nan_obj = nan_get_psoc_priv_obj(psoc); if (!psoc_nan_obj) { nan_err("psoc_nan_obj is null"); - status = QDF_STATUS_E_NULL_VALUE; - goto ndp_indication_failed; + return QDF_STATUS_E_NULL_VALUE; } nan_debug("role: %d, vdev: %d, csid: %d, peer_mac_addr " @@ -363,16 +344,12 @@ static QDF_STATUS nan_handle_ndp_ind( if (QDF_IS_STATUS_ERROR(status)) { nan_err("Couldn't add ndi peer, ndp_role: %d", ndp_ind->role); - goto ndp_indication_failed; + return status; } } if (NAN_DATAPATH_ROLE_RESPONDER == ndp_ind->role) psoc_nan_obj->cb_obj.os_if_event_handler(psoc, ndp_ind->vdev, NDP_INDICATION, ndp_ind); -ndp_indication_failed: - qdf_mem_free(ndp_ind->ndp_config.ndp_cfg); - qdf_mem_free(ndp_ind->ndp_info.ndp_app_info); - qdf_mem_free(ndp_ind->scid.scid); return status; } diff --git a/umac/nan/dispatcher/src/nan_ucfg_api.c b/umac/nan/dispatcher/src/nan_ucfg_api.c index d01f00dddb..dc9412ac8b 100644 --- a/umac/nan/dispatcher/src/nan_ucfg_api.c +++ b/umac/nan/dispatcher/src/nan_ucfg_api.c @@ -302,224 +302,10 @@ inline QDF_STATUS ucfg_nan_get_callbacks(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } -static struct nan_datapath_initiator_req *ucfg_nan_copy_intiator_req( - struct wlan_objmgr_vdev *vdev, - struct nan_datapath_initiator_req *in_req) -{ - struct nan_datapath_initiator_req *out_req; - - out_req = qdf_mem_malloc(sizeof(*out_req)); - if (!out_req) { - nan_alert("malloc failed"); - return NULL; - } - - qdf_mem_copy(out_req, in_req, sizeof(*out_req)); - if (in_req->ndp_config.ndp_cfg_len) { - out_req->ndp_config.ndp_cfg = - qdf_mem_malloc(in_req->ndp_config.ndp_cfg_len); - if (!out_req->ndp_config.ndp_cfg) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(out_req->ndp_config.ndp_cfg, - in_req->ndp_config.ndp_cfg, - in_req->ndp_config.ndp_cfg_len); - } - - if (in_req->ndp_info.ndp_app_info_len) { - out_req->ndp_info.ndp_app_info = - qdf_mem_malloc(in_req->ndp_info.ndp_app_info_len); - if (!out_req->ndp_info.ndp_app_info) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(out_req->ndp_info.ndp_app_info, - in_req->ndp_info.ndp_app_info, - in_req->ndp_info.ndp_app_info_len); - } - - if (in_req->pmk.pmk_len) { - out_req->pmk.pmk = qdf_mem_malloc(in_req->pmk.pmk_len); - if (!out_req->pmk.pmk) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(out_req->pmk.pmk, in_req->pmk.pmk, - in_req->pmk.pmk_len); - } - - if (in_req->passphrase.passphrase_len) { - out_req->passphrase.passphrase = - qdf_mem_malloc(in_req->passphrase.passphrase_len); - if (NULL == out_req->passphrase.passphrase) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(out_req->passphrase.passphrase, - in_req->passphrase.passphrase, - in_req->passphrase.passphrase_len); - } - - if (in_req->service_name.service_name_len) { - out_req->service_name.service_name = - qdf_mem_malloc(in_req->service_name.service_name_len); - if (NULL == out_req->service_name.service_name) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(out_req->service_name.service_name, - in_req->service_name.service_name, - in_req->service_name.service_name_len); - } - - nan_debug("pmk_len: %d, passphrase_len: %d, service_name_len: %d", - out_req->pmk.pmk_len, - out_req->passphrase.passphrase_len, - out_req->service_name.service_name_len); - - /* do not get ref here, rather take ref when request is activated */ - out_req->vdev = vdev; - return out_req; - -free_resources: - qdf_mem_free(out_req->passphrase.passphrase); - qdf_mem_free(out_req->service_name.service_name); - qdf_mem_free(out_req->pmk.pmk); - qdf_mem_free(out_req->ndp_info.ndp_app_info); - qdf_mem_free(out_req->ndp_config.ndp_cfg); - qdf_mem_free(out_req); - return NULL; -} - -static struct nan_datapath_responder_req *ucfg_nan_copy_responder_req( - struct wlan_objmgr_vdev *vdev, - struct nan_datapath_responder_req *in_req) -{ - struct nan_datapath_responder_req *req; - - req = qdf_mem_malloc(sizeof(*req)); - if (!req) { - nan_alert("malloc failed"); - return NULL; - } - - qdf_mem_copy(req, in_req, sizeof(*req)); - if (in_req->ndp_config.ndp_cfg_len) { - req->ndp_config.ndp_cfg = - qdf_mem_malloc(in_req->ndp_config.ndp_cfg_len); - if (!req->ndp_config.ndp_cfg) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->ndp_config.ndp_cfg, - in_req->ndp_config.ndp_cfg, - in_req->ndp_config.ndp_cfg_len); - } - - if (in_req->ndp_info.ndp_app_info_len) { - req->ndp_info.ndp_app_info = - qdf_mem_malloc(in_req->ndp_info.ndp_app_info_len); - if (!req->ndp_info.ndp_app_info) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->ndp_info.ndp_app_info, - in_req->ndp_info.ndp_app_info, - in_req->ndp_info.ndp_app_info_len); - } - - if (in_req->pmk.pmk_len) { - req->pmk.pmk = qdf_mem_malloc(in_req->pmk.pmk_len); - if (!req->pmk.pmk) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->pmk.pmk, in_req->pmk.pmk, - in_req->pmk.pmk_len); - } - - if (in_req->passphrase.passphrase_len) { - req->passphrase.passphrase = - qdf_mem_malloc(in_req->passphrase.passphrase_len); - if (NULL == req->passphrase.passphrase) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->passphrase.passphrase, - in_req->passphrase.passphrase, - in_req->passphrase.passphrase_len); - } - - if (in_req->service_name.service_name_len) { - req->service_name.service_name = - qdf_mem_malloc(in_req->service_name.service_name_len); - if (NULL == req->service_name.service_name) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->service_name.service_name, - in_req->service_name.service_name, - in_req->service_name.service_name_len); - } - - nan_debug("pmk_len: %d, passphrase_len: %d, service_name_len: %d", - req->pmk.pmk_len, - req->passphrase.passphrase_len, - req->service_name.service_name_len); - - /* do not get ref here, rather take ref when request is activated */ - req->vdev = vdev; - return req; - -free_resources: - qdf_mem_free(req->passphrase.passphrase); - qdf_mem_free(req->service_name.service_name); - qdf_mem_free(req->pmk.pmk); - qdf_mem_free(req->ndp_info.ndp_app_info); - qdf_mem_free(req->ndp_config.ndp_cfg); - qdf_mem_free(req); - return NULL; -} - -static struct nan_datapath_end_req *ucfg_nan_copy_end_req( - struct wlan_objmgr_vdev *vdev, - struct nan_datapath_end_req *in_req) -{ - struct nan_datapath_end_req *req; - - req = qdf_mem_malloc(sizeof(*req)); - if (!req) { - nan_alert("malloc failed"); - return NULL; - } - - qdf_mem_copy(req, in_req, sizeof(*req)); - if (in_req->num_ndp_instances) { - req->ndp_ids = qdf_mem_malloc(sizeof(uint32_t) * - in_req->num_ndp_instances); - if (!req->ndp_ids) { - nan_alert("malloc failed"); - goto free_resources; - } - qdf_mem_copy(req->ndp_ids, in_req->ndp_ids, - sizeof(uint32_t) * in_req->num_ndp_instances); - } - - /* do not get ref here, rather take ref when request is activated */ - req->vdev = vdev; - return req; - -free_resources: - qdf_mem_free(req->ndp_ids); - qdf_mem_free(req); - return NULL; -} - QDF_STATUS ucfg_nan_req_processor(struct wlan_objmgr_vdev *vdev, void *in_req, uint32_t req_type) { - void *req; + uint32_t len; QDF_STATUS status; struct scheduler_msg msg = {0}; @@ -530,26 +316,26 @@ QDF_STATUS ucfg_nan_req_processor(struct wlan_objmgr_vdev *vdev, switch (req_type) { case NDP_INITIATOR_REQ: - req = ucfg_nan_copy_intiator_req(vdev, in_req); + len = sizeof(struct nan_datapath_initiator_req); break; case NDP_RESPONDER_REQ: - req = ucfg_nan_copy_responder_req(vdev, in_req); + len = sizeof(struct nan_datapath_responder_req); break; case NDP_END_REQ: - req = ucfg_nan_copy_end_req(vdev, in_req); + len = sizeof(struct nan_datapath_end_req); break; default: nan_err("in correct message req type: %d", req_type); return QDF_STATUS_E_INVAL; } - if (!req) { - nan_err("failed to create local copy"); - return QDF_STATUS_E_INVAL; + msg.bodyptr = qdf_mem_malloc(len); + if (!msg.bodyptr) { + nan_err("malloc failed"); + return QDF_STATUS_E_NOMEM; } - + qdf_mem_copy(msg.bodyptr, in_req, len); msg.type = req_type; - msg.bodyptr = req; msg.callback = nan_scheduled_msg_handler; status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg); if (QDF_IS_STATUS_ERROR(status)) { diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 78e6b99ab6..da3aace5ab 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -49,6 +49,10 @@ #endif #include "wlan_scan_public_structs.h" +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +#include "nan_public_structs.h" +#endif + typedef qdf_nbuf_t wmi_buf_t; #define wmi_buf_data(_buf) qdf_nbuf_data(_buf) @@ -1756,4 +1760,103 @@ QDF_STATUS wmi_unified_send_dump_wds_table_cmd(void *wmi_hdl); QDF_STATUS wmi_extract_wds_entry(void *wmi_hdl, uint8_t *evt_buf, struct wdsentry *wds_entry, u_int32_t idx); + +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +/** + * wmi_unified_ndp_initiator_req_cmd_send - api to send initiator request to FW + * @wmi_hdl: wma handle + * @req: pointer to request buffer + * + * Return: status of operation + */ +QDF_STATUS wmi_unified_ndp_initiator_req_cmd_send(void *wmi_hdl, + struct nan_datapath_initiator_req *req); + +/** + * wmi_unified_ndp_responder_req_cmd_send - api to send responder request to FW + * @wmi_hdl: wma handle + * @req: pointer to request buffer + * + * Return: status of operation + */ +QDF_STATUS wmi_unified_ndp_responder_req_cmd_send(void *wmi_hdl, + struct nan_datapath_responder_req *req); + +/** + * wmi_unified_ndp_end_req_cmd_send - api to send end request to FW + * @wmi_hdl: wma handle + * @req: pointer to request buffer + * + * Return: status of operation + */ +QDF_STATUS wmi_unified_ndp_end_req_cmd_send(void *wmi_hdl, + struct nan_datapath_end_req *req); + +/** + * wmi_extract_ndp_initiator_rsp - api to extract initiator rsp from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @rsp: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_initiator_rsp(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_initiator_rsp **rsp); + +/** + * wmi_extract_ndp_ind - api to extract ndp indication struct from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @ind: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_ind(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_indication_event **ind); + +/** + * wmi_extract_ndp_confirm - api to extract ndp confim struct from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @ev: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_confirm(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_confirm_event **ev); + +/** + * wmi_extract_ndp_responder_rsp - api to extract responder rsp from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @rsp: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_responder_rsp(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_responder_rsp **rsp); + +/** + * wmi_extract_ndp_end_rsp - api to extract ndp end rsp from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @rsp: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_end_rsp(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_end_rsp_event **rsp); + +/** + * wmi_extract_ndp_end_ind - api to extract ndp end indication from even buffer + * @wmi_hdl: wma handle + * @data: event buffer + * @ind: buffer to populate + * + * Return: status of operation + */ +QDF_STATUS wmi_extract_ndp_end_ind(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_end_indication_event **ind); + +#endif #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 3c89a56a51..012bbfa735 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -50,6 +50,10 @@ #endif #include +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +#include "nan_public_structs.h" +#endif + #define WMI_UNIFIED_MAX_EVENT 0x100 #define WMI_MAX_CMDS 1024 @@ -1452,6 +1456,29 @@ QDF_STATUS (*extract_wds_entry)(wmi_unified_t wmi_handle, uint8_t *evt_buf, struct wdsentry *wds_entry, u_int32_t idx); + +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +QDF_STATUS (*send_ndp_initiator_req_cmd)(wmi_unified_t wmi_handle, + struct nan_datapath_initiator_req *req); +QDF_STATUS (*send_ndp_responder_req_cmd)(wmi_unified_t wmi_handle, + struct nan_datapath_responder_req *req); +QDF_STATUS (*send_ndp_end_req_cmd)(wmi_unified_t wmi_handle, + struct nan_datapath_end_req *req); + +QDF_STATUS (*extract_ndp_initiator_rsp)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_initiator_rsp **rsp); +QDF_STATUS (*extract_ndp_ind)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_indication_event **ind); +QDF_STATUS (*extract_ndp_confirm)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_confirm_event **ev); +QDF_STATUS (*extract_ndp_responder_rsp)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_responder_rsp **rsp); +QDF_STATUS (*extract_ndp_end_rsp)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_end_rsp_event **rsp); +QDF_STATUS (*extract_ndp_end_ind)(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_end_indication_event **ind); + +#endif }; /* Forward declartion for psoc*/ diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 23e072f02d..bf6e8a9921 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -7113,3 +7113,101 @@ QDF_STATUS wmi_extract_wds_entry(void *wmi_hdl, uint8_t *evt_buf, return QDF_STATUS_E_FAILURE; } + +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +QDF_STATUS wmi_unified_ndp_initiator_req_cmd_send(void *wmi_hdl, + struct nan_datapath_initiator_req *req) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->send_ndp_initiator_req_cmd) + return wmi_handle->ops->send_ndp_initiator_req_cmd(wmi_handle, + req); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_unified_ndp_responder_req_cmd_send(void *wmi_hdl, + struct nan_datapath_responder_req *req) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->send_ndp_responder_req_cmd) + return wmi_handle->ops->send_ndp_responder_req_cmd(wmi_handle, + req); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_unified_ndp_end_req_cmd_send(void *wmi_hdl, + struct nan_datapath_end_req *req) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->send_ndp_end_req_cmd) + return wmi_handle->ops->send_ndp_end_req_cmd(wmi_handle, + req); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_initiator_rsp(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_initiator_rsp **rsp) +{ + if (wmi_handle->ops->extract_ndp_initiator_rsp) + return wmi_handle->ops->extract_ndp_initiator_rsp(wmi_handle, + data, rsp); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_ind(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_indication_event **ind) +{ + if (wmi_handle->ops->extract_ndp_ind) + return wmi_handle->ops->extract_ndp_ind(wmi_handle, + data, ind); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_confirm(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_confirm_event **ev) +{ + if (wmi_handle->ops->extract_ndp_confirm) + return wmi_handle->ops->extract_ndp_confirm(wmi_handle, + data, ev); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_responder_rsp(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_responder_rsp **rsp) +{ + if (wmi_handle->ops->extract_ndp_responder_rsp) + return wmi_handle->ops->extract_ndp_responder_rsp(wmi_handle, + data, rsp); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_end_rsp(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_end_rsp_event **rsp) +{ + if (wmi_handle->ops->extract_ndp_end_rsp) + return wmi_handle->ops->extract_ndp_end_rsp(wmi_handle, + data, rsp); + + return QDF_STATUS_E_FAILURE; +} + +QDF_STATUS wmi_extract_ndp_end_ind(wmi_unified_t wmi_handle, uint8_t *data, + struct nan_datapath_end_indication_event **ind) +{ + if (wmi_handle->ops->extract_ndp_end_ind) + return wmi_handle->ops->extract_ndp_end_ind(wmi_handle, + data, ind); + + return QDF_STATUS_E_FAILURE; +} +#endif diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index b53e7cf809..3cfa4c31b2 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -40,6 +40,10 @@ #endif #include +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +#include "nan_public_structs.h" +#endif + /* copy_vdev_create_pdev_id() - copy pdev from host params to target command * buffer. * @wmi_handle: pointer to wmi_handle @@ -16519,6 +16523,593 @@ QDF_STATUS send_bcn_offload_control_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +#ifdef WLAN_FEATURE_NAN_CONVERGENCE +static QDF_STATUS nan_ndp_initiator_req_tlv(wmi_unified_t wmi_handle, + struct nan_datapath_initiator_req *ndp_req) +{ + uint16_t len; + wmi_buf_t buf; + uint8_t *tlv_ptr; + QDF_STATUS status; + wmi_channel *ch_tlv; + wmi_ndp_initiator_req_fixed_param *cmd; + uint32_t passphrase_len, service_name_len; + uint32_t ndp_cfg_len, ndp_app_info_len, pmk_len; + + /* + * WMI command expects 4 byte alligned len: + * round up ndp_cfg_len and ndp_app_info_len to 4 bytes + */ + ndp_cfg_len = qdf_roundup(ndp_req->ndp_config.ndp_cfg_len, 4); + ndp_app_info_len = qdf_roundup(ndp_req->ndp_info.ndp_app_info_len, 4); + pmk_len = qdf_roundup(ndp_req->pmk.pmk_len, 4); + passphrase_len = qdf_roundup(ndp_req->passphrase.passphrase_len, 4); + service_name_len = + qdf_roundup(ndp_req->service_name.service_name_len, 4); + /* allocated memory for fixed params as well as variable size data */ + len = sizeof(*cmd) + sizeof(*ch_tlv) + (5 * WMI_TLV_HDR_SIZE) + + ndp_cfg_len + ndp_app_info_len + pmk_len + + passphrase_len + service_name_len; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("wmi_buf_alloc failed"); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_ndp_initiator_req_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_ndp_initiator_req_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_ndp_initiator_req_fixed_param)); + cmd->vdev_id = wlan_vdev_get_id(ndp_req->vdev); + cmd->transaction_id = ndp_req->transaction_id; + cmd->service_instance_id = ndp_req->service_instance_id; + WMI_CHAR_ARRAY_TO_MAC_ADDR(ndp_req->peer_discovery_mac_addr.bytes, + &cmd->peer_discovery_mac_addr); + + cmd->ndp_cfg_len = ndp_req->ndp_config.ndp_cfg_len; + cmd->ndp_app_info_len = ndp_req->ndp_info.ndp_app_info_len; + cmd->ndp_channel_cfg = ndp_req->channel_cfg; + cmd->nan_pmk_len = ndp_req->pmk.pmk_len; + cmd->nan_csid = ndp_req->ncs_sk_type; + cmd->nan_passphrase_len = ndp_req->passphrase.passphrase_len; + cmd->nan_servicename_len = ndp_req->service_name.service_name_len; + + ch_tlv = (wmi_channel *)&cmd[1]; + WMITLV_SET_HDR(ch_tlv, WMITLV_TAG_STRUC_wmi_channel, + WMITLV_GET_STRUCT_TLVLEN(wmi_channel)); + ch_tlv->mhz = ndp_req->channel; + tlv_ptr = (uint8_t *)&ch_tlv[1]; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + ndp_req->ndp_config.ndp_cfg, cmd->ndp_cfg_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + ndp_req->ndp_info.ndp_app_info, cmd->ndp_app_info_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], ndp_req->pmk.pmk, + cmd->nan_pmk_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, passphrase_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], ndp_req->passphrase.passphrase, + cmd->nan_passphrase_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + passphrase_len; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, service_name_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + ndp_req->service_name.service_name, + cmd->nan_servicename_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + service_name_len; + + WMI_LOGD("vdev_id = %d, transaction_id: %d, service_instance_id: %d, ch: %d, ch_cfg: %d, csid: %d", + cmd->vdev_id, cmd->transaction_id, cmd->service_instance_id, + ch_tlv->mhz, cmd->ndp_channel_cfg, cmd->nan_csid); + WMI_LOGD("peer mac addr: mac_addr31to0: 0x%x, mac_addr47to32: 0x%x", + cmd->peer_discovery_mac_addr.mac_addr31to0, + cmd->peer_discovery_mac_addr.mac_addr47to32); + + WMI_LOGD("ndp_config len: %d", cmd->ndp_cfg_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + ndp_req->ndp_config.ndp_cfg, + ndp_req->ndp_config.ndp_cfg_len); + + WMI_LOGD("ndp_app_info len: %d", cmd->ndp_app_info_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + ndp_req->ndp_info.ndp_app_info, + ndp_req->ndp_info.ndp_app_info_len); + + WMI_LOGD("pmk len: %d", cmd->nan_pmk_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + ndp_req->pmk.pmk, cmd->nan_pmk_len); + + WMI_LOGD("pass phrase len: %d", cmd->nan_passphrase_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + ndp_req->passphrase.passphrase, + cmd->nan_passphrase_len); + + WMI_LOGD("service name len: %d", cmd->nan_servicename_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + ndp_req->service_name.service_name, + cmd->nan_servicename_len); + + WMI_LOGD("sending WMI_NDP_INITIATOR_REQ_CMDID(0x%X)", + WMI_NDP_INITIATOR_REQ_CMDID); + + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_NDP_INITIATOR_REQ_CMDID); + if (QDF_IS_STATUS_ERROR(status)) { + WMI_LOGE("WMI_NDP_INITIATOR_REQ_CMDID failed, ret: %d", status); + wmi_buf_free(buf); + } + + return status; +} + +static QDF_STATUS nan_ndp_responder_req_tlv(wmi_unified_t wmi_handle, + struct nan_datapath_responder_req *req) +{ + uint16_t len; + wmi_buf_t buf; + uint8_t *tlv_ptr; + QDF_STATUS status; + wmi_ndp_responder_req_fixed_param *cmd; + uint32_t passphrase_len, service_name_len; + uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len, pmk_len; + + vdev_id = wlan_vdev_get_id(req->vdev); + WMI_LOGD("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d", + vdev_id, req->transaction_id, + req->ndp_rsp, + req->ndp_instance_id, + req->ndp_info.ndp_app_info_len); + + /* + * WMI command expects 4 byte alligned len: + * round up ndp_cfg_len and ndp_app_info_len to 4 bytes + */ + ndp_cfg_len = qdf_roundup(req->ndp_config.ndp_cfg_len, 4); + ndp_app_info_len = qdf_roundup(req->ndp_info.ndp_app_info_len, 4); + pmk_len = qdf_roundup(req->pmk.pmk_len, 4); + passphrase_len = qdf_roundup(req->passphrase.passphrase_len, 4); + service_name_len = + qdf_roundup(req->service_name.service_name_len, 4); + + /* allocated memory for fixed params as well as variable size data */ + len = sizeof(*cmd) + 5*WMI_TLV_HDR_SIZE + ndp_cfg_len + ndp_app_info_len + + pmk_len + passphrase_len + service_name_len; + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("wmi_buf_alloc failed"); + return QDF_STATUS_E_NOMEM; + } + cmd = (wmi_ndp_responder_req_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_ndp_responder_req_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_ndp_responder_req_fixed_param)); + cmd->vdev_id = vdev_id; + cmd->transaction_id = req->transaction_id; + cmd->ndp_instance_id = req->ndp_instance_id; + cmd->rsp_code = req->ndp_rsp; + cmd->ndp_cfg_len = req->ndp_config.ndp_cfg_len; + cmd->ndp_app_info_len = req->ndp_info.ndp_app_info_len; + cmd->nan_pmk_len = req->pmk.pmk_len; + cmd->nan_csid = req->ncs_sk_type; + cmd->nan_passphrase_len = req->passphrase.passphrase_len; + cmd->nan_servicename_len = req->service_name.service_name_len; + + tlv_ptr = (uint8_t *)&cmd[1]; + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + req->ndp_config.ndp_cfg, cmd->ndp_cfg_len); + + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_cfg_len; + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + req->ndp_info.ndp_app_info, + req->ndp_info.ndp_app_info_len); + + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + ndp_app_info_len; + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], req->pmk.pmk, + cmd->nan_pmk_len); + + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len; + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, passphrase_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + req->passphrase.passphrase, + cmd->nan_passphrase_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + passphrase_len; + + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, service_name_len); + qdf_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + req->service_name.service_name, + cmd->nan_servicename_len); + + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + service_name_len; + + WMI_LOGD("vdev_id = %d, transaction_id: %d, csid: %d", + cmd->vdev_id, cmd->transaction_id, cmd->nan_csid); + + WMI_LOGD("ndp_config len: %d", + req->ndp_config.ndp_cfg_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + req->ndp_config.ndp_cfg, + req->ndp_config.ndp_cfg_len); + + WMI_LOGD("ndp_app_info len: %d", + req->ndp_info.ndp_app_info_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + req->ndp_info.ndp_app_info, + req->ndp_info.ndp_app_info_len); + + WMI_LOGD("pmk len: %d", cmd->nan_pmk_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + req->pmk.pmk, cmd->nan_pmk_len); + + WMI_LOGD("pass phrase len: %d", cmd->nan_passphrase_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + req->passphrase.passphrase, + cmd->nan_passphrase_len); + + WMI_LOGD("service name len: %d", cmd->nan_servicename_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + req->service_name.service_name, + cmd->nan_servicename_len); + + WMI_LOGD("sending WMI_NDP_RESPONDER_REQ_CMDID(0x%X)", + WMI_NDP_RESPONDER_REQ_CMDID); + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_NDP_RESPONDER_REQ_CMDID); + if (QDF_IS_STATUS_ERROR(status)) { + WMI_LOGE("WMI_NDP_RESPONDER_REQ_CMDID failed, ret: %d", status); + wmi_buf_free(buf); + } + return status; +} + +static QDF_STATUS nan_ndp_end_req_tlv(wmi_unified_t wmi_handle, + struct nan_datapath_end_req *req) +{ + uint16_t len; + wmi_buf_t buf; + QDF_STATUS status; + uint32_t ndp_end_req_len, i; + wmi_ndp_end_req *ndp_end_req_lst; + wmi_ndp_end_req_fixed_param *cmd; + + /* len of tlv following fixed param */ + ndp_end_req_len = sizeof(wmi_ndp_end_req) * req->num_ndp_instances; + /* above comes out to 4 byte alligned already, no need of padding */ + len = sizeof(*cmd) + ndp_end_req_len + WMI_TLV_HDR_SIZE; + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("Malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + cmd = (wmi_ndp_end_req_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_ndp_end_req_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_ndp_end_req_fixed_param)); + + cmd->transaction_id = req->transaction_id; + + /* set tlv pointer to end of fixed param */ + WMITLV_SET_HDR((uint8_t *)&cmd[1], WMITLV_TAG_ARRAY_STRUC, + ndp_end_req_len); + + ndp_end_req_lst = (wmi_ndp_end_req *)((uint8_t *)&cmd[1] + + WMI_TLV_HDR_SIZE); + for (i = 0; i < req->num_ndp_instances; i++) { + WMITLV_SET_HDR(&ndp_end_req_lst[i], + WMITLV_TAG_ARRAY_FIXED_STRUC, + (sizeof(*ndp_end_req_lst) - WMI_TLV_HDR_SIZE)); + + ndp_end_req_lst[i].ndp_instance_id = req->ndp_ids[i]; + } + + WMI_LOGD("Sending WMI_NDP_END_REQ_CMDID to FW"); + status = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_NDP_END_REQ_CMDID); + if (QDF_IS_STATUS_ERROR(status)) { + WMI_LOGE("WMI_NDP_END_REQ_CMDID failed, ret: %d", status); + wmi_buf_free(buf); + } + + return status; +} + +static QDF_STATUS extract_ndp_initiator_rsp_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_initiator_rsp **rsp) +{ + WMI_NDP_INITIATOR_RSP_EVENTID_param_tlvs *event; + wmi_ndp_initiator_rsp_event_fixed_param *fixed_params; + + event = (WMI_NDP_INITIATOR_RSP_EVENTID_param_tlvs *)data; + fixed_params = event->fixed_param; + + *rsp = qdf_mem_malloc(sizeof(**rsp)); + if (!(*rsp)) { + WMI_LOGE("malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + (*rsp)->vdev = + wlan_objmgr_get_vdev_by_id_from_psoc(wmi_handle->soc->wmi_psoc, + fixed_params->vdev_id, + WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + + (*rsp)->transaction_id = fixed_params->transaction_id; + (*rsp)->ndp_instance_id = fixed_params->ndp_instance_id; + (*rsp)->status = fixed_params->rsp_status; + (*rsp)->reason = fixed_params->reason_code; + + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS extract_ndp_ind_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_indication_event **rsp) +{ + WMI_NDP_INDICATION_EVENTID_param_tlvs *event; + wmi_ndp_indication_event_fixed_param *fixed_params; + + event = (WMI_NDP_INDICATION_EVENTID_param_tlvs *)data; + fixed_params = + (wmi_ndp_indication_event_fixed_param *)event->fixed_param; + + *rsp = qdf_mem_malloc(sizeof(**rsp)); + if (!(*rsp)) { + WMI_LOGE("malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + (*rsp)->vdev = + wlan_objmgr_get_vdev_by_id_from_psoc(wmi_handle->soc->wmi_psoc, + fixed_params->vdev_id, + WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + (*rsp)->service_instance_id = fixed_params->service_instance_id; + (*rsp)->ndp_instance_id = fixed_params->ndp_instance_id; + (*rsp)->role = fixed_params->self_ndp_role; + (*rsp)->policy = fixed_params->accept_policy; + + WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_ndi_mac_addr, + (*rsp)->peer_mac_addr.bytes); + WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_discovery_mac_addr, + (*rsp)->peer_discovery_mac_addr.bytes); + + WMI_LOGD("WMI_NDP_INDICATION_EVENTID(0x%X) received. vdev %d,\n" + "service_instance %d, ndp_instance %d, role %d, policy %d,\n" + "csid: %d, scid_len: %d, peer_addr: %pM, peer_disc_addr: %pM", + WMI_NDP_INDICATION_EVENTID, fixed_params->vdev_id, + fixed_params->service_instance_id, + fixed_params->ndp_instance_id, fixed_params->self_ndp_role, + fixed_params->accept_policy, + fixed_params->nan_csid, fixed_params->nan_scid_len, + (*rsp)->peer_mac_addr.bytes, + (*rsp)->peer_discovery_mac_addr.bytes); + + WMI_LOGD("ndp_cfg - %d bytes", fixed_params->ndp_cfg_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + &event->ndp_cfg, fixed_params->ndp_cfg_len); + + WMI_LOGD("ndp_app_info - %d bytes", + fixed_params->ndp_app_info_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + &event->ndp_app_info, fixed_params->ndp_app_info_len); + + (*rsp)->ndp_config.ndp_cfg_len = fixed_params->ndp_cfg_len; + (*rsp)->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len; + (*rsp)->ncs_sk_type = fixed_params->nan_csid; + (*rsp)->scid.scid_len = fixed_params->nan_scid_len; + qdf_mem_copy((*rsp)->ndp_config.ndp_cfg, event->ndp_cfg, + (*rsp)->ndp_config.ndp_cfg_len); + qdf_mem_copy((*rsp)->ndp_info.ndp_app_info, event->ndp_app_info, + (*rsp)->ndp_info.ndp_app_info_len); + qdf_mem_copy((*rsp)->scid.scid, event->ndp_scid, (*rsp)->scid.scid_len); + WMI_LOGD("scid hex dump:"); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + (*rsp)->scid.scid, (*rsp)->scid.scid_len); + + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS extract_ndp_confirm_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_confirm_event **rsp) +{ + WMI_NDP_CONFIRM_EVENTID_param_tlvs *event; + wmi_ndp_confirm_event_fixed_param *fixed_params; + + event = (WMI_NDP_CONFIRM_EVENTID_param_tlvs *) data; + fixed_params = (wmi_ndp_confirm_event_fixed_param *)event->fixed_param; + WMI_LOGD("WMI_NDP_CONFIRM_EVENTID(0x%X) recieved. vdev %d, ndp_instance %d, rsp_code %d, reason_code: %d, num_active_ndps_on_peer: %d", + WMI_NDP_CONFIRM_EVENTID, fixed_params->vdev_id, + fixed_params->ndp_instance_id, fixed_params->rsp_code, + fixed_params->reason_code, + fixed_params->num_active_ndps_on_peer); + WMI_LOGD("ndp_cfg - %d bytes", fixed_params->ndp_cfg_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + &event->ndp_cfg, fixed_params->ndp_cfg_len); + + WMI_LOGD("ndp_app_info - %d bytes", + fixed_params->ndp_app_info_len); + QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, + &event->ndp_app_info, fixed_params->ndp_app_info_len); + + *rsp = qdf_mem_malloc(sizeof(**rsp)); + if (!(*rsp)) { + WMI_LOGE("malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + (*rsp)->vdev = + wlan_objmgr_get_vdev_by_id_from_psoc(wmi_handle->soc->wmi_psoc, + fixed_params->vdev_id, + WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + (*rsp)->ndp_instance_id = fixed_params->ndp_instance_id; + (*rsp)->rsp_code = fixed_params->rsp_code; + (*rsp)->reason_code = fixed_params->reason_code; + (*rsp)->num_active_ndps_on_peer = fixed_params->num_active_ndps_on_peer; + WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_ndi_mac_addr, + (*rsp)->peer_ndi_mac_addr.bytes); + (*rsp)->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len; + qdf_mem_copy((*rsp)->ndp_info.ndp_app_info, event->ndp_app_info, + (*rsp)->ndp_info.ndp_app_info_len); + + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS extract_ndp_responder_rsp_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_responder_rsp **rsp) +{ + WMI_NDP_RESPONDER_RSP_EVENTID_param_tlvs *event; + wmi_ndp_responder_rsp_event_fixed_param *fixed_params; + + event = (WMI_NDP_RESPONDER_RSP_EVENTID_param_tlvs *)data; + fixed_params = event->fixed_param; + + WMI_LOGD("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, fixed_params->vdev_id, + (*rsp)->peer_mac_addr.bytes, (*rsp)->transaction_id, + (*rsp)->status, (*rsp)->reason, (*rsp)->create_peer); + + *rsp = qdf_mem_malloc(sizeof(**rsp)); + if (!(*rsp)) { + WMI_LOGE("malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + (*rsp)->vdev = + wlan_objmgr_get_vdev_by_id_from_psoc(wmi_handle->soc->wmi_psoc, + fixed_params->vdev_id, + WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + (*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); + + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS extract_ndp_end_rsp_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_end_rsp_event **rsp) +{ + WMI_NDP_END_RSP_EVENTID_param_tlvs *event; + wmi_ndp_end_rsp_event_fixed_param *fixed_params = NULL; + + event = (WMI_NDP_END_RSP_EVENTID_param_tlvs *) data; + fixed_params = (wmi_ndp_end_rsp_event_fixed_param *)event->fixed_param; + WMI_LOGD("WMI_NDP_END_RSP_EVENTID(0x%X) recieved. transaction_id: %d, rsp_status: %d, reason_code: %d", + WMI_NDP_END_RSP_EVENTID, fixed_params->transaction_id, + fixed_params->rsp_status, fixed_params->reason_code); + + *rsp = qdf_mem_malloc(sizeof(**rsp)); + if (!(*rsp)) { + WMI_LOGE("malloc failed"); + return QDF_STATUS_E_NOMEM; + } + + (*rsp)->vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc( + wmi_handle->soc->wmi_psoc, QDF_NDI_MODE, WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + (*rsp)->transaction_id = fixed_params->transaction_id; + (*rsp)->reason = fixed_params->reason_code; + (*rsp)->status = fixed_params->rsp_status; + + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS extract_ndp_end_ind_tlv(wmi_unified_t wmi_handle, + uint8_t *data, struct nan_datapath_end_indication_event **rsp) +{ + uint32_t i, buf_size; + wmi_ndp_end_indication *ind; + struct qdf_mac_addr peer_addr; + WMI_NDP_END_INDICATION_EVENTID_param_tlvs *event; + + event = (WMI_NDP_END_INDICATION_EVENTID_param_tlvs *) data; + ind = event->ndp_end_indication_list; + + if (event->num_ndp_end_indication_list == 0) { + WMI_LOGE("Error: Event ignored, 0 ndp instances"); + return -EINVAL; + } + + (*rsp)->vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc( + wmi_handle->soc->wmi_psoc, QDF_NDI_MODE, WLAN_NAN_ID); + if (!(*rsp)->vdev) { + WMI_LOGE("vdev is null"); + qdf_mem_free(*rsp); + return QDF_STATUS_E_INVAL; + } + + WMI_LOGD("number of ndp instances = %d", + event->num_ndp_end_indication_list); + buf_size = sizeof(*rsp) + event->num_ndp_end_indication_list * + sizeof((*rsp)->ndp_map[0]); + *rsp = qdf_mem_malloc(buf_size); + if (!(*rsp)) { + WMI_LOGE("Failed to allocate memory"); + return -ENOMEM; + } + + (*rsp)->num_ndp_ids = event->num_ndp_end_indication_list; + for (i = 0; i < (*rsp)->num_ndp_ids; i++) { + WMI_MAC_ADDR_TO_CHAR_ARRAY(&ind[i].peer_ndi_mac_addr, + peer_addr.bytes); + WMI_LOGD("ind[%d]: type %d, reason_code %d, instance_id %d num_active %d ", + i, ind[i].type, ind[i].reason_code, + ind[i].ndp_instance_id, + ind[i].num_active_ndps_on_peer); + /* Add each instance entry to the list */ + (*rsp)->ndp_map[i].ndp_instance_id = ind[i].ndp_instance_id; + (*rsp)->ndp_map[i].vdev_id = ind[i].vdev_id; + WMI_MAC_ADDR_TO_CHAR_ARRAY(&ind[i].peer_ndi_mac_addr, + (*rsp)->ndp_map[i].peer_ndi_mac_addr.bytes); + (*rsp)->ndp_map[i].num_active_ndp_sessions = + ind[i].num_active_ndps_on_peer; + (*rsp)->ndp_map[i].type = ind[i].type; + (*rsp)->ndp_map[i].reason_code = ind[i].reason_code; + } + + return QDF_STATUS_SUCCESS; +} +#endif + /** * save_service_bitmap_tlv() - save service bitmap * @wmi_handle: wmi handle @@ -20607,6 +21198,17 @@ struct wmi_ops tlv_ops = { .send_roam_scan_hlp_cmd = send_roam_scan_send_hlp_cmd_tlv, #endif .send_wow_timer_pattern_cmd = send_wow_timer_pattern_cmd_tlv, +#ifdef WLAN_FEATURE_NAN_CONVERGENCE + .send_ndp_initiator_req_cmd = nan_ndp_initiator_req_tlv, + .send_ndp_responder_req_cmd = nan_ndp_responder_req_tlv, + .send_ndp_end_req_cmd = nan_ndp_end_req_tlv, + .extract_ndp_initiator_rsp = extract_ndp_initiator_rsp_tlv, + .extract_ndp_ind = extract_ndp_ind_tlv, + .extract_ndp_confirm = extract_ndp_confirm_tlv, + .extract_ndp_responder_rsp = extract_ndp_responder_rsp_tlv, + .extract_ndp_end_rsp = extract_ndp_end_rsp_tlv, + .extract_ndp_end_ind = extract_ndp_end_ind_tlv, +#endif }; /**