diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 3674b16e74..a7c0493e33 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -4725,6 +4725,7 @@ typedef enum { wmi_twt_del_dialog_complete_event_id, wmi_twt_pause_dialog_complete_event_id, wmi_twt_resume_dialog_complete_event_id, + wmi_twt_nudge_dialog_complete_event_id, wmi_twt_session_stats_event_id, #endif wmi_apf_get_vdev_work_memory_resp_event_id, diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 9c744ffef1..09e762a7db 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2205,6 +2205,9 @@ QDF_STATUS (*send_twt_del_dialog_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_twt_pause_dialog_cmd)(wmi_unified_t wmi_handle, struct wmi_twt_pause_dialog_cmd_param *params); +QDF_STATUS (*send_twt_nudge_dialog_cmd)(wmi_unified_t wmi_handle, + struct wmi_twt_nudge_dialog_cmd_param *params); + QDF_STATUS (*send_twt_resume_dialog_cmd)(wmi_unified_t wmi_handle, struct wmi_twt_resume_dialog_cmd_param *params); @@ -2243,6 +2246,10 @@ QDF_STATUS (*extract_twt_pause_dialog_comp_event)(wmi_unified_t wmi_handle, uint8_t *evt_buf, struct wmi_twt_pause_dialog_complete_event_param *params); +QDF_STATUS (*extract_twt_nudge_dialog_comp_event)(wmi_unified_t wmi_handle, + uint8_t *evt_buf, + struct wmi_twt_nudge_dialog_complete_event_param *params); + QDF_STATUS (*extract_twt_resume_dialog_comp_event)(wmi_unified_t wmi_handle, uint8_t *evt_buf, struct wmi_twt_resume_dialog_complete_event_param *params); diff --git a/wmi/inc/wmi_unified_twt_api.h b/wmi/inc/wmi_unified_twt_api.h index 3895c42cb1..818a425078 100644 --- a/wmi/inc/wmi_unified_twt_api.h +++ b/wmi/inc/wmi_unified_twt_api.h @@ -81,6 +81,17 @@ QDF_STATUS wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle, struct wmi_twt_pause_dialog_cmd_param *params); +/** + * wmi_unified_twt_nudge_dialog_cmd() - Send WMI command to nudge TWT dialog + * @wmi_handle: wmi handle + * @params: Parameters to be configured + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle, + struct wmi_twt_nudge_dialog_cmd_param *params); + /** * wmi_unified_twt_resume_dialog_cmd() - Send WMI command to resume TWT dialog * @wmi_handle: wmi handle @@ -203,6 +214,20 @@ QDF_STATUS wmi_extract_twt_pause_dialog_comp_event( uint8_t *evt_buf, struct wmi_twt_pause_dialog_complete_event_param *params); +/** + * wmi_extract_twt_nudge_dialog_comp_event() - Extract WMI event params for TWT + * nudge dialog completion event + * @wmi_handle: wmi handle + * @evt_buf: Pointer event buffer + * @params: Parameters to extract + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, + struct wmi_twt_nudge_dialog_complete_event_param *params); + /** * wmi_extract_twt_resume_dialog_comp_event() - Extract WMI event params for TWT * resume dialog completion event diff --git a/wmi/inc/wmi_unified_twt_param.h b/wmi/inc/wmi_unified_twt_param.h index 98416a8606..2554e9bf72 100644 --- a/wmi/inc/wmi_unified_twt_param.h +++ b/wmi/inc/wmi_unified_twt_param.h @@ -129,7 +129,8 @@ enum WMI_HOST_ENABLE_TWT_STATUS { WMI_HOST_ENABLE_TWT_STATUS_UNKNOWN_ERROR, }; -/** struct wmi_twt_enable_complete_event_param: +/** + * struct wmi_twt_enable_complete_event_param: * @pdev_is: pdev_id for identifying the MAC. * @status: From enum WMI_HOST_ENABLE_TWT_STATUS */ @@ -139,7 +140,7 @@ struct wmi_twt_enable_complete_event_param { }; /** - *struct wmi_twt_disable_param: + * struct wmi_twt_disable_param: * @pdev_id: pdev_id for identifying the MAC. * @ext_conf_present: If requestor/responder extend config is present. * @twt_role: values from enum WMI_TWT_ROLE. @@ -152,7 +153,8 @@ struct wmi_twt_disable_param { enum WMI_TWT_OPERATION twt_oper; }; -/** struct wmi_twt_disable_complete_event: +/** + * struct wmi_twt_disable_complete_event: * @pdev_id: pdev_id for identifying the MAC. */ struct wmi_twt_disable_complete_event { @@ -204,7 +206,8 @@ struct wmi_host_twt_session_stats_info { uint32_t sp_tsf_us_hi; }; -/** struct wmi_twt_session_stats_event: +/** + * struct wmi_twt_session_stats_event: * @pdev_id: pdev_id for identifying the MAC. * @num_sessions: number of TWT sessions * @twt_sessions: received TWT sessions @@ -226,7 +229,8 @@ enum WMI_HOST_TWT_COMMAND { WMI_HOST_TWT_COMMAND_REJECT_TWT = 7, }; -/** struct wmi_twt_add_dialog_param - +/** + * struct wmi_twt_add_dialog_param - * @vdev_id: VDEV identifier * @peer_macaddr: peer MAC address when vdev is AP VDEV * @dialog_id: diaglog_id (TWT dialog ID) @@ -341,7 +345,8 @@ struct wmi_twt_add_dialog_additional_params { uint32_t sp_tsf_us_hi; }; -/** struct wmi_twt_add_dialog_complete_param - +/** + * struct wmi_twt_add_dialog_complete_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -356,7 +361,8 @@ struct wmi_twt_add_dialog_complete_event_param { uint32_t num_additional_twt_params; }; -/** struct wmi_twt_del_dialog_param - +/** + * struct wmi_twt_del_dialog_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -393,7 +399,8 @@ enum WMI_HOST_DEL_TWT_STATUS { WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR, }; -/** struct wmi_twt_del_dialog_complete_event_param - +/** + * struct wmi_twt_del_dialog_complete_event_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -410,7 +417,8 @@ struct wmi_twt_del_dialog_complete_event_param { uint32_t status; }; -/** struct wmi_twt_pause_dialog_cmd_param - +/** + * struct wmi_twt_pause_dialog_cmd_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -421,6 +429,22 @@ struct wmi_twt_pause_dialog_cmd_param { uint32_t dialog_id; }; +/** + * struct wmi_twt_nudge_dialog_cmd_param - + * @vdev_id: VDEV identifier + * @peer_macaddr: Peer mac address + * @dialog_id: TWT dialog ID + * @suspend_duration: TWT suspend duration in microseconds + * @next_twt_size: next TWT size + */ +struct wmi_twt_nudge_dialog_cmd_param { + uint32_t vdev_id; + uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE]; + uint32_t dialog_id; + uint32_t suspend_duration; + uint32_t next_twt_size; +}; + /* enum WMI_HOST_PAUSE_TWT_STATUS - status code of pausing TWT dialog * WMI_HOST_PAUSE_TWT_STATUS_OK: pausing TWT dialog successfully completed * WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST: TWT dialog ID not exists @@ -445,7 +469,8 @@ enum WMI_HOST_PAUSE_TWT_STATUS { WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED, }; -/** struct wmi_twt_pause_dialog_complete_event_param - +/** + * struct wmi_twt_pause_dialog_complete_event_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -455,10 +480,47 @@ struct wmi_twt_pause_dialog_complete_event_param { uint32_t vdev_id; uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE]; uint32_t dialog_id; - uint32_t status; + enum WMI_HOST_PAUSE_TWT_STATUS status; }; -/** struct wmi_twt_resume_dialog_cmd_param - +/* enum WMI_HOST_NUDGE_TWT_STATUS - status code of nudge TWT dialog + * WMI_HOST_NUDGE_TWT_STATUS_OK: nudge TWT dialog successfully completed + * WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST: TWT dialog ID not exists + * WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM: invalid parameters + * WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY: FW is in the process of handling + * this dialog + * WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE: FW resource exhausted + * WMI_HOST_NUDGE_TWT_STATUS_NO_ACK: peer AP/STA did not ACK the + * request/response frame + * WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR: nudge TWT dialog failed with an + * unknown reason + */ +enum WMI_HOST_NUDGE_TWT_STATUS { + WMI_HOST_NUDGE_TWT_STATUS_OK, + WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST, + WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM, + WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY, + WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE, + WMI_HOST_NUDGE_TWT_STATUS_NO_ACK, + WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR, +}; + +/** + * struct wmi_twt_nudge_dialog_complete_event_param - + * @vdev_id: VDEV identifier + * @peer_macaddr: Peer mac address + * @dialog_id: TWT dialog ID + * @status: refer to WMI_HOST_PAUSE_TWT_STATUS + */ +struct wmi_twt_nudge_dialog_complete_event_param { + uint32_t vdev_id; + uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE]; + uint32_t dialog_id; + enum WMI_HOST_NUDGE_TWT_STATUS status; +}; + +/** + * struct wmi_twt_resume_dialog_cmd_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -498,7 +560,8 @@ enum WMI_HOST_RESUME_TWT_STATUS { WMI_HOST_RESUME_TWT_STATUS_UNKNOWN_ERROR, }; -/** struct wmi_twt_resume_dialog_complete_event_param - +/** + * struct wmi_twt_resume_dialog_complete_event_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -512,7 +575,8 @@ struct wmi_twt_resume_dialog_complete_event_param { }; #ifdef WLAN_SUPPORT_BCAST_TWT -/** struct wmi_twt_btwt_invite_sta_cmd_param - +/** + * struct wmi_twt_btwt_invite_sta_cmd_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: TWT dialog ID @@ -548,7 +612,8 @@ enum WMI_HOST_INVITATION_TWT_BTWT_STATUS { WMI_HOST_INVITATION_TWT_BTWT_STATUS_UNKNOWN_ERROR, }; -/** struct wmi_twt_btwt_invite_sta_complete_event_param - +/** + * struct wmi_twt_btwt_invite_sta_complete_event_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: BTWT dialog ID @@ -561,7 +626,8 @@ struct wmi_twt_btwt_invite_sta_complete_event_param { uint32_t status; }; -/** struct wmi_twt_btwt_remove_sta_cmd_param - +/** + * struct wmi_twt_btwt_remove_sta_cmd_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: BTWT dialog ID @@ -597,7 +663,8 @@ enum WMI_HOST_KICKOFF_TWT_BTWT_STATUS { WMI_HOST_KICKOFF_TWT_BTWT_STATUS_UNKNOWN_ERROR, }; -/** struct wmi_twt_btwt_remove_sta_complete_event_param - +/** + * struct wmi_twt_btwt_remove_sta_complete_event_param - * @vdev_id: VDEV identifier * @peer_macaddr: Peer mac address * @dialog_id: BTWT dialog ID diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 8cd6482037..036b9ce348 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -14829,6 +14829,8 @@ static void populate_tlv_events_id(uint32_t *event_ids) WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID; event_ids[wmi_twt_resume_dialog_complete_event_id] = WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID; + event_ids[wmi_twt_nudge_dialog_complete_event_id] = + WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID; event_ids[wmi_twt_session_stats_event_id] = WMI_TWT_SESSION_STATS_EVENTID; #endif diff --git a/wmi/src/wmi_unified_twt_api.c b/wmi/src/wmi_unified_twt_api.c index 2e0d6d13c6..26f19bdf36 100644 --- a/wmi/src/wmi_unified_twt_api.c +++ b/wmi/src/wmi_unified_twt_api.c @@ -78,6 +78,17 @@ wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } +QDF_STATUS +wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle, + struct wmi_twt_nudge_dialog_cmd_param *params) +{ + if (wmi_handle->ops->send_twt_nudge_dialog_cmd) + return wmi_handle->ops->send_twt_nudge_dialog_cmd( + wmi_handle, params); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_unified_twt_resume_dialog_cmd( wmi_unified_t wmi_handle, struct wmi_twt_resume_dialog_cmd_param *params) @@ -187,6 +198,18 @@ QDF_STATUS wmi_extract_twt_pause_dialog_comp_event( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, + struct wmi_twt_nudge_dialog_complete_event_param *params) +{ + if (wmi_handle->ops->extract_twt_nudge_dialog_comp_event) + return wmi_handle->ops->extract_twt_nudge_dialog_comp_event( + wmi_handle, evt_buf, params); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_extract_twt_resume_dialog_comp_event( wmi_unified_t wmi_handle, uint8_t *evt_buf, diff --git a/wmi/src/wmi_unified_twt_tlv.c b/wmi/src/wmi_unified_twt_tlv.c index 8beb9b9517..4d43fd31d4 100644 --- a/wmi/src/wmi_unified_twt_tlv.c +++ b/wmi/src/wmi_unified_twt_tlv.c @@ -276,6 +276,43 @@ send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle, return status; } +static QDF_STATUS +send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle, + struct wmi_twt_nudge_dialog_cmd_param *params) +{ + wmi_twt_nudge_dialog_cmd_fixed_param *cmd; + wmi_buf_t buf; + QDF_STATUS status; + + buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd)); + if (!buf) + return QDF_STATUS_E_FAILURE; + + cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_twt_nudge_dialog_cmd_fixed_param)); + + cmd->vdev_id = params->vdev_id; + WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr); + cmd->dialog_id = params->dialog_id; + cmd->suspend_duration_ms = params->suspend_duration / 1000; + cmd->next_twt_size = params->next_twt_size; + + wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d " + "peer_macaddr: "QDF_MAC_ADDR_FMT, cmd->vdev_id, + cmd->dialog_id, cmd->suspend_duration_ms, cmd->next_twt_size, + QDF_MAC_ADDR_REF(params->peer_macaddr)); + + status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd), + WMI_TWT_NUDGE_DIALOG_CMDID); + if (QDF_IS_STATUS_ERROR(status)) + wmi_buf_free(buf); + + return status; +} + static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle, struct wmi_twt_resume_dialog_cmd_param *params) { @@ -570,6 +607,31 @@ static QDF_STATUS extract_twt_del_dialog_comp_event_tlv( return QDF_STATUS_SUCCESS; } +static enum WMI_HOST_PAUSE_TWT_STATUS +wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status) +{ + switch (status) { + case WMI_PAUSE_TWT_STATUS_OK: + return WMI_HOST_PAUSE_TWT_STATUS_OK; + case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST: + return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST; + case WMI_PAUSE_TWT_STATUS_INVALID_PARAM: + return WMI_HOST_PAUSE_TWT_STATUS_INVALID_PARAM; + case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY: + return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_BUSY; + case WMI_PAUSE_TWT_STATUS_NO_RESOURCE: + return WMI_HOST_PAUSE_TWT_STATUS_NO_RESOURCE; + case WMI_PAUSE_TWT_STATUS_NO_ACK: + return WMI_HOST_PAUSE_TWT_STATUS_NO_ACK; + case WMI_PAUSE_TWT_STATUS_UNKNOWN_ERROR: + return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR; + case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED: + return WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED; + default: + return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR; + } +} + static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv( wmi_unified_t wmi_handle, uint8_t *evt_buf, @@ -588,7 +650,54 @@ static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv( params->vdev_id = ev->vdev_id; WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr); - params->status = ev->status; + params->status = wmi_twt_pause_status_to_host_twt_status(ev->status); + params->dialog_id = ev->dialog_id; + + return QDF_STATUS_SUCCESS; +} + +static enum WMI_HOST_NUDGE_TWT_STATUS +wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status) +{ + switch (status) { + case WMI_NUDGE_TWT_STATUS_OK: + return WMI_HOST_NUDGE_TWT_STATUS_OK; + case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST: + return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST; + case WMI_NUDGE_TWT_STATUS_INVALID_PARAM: + return WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM; + case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY: + return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY; + case WMI_NUDGE_TWT_STATUS_NO_RESOURCE: + return WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE; + case WMI_NUDGE_TWT_STATUS_NO_ACK: + return WMI_HOST_NUDGE_TWT_STATUS_NO_ACK; + case WMI_NUDGE_TWT_STATUS_UNKNOWN_ERROR: + return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR; + default: + return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR; + } +} + +static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv( + wmi_unified_t wmi_handle, + uint8_t *evt_buf, + struct wmi_twt_nudge_dialog_complete_event_param *params) +{ + WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf; + wmi_twt_nudge_dialog_complete_event_fixed_param *ev; + + param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + wmi_err("evt_buf is NULL"); + return QDF_STATUS_E_INVAL; + } + + ev = param_buf->fixed_param; + + params->vdev_id = ev->vdev_id; + WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr); + params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status); params->dialog_id = ev->dialog_id; return QDF_STATUS_SUCCESS; @@ -793,6 +902,7 @@ void wmi_twt_attach_tlv(wmi_unified_t wmi_handle) ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv; ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv; ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv; + ops->send_twt_nudge_dialog_cmd = send_twt_nudge_dialog_cmd_tlv; ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv; ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv; ops->extract_twt_disable_comp_event = @@ -805,6 +915,8 @@ void wmi_twt_attach_tlv(wmi_unified_t wmi_handle) extract_twt_del_dialog_comp_event_tlv; ops->extract_twt_pause_dialog_comp_event = extract_twt_pause_dialog_comp_event_tlv; + ops->extract_twt_nudge_dialog_comp_event = + extract_twt_nudge_dialog_comp_event_tlv; ops->extract_twt_resume_dialog_comp_event = extract_twt_resume_dialog_comp_event_tlv; ops->extract_twt_session_stats_event =