|
@@ -33,6 +33,39 @@
|
|
#include "wlan_objmgr_psoc_obj.h"
|
|
#include "wlan_objmgr_psoc_obj.h"
|
|
#include "wlan_objmgr_peer_obj.h"
|
|
#include "wlan_objmgr_peer_obj.h"
|
|
#include "wlan_lmac_if_def.h"
|
|
#include "wlan_lmac_if_def.h"
|
|
|
|
+#include "wlan_vdev_mgr_tgt_if_tx_api.h"
|
|
|
|
+
|
|
|
|
+#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
|
|
|
+uint8_t wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev *vdev)
|
|
|
|
+{
|
|
|
|
+ struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
|
|
|
+ if (!vdev_pos_obj) {
|
|
|
|
+ wifi_pos_err("Wifi pos vdev priv obj is null");
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return vdev_pos_obj->num_pasn_peers;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev *vdev,
|
|
|
|
+ bool is_increment)
|
|
|
|
+{
|
|
|
|
+ struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
|
|
|
+ if (!vdev_pos_obj) {
|
|
|
|
+ wifi_pos_err("Wifi pos vdev priv obj is null");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (is_increment)
|
|
|
|
+ vdev_pos_obj->num_pasn_peers++;
|
|
|
|
+ else
|
|
|
|
+ vdev_pos_obj->num_pasn_peers--;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
|
|
void wifi_pos_set_11az_failed_peers(struct wlan_objmgr_vdev *vdev,
|
|
void wifi_pos_set_11az_failed_peers(struct wlan_objmgr_vdev *vdev,
|
|
struct qdf_mac_addr *mac_addr)
|
|
struct qdf_mac_addr *mac_addr)
|
|
@@ -313,7 +346,7 @@ QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
|
|
struct wlan_objmgr_vdev *vdev;
|
|
struct wlan_objmgr_vdev *vdev;
|
|
struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
struct wifi_pos_11az_context *pasn_context;
|
|
struct wifi_pos_11az_context *pasn_context;
|
|
- QDF_STATUS status;
|
|
|
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
uint8_t i;
|
|
uint8_t i;
|
|
|
|
|
|
legacy_cb = wifi_pos_get_legacy_ops(psoc);
|
|
legacy_cb = wifi_pos_get_legacy_ops(psoc);
|
|
@@ -369,6 +402,7 @@ QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc,
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ wifi_pos_update_pasn_peer_count(vdev, true);
|
|
if (req[i].is_ltf_keyseed_required) {
|
|
if (req[i].is_ltf_keyseed_required) {
|
|
peer = wlan_objmgr_get_peer_by_mac(psoc,
|
|
peer = wlan_objmgr_get_peer_by_mac(psoc,
|
|
req[i].peer_mac.bytes,
|
|
req[i].peer_mac.bytes,
|
|
@@ -444,9 +478,11 @@ wifi_pos_handle_ranging_peer_create_rsp(struct wlan_objmgr_psoc *psoc,
|
|
wifi_pos_debug("Received peer create response for " QDF_MAC_ADDR_FMT " status:%d pending_count:%d",
|
|
wifi_pos_debug("Received peer create response for " QDF_MAC_ADDR_FMT " status:%d pending_count:%d",
|
|
QDF_MAC_ADDR_REF(peer_mac->bytes), peer_create_status,
|
|
QDF_MAC_ADDR_REF(peer_mac->bytes), peer_create_status,
|
|
pasn_context->num_pending_peer_creation);
|
|
pasn_context->num_pending_peer_creation);
|
|
- if (peer_create_status)
|
|
|
|
|
|
+ if (peer_create_status) {
|
|
wifi_pos_move_peers_to_fail_list(vdev, peer_mac,
|
|
wifi_pos_move_peers_to_fail_list(vdev, peer_mac,
|
|
WLAN_WIFI_POS_PASN_PEER_TYPE_MAX);
|
|
WLAN_WIFI_POS_PASN_PEER_TYPE_MAX);
|
|
|
|
+ wifi_pos_update_pasn_peer_count(vdev, false);
|
|
|
|
+ }
|
|
|
|
|
|
status = wifi_pos_check_and_initiate_pasn_authentication(psoc, vdev,
|
|
status = wifi_pos_check_and_initiate_pasn_authentication(psoc, vdev,
|
|
pasn_context);
|
|
pasn_context);
|
|
@@ -464,10 +500,32 @@ QDF_STATUS wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc *psoc,
|
|
struct wlan_objmgr_peer *peer;
|
|
struct wlan_objmgr_peer *peer;
|
|
struct wlan_pasn_request *del_peer_list;
|
|
struct wlan_pasn_request *del_peer_list;
|
|
struct wlan_objmgr_vdev *vdev;
|
|
struct wlan_objmgr_vdev *vdev;
|
|
|
|
+ struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
bool no_fw_peer_delete;
|
|
bool no_fw_peer_delete;
|
|
uint8_t peer_count = 0, i;
|
|
uint8_t peer_count = 0, i;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
|
|
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
|
|
|
+ WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ if (!vdev) {
|
|
|
|
+ wifi_pos_err("Vdev object is null");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
|
|
|
+ if (!vdev_pos_obj) {
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ wifi_pos_err("Wifi pos vdev priv obj is null");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (vdev_pos_obj->is_delete_all_pasn_peer_in_progress) {
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ wifi_pos_err("Vdev delete all peer in progress. Ignore indvidual peer delete");
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+ }
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+
|
|
legacy_cb = wifi_pos_get_legacy_ops(psoc);
|
|
legacy_cb = wifi_pos_get_legacy_ops(psoc);
|
|
if (!legacy_cb || !legacy_cb->pasn_peer_delete_cb) {
|
|
if (!legacy_cb || !legacy_cb->pasn_peer_delete_cb) {
|
|
wifi_pos_err("legacy callback is not registered");
|
|
wifi_pos_err("legacy callback is not registered");
|
|
@@ -640,3 +698,96 @@ bool wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer)
|
|
|
|
|
|
return peer_priv->is_ltf_keyseed_required;
|
|
return peer_priv->is_ltf_keyseed_required;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static
|
|
|
|
+void wifi_pos_delete_objmgr_ranging_peer(struct wlan_objmgr_vdev *vdev,
|
|
|
|
+ void *object, void *arg)
|
|
|
|
+{
|
|
|
|
+ struct wlan_objmgr_peer *peer = object;
|
|
|
|
+ QDF_STATUS status;
|
|
|
|
+
|
|
|
|
+ status = wlan_objmgr_peer_obj_delete(peer);
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
|
+ wifi_pos_err("Failed to delete peer");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+QDF_STATUS
|
|
|
|
+wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev *vdev)
|
|
|
|
+{
|
|
|
|
+ QDF_STATUS status;
|
|
|
|
+ struct vdev_mlme_obj *vdev_mlme;
|
|
|
|
+ struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
|
|
+ struct peer_delete_all_params param;
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
|
|
|
+ if (!vdev_pos_obj) {
|
|
|
|
+ wifi_pos_err("Wifi pos vdev priv obj is null");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!vdev_pos_obj->num_pasn_peers)
|
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj->is_delete_all_pasn_peer_in_progress = true;
|
|
|
|
+ status = wlan_objmgr_iterate_peerobj_list(vdev,
|
|
|
|
+ wifi_pos_delete_objmgr_ranging_peer,
|
|
|
|
+ NULL, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
|
+ wifi_pos_err("Delete objmgr peers failed");
|
|
|
|
+
|
|
|
|
+ vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
|
|
|
|
+ if (!vdev_mlme) {
|
|
|
|
+ wifi_pos_err(" VDEV MLME component object is NULL");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ param.vdev_id = wlan_vdev_get_id(vdev);
|
|
|
|
+ param.peer_type_bitmap = BIT(WLAN_PEER_RTT_PASN);
|
|
|
|
+
|
|
|
|
+ status = tgt_vdev_mgr_peer_delete_all_send(vdev_mlme, ¶m);
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
|
+ wifi_pos_err("Send vdev delete all peers failed");
|
|
|
|
+
|
|
|
|
+ return status;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+QDF_STATUS
|
|
|
|
+wifi_pos_vdev_delete_all_ranging_peers_rsp(struct wlan_objmgr_psoc *psoc,
|
|
|
|
+ uint8_t vdev_id)
|
|
|
|
+{
|
|
|
|
+ struct wifi_pos_legacy_ops *legacy_cb;
|
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
|
+ struct wifi_pos_vdev_priv_obj *vdev_pos_obj;
|
|
|
|
+ QDF_STATUS status;
|
|
|
|
+
|
|
|
|
+ vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
|
|
|
|
+ WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ if (!vdev) {
|
|
|
|
+ wifi_pos_err(" VDEV is NULL");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev);
|
|
|
|
+ if (!vdev_pos_obj) {
|
|
|
|
+ wifi_pos_err("Wifi pos vdev priv obj is null");
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ vdev_pos_obj->is_delete_all_pasn_peer_in_progress = false;
|
|
|
|
+
|
|
|
|
+ legacy_cb = wifi_pos_get_legacy_ops(psoc);
|
|
|
|
+ if (!legacy_cb || !legacy_cb->pasn_vdev_delete_resume_cb) {
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+ wifi_pos_err("legacy callbacks is not registered");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ status = legacy_cb->pasn_vdev_delete_resume_cb(vdev);
|
|
|
|
+ if (QDF_IS_STATUS_ERROR(status))
|
|
|
|
+ wifi_pos_err("Delete all PASN peer failed");
|
|
|
|
+
|
|
|
|
+ wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID);
|
|
|
|
+
|
|
|
|
+ return status;
|
|
|
|
+}
|