From c076051dff5ae992efc78fae27c0c599812ab837 Mon Sep 17 00:00:00 2001 From: Disha Das Date: Wed, 27 Nov 2019 15:41:51 +0530 Subject: [PATCH] qcacmn: Add GET PN WMI to obtain PN number Add GET PN WMI to obtain the PN number for a non-bss peer. Change-Id: I8c999b3518b53e971d8207e74ce5e3a2f7d48aa8 --- wmi/inc/wmi_unified_api.h | 22 +++++++++++ wmi/inc/wmi_unified_param.h | 29 +++++++++++++++ wmi/inc/wmi_unified_priv.h | 6 +++ wmi/src/wmi_unified_api.c | 34 +++++++++++++++++ wmi/src/wmi_unified_tlv.c | 73 +++++++++++++++++++++++++++++++++++++ 5 files changed, 164 insertions(+) diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index ddb4ee438a..99fe3adc49 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1161,6 +1161,17 @@ QDF_STATUS wmi_unified_setup_install_key_cmd(wmi_unified_t wmi_handle, struct set_key_params *key_params); +/** + * wmi_unified_get_pn_send_cmd() - send command to fw get PN for peer + * @wmi_handle: wmi handle + * @pn_params: PN parameters + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_get_pn_send_cmd(wmi_unified_t wmi_hdl, + struct peer_request_pn_param *pn_params); + /** * wmi_unified_p2p_go_set_beacon_ie_cmd() - set beacon IE for p2p go * @wmi_handle: wmi handle @@ -2340,6 +2351,17 @@ QDF_STATUS wmi_unified_lci_set_cmd_send(wmi_unified_t wmi_handle, QDF_STATUS wmi_unified_lcr_set_cmd_send(wmi_unified_t wmi_handle, struct lcr_set_params *param); +/** + * wmi_unified_extract_pn() - extract pn event data + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer + * @param: pointer to get pn event param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_extract_pn(wmi_unified_t wmi_hdl, void *evt_buf, + struct wmi_host_get_pn_event *param); + /** * wmi_unified_send_periodic_chan_stats_config_cmd() - send periodic chan * stats cmd to fw diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 850e6df334..5a4ebed39f 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -3650,6 +3650,18 @@ struct rtt_meas_req_test_params { uint8_t req_id; }; +/** + * struct peer_request_pn_param - PN request params + * @vdev_id: vdev id + * @peer_macaddr: Peer mac address + * @key_type: key type + */ +struct peer_request_pn_param { + uint32_t vdev_id; + uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE]; + uint32_t key_type; +}; + /** * struct rtt_meas_req_params - RTT measurement request params * @req_id: Request id @@ -4538,6 +4550,7 @@ typedef enum { wmi_motion_det_host_eventid, wmi_motion_det_base_line_host_eventid, wmi_get_ani_level_event_id, + wmi_peer_tx_pn_response_event_id, wmi_events_max, } wmi_conv_event_id; @@ -7077,6 +7090,22 @@ enum wmi_host_fatal_condition_subtype_packet_log_config { #endif /* OL_ATH_SMART_LOGGING */ +#define GET_PN_MAX_LEN 16 + +/** + * struct wmi_host_get_pn_event - PN event params + * @vdev_id: vdev id + * @peer_macaddr: Peer mac address + * @key_type: key type + * @pn : pn value + */ +struct wmi_host_get_pn_event { + uint32_t vdev_id; + uint8_t mac_addr[QDF_MAC_ADDR_SIZE]; + uint32_t key_type; + uint8_t pn[GET_PN_MAX_LEN]; +}; + /** * struct wmi_init_cmd_param - INIT command params * @target_resource_config: pointer to resource config diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 504cd1b5da..1990cd8dc1 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -192,6 +192,7 @@ struct wmi_command_header { uint32_t sub_type:4; #endif + }; /** @@ -2053,6 +2054,11 @@ QDF_STATUS (*extract_get_elna_bypass_resp)(wmi_unified_t wmi_handle, struct get_elna_bypass_response *resp); #endif /* WLAN_FEATURE_ELNA */ +QDF_STATUS (*send_pdev_get_pn_cmd)(wmi_unified_t wmi_handle, + struct peer_request_pn_param *pn_params); +QDF_STATUS (*extract_get_pn_data)(wmi_unified_t wmi_handle, + void *evt_buf, + struct wmi_host_get_pn_event *param); #ifdef FEATURE_ANI_LEVEL_REQUEST QDF_STATUS (*send_ani_level_cmd)(wmi_unified_t wmi_handle, uint32_t *freqs, uint8_t num_freqs); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 422e5d72c3..fc5db64d45 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -1399,6 +1399,23 @@ QDF_STATUS wmi_unified_remove_beacon_filter_cmd_send( return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_get_pn_send_cmd() - send command to get PN for peer + * @wmi_hdl: wmi handle + * @wmi_peer_tx_pn_request_cmd_fixed_param: pn request params + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_get_pn_send_cmd(wmi_unified_t wmi_hdl, + struct peer_request_pn_param *pn_params) +{ + if (wmi_hdl->ops->send_pdev_get_pn_cmd) + return wmi_hdl->ops->send_pdev_get_pn_cmd(wmi_hdl, + pn_params); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_unified_mgmt_cmd_send() - WMI mgmt cmd function * @param wmi_handle : handle to WMI. @@ -1818,6 +1835,23 @@ wmi_extract_fips_event_data(wmi_unified_t wmi_handle, void *evt_buf, return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_extract_pn() - extract pn event data + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param param: pointer to get pn event param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_extract_pn(wmi_unified_t wmi_hdl, void *evt_buf, + struct wmi_host_get_pn_event *param) +{ + if (wmi_hdl->ops->extract_get_pn_data) + return wmi_hdl->ops->extract_get_pn_data(wmi_hdl, + evt_buf, param); + return QDF_STATUS_E_FAILURE; +} + #ifdef WLAN_FEATURE_DISA QDF_STATUS wmi_extract_encrypt_decrypt_resp_params(void *wmi_hdl, void *evt_buf, diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index ea14e4860d..e6b2a82d0c 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -4349,6 +4349,8 @@ static QDF_STATUS send_setup_install_key_cmd_tlv(wmi_unified_t wmi_handle, sizeof(wmi_key_seq_counter)); cmd->key_len = key_params->key_len; + qdf_mem_copy(&cmd->key_tsc_counter, &key_params->key_tsc_counter, + sizeof(wmi_key_seq_counter)); wmi_mtrace(WMI_VDEV_INSTALL_KEY_CMDID, cmd->vdev_id, 0); status = wmi_unified_cmd_send(wmi_handle, buf, len, WMI_VDEV_INSTALL_KEY_CMDID); @@ -10511,6 +10513,73 @@ static QDF_STATUS fips_conv_data_be(uint32_t data_len, uint8_t *data) } #endif +/** +* send_pdev_get_pn_cmd_tlv() - send get PN request params to fw +* @wmi_handle - wmi handle +* @params - PN request params for peer +* +* Return: QDF_STATUS - success or error status +*/ +static QDF_STATUS +send_pdev_get_pn_cmd_tlv(wmi_unified_t wmi_handle, + struct peer_request_pn_param *params) +{ + wmi_peer_tx_pn_request_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint8_t *buf_ptr; + uint32_t len = sizeof(wmi_peer_tx_pn_request_cmd_fixed_param); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s:wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + buf_ptr = (uint8_t *)wmi_buf_data(buf); + cmd = (wmi_peer_tx_pn_request_cmd_fixed_param *)buf_ptr; + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_peer_tx_pn_request_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_peer_tx_pn_request_cmd_fixed_param)); + + cmd->vdev_id = params->vdev_id; + WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr); + cmd->key_type = params->key_type; + if (wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_PEER_TX_PN_REQUEST_CMDID)) { + WMI_LOGE("%s:Failed to send WMI command\n", __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} + +/** +* extract_get_pn_data_tlv() - extract pn resp +* @wmi_handle - wmi handle +* @params - PN response params for peer +* +* Return: QDF_STATUS - success or error status +*/ +static QDF_STATUS +extract_get_pn_data_tlv(wmi_unified_t wmi_handle, void *evt_buf, + struct wmi_host_get_pn_event *param) +{ + WMI_PEER_TX_PN_RESPONSE_EVENTID_param_tlvs *param_buf; + wmi_peer_tx_pn_response_event_fixed_param *event = NULL; + + param_buf = (WMI_PEER_TX_PN_RESPONSE_EVENTID_param_tlvs *)evt_buf; + event = + (wmi_peer_tx_pn_response_event_fixed_param *)param_buf->fixed_param; + + param->vdev_id = event->vdev_id; + param->key_type = event->key_type; + qdf_mem_copy(param->pn, event->pn, sizeof(event->pn)); + WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, param->mac_addr); + + return QDF_STATUS_SUCCESS; +} + /** * extract_fips_event_data_tlv() - extract fips event data * @wmi_handle: wmi handle @@ -12663,6 +12732,8 @@ struct wmi_ops tlv_ops = { extract_encrypt_decrypt_resp_event_tlv, #endif .send_pdev_fips_cmd = send_pdev_fips_cmd_tlv, + .extract_get_pn_data = extract_get_pn_data_tlv, + .send_pdev_get_pn_cmd = send_pdev_get_pn_cmd_tlv, #ifdef WLAN_FEATURE_DISA .send_encrypt_decrypt_send_cmd = send_encrypt_decrypt_send_cmd_tlv, #endif @@ -13102,6 +13173,8 @@ static void populate_tlv_events_id(uint32_t *event_ids) event_ids[wmi_motion_det_base_line_host_eventid] = WMI_MOTION_DET_BASE_LINE_HOST_EVENTID; event_ids[wmi_get_ani_level_event_id] = WMI_GET_CHANNEL_ANI_EVENTID; + event_ids[wmi_peer_tx_pn_response_event_id] = + WMI_PEER_TX_PN_RESPONSE_EVENTID; } /**