diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 1f99743df8..cf782cb66f 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -356,6 +356,7 @@ typedef void (*qdf_timer_func_t)(void *); * @QDF_MODULE_ID_OCB: OCB module ID * @QDF_MODULE_ID_IPA: IPA module ID * @QDF_MODULE_ID_CP_STATS: Control Plane Statistics ID + * @QDF_MODULE_ID_ACTION_OUI: ACTION OUI module ID * @QDF_MODULE_ID_ANY: anything * @QDF_MODULE_ID_MAX: Max place holder module ID */ @@ -459,6 +460,7 @@ typedef enum { QDF_MODULE_ID_OCB, QDF_MODULE_ID_IPA, QDF_MODULE_ID_CP_STATS, + QDF_MODULE_ID_ACTION_OUI, QDF_MODULE_ID_ANY, QDF_MODULE_ID_MAX, } QDF_MODULE_ID; diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 1d2004082a..0adc377f0b 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -2803,6 +2803,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = { [QDF_MODULE_ID_CONFIG] = {"CONFIG"}, [QDF_MODULE_ID_IPA] = {"IPA"}, [QDF_MODULE_ID_CP_STATS] = {"CP_STATS"}, + [QDF_MODULE_ID_ACTION_OUI] = {"action_oui"}, [QDF_MODULE_ID_ANY] = {"ANY"}, }; qdf_export_symbol(g_qdf_category_name); @@ -3247,6 +3248,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_FD] = QDF_TRACE_LEVEL_ERROR, [QDF_MODULE_ID_OCB] = QDF_TRACE_LEVEL_ERROR, [QDF_MODULE_ID_IPA] = QDF_TRACE_LEVEL_NONE, + [QDF_MODULE_ID_ACTION_OUI] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_CP_STATS] = QDF_TRACE_LEVEL_ERROR, [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_NONE, }; diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h index 7ea8421150..f5e3987401 100644 --- a/umac/cmn_services/inc/wlan_cmn.h +++ b/umac/cmn_services/inc/wlan_cmn.h @@ -249,6 +249,7 @@ * @WLAN_UMAC_COMP_OCB: OCB * @WLAN_UMAC_COMP_IPA: IPA * @WLAN_UMAC_COMP_CP_STATS: Control Plane Statistics + * @WLAN_UMAC_COMP_ACTION_OUI: ACTION OUI * @WLAN_UMAC_COMP_ID_MAX: Maximum components in UMAC * * This id is static. @@ -283,6 +284,7 @@ enum wlan_umac_comp_id { WLAN_UMAC_COMP_OCB = 25, WLAN_UMAC_COMP_IPA = 26, WLAN_UMAC_COMP_CP_STATS = 27, + WLAN_UMAC_COMP_ACTION_OUI = 28, WLAN_UMAC_COMP_ID_MAX, }; diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index ad4c7d370a..99cf93bc9e 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h @@ -216,6 +216,7 @@ typedef void (*wlan_objmgr_peer_status_handler)( * @WLAN_WIFI_POS_OSIF_ID: wifi positioning (OSID) * @WLAN_WIFI_POS_TGT_IF_ID: wifi positioning (Target IF) * @WLAN_MLME_OBJ_DEL_ID: Object delete req/resp tracking with FW + * @WLAN_ACTION_OUI_ID: action oui operations * @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array */ /* New value added to the enum must also be reflected in function @@ -265,6 +266,7 @@ typedef enum { WLAN_WIFI_POS_OSIF_ID = 40, WLAN_WIFI_POS_TGT_IF_ID = 41, WLAN_MLME_OBJ_DEL_ID = 42, + WLAN_ACTION_OUI_ID = 43, WLAN_REF_ID_MAX, } wlan_objmgr_ref_dbgid; @@ -321,6 +323,7 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id) "WLAN_WIFI_POS_OSIF_ID", "WLAN_WIFI_POS_TGT_IF_ID", "WLAN_MLME_OBJ_DEL_ID", + "WLAN_ACTION_OUI_ID", "WLAN_REF_ID_MAX"}; return (char *)strings[id]; diff --git a/wmi/inc/wmi_unified_action_oui_tlv.h b/wmi/inc/wmi_unified_action_oui_tlv.h new file mode 100644 index 0000000000..2ea52db820 --- /dev/null +++ b/wmi/inc/wmi_unified_action_oui_tlv.h @@ -0,0 +1,96 @@ +/* + * 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 + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _WMI_UNIFIED_ACTION_OUI_TLV_H_ +#define _WMI_UNIFIED_ACTION_OUI_TLV_H_ + +#ifdef WLAN_FEATURE_ACTION_OUI + +#include "wmi.h" +#include "wmi_unified.h" +#include "wmi_unified_api.h" +#include "wmi_unified_param.h" + +/** + * wmi_get_action_oui_info_mask() - convert info mask to firmware specific + * @info_mask: host specific info mask + * + * Return: firmware specific information mask + */ +uint32_t wmi_get_action_oui_info_mask(uint32_t info_mask); + +/** + * wmi_get_action_oui_id() - convert action id to firmware specific + * @action_id: host specific action id + * @id: output pointer to hold converted fw specific action id + * + * Return: true on conversion else failure + */ +bool wmi_get_action_oui_id(enum action_oui_id action_id, + wmi_vendor_oui_action_id *id); + + +/** + * wmi_fill_oui_extensions() - populates wmi_vendor_oui_ext array + * @extension: pointer to user supplied action oui extensions + * @no_oui_extns: number of action oui extensions + * @cmd_ext: output pointer to TLV + * + * This function parses the user supplied input data and populates the + * array of variable structures TLV in WMI_PDEV_CONFIG_VENDOR_OUI_ACTION_CMDID + * + * Return: None + */ +void wmi_fill_oui_extensions(struct action_oui_extension *extension, + uint32_t no_oui_extns, + wmi_vendor_oui_ext *cmd_ext); + +/** + * wmi_fill_oui_extensions_buffer() - populates data buffer in action oui cmd + * @extension: pointer to user supplied action oui extensions + * @cmd_ext: pointer to vendor_oui_ext TLV in action oui cmd + * @no_oui_extns: number of action oui extensions + * @rem_var_buf_len: remaining length of buffer to be populated + * @var_buf: output pointer to hold variable length data + * + * This function parses the user supplied input data and populates the variable + * buffer of type array byte TLV in WMI_PDEV_CONFIG_VENDOR_OUI_ACTION_CMDID + * + * Return: QDF_STATUS_SUCCESS for successful fill else QDF_STATUS_E_INVAL + */ +QDF_STATUS +wmi_fill_oui_extensions_buffer(struct action_oui_extension *extension, + wmi_vendor_oui_ext *cmd_ext, + uint32_t no_oui_extns, uint32_t rem_var_buf_len, + uint8_t *var_buf); + +/** + * send_action_oui_cmd_tlv() - send action oui cmd to firmware + * @wmi_handle: wmi handler + * @req: pointer to action oui info + * + * Return: QDF_STATUS_SUCCESS on successful transmission else + * QDF_STATUS_E_INVAL or QDF_STATUS_E_NOMEM + */ +QDF_STATUS +send_action_oui_cmd_tlv(wmi_unified_t wmi_handle, + struct action_oui_request *req); + +#endif /* WLAN_FEATURE_ACTION_OUI */ + +#endif /* _WMI_UNIFIED_ACTION_OUI_TLV_H_ */ diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 1c5c603913..c524609ee6 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -43,7 +43,9 @@ #ifdef WLAN_FEATURE_DISA #include "wlan_disa_public_struct.h" #endif - +#ifdef WLAN_FEATURE_ACTION_OUI +#include "wlan_action_oui_public_struct.h" +#endif #ifdef WLAN_FEATURE_NAN_CONVERGENCE #include "nan_public_structs.h" #endif @@ -1940,6 +1942,20 @@ QDF_STATUS wmi_unified_dfs_phyerr_offload_dis_cmd(void *wmi_hdl, QDF_STATUS wmi_unified_set_country_cmd_send(void *wmi_hdl, struct set_country *param); + +#ifdef WLAN_FEATURE_ACTION_OUI +/** + * wmi_unified_send_action_oui_cmd() - send action oui cmd to fw + * @wmi_hdl: wma handle + * @req: wmi action oui message to be send + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_send_action_oui_cmd(void *wmi_hdl, + struct action_oui_request *req); +#endif /* WLAN_FEATURE_ACTION_OUI */ + /* * wmi_unified_set_del_pmkid_cache() - set delete PMKID * @wmi_hdl: wma handle diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index a9a7fe4ee8..1e902d080e 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1404,6 +1404,11 @@ QDF_STATUS (*extract_encrypt_decrypt_resp_event)(wmi_unified_t wmi_handle, struct disa_encrypt_decrypt_resp_params *resp); #endif +#ifdef WLAN_FEATURE_ACTION_OUI +QDF_STATUS (*send_action_oui_cmd)(wmi_unified_t wmi_handle, + struct action_oui_request *req); +#endif /* WLAN_FEATURE_ACTION_OUI */ + QDF_STATUS (*send_sar_limit_cmd)(wmi_unified_t wmi_handle, struct sar_limit_cmd_params *params); diff --git a/wmi/src/wmi_unified_action_oui_tlv.c b/wmi/src/wmi_unified_action_oui_tlv.c new file mode 100644 index 0000000000..86402071ab --- /dev/null +++ b/wmi/src/wmi_unified_action_oui_tlv.c @@ -0,0 +1,277 @@ +/* + * 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 + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "wmi_unified_action_oui_tlv.h" + +bool wmi_get_action_oui_id(enum action_oui_id action_id, + wmi_vendor_oui_action_id *id) +{ + switch (action_id) { + + case ACTION_OUI_CONNECT_1X1: + *id = WMI_VENDOR_OUI_ACTION_CONNECTION_1X1; + return true; + + case ACTION_OUI_ITO_EXTENSION: + *id = WMI_VENDOR_OUI_ACTION_ITO_EXTENSION; + return true; + + case ACTION_OUI_CCKM_1X1: + *id = WMI_VENDOR_OUI_ACTION_CCKM_1X1; + return true; + + case ACTION_OUI_ITO_ALTERNATE: + *id = WMI_VENDOR_OUI_ACTION_ALT_ITO; + return true; + + case ACTION_OUI_SWITCH_TO_11N_MODE: + *id = WMI_VENDOR_OUI_ACTION_SWITCH_TO_11N_MODE; + return true; + + default: + return false; + } +} + +uint32_t wmi_get_action_oui_info_mask(uint32_t info_mask) +{ + uint32_t info_presence = WMI_BEACON_INFO_PRESENCE_OUI_EXT; + + if (info_mask & ACTION_OUI_INFO_MAC_ADDRESS) + info_presence |= WMI_BEACON_INFO_PRESENCE_MAC_ADDRESS; + + if (info_mask & ACTION_OUI_INFO_AP_CAPABILITY_NSS) + info_presence |= WMI_BEACON_INFO_PRESENCE_AP_CAPABILITY_NSS; + + if (info_mask & ACTION_OUI_INFO_AP_CAPABILITY_HT) + info_presence |= WMI_BEACON_INFO_PRESENCE_AP_CAPABILITY_HT; + + if (info_mask & ACTION_OUI_INFO_AP_CAPABILITY_VHT) + info_presence |= WMI_BEACON_INFO_PRESENCE_AP_CAPABILITY_VHT; + + if (info_mask & ACTION_OUI_INFO_AP_CAPABILITY_BAND) + info_presence |= WMI_BEACON_INFO_PRESENCE_AP_CAPABILITY_BAND; + + return info_presence; +} + +void wmi_fill_oui_extensions(struct action_oui_extension *extension, + uint32_t no_oui_extns, + wmi_vendor_oui_ext *cmd_ext) +{ + uint32_t i; + uint32_t buffer_length; + + for (i = 0; i < no_oui_extns; i++) { + WMITLV_SET_HDR(&cmd_ext->tlv_header, + WMITLV_TAG_STRUC_wmi_vendor_oui_ext, + WMITLV_GET_STRUCT_TLVLEN(wmi_vendor_oui_ext)); + cmd_ext->info_presence_bit_mask = + wmi_get_action_oui_info_mask(extension->info_mask); + + cmd_ext->oui_header_length = extension->oui_length; + cmd_ext->oui_data_length = extension->data_length; + cmd_ext->mac_address_length = extension->mac_addr_length; + cmd_ext->capability_data_length = + extension->capability_length; + + buffer_length = extension->oui_length + + extension->data_length + + extension->data_mask_length + + extension->mac_addr_length + + extension->mac_mask_length + + extension->capability_length; + + cmd_ext->buf_data_length = buffer_length + 1; + + cmd_ext++; + extension++; + } + +} + +QDF_STATUS +wmi_fill_oui_extensions_buffer(struct action_oui_extension *extension, + wmi_vendor_oui_ext *cmd_ext, + uint32_t no_oui_extns, uint32_t rem_var_buf_len, + uint8_t *var_buf) +{ + uint8_t i; + + for (i = 0; i < (uint8_t)no_oui_extns; i++) { + if ((rem_var_buf_len - cmd_ext->buf_data_length) < 0) { + WMI_LOGE(FL("Invalid action oui command length")); + return QDF_STATUS_E_INVAL; + } + + var_buf[0] = i; + var_buf++; + + qdf_mem_copy(var_buf, extension->oui, extension->oui_length); + var_buf += extension->oui_length; + + if (extension->data_length) { + qdf_mem_copy(var_buf, extension->data, + extension->data_length); + var_buf += extension->data_length; + } + + if (extension->data_mask_length) { + qdf_mem_copy(var_buf, extension->data_mask, + extension->data_mask_length); + var_buf += extension->data_mask_length; + } + + if (extension->mac_addr_length) { + qdf_mem_copy(var_buf, extension->mac_addr, + extension->mac_addr_length); + var_buf += extension->mac_addr_length; + } + + if (extension->mac_mask_length) { + qdf_mem_copy(var_buf, extension->mac_mask, + extension->mac_mask_length); + var_buf += extension->mac_mask_length; + } + + if (extension->capability_length) { + qdf_mem_copy(var_buf, extension->capability, + extension->capability_length); + var_buf += extension->capability_length; + } + + rem_var_buf_len -= cmd_ext->buf_data_length; + cmd_ext++; + extension++; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +send_action_oui_cmd_tlv(wmi_unified_t wmi_handle, + struct action_oui_request *req) +{ + wmi_pdev_config_vendor_oui_action_fixed_param *cmd; + wmi_vendor_oui_ext *cmd_ext; + wmi_buf_t wmi_buf; + struct action_oui_extension *extension; + uint32_t len; + uint32_t i; + uint8_t *buf_ptr; + uint32_t no_oui_extns; + uint32_t total_no_oui_extns; + uint32_t var_buf_len = 0; + wmi_vendor_oui_action_id action_id; + bool valid; + uint32_t rem_var_buf_len; + QDF_STATUS status; + + if (!req) { + WMI_LOGE(FL("action oui is empty")); + return QDF_STATUS_E_INVAL; + } + + no_oui_extns = req->no_oui_extensions; + total_no_oui_extns = req->total_no_oui_extensions; + + len = sizeof(*cmd); + len += WMI_TLV_HDR_SIZE; /* Array of wmi_vendor_oui_ext structures */ + + if (!no_oui_extns || + no_oui_extns > WMI_MAX_VENDOR_OUI_ACTION_SUPPORTED_PER_ACTION || + (total_no_oui_extns > WMI_VENDOR_OUI_ACTION_MAX_ACTION_ID * + WMI_MAX_VENDOR_OUI_ACTION_SUPPORTED_PER_ACTION)) { + WMI_LOGE(FL("Invalid number of action oui extensions")); + return QDF_STATUS_E_INVAL; + } + + valid = wmi_get_action_oui_id(req->action_id, &action_id); + if (!valid) { + WMI_LOGE(FL("Invalid action id")); + return QDF_STATUS_E_INVAL; + } + + len += no_oui_extns * sizeof(*cmd_ext); + len += WMI_TLV_HDR_SIZE; /* Variable length buffer */ + + extension = req->extension; + for (i = 0; i < no_oui_extns; i++) { + var_buf_len += extension->oui_length + + extension->data_length + + extension->data_mask_length + + extension->mac_addr_length + + extension->mac_mask_length + + extension->capability_length; + extension++; + } + + var_buf_len += no_oui_extns; /* to store indexes */ + rem_var_buf_len = var_buf_len; + var_buf_len = (var_buf_len + 3) & ~0x3; + len += var_buf_len; + + wmi_buf = wmi_buf_alloc(wmi_handle, len); + if (!wmi_buf) { + WMI_LOGE(FL("Failed to allocate wmi buffer")); + return QDF_STATUS_E_FAILURE; + } + + buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf); + cmd = (wmi_pdev_config_vendor_oui_action_fixed_param *)buf_ptr; + + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_pdev_config_vendor_oui_action_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_pdev_config_vendor_oui_action_fixed_param)); + + cmd->action_id = action_id; + cmd->total_num_vendor_oui = total_no_oui_extns; + cmd->num_vendor_oui_ext = no_oui_extns; + + buf_ptr += sizeof(*cmd); + WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, + no_oui_extns * sizeof(*cmd_ext)); + buf_ptr += WMI_TLV_HDR_SIZE; + cmd_ext = (wmi_vendor_oui_ext *)buf_ptr; + wmi_fill_oui_extensions(req->extension, no_oui_extns, cmd_ext); + + buf_ptr += no_oui_extns * sizeof(*cmd_ext); + WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, var_buf_len); + buf_ptr += WMI_TLV_HDR_SIZE; + status = wmi_fill_oui_extensions_buffer(req->extension, + cmd_ext, no_oui_extns, + rem_var_buf_len, buf_ptr); + if (!QDF_IS_STATUS_SUCCESS(status)) { + wmi_buf_free(wmi_buf); + wmi_buf = NULL; + return QDF_STATUS_E_INVAL; + } + + buf_ptr += var_buf_len; + + if (wmi_unified_cmd_send(wmi_handle, wmi_buf, len, + WMI_PDEV_CONFIG_VENDOR_OUI_ACTION_CMDID)) { + WMI_LOGE(FL("WMI_PDEV_CONFIG_VENDOR_OUI_ACTION send fail")); + wmi_buf_free(wmi_buf); + wmi_buf = NULL; + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index eb94cba9bd..99aefee076 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -7058,6 +7058,21 @@ QDF_STATUS wmi_unified_send_dbs_scan_sel_params_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +#ifdef WLAN_FEATURE_ACTION_OUI +QDF_STATUS +wmi_unified_send_action_oui_cmd(void *wmi_hdl, + struct action_oui_request *req) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->send_action_oui_cmd) + return wmi_handle->ops->send_action_oui_cmd(wmi_handle, + req); + + return QDF_STATUS_E_FAILURE; +} +#endif + /** * wmi_unified_send_limit_off_chan_cmd() - send wmi cmd of limit off channel * configuration params diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 4f95c44504..db9f70e363 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -27,6 +27,9 @@ #ifdef FEATURE_WLAN_APF #include "wmi_unified_apf_tlv.h" #endif +#ifdef WLAN_FEATURE_ACTION_OUI +#include "wmi_unified_action_oui_tlv.h" +#endif #ifdef CONVERGED_P2P_ENABLE #include "wlan_p2p_public_struct.h" #endif @@ -22218,6 +22221,9 @@ struct wmi_ops tlv_ops = { extract_peer_sta_ps_statechange_ev_tlv, .extract_inst_rssi_stats_event = extract_inst_rssi_stats_event_tlv, .send_per_roam_config_cmd = send_per_roam_config_cmd_tlv, +#ifdef WLAN_FEATURE_ACTION_OUI + .send_action_oui_cmd = send_action_oui_cmd_tlv, +#endif .send_dfs_phyerr_offload_en_cmd = send_dfs_phyerr_offload_en_cmd_tlv, .send_dfs_phyerr_offload_dis_cmd = send_dfs_phyerr_offload_dis_cmd_tlv, .extract_reg_chan_list_update_event =