qcacld-3.0: Iterate all links in hdd_adapter_iterate()

Modify the adapter iterate function pointer
hdd_adapter_iterate_cb() to take link info pointer as
function argument. The API can be called for each
link info pointer in adapter to iterate.

Change-Id: I0908667ed34067c61e857ff2b1d30a3bbccdb31f
CRs-Fixed: 3523082
This commit is contained in:
Vinod Kumar Pirla
2023-03-02 05:02:00 -08:00
committed by Rahul Choudhary
parent e02436f8ca
commit 15bc64b5ac
2 changed files with 33 additions and 25 deletions

View File

@@ -2442,7 +2442,7 @@ QDF_STATUS hdd_add_adapter_front(struct hdd_context *hdd_ctx,
/** /**
* typedef hdd_adapter_iterate_cb() - Iteration callback function * typedef hdd_adapter_iterate_cb() - Iteration callback function
* @adapter: current adapter of interest * @link_info: Link info pointer in HDD adapter
* @context: user context supplied to the iterator * @context: user context supplied to the iterator
* *
* This specifies the type of a callback function to supply to * This specifies the type of a callback function to supply to
@@ -2452,8 +2452,8 @@ QDF_STATUS hdd_add_adapter_front(struct hdd_context *hdd_ctx,
* * QDF_STATUS_SUCCESS if further iteration should continue * * QDF_STATUS_SUCCESS if further iteration should continue
* * QDF_STATUS_E_ABORTED if further iteration should be aborted * * QDF_STATUS_E_ABORTED if further iteration should be aborted
*/ */
typedef QDF_STATUS (*hdd_adapter_iterate_cb)(struct hdd_adapter *adapter, typedef QDF_STATUS
void *context); (*hdd_adapter_iterate_cb)(struct wlan_hdd_link_info *link_info, void *context);
/** /**
* hdd_adapter_iterate() - Safely iterate over all adapters * hdd_adapter_iterate() - Safely iterate over all adapters

View File

@@ -9906,6 +9906,7 @@ QDF_STATUS hdd_adapter_iterate(hdd_adapter_iterate_cb cb, void *context)
QDF_STATUS ret = QDF_STATUS_SUCCESS; QDF_STATUS ret = QDF_STATUS_SUCCESS;
QDF_STATUS status; QDF_STATUS status;
int i; int i;
struct wlan_hdd_link_info *link_info;
hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (unlikely(!hdd_ctx)) if (unlikely(!hdd_ctx))
@@ -9928,8 +9929,13 @@ QDF_STATUS hdd_adapter_iterate(hdd_adapter_iterate_cb cb, void *context)
ret = QDF_STATUS_E_FAILURE; ret = QDF_STATUS_E_FAILURE;
continue; continue;
} }
hdd_adapter_for_each_active_link_info(adapter, link_info) {
status = cb(adapter, context); status = cb(link_info, context);
if (status != QDF_STATUS_SUCCESS) {
hdd_adapter_put(adapter);
return status;
}
}
hdd_adapter_put(adapter); hdd_adapter_put(adapter);
if (status != QDF_STATUS_SUCCESS) if (status != QDF_STATUS_SUCCESS)
return status; return status;
@@ -19799,7 +19805,7 @@ struct hdd_is_connection_in_progress_priv {
/** /**
* hdd_is_connection_in_progress_iterator() - Check adapter connection based * hdd_is_connection_in_progress_iterator() - Check adapter connection based
* on device mode * on device mode
* @adapter: current adapter of interest * @link_info: Link info pointer in HDD adapter
* @ctx: user context supplied * @ctx: user context supplied
* *
* Check if connection is in progress for the current adapter according to the * Check if connection is in progress for the current adapter according to the
@@ -19809,9 +19815,9 @@ struct hdd_is_connection_in_progress_priv {
* * QDF_STATUS_SUCCESS if iteration should continue * * QDF_STATUS_SUCCESS if iteration should continue
* * QDF_STATUS_E_ABORTED if iteration should be aborted * * QDF_STATUS_E_ABORTED if iteration should be aborted
*/ */
static QDF_STATUS hdd_is_connection_in_progress_iterator( static QDF_STATUS
struct hdd_adapter *adapter, hdd_is_connection_in_progress_iterator(struct wlan_hdd_link_info *link_info,
void *ctx) void *ctx)
{ {
struct hdd_station_ctx *hdd_sta_ctx; struct hdd_station_ctx *hdd_sta_ctx;
uint8_t *sta_mac; uint8_t *sta_mac;
@@ -19819,13 +19825,15 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
mac_handle_t mac_handle; mac_handle_t mac_handle;
struct hdd_station_info *sta_info, *tmp = NULL; struct hdd_station_info *sta_info, *tmp = NULL;
struct hdd_is_connection_in_progress_priv *context = ctx; struct hdd_is_connection_in_progress_priv *context = ctx;
struct hdd_adapter *adapter = link_info->adapter;
hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (!hdd_ctx) if (!hdd_ctx)
return QDF_STATUS_E_ABORTED; return QDF_STATUS_E_ABORTED;
mac_handle = hdd_ctx->mac_handle; mac_handle = hdd_ctx->mac_handle;
if (!test_bit(SME_SESSION_OPENED, &adapter->deflink->link_flags) &&
if (!test_bit(SME_SESSION_OPENED, &link_info->link_flags) &&
(adapter->device_mode == QDF_STA_MODE || (adapter->device_mode == QDF_STA_MODE ||
adapter->device_mode == QDF_P2P_CLIENT_MODE || adapter->device_mode == QDF_P2P_CLIENT_MODE ||
adapter->device_mode == QDF_P2P_DEVICE_MODE || adapter->device_mode == QDF_P2P_DEVICE_MODE ||
@@ -19836,12 +19844,12 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
if ((QDF_STA_MODE == adapter->device_mode || if ((QDF_STA_MODE == adapter->device_mode ||
QDF_P2P_CLIENT_MODE == adapter->device_mode || QDF_P2P_CLIENT_MODE == adapter->device_mode ||
QDF_P2P_DEVICE_MODE == adapter->device_mode) && QDF_P2P_DEVICE_MODE == adapter->device_mode) &&
hdd_cm_is_connecting(adapter->deflink)) { hdd_cm_is_connecting(link_info)) {
hdd_debug("%pK(%d) mode %d Connection is in progress", hdd_debug("%pK(%d) mode %d Connection is in progress",
WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink), WLAN_HDD_GET_STATION_CTX_PTR(link_info),
adapter->deflink->vdev_id, adapter->device_mode); link_info->vdev_id, adapter->device_mode);
context->out_vdev_id = adapter->deflink->vdev_id; context->out_vdev_id = link_info->vdev_id;
context->out_reason = CONNECTION_IN_PROGRESS; context->out_reason = CONNECTION_IN_PROGRESS;
context->connection_in_progress = true; context->connection_in_progress = true;
@@ -19849,12 +19857,12 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
} }
if ((QDF_STA_MODE == adapter->device_mode) && if ((QDF_STA_MODE == adapter->device_mode) &&
sme_roaming_in_progress(mac_handle, adapter->deflink->vdev_id)) { sme_roaming_in_progress(mac_handle, link_info->vdev_id)) {
hdd_debug("%pK(%d) mode %d Reassociation in progress", hdd_debug("%pK(%d) mode %d Reassociation in progress",
WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink), WLAN_HDD_GET_STATION_CTX_PTR(link_info),
adapter->deflink->vdev_id, adapter->device_mode); link_info->vdev_id, adapter->device_mode);
context->out_vdev_id = adapter->deflink->vdev_id; context->out_vdev_id = link_info->vdev_id;
context->out_reason = REASSOC_IN_PROGRESS; context->out_reason = REASSOC_IN_PROGRESS;
context->connection_in_progress = true; context->connection_in_progress = true;
return QDF_STATUS_E_ABORTED; return QDF_STATUS_E_ABORTED;
@@ -19864,16 +19872,16 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
(QDF_P2P_CLIENT_MODE == adapter->device_mode) || (QDF_P2P_CLIENT_MODE == adapter->device_mode) ||
(QDF_P2P_DEVICE_MODE == adapter->device_mode)) { (QDF_P2P_DEVICE_MODE == adapter->device_mode)) {
hdd_sta_ctx = hdd_sta_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink); WLAN_HDD_GET_STATION_CTX_PTR(link_info);
if (hdd_cm_is_vdev_associated(adapter->deflink) if (hdd_cm_is_vdev_associated(link_info)
&& sme_is_sta_key_exchange_in_progress( && sme_is_sta_key_exchange_in_progress(
mac_handle, adapter->deflink->vdev_id)) { mac_handle, link_info->vdev_id)) {
sta_mac = (uint8_t *)&(adapter->mac_addr.bytes[0]); sta_mac = (uint8_t *)&(adapter->mac_addr.bytes[0]);
hdd_debug("client " QDF_MAC_ADDR_FMT hdd_debug("client " QDF_MAC_ADDR_FMT
" is in middle of WPS/EAPOL exchange.", " is in middle of WPS/EAPOL exchange.",
QDF_MAC_ADDR_REF(sta_mac)); QDF_MAC_ADDR_REF(sta_mac));
context->out_vdev_id = adapter->deflink->vdev_id; context->out_vdev_id = link_info->vdev_id;
context->out_reason = EAPOL_IN_PROGRESS; context->out_reason = EAPOL_IN_PROGRESS;
context->connection_in_progress = true; context->connection_in_progress = true;
@@ -19896,7 +19904,7 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
" of SAP/GO is in middle of WPS/EAPOL exchange", " of SAP/GO is in middle of WPS/EAPOL exchange",
QDF_MAC_ADDR_REF(sta_mac)); QDF_MAC_ADDR_REF(sta_mac));
context->out_vdev_id = adapter->deflink->vdev_id; context->out_vdev_id = link_info->vdev_id;
context->out_reason = SAP_EAPOL_IN_PROGRESS; context->out_reason = SAP_EAPOL_IN_PROGRESS;
context->connection_in_progress = true; context->connection_in_progress = true;
@@ -19912,9 +19920,9 @@ static QDF_STATUS hdd_is_connection_in_progress_iterator(
} }
if (hdd_ctx->connection_in_progress) { if (hdd_ctx->connection_in_progress) {
hdd_debug("AP/GO: vdev %d connection is in progress", hdd_debug("AP/GO: vdev %d connection is in progress",
adapter->deflink->vdev_id); link_info->vdev_id);
context->out_reason = SAP_CONNECTION_IN_PROGRESS; context->out_reason = SAP_CONNECTION_IN_PROGRESS;
context->out_vdev_id = adapter->deflink->vdev_id; context->out_vdev_id = link_info->vdev_id;
context->connection_in_progress = true; context->connection_in_progress = true;
return QDF_STATUS_E_ABORTED; return QDF_STATUS_E_ABORTED;