From eea57c01963b6c21d792dd1ca35daa76f053a39f Mon Sep 17 00:00:00 2001 From: Amit Mehta Date: Mon, 1 Aug 2022 04:29:00 -0700 Subject: [PATCH] qcacld-3.0: Get DP interface by netdev Currently while attaching vdev to DP interface we are searching DP interface based on the Adapter MAC address, but if STA MLD and Link address is same, we were getting the Link Interface instead of MLD interface, which was causing the EAPOL packet to drop. To Fix the issue, instead of searching for DP interface based on MAC address, use netdev to search DP interface. Change-Id: I50c7974c053717b496fab0eeb89774af382b4313 CRs-Fixed: 3258684 --- components/dp/core/src/wlan_dp_main.c | 17 +++--- .../dp/dispatcher/inc/wlan_dp_public_struct.h | 5 +- .../dp/dispatcher/src/wlan_dp_ucfg_api.c | 4 +- core/hdd/src/wlan_hdd_main.c | 54 +++++++++++++------ 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/components/dp/core/src/wlan_dp_main.c b/components/dp/core/src/wlan_dp_main.c index 2902703c2c..bc7729b76d 100644 --- a/components/dp/core/src/wlan_dp_main.c +++ b/components/dp/core/src/wlan_dp_main.c @@ -136,8 +136,7 @@ dp_get_intf_by_netdev(struct wlan_dp_psoc_context *dp_ctx, qdf_netdev_t dev) qdf_spin_lock_bh(&dp_ctx->intf_list_lock); for (dp_get_front_intf_no_lock(dp_ctx, &dp_intf); dp_intf; dp_get_next_intf_no_lock(dp_ctx, dp_intf, &dp_intf)) { - if (!qdf_str_cmp(qdf_netdev_get_devname(dp_intf->dev), - qdf_netdev_get_devname(dev))) { + if (dp_intf->dev == dev) { qdf_spin_unlock_bh(&dp_ctx->intf_list_lock); return dp_intf; } @@ -887,7 +886,7 @@ dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg) struct wlan_dp_intf *dp_intf; QDF_STATUS status = QDF_STATUS_SUCCESS; struct qdf_mac_addr *mac_addr; - struct qdf_mac_addr intf_mac; + qdf_netdev_t dev; dp_info("DP VDEV OBJ create notification"); @@ -900,18 +899,18 @@ dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg) dp_ctx = dp_psoc_get_priv(psoc); mac_addr = (struct qdf_mac_addr *)wlan_vdev_mlme_get_macaddr(vdev); - status = dp_ctx->dp_ops.dp_get_nw_intf_mac_by_vdev_mac(mac_addr, - &intf_mac); - if (QDF_IS_STATUS_ERROR(status)) { + dev = dp_ctx->dp_ops.dp_get_netdev_by_vdev_mac(mac_addr); + if (!dev) { dp_err("Failed to get intf mac:" QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(mac_addr)); return QDF_STATUS_E_INVAL; } - dp_intf = dp_get_intf_by_macaddr(dp_ctx, &intf_mac); + dp_intf = dp_get_intf_by_netdev(dp_ctx, dev); if (!dp_intf) { - dp_err("Failed to get dp intf mac:" QDF_MAC_ADDR_FMT, - QDF_MAC_ADDR_REF(mac_addr)); + dp_err("Failed to get dp intf dev: %s", + qdf_netdev_get_devname(dev)); + return QDF_STATUS_E_INVAL; } diff --git a/components/dp/dispatcher/inc/wlan_dp_public_struct.h b/components/dp/dispatcher/inc/wlan_dp_public_struct.h index e84b58aa35..7624cf9669 100644 --- a/components/dp/dispatcher/inc/wlan_dp_public_struct.h +++ b/components/dp/dispatcher/inc/wlan_dp_public_struct.h @@ -562,8 +562,8 @@ union wlan_tp_data { /** * struct wlan_dp_psoc_callbacks - struct containing callback * to non-converged driver - * @os_if_dp_gro_rx: OS IF Callback to handle GRO packet to n/w stack * @callback_ctx : Opaque callback context + * @dp_get_netdev_by_vdev_mac: Callback to get netdev from vdev mac address * @wlan_dp_sta_get_dot11mode: Callback to get dot11 mode * @wlan_dp_get_ap_client_count: Callback to get client count connected to AP * @wlan_dp_sta_ndi_connected: Callback to get NDI connected status @@ -591,8 +591,7 @@ union wlan_tp_data { struct wlan_dp_psoc_callbacks { hdd_cb_handle callback_ctx; - QDF_STATUS (*dp_get_nw_intf_mac_by_vdev_mac)(struct qdf_mac_addr *mac_addr, - struct qdf_mac_addr *intf_mac); + qdf_netdev_t (*dp_get_netdev_by_vdev_mac)(struct qdf_mac_addr *mac_addr); unsigned int (*dp_get_tx_flow_low_watermark)(hdd_cb_handle cb_ctx, uint8_t intf_id); void (*dp_get_tx_resource)(uint8_t intf_id, struct qdf_mac_addr *mac_addr); diff --git a/components/dp/dispatcher/src/wlan_dp_ucfg_api.c b/components/dp/dispatcher/src/wlan_dp_ucfg_api.c index beb786ff5e..db7162a410 100644 --- a/components/dp/dispatcher/src/wlan_dp_ucfg_api.c +++ b/components/dp/dispatcher/src/wlan_dp_ucfg_api.c @@ -1895,8 +1895,8 @@ void ucfg_dp_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc, dp_ctx->dp_ops.dp_tsf_timestamp_rx = cb_obj->dp_tsf_timestamp_rx; dp_ctx->dp_ops.dp_gro_rx_legacy_get_napi = cb_obj->dp_gro_rx_legacy_get_napi; - dp_ctx->dp_ops.dp_get_nw_intf_mac_by_vdev_mac = - cb_obj->dp_get_nw_intf_mac_by_vdev_mac; + dp_ctx->dp_ops.dp_get_netdev_by_vdev_mac = + cb_obj->dp_get_netdev_by_vdev_mac; dp_ctx->dp_ops.dp_nbuf_push_pkt = cb_obj->dp_nbuf_push_pkt; dp_ctx->dp_ops.dp_rx_napi_gro_flush = cb_obj->dp_rx_napi_gro_flush; diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index df95cb9be9..67cc86f6dc 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4835,9 +4835,16 @@ hdd_set_mld_address(struct hdd_adapter *adapter, struct hdd_context *hdd_ctx, } } -static QDF_STATUS -hdd_get_nw_adapter_mac_by_vdev_mac(struct qdf_mac_addr *mac_addr, - struct qdf_mac_addr *adapter_mac) +/** + * hdd_get_netdev_by_vdev_mac() - Get Netdev based on MAC + * @mac_addr: Vdev MAC address + * + * Get netdev from adapter based upon Vdev MAC address. + * + * Return: netdev pointer. + */ +static qdf_netdev_t +hdd_get_netdev_by_vdev_mac(struct qdf_mac_addr *mac_addr) { struct hdd_context *hdd_ctx; struct hdd_adapter *adapter; @@ -4846,24 +4853,23 @@ hdd_get_nw_adapter_mac_by_vdev_mac(struct qdf_mac_addr *mac_addr, hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); if (!hdd_ctx) { hdd_err("Invalid HDD context"); - return QDF_STATUS_E_INVAL; + return NULL; } adapter = hdd_get_adapter_by_macaddr(hdd_ctx, mac_addr->bytes); if (!adapter) { - hdd_err("Invalid Adapter context"); - return QDF_STATUS_E_INVAL; + hdd_err("Adapter not foud for MAC " QDF_MAC_ADDR_FMT "", + QDF_MAC_ADDR_REF(mac_addr)); + return NULL; } if (adapter->mlo_adapter_info.is_link_adapter && adapter->mlo_adapter_info.associate_with_ml_adapter) { ml_adapter = adapter->mlo_adapter_info.ml_adapter; - qdf_copy_macaddr(adapter_mac, &ml_adapter->mac_addr); - } else { - qdf_copy_macaddr(adapter_mac, &adapter->mac_addr); + adapter = ml_adapter; } - return QDF_STATUS_SUCCESS; + return adapter->dev; } #else static void @@ -4872,12 +4878,26 @@ hdd_set_mld_address(struct hdd_adapter *adapter, struct hdd_context *hdd_ctx, { } -static QDF_STATUS -hdd_get_nw_adapter_mac_by_vdev_mac(struct qdf_mac_addr *mac_addr, - struct qdf_mac_addr *adapter_mac) +static qdf_netdev_t +hdd_get_netdev_by_vdev_mac(struct qdf_mac_addr *mac_addr) { - qdf_copy_macaddr(adapter_mac, mac_addr); - return QDF_STATUS_SUCCESS; + struct hdd_context *hdd_ctx; + struct hdd_adapter *adapter; + + hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + if (!hdd_ctx) { + hdd_err("Invalid HDD context"); + return NULL; + } + + adapter = hdd_get_adapter_by_macaddr(hdd_ctx, mac_addr->bytes); + if (!adapter) { + hdd_err("Adapter not foud for MAC " QDF_MAC_ADDR_FMT "", + QDF_MAC_ADDR_REF(mac_addr)); + return NULL; + } + + return adapter->dev; } #endif @@ -10472,8 +10492,8 @@ static void hdd_dp_register_callbacks(struct hdd_context *hdd_ctx) cb_obj.dp_nud_failure_work = hdd_nud_failure_work; cb_obj.dp_get_pause_map = hdd_get_pause_map; - cb_obj.dp_get_nw_intf_mac_by_vdev_mac = - hdd_get_nw_adapter_mac_by_vdev_mac; + cb_obj.dp_get_netdev_by_vdev_mac = + hdd_get_netdev_by_vdev_mac; cb_obj.dp_get_tx_resource = hdd_get_tx_resource; cb_obj.dp_get_tx_flow_low_watermark = hdd_get_tx_flow_low_watermark; cb_obj.dp_get_tsf_time = hdd_get_tsf_time_cb;