From nobody Sun Feb 8 18:31:29 2026 Received: from mail-pl1-f225.google.com (mail-pl1-f225.google.com [209.85.214.225]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 787E9346AE6 for ; Wed, 21 Jan 2026 07:36:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768980967; cv=none; b=aA2Fa5zP544BP4gimolhxoFcnq9AcufYHEw3nUuxjF6hqZj+IcaAWHlpFVFwZtHy0GvXr4+4Uf4L16oMKvZjH3GGraf+uGxZ1HVQcsFzrZDm475ACgSGLHlRSGcg1XHLhthj6e8KjhWiw3xXexJobv3SopLaph2C+bKRkjuq1S8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768980967; c=relaxed/simple; bh=nL6sr6Ekrqcih+FjUGdb919SiseL/nETfdZ1kimdsR0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TOxyOebi1BX5lPAU+E0wM2K1LVeUGZ5DxqWYPb/7iPTxNMnnA8kR6dCzC/gvZd3HxqQDy+9X1p2s0I/+//tGu24y0z++DIb56/rv7NbN4qgV6hCcb3mHut0FWZET1pJ3t6RhwHc3opfXHgmw+ITAxGwV7YRjKkpn6+bptxHeGGM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=ZrWDQfs4; arc=none smtp.client-ip=209.85.214.225 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="ZrWDQfs4" Received: by mail-pl1-f225.google.com with SMTP id d9443c01a7336-2a12ed4d205so38504595ad.0 for ; Tue, 20 Jan 2026 23:36:05 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768980964; x=1769585764; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IPRVbPwF+wXnXIym+qvc8QVBDwbNyNX7SjLMFiSMDaA=; b=hT/K3ftLTckJvtbp/jdu8RaN7S4lZ6sysmibjorzjP0d+QE9dZYUcR6+6F9vFhIGzY vv86jtawEj/EuALPOfFVFJmyVbGxTPwkULWBHq446rhevdpo0cV0qIEkkgUVCqS3HVVk Z4Z3lpirY8toTZSAU15oaJCxAa5krhX1TkrudwUtICOL7kYvvFw3MJv0cSOZ6u6Ea6BB Yolusm7Y0lYdxjFxlzciciW77mr5NYEL2Dpvi2BSIy2p/WhvNS3lwknqxi7UyG0YCm7i PqPIMR3xZAHXpTkWmxdFcDD/41rOXLxhMO1Uf1Q0ksl6e6FDtU1bhnOa25AnCuH1fzm6 T1IQ== X-Forwarded-Encrypted: i=1; AJvYcCWFX9QPgl8IZsM2XTH5FYtCdoSIT5VkUcVgdr/ezRc1y8mF96Ncm6hBTQonXS+m/ZsESEMqT3q59yZrmhc=@vger.kernel.org X-Gm-Message-State: AOJu0Yyc0YpkG60CaHdnTCXzTmbKlTUF71L/s/ykP1USoOwtmogeRx96 PUDuwCL5+JKGREYYLEAT5ltMYHizb+XItQlMKPCvxX7LZsDL6E0wqJdSEr99lckOsPBiAM2DmzR XqdMOPgCOpKQtQ6Cg71OtDUfk3eAIPNKSH66ruLv8stLHlzVegBlhib54edyCAZ0a+95lkyDOCs RaqLvjPNtV/+TRCmecedZurCGwKnFdS+MBJuOo0RBNzyMAmD9Zj9KswtXd36Gqv7Sd2amKOg+R9 uzookYIUS9jbfpkmKLC X-Gm-Gg: AZuq6aJnoN9QeMkfzhz/j7AUjs1i27tqXgbs0TZ5LRS7L3kmZbFCfxyN+HAxLJeRhgb TZnIwSkJ7U1GYRpWcEIokXr+XLVZdgEPnvrujWMCPzz+BWRCEKEJ5nhu+MKXCGAWJpmk2Zd5d0w giANf9nMshPNeNAbLY6GI+wAWtz5cBvuDX/dW4MvIl966WuPWuLwnNoqWn/S/aiAOXCswAvPLDw t2EIqtGWjSRS5B+bownktpG4D4ptUEqCrqgHiYSUuZvZJ8gBJzAz9Mogy2hrH+On64tc47bKtVC haJ84JvsTBrEf6W48sbfI7nrXEuSf/3PlK/UEg4v3FnsbcZGMeB2BLDS2nFcDKAnhDiC8RiIB/j BPXQvU79RC6oymSIOrI0LGU9mevKcbJuN7XzAbDpFq8Ugft5yJILEe6L/FhNpIp/5Q2Z/7rsxtQ cGbGX2w1MRtfxJ2XJ4fVwSOxSclR4lM7aK6ifUjBwo X-Received: by 2002:a17:903:120d:b0:2a7:aa9e:fb40 with SMTP id d9443c01a7336-2a7aa9efcabmr7659415ad.45.1768980964416; Tue, 20 Jan 2026 23:36:04 -0800 (PST) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-2.dlp.protect.broadcom.com. [144.49.247.2]) by smtp-relay.gmail.com with ESMTPS id d9443c01a7336-2a79e174f39sm2097425ad.27.2026.01.20.23.36.04 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Jan 2026 23:36:04 -0800 (PST) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-8946448adbdso40586046d6.1 for ; Tue, 20 Jan 2026 23:36:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1768980963; x=1769585763; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=IPRVbPwF+wXnXIym+qvc8QVBDwbNyNX7SjLMFiSMDaA=; b=ZrWDQfs4mx3KruX54fLgv0qIZKL4h8LrHqMvrmC/BVDEZHc065oEYm6raK0I3O8Jq7 7z6n3s4ll6LY0XZjdEFVwtxDQopMAePgpQLSarqQw3ZKkRd97Lnk2KWT3Pk3xGr4AX76 PPXzmYiLtdMM5Q6Nwd2Xmbgg8eQ2IqhMJWugg= X-Forwarded-Encrypted: i=1; AJvYcCVD7bEjPGjOs+DuodMv+d74QJtzPyC6Hy7CKDYaIq/YfDNhpnGqXSA1C/Qy09fSxmnBGE46a8oVDZIUCLs=@vger.kernel.org X-Received: by 2002:a05:6214:29c2:b0:893:348e:4126 with SMTP id 6a1803df08f44-8942e52179fmr267876956d6.61.1768980963172; Tue, 20 Jan 2026 23:36:03 -0800 (PST) X-Received: by 2002:a05:6214:29c2:b0:893:348e:4126 with SMTP id 6a1803df08f44-8942e52179fmr267876746d6.61.1768980962761; Tue, 20 Jan 2026 23:36:02 -0800 (PST) Received: from lvnvda4076.lvn.broadcom.net ([192.19.161.250]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-894592ba642sm51439736d6.57.2026.01.20.23.36.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Jan 2026 23:36:02 -0800 (PST) From: Kiran Kella To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, jayakrishnan.udayavarma@broadcom.com, ajit.khaparde@broadcom.com, akhilesh.samineni@broadcom.com, Kiran Kella Subject: [net-next 1/2] psp: Support for transmit on logical device when the underlying transport device supports PSP. Date: Tue, 20 Jan 2026 23:35:16 -0800 Message-ID: <20260121073517.3323332-2-kiran.kella@broadcom.com> X-Mailer: git-send-email 2.45.4 In-Reply-To: <20260121073517.3323332-1-kiran.kella@broadcom.com> References: <20260121073517.3323332-1-kiran.kella@broadcom.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" This is achieved by propagating the psp_dev from the lower device to the upper devices in the device stack via a netdevice notifier. The lowest device owns the psp_dev pointer while the upper devices just borrow the pointer. When the lower device is unlinked, the borrowed pointer is cleared in the upper device. Assumption being that psp_dev is set on the lowest device before any upper devices stack are linked on that lowest device at a later point of time. In case of bond devices: - If an upper device has multiple lower devices, the psp_dev is not propogated as it would be ambiguous which slave will be used for transmission. - If a bond device transitions from having one slave device to multiple slaves, any previously borrowed psp_dev pointer is cleared to avoid ambiguity. Signed-off-by: Kiran Kella Reviewed-by: Ajit Kumar Khaparde Reviewed-by: Akhilesh Samineni --- net/psp/psp_main.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/net/psp/psp_main.c b/net/psp/psp_main.c index a8534124f626..0bff50c9314d 100644 --- a/net/psp/psp_main.c +++ b/net/psp/psp_main.c @@ -313,10 +313,124 @@ int psp_dev_rcv(struct sk_buff *skb, u16 dev_id, u8 = generation, bool strip_icv) } EXPORT_SYMBOL(psp_dev_rcv); =20 +/** + * psp_netdevice_event() - Handle netdevice events for PSP device propagat= ion + * @nb: notifier block + * @event: netdevice event + * @ptr: netdevice notifier info + * + * Propagates psp_dev pointer from lower devices to upper devices when + * upper devices are created (e.g., VLAN subinterfaces). + */ +static int psp_netdevice_event(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct netdev_notifier_changeupper_info *info; + struct net_device *dev, *upper_dev; + struct psp_dev *psd; + + if (event !=3D NETDEV_CHANGEUPPER) + return NOTIFY_DONE; + + info =3D ptr; + dev =3D netdev_notifier_info_to_dev(ptr); + upper_dev =3D info->upper_dev; + + if (info->linking) { + bool has_multiple_lowers =3D false; + struct list_head *iter; + + /* Lower device is being linked to an upper device. + * Propagate psp_dev from the immediate lower device to the + * upper device. The immediate lower device would have already + * got the psp_dev pointer set in a previous notification (or + * owns it if it's the lowest device), + * Upper devices just borrow the pointer. + * + * However, if the upper device has multiple lower devices, + * don't propagate psp_dev as it would be ambiguous + * which slave will be used for transmission (eg., bond device). + * If the upper device already has psp_dev set and is getting + * a second lower device, clear the psp_dev. + */ + + rcu_read_lock(); + iter =3D &upper_dev->adj_list.lower; + /* Check if there's a second lower device */ + if (netdev_next_lower_dev_rcu(upper_dev, &iter)) + if (netdev_next_lower_dev_rcu(upper_dev, &iter)) + has_multiple_lowers =3D true; + + /* If upper device now has multiple lower devices, clear psp_dev + * if it was previously set (from when it had only one slave). + */ + if (has_multiple_lowers) { + psd =3D rcu_dereference(upper_dev->psp_dev); + rcu_read_unlock(); + if (psd) + rcu_assign_pointer(upper_dev->psp_dev, NULL); + + return NOTIFY_DONE; + } + + /* Get psp_dev from the immediate lower device */ + psd =3D rcu_dereference(dev->psp_dev); + rcu_read_unlock(); + + /* Propagate psp_dev to upper device if found */ + if (psd) + rcu_assign_pointer(upper_dev->psp_dev, psd); + } else { + struct net_device *remaining_lower =3D NULL; + bool has_single_lower =3D false; + struct list_head *iter; + + /* Lower device is being unlinked from an upper device. + * After unlinking, check if the upper device now has exactly + * one lower device remaining. If so, propagate psp_dev from + * that remaining lower device to the upper device. + */ + + rcu_read_lock(); + iter =3D &upper_dev->adj_list.lower; + remaining_lower =3D netdev_next_lower_dev_rcu(upper_dev, &iter); + /* Check if there's a second lower device */ + if (remaining_lower) + if (!netdev_next_lower_dev_rcu(upper_dev, &iter)) + has_single_lower =3D true; + + if (has_single_lower) { + /* Upper device now has exactly one lower device. + * Propagate psp_dev from the remaining lower device. + */ + psd =3D rcu_dereference(remaining_lower->psp_dev); + rcu_read_unlock(); + if (psd) + rcu_assign_pointer(upper_dev->psp_dev, psd); + } else { + /* Upper device has zero or multiple lower devices. + * Clear psp_dev if it was previously set. + */ + psd =3D rcu_dereference(upper_dev->psp_dev); + rcu_read_unlock(); + if (psd) + rcu_assign_pointer(upper_dev->psp_dev, NULL); + } + } + + return NOTIFY_DONE; +} + +static struct notifier_block psp_netdevice_notifier =3D { + .notifier_call =3D psp_netdevice_event, +}; + static int __init psp_init(void) { mutex_init(&psp_devs_lock); =20 + register_netdevice_notifier(&psp_netdevice_notifier); + return genl_register_family(&psp_nl_family); } =20 --=20 2.45.4 From nobody Sun Feb 8 18:31:29 2026 Received: from mail-dy1-f228.google.com (mail-dy1-f228.google.com [74.125.82.228]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB088376BCF for ; Wed, 21 Jan 2026 07:36:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768980971; cv=none; b=K9oW2EsbgCid9ZsQMalfITXHQjd7nxufkc2dNnJkI1elqcH5L74scuYkzxRjfgL3o8r60p1lTK+6MZDG5zCDb0eGIEVCTF2ulFwiXccrR5kTjMpgGAjXoIc5Q/xkrQuQoaDB8h26VjY1evD+TV+oDdFIqVkZ/Ey4UmBesXRPWeQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768980971; c=relaxed/simple; bh=eGIsvV3k8nobm8gxsUjvfDtP/GdTxHyAPFyisoAEnvM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XShrIJZBspi715pimv61O0EnLquxoFHJLMJsSz9lMSvAKM2qNMAez4lW+z9dENnYNQImXQ2nRq0QzDr6RmRo+zqVjzJrV7V8qOLS+Q36o7RgCmSmY12fsi/ltHV8tSP65KU2PIksizZLLymvzXJPzxxjv79dPHGlkvqvqcWeydY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=YWBKm4d0; arc=none smtp.client-ip=74.125.82.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="YWBKm4d0" Received: by mail-dy1-f228.google.com with SMTP id 5a478bee46e88-2b71515d8adso277608eec.1 for ; Tue, 20 Jan 2026 23:36:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768980969; x=1769585769; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZFRs/2/xUWr64s2Em1Um+RwUgbyhXVk/kopd42Lfxvw=; b=HBHz4P5cNyg8UqnnBCkqEnkJO91eJz/UYqPuECfzdjaDjhmlPpD04SQm7PQBYqLgq4 KaPdbh5hCx8xpu2uVn4kkDlp5oIjml1mi1FFqQH42BJwYH/CPxzLpHB+TFGrzhYNZHsP BlJMsHF+JvvMtjLIe6sqwwOAPmaoh1rwJFo3ikxfPqS+vO53szzCH4lEt0d3UkcgWo4T tOKvtrR+AO1tDYstiyzde1nKw/HJKbgZaGE1e64myJ4/c9Y5icTYS/ACTL0Yc6QcxUG6 2PRx9ltyfgrYZhZImXxaAalQ+iYbuRIqmiL47HVR8chY/WjHcmoAtono0iIhchCuWDB5 ddzg== X-Forwarded-Encrypted: i=1; AJvYcCW2Dreh0ZdNxibhV9HXYiZk5gfp8n8HwWD6bIzOB6y/mNsRJOfDIVQwsS1T9oootIrOwM8etomvGjMzjcQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzDf34JXYb/Z+IMpPgKFUoEViuMY30azEKJsW1/nK8j7CtZLn0m o5DzKgrkw9nZ24aAL4j8ptqUpJyOckRFpHuPW1mySwm3AIvr+mv+clCgBxp8g3bu9EhaVQJCO+S IokQpx4bbIx+noYnfrCvTR2pO1hLb6Bp0pyrUOBWipaO406gYr/4edhCzx7sSNUBRDGTDENXSV7 GZ4kicItabEalYa0tFzWQPFACwOPNcB+r0QeTgxbnJQj2LXzPVzC0mNhpNTke1xpK5PiUTr/hcz OJ+lni1j10CD2CqSA== X-Gm-Gg: AZuq6aItTIcIWe0jWVSMSQVd2RYDtnmnrwPtn8/GeQ8mGkCWkEpRnqr53t8PZv6S6oQ tNaIG8vOwHwLKVnCp++ehORSj7OhKhrBW68s0fplcCatJkxHaJ0uE+/4QETGP6aSSake4nFnbP9 CWWf0afqpLbozJgVc0RNV+VDqzarnj4i4eH4Y3OEifkZmdHwtAxIocm0BNqpB4MVVNddkJr7Tax 9kHsx804zj4SSSDzguIq7TpALFyfJZ5Y5EGWSDgCjM6uS54DrKCqYojFN89Oyj64cm/vuRFguCx sqKMXnh1Yt+brH3r2dJ1EfseBi6077Ym9rQNNV4AlRrP3tcKPGwjDROzhtsxkAHkYcPy6TCLRuU fOggYTgwNfKvf69rvIhj31Z7FHDRaB2wvcgUysNGowKa1isquZ/vgRAMZBXgSj2nboihHRGOpJw +SubbNB18nmSJs7B3gv45CNK5OBHexB70jjNOqibXZ X-Received: by 2002:a05:7300:8623:b0:2b0:5306:1773 with SMTP id 5a478bee46e88-2b6fd5d824cmr2548342eec.1.1768980968594; Tue, 20 Jan 2026 23:36:08 -0800 (PST) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-2.dlp.protect.broadcom.com. [144.49.247.2]) by smtp-relay.gmail.com with ESMTPS id 5a478bee46e88-2b6b336814esm1696935eec.0.2026.01.20.23.36.08 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 20 Jan 2026 23:36:08 -0800 (PST) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-890587d4e87so182114326d6.0 for ; Tue, 20 Jan 2026 23:36:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1768980967; x=1769585767; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZFRs/2/xUWr64s2Em1Um+RwUgbyhXVk/kopd42Lfxvw=; b=YWBKm4d0y/tDWooA7J1vV9Tf5Zj6hKGcGciAMoig0BXwb4ofZhYbrZFLklsn3vz/UQ U5vAw2cCgYjsBjlOpL8KsF3rfkpNuXCaRkMyMX4C9Iqj8i6KKaKQqix/zzwmvi9Keh6F NrMy/Dr1yh1XGQMRmbxSShirRA8d0KY12FrhQ= X-Forwarded-Encrypted: i=1; AJvYcCVLsBQO1uDKrhulJ6FKXYh+znF4wXcYNP+IlrMIz9iUNovg2xXF1MQnlU3usDYHtbTKSUUk0fLnXnJkWlg=@vger.kernel.org X-Received: by 2002:ad4:596a:0:b0:894:60a9:d45a with SMTP id 6a1803df08f44-894638f5e6fmr51128436d6.48.1768980967380; Tue, 20 Jan 2026 23:36:07 -0800 (PST) X-Received: by 2002:ad4:596a:0:b0:894:60a9:d45a with SMTP id 6a1803df08f44-894638f5e6fmr51128316d6.48.1768980967000; Tue, 20 Jan 2026 23:36:07 -0800 (PST) Received: from lvnvda4076.lvn.broadcom.net ([192.19.161.250]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-894592ba642sm51439736d6.57.2026.01.20.23.36.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 20 Jan 2026 23:36:06 -0800 (PST) From: Kiran Kella To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, jayakrishnan.udayavarma@broadcom.com, ajit.khaparde@broadcom.com, akhilesh.samineni@broadcom.com, Kiran Kella Subject: [net-next 2/2] selftests: drv-net: psp: add test for VLAN sub-interface Date: Tue, 20 Jan 2026 23:35:17 -0800 Message-ID: <20260121073517.3323332-3-kiran.kella@broadcom.com> X-Mailer: git-send-email 2.45.4 In-Reply-To: <20260121073517.3323332-1-kiran.kella@broadcom.com> References: <20260121073517.3323332-1-kiran.kella@broadcom.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Add test to validate that the psp device information is propagated properly from the lower device to the upper devices so that the PSP transmit validation passes. Signed-off-by: Kiran Kella Reviewed-by: Akhilesh Samineni --- tools/testing/selftests/drivers/net/psp.py | 117 ++++++++++++++++++++- 1 file changed, 115 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/drivers/net/psp.py b/tools/testing/sel= ftests/drivers/net/psp.py index 528a421ecf76..b0373d6b4998 100755 --- a/tools/testing/selftests/drivers/net/psp.py +++ b/tools/testing/selftests/drivers/net/psp.py @@ -17,7 +17,7 @@ from lib.py import ksft_not_none from lib.py import KsftSkipEx from lib.py import NetDrvEpEnv, PSPFamily, NlError from lib.py import bkg, rand_port, wait_port_listen - +from lib.py import ip =20 def _get_outq(s): one =3D b'\0' * 4 @@ -568,6 +568,119 @@ def removal_device_bi(cfg): finally: _close_conn(cfg, s) =20 +def vlan_basic_send(cfg): + """ + Test PSP over VLAN-to-VLAN traffic + + Network topology: + Local VLAN (nsim0.100) <---> Remote VLAN (nsim1.100) + | | + Local Physical (nsim0) <---> Remote Physical (nsim1) + [PSP configured here] + """ + cfg.require_nsim() + _init_psp_dev(cfg) + + # Store original interface names and addresses + orig_local_ifname =3D cfg.ifname + orig_local_ifindex =3D cfg.ifindex + orig_remote_ifname =3D cfg.remote_ifname + orig_local_addr_v4 =3D cfg.addr_v["4"] + orig_local_addr_v6 =3D cfg.addr_v["6"] + orig_remote_addr_v4 =3D cfg.remote_addr_v["4"] + orig_remote_addr_v6 =3D cfg.remote_addr_v["6"] + + # VLAN configuration + vlan_id =3D 100 + local_vlan_ifname =3D f"{orig_local_ifname}.{vlan_id}" + remote_vlan_ifname =3D f"{orig_remote_ifname}.{vlan_id}" + + local_vlan_addr_v4 =3D "192.0.2.21" + remote_vlan_addr_v4 =3D "192.0.2.22" + local_vlan_addr_v6 =3D "2001:db8::21" + remote_vlan_addr_v6 =3D "2001:db8::22" + + try: + # Create VLAN interface on LOCAL side + ip(f"link add link {orig_local_ifname} name {local_vlan_ifname} ty= pe vlan id {vlan_id}") + ip(f"addr add {local_vlan_addr_v4}/24 dev {local_vlan_ifname}") + ip(f"-6 addr add {local_vlan_addr_v6}/64 dev {local_vlan_ifname} n= odad") + ip(f"link set {local_vlan_ifname} up") + + # Create VLAN interface on REMOTE side + ip(f"link add link {orig_remote_ifname} name {remote_vlan_ifname} = type vlan id {vlan_id}", host=3Dcfg.remote) + ip(f"addr add {remote_vlan_addr_v4}/24 dev {remote_vlan_ifname}", = host=3Dcfg.remote) + ip(f"-6 addr add {remote_vlan_addr_v6}/64 dev {remote_vlan_ifname}= nodad", host=3Dcfg.remote) + ip(f"link set {remote_vlan_ifname} up", host=3Dcfg.remote) + + # Get VLAN interface indices + local_vlan_info =3D ip(f"-j link show {local_vlan_ifname}", json= =3DTrue)[0] + local_vlan_ifindex =3D local_vlan_info['ifindex'] + + remote_vlan_info =3D ip(f"-j link show {remote_vlan_ifname}", json= =3DTrue, host=3Dcfg.remote)[0] + remote_vlan_ifindex =3D remote_vlan_info['ifindex'] + + # Temporarily switch cfg to use VLAN interfaces + # The PSP device is still on the physical interface, but + # the socket will be bound to the VLAN interface + cfg.ifname =3D local_vlan_ifname + cfg.ifindex =3D local_vlan_ifindex + cfg.remote_ifname =3D remote_vlan_ifname + cfg.addr_v["4"] =3D local_vlan_addr_v4 + cfg.addr_v["6"] =3D local_vlan_addr_v6 + cfg.remote_addr_v["4"] =3D remote_vlan_addr_v4 + cfg.remote_addr_v["6"] =3D remote_vlan_addr_v6 + cfg.addr =3D local_vlan_addr_v4 + cfg.remote_addr =3D remote_vlan_addr_v4 + + s =3D _make_psp_conn(cfg, version=3D0) + + try: + # Create PSP associations + # The socket's device is VLAN, but PSP device is on physical N= IC + rx_assoc =3D cfg.pspnl.rx_assoc({ + "version": 0, + "dev-id": cfg.psp_dev_id, # PSP device on physical interf= ace + "sock-fd": s.fileno() + }) + rx =3D rx_assoc['rx-key'] + tx =3D _spi_xchg(s, rx) + + cfg.pspnl.tx_assoc({ + "dev-id": cfg.psp_dev_id, + "version": 0, + "tx-key": tx, + "sock-fd": s.fileno() + }) + + # Send data through VLAN interface (VLAN-to-VLAN traffic!) + data_len =3D _send_careful(cfg, s, 100) + _check_data_rx(cfg, data_len) + + finally: + _close_psp_conn(cfg, s) + + finally: + # Restore original interface configuration + cfg.ifname =3D orig_local_ifname + cfg.ifindex =3D orig_local_ifindex + cfg.remote_ifname =3D orig_remote_ifname + cfg.addr_v["4"] =3D orig_local_addr_v4 + cfg.addr_v["6"] =3D orig_local_addr_v6 + cfg.remote_addr_v["4"] =3D orig_remote_addr_v4 + cfg.remote_addr_v["6"] =3D orig_remote_addr_v6 + cfg.addr =3D orig_local_addr_v4 + cfg.remote_addr =3D orig_remote_addr_v4 + + # Clean up VLAN interfaces + try: + ip(f"link del {local_vlan_ifname}") + except Exception: + pass + try: + ip(f"link del {remote_vlan_ifname}", host=3Dcfg.remote) + except Exception: + pass =20 def psp_ip_ver_test_builder(name, test_func, psp_ver, ipver): """Build test cases for each combo of PSP version and IP version""" @@ -622,7 +735,7 @@ def main() -> None: ] =20 ksft_run(cases=3Dcases, globs=3Dglobals(), - case_pfx=3D{"dev_", "data_", "assoc_", "removal_"= }, + case_pfx=3D{"dev_", "data_", "assoc_", "removal_"= , "vlan_"}, args=3D(cfg, )) =20 cfg.comm_sock.send(b"exit\0") --=20 2.45.4