penguin/monok8s

k8s image for Mono Gateway Dev Kit

patches/ask/dpa/0002-cdx-harden-fman-port-lookup.patch

raw ยท 5182 bytes

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: monok8s <monok8s@example.invalid>
Date: Sun, 10 May 2026 00:00:00 +0000
Subject: [PATCH 2/4] cdx: harden FMAN port lookup

The DPA userspace loader passes FMC-derived port metadata into the CDX
ioctl. If an Ethernet netdev has a partially initialized DPAA private
structure, find_osdev_by_fman_params() can dereference a missing mac_dev
or FM wrapper pointer while trying to match the FMC port.

Add lookup diagnostics and hard NULL guards so a mismatched board
model returns -ENODEV instead of oopsing the kernel.
---
 cdx/devman.c  | 85 +++++++++++++++++++++++++++++++++++++--------------
 cdx/dpa_cfg.c | 18 ++++++++---
 2 files changed, 76 insertions(+), 27 deletions(-)

diff -urN a/cdx/devman.c b/cdx/devman.c
--- a/cdx/devman.c	2026-05-10 00:32:28.745375897 +0000
+++ b/cdx/devman.c	2026-05-10 00:32:29.834300280 +0000
@@ -396,39 +396,74 @@
 		uint32_t speed)
 {
 	struct net_device *device;
-	struct dpa_priv_s *priv;	
-	struct mac_device *macdev;
+
+	DPA_INFO("%s::lookup fm %u port %u speed %uG\n",
+			__func__, fm_idx, port_idx, speed);
 
 	device = first_net_device(&init_net);
-	while(1) {
-		if (!device) 
-			break;
-		if (device->type == ARPHRD_ETHER) {
-			t_LnxWrpFmDev *p_LnxWrpFmDev;
-			priv = netdev_priv(device);
-			macdev = priv->mac_dev;
-			if (macdev) {
-				p_LnxWrpFmDev = (t_LnxWrpFmDev*)macdev->fm;
-				if (speed == 10) {
-					//10 gig interfaces upports only SUPPORTED_10000baseT_Full
-					/*DGW board has 2 fixed-link interfaces 
-						1 - (eth2)(xDSL)1G Fixed link interface linked to rgmii-txid
-						2 - eth5(G.fast)- 1G Fixed link interface linked to sgmii and
-						connected to 10G link of the board.
-						sgmii - considered as 1000baseT_Full and this has cell_index = 0*/
-
-					if ( (!macdev->fixed_link) && (macdev->if_support != SUPPORTED_10000baseT_Full) )
-						goto next_device; 
-				}
-				if ((fm_idx == p_LnxWrpFmDev->id) && 
-						(port_idx == macdev->cell_index))
-					return device;
-			}
+	while (device) {
+		struct dpa_priv_s *priv;
+		struct mac_device *macdev;
+		t_LnxWrpFmDev *p_LnxWrpFmDev;
+
+		if (device->type != ARPHRD_ETHER)
+			goto next_device;
+
+		priv = netdev_priv(device);
+		if (!priv) {
+			DPA_INFO("%s::skip %s: null private data\n",
+					__func__, device->name);
+			goto next_device;
+		}
+
+		macdev = priv->mac_dev;
+		if (!macdev) {
+			DPA_INFO("%s::skip %s: null mac_dev\n",
+					__func__, device->name);
+			goto next_device;
+		}
+
+		if (!macdev->fm) {
+			DPA_INFO("%s::skip %s: null mac_dev->fm cell_index %u max_speed %u fixed_link %u if_support 0x%x\n",
+					__func__, device->name, macdev->cell_index,
+					macdev->max_speed, macdev->fixed_link,
+					macdev->if_support);
+			goto next_device;
 		}
+
+		p_LnxWrpFmDev = (t_LnxWrpFmDev *)macdev->fm;
+		DPA_INFO("%s::candidate %s fm %u cell_index %u max_speed %u fixed_link %u if_support 0x%x\n",
+				__func__, device->name, p_LnxWrpFmDev->id,
+				macdev->cell_index, macdev->max_speed,
+				macdev->fixed_link, macdev->if_support);
+
+		if (speed == 10) {
+			//10 gig interfaces upports only SUPPORTED_10000baseT_Full
+			/*DGW board has 2 fixed-link interfaces
+				1 - (eth2)(xDSL)1G Fixed link interface linked to rgmii-txid
+				2 - eth5(G.fast)- 1G Fixed link interface linked to sgmii and
+				connected to 10G link of the board.
+				sgmii - considered as 1000baseT_Full and this has cell_index = 0*/
+
+			if ((!macdev->fixed_link) &&
+					(macdev->if_support != SUPPORTED_10000baseT_Full))
+				goto next_device;
+		}
+
+		if ((fm_idx == p_LnxWrpFmDev->id) &&
+				(port_idx == macdev->cell_index)) {
+			DPA_INFO("%s::matched %s for fm %u port %u speed %uG\n",
+					__func__, device->name, fm_idx, port_idx, speed);
+			return device;
+		}
+
 next_device:
 		device = next_net_device(device);
 	}
-	return device;
+
+	DPA_ERROR("%s::no OS device found for fm %u port %u speed %uG\n",
+			__func__, fm_idx, port_idx, speed);
+	return NULL;
 }
 
 
diff -urN a/cdx/dpa_cfg.c b/cdx/dpa_cfg.c
--- a/cdx/dpa_cfg.c	2026-05-10 00:32:28.757992164 +0000
+++ b/cdx/dpa_cfg.c	2026-05-10 00:32:51.954850425 +0000
@@ -301,15 +301,21 @@
 		struct net_device *dev;
 
 		if (port_info->type) {
+			DPA_INFO("%s::mapping user port %s fm %u index %u portid %u type %uG\n",
+					__func__, port_info->name, port_info->fm_index,
+					port_info->index, port_info->portid, port_info->type);
 			dev = find_osdev_by_fman_params(port_info->fm_index,
 					port_info->index, port_info->type);
 			if (!dev) {
-				DPA_ERROR("%s::could not map port %s\n",
-						__func__, port_info->name);
-				return -EIO;
-			} else {
-				strcpy(port_info->name, dev->name);
+				DPA_ERROR("%s::could not map port %s fm %u index %u portid %u type %uG\n",
+						__func__, port_info->name,
+						port_info->fm_index, port_info->index,
+						port_info->portid, port_info->type);
+				return -ENODEV;
 			}
+			DPA_INFO("%s::mapped user port %s to netdev %s\n",
+					__func__, port_info->name, dev->name);
+			strscpy(port_info->name, dev->name, sizeof(port_info->name));
 		}
 #ifdef DPA_CFG_DEBUG
 		DPA_INFO("%s::port %s, fmindex %d, port index %d, port id %d\n",