diff options
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_nan_datapath.c | 109 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_nan_datapath.h | 6 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 34 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/nan/nan_datapath.c | 5 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma_nan_datapath.c | 113 | ||||
| -rw-r--r-- | CORE/SME/src/nan/nan_datapath_api.c | 151 |
6 files changed, 321 insertions, 97 deletions
diff --git a/CORE/HDD/src/wlan_hdd_nan_datapath.c b/CORE/HDD/src/wlan_hdd_nan_datapath.c index d0d173ef26db..2a2e6e4dba80 100644 --- a/CORE/HDD/src/wlan_hdd_nan_datapath.c +++ b/CORE/HDD/src/wlan_hdd_nan_datapath.c @@ -62,6 +62,11 @@ qca_wlan_vendor_ndp_policy[QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX + 1] = { 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, + .len = NDP_PMK_LEN }, + [QCA_WLAN_VENDOR_ATTR_NDP_SCID] = { .type = NLA_BINARY, + .len = NDP_SCID_BUF_LEN }, }; /** @@ -466,6 +471,18 @@ static int hdd_ndi_delete_req_handler(hdd_context_t *hdd_ctx, * @hdd_ctx: hdd context * @tb: parsed NL attribute list * + * tb will contain following vendor attributes: + * QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR + * QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID + * QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL - optional + * QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG + * QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID + * QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR + * QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO - optional + * QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS - optional + * QCA_WLAN_VENDOR_ATTR_NDP_PMK - optional + * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE - optional + * * Return: 0 on success or error code on failure */ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx, @@ -525,9 +542,13 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx, req.channel = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL]); - if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG]) + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG]) { req.channel_cfg = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL_CONFIG]); + } else { + hddLog(LOGE, FL("Channel config is unavailable")); + return -EINVAL; + } if (!tb[QCA_WLAN_VENDOR_ATTR_NDP_SERVICE_INSTANCE_ID]) { hddLog(LOGE, FL("NDP service instance ID is unavailable")); @@ -562,10 +583,31 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx, nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS]); } - hddLog(LOG1, FL("vdev_id: %d, transaction_id: %d, channel: %d, service_instance_id: %d, ndp_app_info_len: %d, peer_discovery_mac_addr: %pM"), + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] && + !tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) { + hddLog(LOGE, FL("PMK cannot be absent when CSID is present.")); + return -EINVAL; + } + + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) { + req.pmk.pmk = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + req.pmk.pmk_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, + VOS_TRACE_LEVEL_DEBUG, + req.pmk.pmk, req.pmk.pmk_len); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]) { + req.ncs_sk_type = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]); + + } + + hddLog(LOG1, + FL("vdev_id: %d, transaction_id: %d, channel: %d, service_instance_id: %d, ndp_app_info_len: %d, csid: %d, peer_discovery_mac_addr: %pM"), req.vdev_id, req.transaction_id, req.channel, req.service_instance_id, req.ndp_info.ndp_app_info_len, - req.peer_discovery_mac_addr.bytes); + req.ncs_sk_type, req.peer_discovery_mac_addr.bytes); status = sme_ndp_initiator_req_handler(hal, &req); if (status != VOS_STATUS_SUCCESS) { hddLog(LOGE, @@ -582,6 +624,16 @@ static int hdd_ndp_initiator_req_handler(hdd_context_t *hdd_ctx, * @hdd_ctx: hdd context * @tb: parsed NL attribute list * + * tb includes following vendor attributes: + * QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR + * QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID + * QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID + * QCA_WLAN_VENDOR_ATTR_NDP_RESPONSE_CODE + * QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO - optional + * QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS - optional + * QCA_WLAN_VENDOR_ATTR_NDP_PMK - optional + * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE - optional + * * Return: 0 on success or error code on failure */ static int hdd_ndp_responder_req_handler(hdd_context_t *hdd_ctx, @@ -676,10 +728,31 @@ static int hdd_ndp_responder_req_handler(hdd_context_t *hdd_ctx, hddLog(LOG1, FL("NDP config data is unavailable")); } + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE] && + !tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) { + hddLog(LOGE, FL("PMK cannot be absent when CSID is present.")); + return -EINVAL; + } + + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]) { + req.pmk.pmk = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + req.pmk.pmk_len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_NDP_PMK]); + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, + VOS_TRACE_LEVEL_DEBUG, + req.pmk.pmk, req.pmk.pmk_len); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]) { + req.ncs_sk_type = + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE]); + + } + hddLog(LOG1, - FL("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d"), + FL("vdev_id: %d, transaction_id: %d, ndp_rsp %d, ndp_instance_id: %d, ndp_app_info_len: %d, csid: %d"), req.vdev_id, req.transaction_id, req.ndp_rsp, - req.ndp_instance_id, req.ndp_info.ndp_app_info_len); + req.ndp_instance_id, req.ndp_info.ndp_app_info_len, + req.ncs_sk_type); status = sme_ndp_responder_req_handler(hdd_ctx->hHal, &req); if (status != eHAL_STATUS_SUCCESS) { @@ -1364,6 +1437,8 @@ ndp_confirm_nla_failed: * QCA_WLAN_VENDOR_ATTR_NDP_INSTANCE_ID (4 bytes) * QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO (ndp_app_info_len size) * QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS (4 bytes) + * QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE(4 bytes) + * QCA_WLAN_VENDOR_ATTR_NDP_SCID(scid_len in size) * * Return: none */ @@ -1419,9 +1494,9 @@ static void hdd_ndp_indication_handler(hdd_adapter_t *adapter, return; } - data_len = (4 * sizeof(uint32_t)) + (2 * VOS_MAC_ADDR_SIZE) + IFNAMSIZ + - event->ndp_info.ndp_app_info_len + (8 * NLA_HDRLEN) + - NLMSG_HDRLEN; + data_len = (5 * sizeof(uint32_t)) + (2 * VOS_MAC_ADDR_SIZE) + IFNAMSIZ + + event->ndp_info.ndp_app_info_len + event->scid.scid_len + + (10 * NLA_HDRLEN) + NLMSG_HDRLEN; /* notify response to the upper layer */ vendor_event = cfg80211_vendor_event_alloc(hdd_ctx->wiphy, @@ -1475,6 +1550,24 @@ static void hdd_ndp_indication_handler(hdd_adapter_t *adapter, goto ndp_indication_nla_failed; } + if (event->scid.scid_len) { + if (nla_put_u32(vendor_event, + QCA_WLAN_VENDOR_ATTR_NDP_NCS_SK_TYPE, + event->ncs_sk_type)) + goto ndp_indication_nla_failed; + + if (nla_put(vendor_event, QCA_WLAN_VENDOR_ATTR_NDP_SCID, + event->scid.scid_len, + event->scid.scid)) + goto ndp_indication_nla_failed; + + hddLog(LOG1, FL("csid: %d, scid_len: %d"), + event->ncs_sk_type, event->scid.scid_len); + + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG, + event->scid.scid, event->scid.scid_len); + } + cfg80211_vendor_event(vendor_event, GFP_KERNEL); EXIT(); return; diff --git a/CORE/HDD/src/wlan_hdd_nan_datapath.h b/CORE/HDD/src/wlan_hdd_nan_datapath.h index 69c09f7d8be1..3af78bdac5a8 100644 --- a/CORE/HDD/src/wlan_hdd_nan_datapath.h +++ b/CORE/HDD/src/wlan_hdd_nan_datapath.h @@ -39,6 +39,8 @@ struct wireless_dev; #define NDP_APP_INFO_LEN 255 #define NDP_QOS_INFO_LEN 255 +#define NDP_PMK_LEN 32 +#define NDP_SCID_BUF_LEN 256 #define NDP_NUM_INSTANCE_ID 255 @@ -84,6 +86,7 @@ enum qca_wlan_vendor_attr_ndp_params { QCA_WLAN_VENDOR_ATTR_NDP_CHANNEL, QCA_WLAN_VENDOR_ATTR_NDP_PEER_DISCOVERY_MAC_ADDR, QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR, + /* CONFIG_SECURITY is deprecated, use NCS_SK_TYPE/PMK/SCID instead */ QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_SECURITY, QCA_WLAN_VENDOR_ATTR_NDP_CONFIG_QOS, QCA_WLAN_VENDOR_ATTR_NDP_APP_INFO, @@ -94,6 +97,9 @@ enum qca_wlan_vendor_attr_ndp_params { 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, + QCA_WLAN_VENDOR_ATTR_NDP_PMK, + QCA_WLAN_VENDOR_ATTR_NDP_SCID, QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_AFTER_LAST, QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX = diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index 62a9a833947a..605e9c697d21 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -7853,6 +7853,28 @@ struct ndp_app_info { }; /** + * struct ndp_scid - structure to hold sceurity context identifier + * @scid_len: length of scid + * @scid: scid + * + */ +struct ndp_scid { + uint32_t scid_len; + uint8_t *scid; +}; + +/** + * struct ndp_pmk - structure to hold pairwise master key + * @pmk_len: length of pairwise master key + * @pmk: buffer containing pairwise master key + * + */ +struct ndp_pmk { + uint32_t pmk_len; + uint8_t *pmk; +}; + +/** * struct ndi_create_req - ndi create request params * @transaction_id: unique identifier * @iface_name: interface name @@ -7897,6 +7919,8 @@ struct ndp_app_info { * @self_ndi_mac_addr: self NDI mac address * @ndp_config: ndp configuration params * @ndp_info: ndp application info + * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256 + * @pmk: pairwise master key * */ struct ndp_initiator_req { @@ -7909,6 +7933,8 @@ struct ndp_initiator_req { v_MACADDR_t self_ndi_mac_addr; struct ndp_cfg ndp_config; struct ndp_app_info ndp_info; + uint32_t ncs_sk_type; + struct ndp_pmk pmk; }; /** @@ -7940,6 +7966,8 @@ struct ndp_initiator_rsp { * @ndp_accept_policy: accept policy configured by the upper layer * @ndp_config: ndp configuration params * @ndp_info: ndp application info + * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256 + * @scid: security context identifier * */ struct ndp_indication_event { @@ -7952,6 +7980,8 @@ struct ndp_indication_event { enum ndp_accept_policy policy; struct ndp_cfg ndp_config; struct ndp_app_info ndp_info; + uint32_t ncs_sk_type; + struct ndp_scid scid; }; /** @@ -7962,6 +7992,8 @@ struct ndp_indication_event { * @ndp_rsp: response to the ndp create request * @ndp_config: ndp configuration params * @ndp_info: ndp application info + * @pmk: pairwise master key + * @ncs_sk_type: indicates NCS_SK_128 or NCS_SK_256 * */ struct ndp_responder_req { @@ -7971,6 +8003,8 @@ struct ndp_responder_req { enum ndp_response_code ndp_rsp; struct ndp_cfg ndp_config; struct ndp_app_info ndp_info; + struct ndp_pmk pmk; + uint32_t ncs_sk_type; }; /** diff --git a/CORE/MAC/src/pe/nan/nan_datapath.c b/CORE/MAC/src/pe/nan/nan_datapath.c index e7435afe9a26..24ab09000963 100644 --- a/CORE/MAC/src/pe/nan/nan_datapath.c +++ b/CORE/MAC/src/pe/nan/nan_datapath.c @@ -131,8 +131,9 @@ static VOS_STATUS lim_handle_ndp_indication_event(tpAniSirGlobal mac_ctx, VOS_STATUS status = VOS_STATUS_SUCCESS; limLog(mac_ctx, LOG1, - FL("role: %d, vdev: %d, peer_mac_addr "MAC_ADDRESS_STR), - ndp_ind->role, ndp_ind->vdev_id, + FL("role: %d, vdev: %d, csid: %d, peer_mac_addr " + MAC_ADDRESS_STR), + ndp_ind->role, ndp_ind->vdev_id, ndp_ind->ncs_sk_type, MAC_ADDR_ARRAY(ndp_ind->peer_mac_addr.bytes)); if ((ndp_ind->role == NDP_ROLE_INITIATOR) || diff --git a/CORE/SERVICES/WMA/wma_nan_datapath.c b/CORE/SERVICES/WMA/wma_nan_datapath.c index bf7e24acb9d6..78022203d7c2 100644 --- a/CORE/SERVICES/WMA/wma_nan_datapath.c +++ b/CORE/SERVICES/WMA/wma_nan_datapath.c @@ -43,15 +43,15 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req) VOS_STATUS status; int ret; uint16_t len; - uint32_t vdev_id, ndp_cfg_len, ndp_app_info_len; + uint32_t vdev_id, ndp_cfg_len, ndp_app_info_len, pmk_len; struct ndp_initiator_rsp *rsp = NULL; - uint8_t *cfg_info, *app_info; ol_txrx_vdev_handle vdev; wmi_buf_t buf; wmi_ndp_initiator_req_fixed_param *cmd; vos_msg_t pe_msg = {0}; struct ndp_initiator_req *ndp_req = req; wmi_channel *ch_tlv; + uint8_t *tlv_ptr; if (NULL == ndp_req) { WMA_LOGE(FL("Invalid ndp_req.")); @@ -75,9 +75,11 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req) */ ndp_cfg_len = vos_roundup(ndp_req->ndp_config.ndp_cfg_len, 4); ndp_app_info_len = vos_roundup(ndp_req->ndp_info.ndp_app_info_len, 4); + pmk_len = vos_roundup(ndp_req->pmk.pmk_len, 4); /* allocated memory for fixed params as well as variable size data */ - len = sizeof(*cmd) + ndp_cfg_len + ndp_app_info_len + - (2 * WMI_TLV_HDR_SIZE) + sizeof(*ch_tlv); + len = sizeof(*cmd) + sizeof(*ch_tlv) + (3 * WMI_TLV_HDR_SIZE) + + ndp_cfg_len + ndp_app_info_len + pmk_len; + buf = wmi_buf_alloc(wma_handle->wmi_handle, len); if (!buf) { WMA_LOGE(FL("wmi_buf_alloc failed")); @@ -97,6 +99,8 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req) 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; ch_tlv = (wmi_channel *)&cmd[1]; WMITLV_SET_HDR(ch_tlv, WMITLV_TAG_STRUC_wmi_channel, @@ -104,21 +108,26 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req) ch_tlv->mhz = ndp_req->channel; ch_tlv->band_center_freq1 = vos_chan_to_freq(vos_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); + vos_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; - cfg_info = (uint8_t *)&ch_tlv[1]; - WMITLV_SET_HDR(cfg_info, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); - vos_mem_copy(&cfg_info[WMI_TLV_HDR_SIZE], ndp_req->ndp_config.ndp_cfg, - cmd->ndp_cfg_len); + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); + vos_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; - app_info = &cfg_info[WMI_TLV_HDR_SIZE + ndp_cfg_len]; - WMITLV_SET_HDR(app_info, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); - vos_mem_copy(&app_info[WMI_TLV_HDR_SIZE], - ndp_req->ndp_info.ndp_app_info, - cmd->ndp_app_info_len); + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, pmk_len); + vos_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; - WMA_LOGE(FL("vdev_id = %d, transaction_id: %d, service_instance_id, %d channel: %d"), + WMA_LOGE(FL("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); + ch_tlv->mhz, cmd->ndp_channel_cfg, cmd->nan_csid); WMA_LOGE(FL("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); @@ -133,8 +142,12 @@ VOS_STATUS wma_handle_ndp_initiator_req(tp_wma_handle wma_handle, void *req) ndp_req->ndp_info.ndp_app_info, ndp_req->ndp_info.ndp_app_info_len); + WMA_LOGE(FL("pmk len: %d"), cmd->nan_pmk_len); + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG, + ndp_req->pmk.pmk, cmd->nan_pmk_len); WMA_LOGE(FL("sending WMI_NDP_INITIATOR_REQ_CMDID(0x%X)"), WMI_NDP_INITIATOR_REQ_CMDID); + ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len, WMI_NDP_INITIATOR_REQ_CMDID); if (ret < 0) { @@ -230,8 +243,8 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle, { wmi_buf_t buf; ol_txrx_vdev_handle vdev; - uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len; - uint8_t *cfg_info, *app_info; + uint32_t vdev_id = 0, ndp_cfg_len, ndp_app_info_len, pmk_len; + uint8_t *tlv_ptr; int ret; wmi_ndp_responder_req_fixed_param *cmd; uint16_t len; @@ -265,9 +278,11 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle, */ ndp_cfg_len = vos_roundup(req_params->ndp_config.ndp_cfg_len, 4); ndp_app_info_len = vos_roundup(req_params->ndp_info.ndp_app_info_len, 4); + pmk_len = vos_roundup(req_params->pmk.pmk_len, 4); /* allocated memory for fixed params as well as variable size data */ - len = sizeof(*cmd) + ndp_cfg_len + ndp_app_info_len + - (2 * WMI_TLV_HDR_SIZE); + len = sizeof(*cmd) + 3*WMI_TLV_HDR_SIZE + ndp_cfg_len + ndp_app_info_len + + pmk_len; + buf = wmi_buf_alloc(wma_handle->wmi_handle, len); if (!buf) { WMA_LOGE(FL("wmi_buf_alloc failed")); @@ -285,19 +300,29 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle, cmd->ndp_cfg_len = req_params->ndp_config.ndp_cfg_len; cmd->ndp_app_info_len = req_params->ndp_info.ndp_app_info_len; + cmd->nan_pmk_len = req_params->pmk.pmk_len; + cmd->nan_csid = req_params->ncs_sk_type; - cfg_info = (uint8_t *)&cmd[1]; - /* WMI command expects 4 byte alligned len */ - WMITLV_SET_HDR(cfg_info, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); - vos_mem_copy(&cfg_info[WMI_TLV_HDR_SIZE], - req_params->ndp_config.ndp_cfg, cmd->ndp_cfg_len); + tlv_ptr = (uint8_t *)&cmd[1]; - app_info = &cfg_info[WMI_TLV_HDR_SIZE + ndp_cfg_len]; - /* WMI command expects 4 byte alligned len */ - WMITLV_SET_HDR(app_info, WMITLV_TAG_ARRAY_BYTE, ndp_app_info_len); - vos_mem_copy(&app_info[WMI_TLV_HDR_SIZE], + WMITLV_SET_HDR(tlv_ptr, WMITLV_TAG_ARRAY_BYTE, ndp_cfg_len); + vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], + req_params->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); + vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], req_params->ndp_info.ndp_app_info, req_params->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); + vos_mem_copy(&tlv_ptr[WMI_TLV_HDR_SIZE], req_params->pmk.pmk, + cmd->nan_pmk_len); + tlv_ptr = tlv_ptr + WMI_TLV_HDR_SIZE + pmk_len; + + WMA_LOGE(FL("vdev_id = %d, transaction_id: %d, csid: %d"), + cmd->vdev_id, cmd->transaction_id, cmd->nan_csid); WMA_LOGD(FL("ndp_config len: %d"), req_params->ndp_config.ndp_cfg_len); @@ -311,6 +336,12 @@ VOS_STATUS wma_handle_ndp_responder_req(tp_wma_handle wma_handle, req_params->ndp_info.ndp_app_info, req_params->ndp_info.ndp_app_info_len); + WMA_LOGE(FL("pmk len: %d"), cmd->nan_pmk_len); + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG, + req_params->pmk.pmk, cmd->nan_pmk_len); + + WMA_LOGE(FL("sending WMI_NDP_RESPONDER_REQ_CMDID(0x%X)"), + WMI_NDP_RESPONDER_REQ_CMDID); ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len, WMI_NDP_RESPONDER_REQ_CMDID); if (ret < 0) { @@ -473,11 +504,14 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info, WMI_MAC_ADDR_TO_CHAR_ARRAY(&fixed_params->peer_discovery_mac_addr, ind_event->peer_discovery_mac_addr.bytes); - WMA_LOGD(FL("WMI_NDP_INDICATION_EVENTID(0x%X) received. vdev %d, service_instance %d, ndp_instance %d, role %d, policy %d, peer_mac_addr: %pM, peer_disc_mac_addr: %pM"), + WMA_LOGD(FL("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_mac_addr: %pM, peer_disc_mac_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, ind_event->peer_mac_addr.bytes, ind_event->peer_discovery_mac_addr.bytes); @@ -490,6 +524,8 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info, &event->ndp_app_info, fixed_params->ndp_app_info_len); ind_event->ndp_config.ndp_cfg_len = fixed_params->ndp_cfg_len; ind_event->ndp_info.ndp_app_info_len = fixed_params->ndp_app_info_len; + ind_event->ncs_sk_type = fixed_params->nan_csid; + ind_event->scid.scid_len = fixed_params->nan_scid_len; if (ind_event->ndp_config.ndp_cfg_len) { ind_event->ndp_config.ndp_cfg = @@ -516,6 +552,24 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info, event->ndp_app_info, ind_event->ndp_info.ndp_app_info_len); } + + if (ind_event->scid.scid_len) { + ind_event->scid.scid = + vos_mem_malloc(ind_event->scid.scid_len); + if (NULL == ind_event->scid.scid) { + WMA_LOGE(FL("malloc failed")); + vos_mem_free(ind_event->ndp_config.ndp_cfg); + vos_mem_free(ind_event->ndp_info.ndp_app_info); + vos_mem_free(ind_event); + return VOS_STATUS_E_NOMEM; + } + vos_mem_copy(ind_event->scid.scid, + event->ndp_scid, ind_event->scid.scid_len); + WMA_LOGD(FL("scid hex dump:")); + VOS_TRACE_HEX_DUMP(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_DEBUG, + ind_event->scid.scid, ind_event->scid.scid_len); + } + pe_msg.type = SIR_HAL_NDP_INDICATION; pe_msg.bodyptr = ind_event; pe_msg.bodyval = 0; @@ -526,6 +580,7 @@ static int wma_ndp_indication_event_handler(void *handle, uint8_t *event_info, WMA_LOGE(FL("fail to post SIR_HAL_NDP_INDICATION msg to PE")); vos_mem_free(ind_event->ndp_config.ndp_cfg); vos_mem_free(ind_event->ndp_info.ndp_app_info); + vos_mem_free(ind_event->scid.scid); vos_mem_free(ind_event); } diff --git a/CORE/SME/src/nan/nan_datapath_api.c b/CORE/SME/src/nan/nan_datapath_api.c index a8fa921cda7d..e9eff93e0a41 100644 --- a/CORE/SME/src/nan/nan_datapath_api.c +++ b/CORE/SME/src/nan/nan_datapath_api.c @@ -30,6 +30,46 @@ #include "sme_nan_datapath.h" /** + * csr_free_ndp_initiator_req() - free resouces from sme command for ndp + * initiator request + * @cmd: sme command msg + * + * Return: None + */ +void csr_free_ndp_initiator_req(tSmeCmd *cmd) +{ + vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg); + cmd->u.initiator_req.ndp_config.ndp_cfg = NULL; + cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0; + vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info); + cmd->u.initiator_req.ndp_info.ndp_app_info = NULL; + cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0; + vos_mem_free(cmd->u.initiator_req.pmk.pmk); + cmd->u.initiator_req.pmk.pmk = NULL; + cmd->u.initiator_req.pmk.pmk_len = 0; +} + +/** + * csr_free_ndp_responder_req() - free resouces from sme command for ndp + * responder request + * @cmd: sme command msg + * + * Return: None + */ +void csr_free_ndp_responder_req(tSmeCmd *cmd) +{ + vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg); + cmd->u.responder_req.ndp_config.ndp_cfg = NULL; + cmd->u.responder_req.ndp_config.ndp_cfg_len = 0; + vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info); + cmd->u.responder_req.ndp_info.ndp_app_info = NULL; + cmd->u.responder_req.ndp_info.ndp_app_info_len = 0; + vos_mem_free(cmd->u.responder_req.pmk.pmk); + cmd->u.responder_req.pmk.pmk = NULL; + cmd->u.responder_req.pmk.pmk_len = 0; +} + +/** * sme_ndp_initiator_req_handler() - ndp initiator req handler * @hal: hal handle * @req_params: request parameters @@ -67,12 +107,13 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal, /* pointers copied as part of above operation are to be overwritten */ cmd->u.initiator_req.ndp_info.ndp_app_info = NULL; cmd->u.initiator_req.ndp_config.ndp_cfg = NULL; + cmd->u.initiator_req.pmk.pmk = NULL; if (req_params->ndp_info.ndp_app_info_len) { cmd->u.initiator_req.ndp_info.ndp_app_info = vos_mem_malloc(req_params->ndp_info.ndp_app_info_len); if (NULL == cmd->u.initiator_req.ndp_info.ndp_app_info) { - csrReleaseCommandRoam(mac_ctx, cmd); + csr_release_ndp_initiator_req(mac_ctx, cmd); sme_ReleaseGlobalLock(&mac_ctx->sme); return eHAL_STATUS_FAILED_ALLOC; } @@ -85,11 +126,8 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal, cmd->u.initiator_req.ndp_config.ndp_cfg = vos_mem_malloc(req_params->ndp_config.ndp_cfg_len); if (NULL == cmd->u.initiator_req.ndp_config.ndp_cfg) { - csrReleaseCommandRoam(mac_ctx, cmd); + csr_release_ndp_initiator_req(mac_ctx, cmd); sme_ReleaseGlobalLock(&mac_ctx->sme); - vos_mem_free( - cmd->u.initiator_req.ndp_info.ndp_app_info); - cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0; return eHAL_STATUS_FAILED_ALLOC; } vos_mem_copy(cmd->u.initiator_req.ndp_config.ndp_cfg, @@ -97,6 +135,18 @@ eHalStatus sme_ndp_initiator_req_handler(tHalHandle hal, req_params->ndp_config.ndp_cfg_len); } + if (req_params->pmk.pmk_len) { + cmd->u.initiator_req.pmk.pmk = + vos_mem_malloc(req_params->pmk.pmk_len); + if (NULL == cmd->u.initiator_req.pmk.pmk) { + csr_release_ndp_initiator_req(mac_ctx, cmd); + sme_ReleaseGlobalLock(&mac_ctx->sme); + return eHAL_STATUS_FAILED_ALLOC; + } + vos_mem_copy(cmd->u.initiator_req.pmk.pmk, + req_params->pmk.pmk, req_params->pmk.pmk_len); + } + status = csrQueueSmeCommand(mac_ctx, cmd, TRUE); if (eHAL_STATUS_SUCCESS != status) { smsLog(mac_ctx, LOGE, FL("SME enqueue failed, status:%d"), @@ -150,12 +200,13 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal, */ cmd->u.responder_req.ndp_info.ndp_app_info = NULL; cmd->u.responder_req.ndp_config.ndp_cfg = NULL; + cmd->u.responder_req.pmk.pmk = NULL; if (req_params->ndp_info.ndp_app_info_len) { cmd->u.responder_req.ndp_info.ndp_app_info = vos_mem_malloc(req_params->ndp_info.ndp_app_info_len); if (NULL == cmd->u.responder_req.ndp_info.ndp_app_info) { - csrReleaseCommandRoam(mac_ctx, cmd); + csr_release_ndp_responder_req(mac_ctx, cmd); sme_ReleaseGlobalLock(&mac_ctx->sme); return eHAL_STATUS_FAILED_ALLOC; } @@ -168,11 +219,8 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal, cmd->u.responder_req.ndp_config.ndp_cfg = vos_mem_malloc(req_params->ndp_config.ndp_cfg_len); if (NULL == cmd->u.responder_req.ndp_config.ndp_cfg) { - csrReleaseCommandRoam(mac_ctx, cmd); + csr_release_ndp_responder_req(mac_ctx, cmd); sme_ReleaseGlobalLock(&mac_ctx->sme); - vos_mem_free( - cmd->u.responder_req.ndp_info.ndp_app_info); - cmd->u.responder_req.ndp_info.ndp_app_info_len = 0; return eHAL_STATUS_FAILED_ALLOC; } vos_mem_copy(cmd->u.responder_req.ndp_config.ndp_cfg, @@ -180,6 +228,18 @@ eHalStatus sme_ndp_responder_req_handler(tHalHandle hal, req_params->ndp_config.ndp_cfg_len); } + if (req_params->pmk.pmk_len) { + cmd->u.responder_req.pmk.pmk = + vos_mem_malloc(req_params->pmk.pmk_len); + if (NULL == cmd->u.responder_req.pmk.pmk) { + csr_release_ndp_responder_req(mac_ctx, cmd); + sme_ReleaseGlobalLock(&mac_ctx->sme); + return eHAL_STATUS_FAILED_ALLOC; + } + vos_mem_copy(cmd->u.responder_req.pmk.pmk, + req_params->pmk.pmk, req_params->pmk.pmk_len); + } + status = csrQueueSmeCommand(mac_ctx, cmd, TRUE); if (eHAL_STATUS_SUCCESS != status) { smsLog(mac_ctx, LOGE, @@ -414,14 +474,17 @@ eHalStatus csr_process_ndp_initiator_request(tpAniSirGlobal mac_ctx, if (NULL == cmd) { smsLog(mac_ctx, LOGE, FL("Invalid req_params")); - return eHAL_STATUS_INVALID_PARAMETER; + status = eHAL_STATUS_INVALID_PARAMETER; + goto sme_initiator_req_failed; } req = &cmd->u.initiator_req; msg_len = sizeof(*lim_msg); lim_msg = vos_mem_malloc(msg_len); - if (NULL == lim_msg) - return eHAL_STATUS_FAILED_ALLOC; + if (NULL == lim_msg) { + status = eHAL_STATUS_FAILED_ALLOC; + goto sme_initiator_req_failed; + } vos_mem_set(lim_msg, msg_len, 0); lim_msg->msg_type = @@ -440,18 +503,11 @@ eHalStatus csr_process_ndp_initiator_request(tpAniSirGlobal mac_ctx, MAC_ADDR_ARRAY(self_mac_addr)); status = palSendMBMessage(mac_ctx->hHdd, lim_msg); - if (!HAL_STATUS_SUCCESS(status)) { - /* - * If fail, free up the ndp_cfg and ndp_app_info - * allocated in sme. - */ - vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info); - vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg); - cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0; - cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0; - cmd->u.initiator_req.ndp_config.ndp_cfg = NULL; - cmd->u.initiator_req.ndp_info.ndp_app_info = NULL; - } + +sme_initiator_req_failed: + /* If fail, free up resources allocated in sme. */ + if (!HAL_STATUS_SUCCESS(status)) + csr_free_ndp_initiator_req(cmd); return status; } @@ -487,9 +543,9 @@ eHalStatus csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx, pal_cpu_to_be16((uint16_t)eWNI_SME_NDP_RESPONDER_REQ); lim_msg->msg_len = pal_cpu_to_be16(msg_len); /* - * following is being copied from p_cmd->u.initiator_req, + * following is being copied from p_cmd->u.responder_req, * no need to perform deep copy, as we are going to use memory - * allocated at SME in p_cmd->u.initiator_req and pass it all the way + * allocated at SME in p_cmd->u.responder_req and pass it all the way * to WMA. */ vos_mem_copy(&lim_msg->req, &cmd->u.responder_req, @@ -504,18 +560,9 @@ eHalStatus csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx, status = palSendMBMessage(mac_ctx->hHdd, lim_msg); free_config: - if (!HAL_STATUS_SUCCESS(status)) { - /* - * If fail, free up the ndp_cfg and ndp_app_info - * allocated in sme. - */ - vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info); - vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg); - cmd->u.responder_req.ndp_info.ndp_app_info_len = 0; - cmd->u.responder_req.ndp_config.ndp_cfg_len = 0; - cmd->u.responder_req.ndp_config.ndp_cfg = NULL; - cmd->u.responder_req.ndp_info.ndp_app_info = NULL; - } + /* If fail, free up the ndp_cfg and ndp_app_info allocated in sme. */ + if (!HAL_STATUS_SUCCESS(status)) + csr_free_ndp_responder_req(cmd); return status; } @@ -716,11 +763,10 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg) } break; case eWNI_SME_NDP_INDICATION: + vos_mem_free(roam_info.ndp.ndp_indication_params.scid.scid); + vos_mem_free(roam_info.ndp.ndp_indication_params.ndp_config.ndp_cfg); vos_mem_free( - roam_info.ndp.ndp_indication_params.ndp_config.ndp_cfg); - vos_mem_free( - roam_info.ndp.ndp_indication_params. - ndp_info.ndp_app_info); + roam_info.ndp.ndp_indication_params.ndp_info.ndp_app_info); break; case eWNI_SME_NDP_END_RSP: if (cmd && @@ -745,6 +791,7 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg) /** * csr_release_ndp_initiator_req() - free resouces from sme command for ndp + * and release the cmd * initiator request * @mac_ctx: Global MAC context * @cmd: sme command msg @@ -753,19 +800,13 @@ void sme_ndp_msg_processor(tpAniSirGlobal mac_ctx, vos_msg_t *msg) */ void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd) { - vos_mem_free(cmd->u.initiator_req.ndp_config.ndp_cfg); - cmd->u.initiator_req.ndp_config.ndp_cfg = NULL; - cmd->u.initiator_req.ndp_config.ndp_cfg_len = 0; - vos_mem_free(cmd->u.initiator_req.ndp_info.ndp_app_info); - cmd->u.initiator_req.ndp_info.ndp_app_info = NULL; - cmd->u.initiator_req.ndp_info.ndp_app_info_len = 0; + csr_free_ndp_initiator_req(cmd); smeReleaseCommand(mac_ctx, cmd); } - /** * csr_release_ndp_responder_req() - free resouces from sme command for ndp - * responder request + * responder request and release the command * @mac_ctx: Global MAC context * @cmd: sme command msg * @@ -773,16 +814,10 @@ void csr_release_ndp_initiator_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd) */ void csr_release_ndp_responder_req(tpAniSirGlobal mac_ctx, tSmeCmd *cmd) { - vos_mem_free(cmd->u.responder_req.ndp_config.ndp_cfg); - cmd->u.responder_req.ndp_config.ndp_cfg = NULL; - cmd->u.responder_req.ndp_config.ndp_cfg_len = 0; - vos_mem_free(cmd->u.responder_req.ndp_info.ndp_app_info); - cmd->u.responder_req.ndp_info.ndp_app_info = NULL; - cmd->u.responder_req.ndp_info.ndp_app_info_len = 0; + csr_free_ndp_responder_req(cmd); smeReleaseCommand(mac_ctx, cmd); } - /** * csr_release_ndp_data_end_req() - free resouces from sme command for ndp * data end request |
