Bläddra i källkod

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
Amit Mehta 2 år sedan
förälder
incheckning
eea57c0196

+ 8 - 9
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;
 	}
 

+ 2 - 3
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);

+ 2 - 2
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;

+ 37 - 17
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;