diff --git a/components/mlme/dispatcher/inc/wlan_mlme_twt_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_twt_ucfg_api.h index 7cca4c7b0d7e..73e3458bf43a 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_twt_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_twt_ucfg_api.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. 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 @@ -382,6 +383,18 @@ uint8_t ucfg_mlme_get_twt_peer_capabilities(struct wlan_objmgr_psoc *psoc, return mlme_get_twt_peer_capabilities(psoc, peer_mac); } +/** + * ucfg_mlme_get_twt_peer_responder_capabilities() - Get peer responder + * capabilities + * @psoc: Pointer to global psoc object + * @peer_mac: Pointer to peer mac address + * + * Return: Return True if peer responder capabilities support else False + */ +bool ucfg_mlme_get_twt_peer_responder_capabilities( + struct wlan_objmgr_psoc *psoc, + struct qdf_mac_addr *peer_mac); + /** * ucfg_mlme_init_twt_context() - Initialize TWT context * @psoc: Pointer to global psoc object @@ -678,6 +691,14 @@ uint8_t ucfg_mlme_get_twt_peer_capabilities(struct wlan_objmgr_psoc *psoc, return 0; } +static inline +bool ucfg_mlme_get_twt_peer_responder_capabilities( + struct wlan_objmgr_psoc *psoc, + struct qdf_mac_addr *peer_mac) +{ + return false; +} + static inline QDF_STATUS ucfg_mlme_init_twt_context(struct wlan_objmgr_psoc *psoc, struct qdf_mac_addr *peer_mac, diff --git a/components/mlme/dispatcher/src/wlan_mlme_twt_ucfg_api.c b/components/mlme/dispatcher/src/wlan_mlme_twt_ucfg_api.c index 26b31cc37855..6a8d28511270 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_twt_ucfg_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_twt_ucfg_api.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021 Qualcomm Innovation Center, Inc. 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 @@ -259,6 +260,20 @@ ucfg_mlme_set_twt_nudge_tgt_cap(struct wlan_objmgr_psoc *psoc, bool val) return QDF_STATUS_SUCCESS; } +bool ucfg_mlme_get_twt_peer_responder_capabilities( + struct wlan_objmgr_psoc *psoc, + struct qdf_mac_addr *peer_mac) +{ + uint8_t peer_cap; + + peer_cap = mlme_get_twt_peer_capabilities(psoc, peer_mac); + + if (peer_cap & WLAN_TWT_CAPA_RESPONDER) + return true; + + return false; +} + QDF_STATUS ucfg_mlme_get_twt_nudge_tgt_cap(struct wlan_objmgr_psoc *psoc, bool *val) { diff --git a/core/hdd/src/wlan_hdd_twt.c b/core/hdd/src/wlan_hdd_twt.c index f4f2aeb5f9b9..35ca8edd9729 100644 --- a/core/hdd/src/wlan_hdd_twt.c +++ b/core/hdd/src/wlan_hdd_twt.c @@ -1817,6 +1817,13 @@ static int hdd_twt_setup_session(struct hdd_adapter *adapter, if (ret) return ret; + if (!ucfg_mlme_get_twt_peer_responder_capabilities( + adapter->hdd_ctx->psoc, + &hdd_sta_ctx->conn_info.bssid)) { + hdd_err_rl("TWT setup reject: TWT responder not supported"); + return -EOPNOTSUPP; + } + ret = hdd_twt_get_add_dialog_values(tb2, ¶ms); if (ret) return ret;