From patchwork Mon Aug 31 15:18:03 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Rozet X-Patchwork-Id: 2295269 X-Patchwork-Delegate: i.maximets@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=IDlm6h1x; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hYXjc1yw7z1xyG for ; Tue, 01 Sep 2026 01:20:04 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id A7E71605AF; Mon, 31 Aug 2026 15:20:02 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id PTDW9zjDrZlG; Mon, 31 Aug 2026 15:20:01 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.9.56; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= Authentication-Results: smtp3.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=IDlm6h1x Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp3.osuosl.org (Postfix) with ESMTPS id BA84E605D0; Mon, 31 Aug 2026 15:20:01 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8A25DC0906; Mon, 31 Aug 2026 15:20:01 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id DD48FC0905 for ; Mon, 31 Aug 2026 15:20:00 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id C3C5580AAD for ; Mon, 31 Aug 2026 15:20:00 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id xqhHCoBsctuJ for ; Mon, 31 Aug 2026 15:19:58 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:c105::1; helo=ch1pr05cu001.outbound.protection.outlook.com; envelope-from=trozet@nvidia.com; receiver= Authentication-Results: smtp1.osuosl.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp1.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=IDlm6h1x Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazlp170100001.outbound.protection.outlook.com [IPv6:2a01:111:f403:c105::1]) by smtp1.osuosl.org (Postfix) with ESMTPS id 35A5280798 for ; Mon, 31 Aug 2026 15:19:56 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pA79JwziF6mP1xDIzfqmW14MDzJQgx7BFE7iwr+Mb6SkM6pIRf4sopWSbOwBD9qrV55bVbMXJB/lIOPKPB1KXYTe7SHMvseLWp+MS0Ur8vpPPIyHK9+y6YUEgTztUd9pjbdAt3LS5DidxmUVo57N4gv62cROKAYhzvWhok+8c8kvNC8EiFwIyjViDcUNrGdn9aJPzrfWVjBW7PCsBZ8CwMUqEy/naeNsHwaUucodNi6A3lLPusuTdTuZ2QIw0t7G4ocbbttkH9t6PPXHgoME4cW8nXC18GbSVp97T+uvTkq3G+JswPFAtHvEMjM28oUWDsk3JgVluP39UF4448dpsA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4wEH4gOWfrKTOEhVrKsAjrMt9wIusqg98erjc9zfQ4E=; b=odXaQQdQ7gioUVJj9la+xjNxbcUBD+DC0tSgvh7QA8MQ6++ztvZgbdju4hbPU6HEP9BIvRT0Ye6CWg/HCpmmTC8J3BPzsuAY17TUshATBeubbPf7e7Vy0jJbkKqG8Z5rM8vIk/+KsNjjv/SkJHdeCJ1+pnl3ikkWeapZcMWXQI145TB9rnJRxicPCqFd9S5VO3DGjXnjvJDFmBAsdPmIMFkiJ3VHNml4wtl8Ymn9xxWcRpKH6Jm44c3JTm26Tf0zq4l1L1XA6AvlieMxgj2BbzvzDjkt8y3jpVxfJY7lDZuRhaBxcDXfnt+3BsC/ssp3YWvs2BWvE7QbECQV6tYMJQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=openvswitch.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4wEH4gOWfrKTOEhVrKsAjrMt9wIusqg98erjc9zfQ4E=; b=IDlm6h1xzr3A49PV/+nb7NMmK+1tfLp13NCM8RBKRiEZdbAaNi0LIX9XiUOPAQylAeZbRN+PbYEX0qF7dM7O54ltKxP9dJdwAIQwebJA1iSlZ2QCLNE16tl0I8p+yWA9Y67UDFKgJNfuRZ9BGg3SiCgF658dU84Nc4boQTe6ppgNo+dEi51320uNepmhBOYRnkDENsvZUDpf/0obLmZDc2vQvX8mpSY0iOXgGrOyL4KvnE085/MIlA1mJIP5fvVn5fLR17D2B848yjZYIv9XWmkQpvvUfPTEXnm4dUPi+0Jpj8yu9pxvSLRFCdyLjSdVoelPkzLwKidpspllkuDJug== Received: from MN2PR11CA0025.namprd11.prod.outlook.com (2603:10b6:208:23b::30) by SJ2PR12MB8883.namprd12.prod.outlook.com (2603:10b6:a03:538::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.360.8; Mon, 31 Aug 2026 15:19:48 +0000 Received: from LV8PEPF0000006B.namprd03.prod.outlook.com (2603:10b6:208:23b:cafe::87) by MN2PR11CA0025.outlook.office365.com (2603:10b6:208:23b::30) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 31 Aug 2026 15:19:48 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by LV8PEPF0000006B.mail.protection.outlook.com (10.167.248.40) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.382.8 via Frontend Transport; Mon, 31 Aug 2026 15:19:47 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 31 Aug 2026 08:19:16 -0700 Received: from fedora.nvidia.com (10.126.231.37) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 31 Aug 2026 08:19:15 -0700 To: Date: Mon, 31 Aug 2026 11:18:03 -0400 Message-ID: <20260831151803.3756241-1-trozet@nvidia.com> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 X-Originating-IP: [10.126.231.37] X-ClientProxiedBy: rnnvmail201.nvidia.com (10.129.68.8) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: LV8PEPF0000006B:EE_|SJ2PR12MB8883:EE_ X-MS-Office365-Filtering-Correlation-Id: b8e5170d-22c0-4896-0172-08df07734b5e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|376014|36860700016|1800799024|82310400026|23010399003|56012099006|10067099003|6133799003|5023799004|11063799006|18002099003|3023799007; X-Microsoft-Antispam-Message-Info: lJ/lMkU9TTCfHpf9S5im3nLdifwlfGHBCMm9xwom8YOgCSo5QhB/2cX9QuQ7fjDIhq5s05BapLVygg75NdvCew8x38e0vlV6jKzv5kntqM7slq/VIYTee8MFMXBA5afCsNd8QHtXbHQzvdmBSzk2Aa/eg0Sq21KRZAU7omKOe68GEzTjzc45u722AOqZiDmJ53q5OXKEL5S18m71Ci9pV3Tdxis5A25Y2a9TvB0P4uhmf5IxSHmEyyypNNYGut2kKj065hmuuX6yLBWXvTYh7eRpAKnh3pM13v/Fcx962umqVztXvs2XbkatvUhD5+I2QVhxQSFsTN7bkdKn3w8qpVx6dDJXuMBRpyVkX9qN1GkH+eSBLCL3xFlvyXLUGZDMBX6w5R8xfMcfqn/W6oGTUkY4KP8aB1IjssSwxmnOxImHk8dMKP5448jl1R2j2w1OfYPT07ZpVRIe89nVrkq7wB07BzOmCbLxqaITlOw2RuWQNAOsxGKqkSbMTApHgdB8/xz0268UKi4NtTahPXQX4JUs44WIQG2U9oLVihy3XhwRhmUt0iGHcfFTRnPfIPePka3nvnSc0Bz5fSZ63EUt8mPMXobDGi8+0aRAieszU/THxr87YstNR4Ufe706JYg0XtOq8IujFWJeVYcP5UnDqMGpoJ72PHCOZtNmXgeSWmL0S6x8TOrO47N+UqPA/7G3iIW1KObPawgE8baRxYnZXg== X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230040)(376014)(36860700016)(1800799024)(82310400026)(23010399003)(56012099006)(10067099003)(6133799003)(5023799004)(11063799006)(18002099003)(3023799007); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: zd5czbKv+euZJqCczgJqaNp5f+jSHlsgLPpVkMKIvHY5ii7SrFJwfmFe4LiHg5iJ9YSH0fRdlpzmt9VZ/8wxWrrxQFaeRlS/fIkDbk7i7973LcGkwvtYAXZCll7pT54/jlu2kc/MApZwza3SJEwaROowLUAavkDP7oGfuSRE04RQsNb8ZiZ7yUYdlm/AR7jvruqPNcHIVmVLlTXoDpwPrYbl/pobYZvPbXm1obdMKWgl6VhV6OOFRz6feVKsGJ1u3AEySIBzbMDUjG4Jnhtx2jGM91lpVxOFvcKOjNtpjJav8JCZ24MvRYJ+x060DkBouNEiN0bLWvork+Np7rTKtFDA2SYwNOFt17vw2pUkWITfi/BV+1ruFL6xqzyJuVGZUQom0HPSVMopgUnnSjrEJn1XqZPgI6wUNt2mShbAhQbO7lJYf2/zTe5peWr/32ze X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Aug 2026 15:19:47.4968 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b8e5170d-22c0-4896-0172-08df07734b5e X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: LV8PEPF0000006B.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB8883 Subject: [ovs-dev] [PATCH] userspace datapath: Include UDP ports in symmetric L4 hash. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Tim Rozet via dev From: Tim Rozet Reply-To: Tim Rozet Cc: Nitin Katiyar Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" The userspace implementation of OVS_HASH_ALG_SYM_L4 calls flow_hash_symmetric_l3l4() with UDP port hashing disabled. As a result, UDP packets with identical addresses but different ports receive the same datapath hash. The Linux datapath implements this algorithm with __skb_get_hash_symmetric(). Its symmetric flow dissector requests FLOW_DISSECTOR_KEY_PORTS, and skb_flow_get_ports() extracts source and destination ports for IPPROTO_UDP. Thus, the two datapaths use different hash fields for the same OVS action. Include UDP ports in the userspace algorithm to align its field selection with Linux. The exact hash value remains datapath-specific and opaque to ovs-vswitchd. Add dummy-datapath coverage that verifies reversed UDP tuples remain symmetric while changing only the UDP source port produces more than one datapath hash. Tested with GitHub Actions and an HBN/OVN integration topology. The userspace datapath distributed 128 VXLAN flows across two underlay ECMP paths and moved all traffic to the remaining path after failover. Fixes: 6a0b0d3be857 ("userspace datapath: Add OVS_HASH_L4_SYMMETRIC dp_hash algorithm") Assisted-by: GPT-5, OpenAI Codex Signed-off-by: Tim Rozet Acked-by: Mike Pattrick --- lib/odp-execute.c | 2 +- tests/ofproto-dpif.at | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) base-commit: 1d4157643ca16ef8d84c8a27fe524aedb7b538d0 diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 618fb5ac8..a22d60295 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -1014,7 +1014,7 @@ odp_execute_actions(void *dp, struct dp_packet_batch *batch, bool steal, flow_extract(packet, &flow); hash = flow_hash_symmetric_l3l4(&flow, hash_act->hash_basis, - false); + true); packet->md.dp_hash = hash; } break; diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index ee6ac873d..93fa97111 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -1201,6 +1201,52 @@ n_flows=ok n_buckets=ok OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto-dpif - symmetric dp_hash includes UDP ports]) + +OVS_VSWITCHD_START +add_of_ports br0 1 10 11 + +AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 \ + 'group_id=1234,type=select,bucket=output:10,bucket=output:11']) +AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 \ + 'udp actions=group:1234']) + +dp_hash_flow_count () { + ovs-appctl dpctl/dump-flows \ + | sed -n '/recirc_id(0x[[0-9a-f]][[0-9a-f]]*),dp_hash/p' \ + | wc -l +} + +forward_flow="in_port(1),eth(src=50:54:00:00:00:01,dst=50:54:00:00:00:02),\ +eth_type(0x0800),ipv4(src=192.0.2.1,dst=198.51.100.1,proto=17,\ +tos=0,ttl=64,frag=no)" +reverse_flow="in_port(1),eth(src=50:54:00:00:00:02,dst=50:54:00:00:00:01),\ +eth_type(0x0800),ipv4(src=198.51.100.1,dst=192.0.2.1,proto=17,\ +tos=0,ttl=64,frag=no)" + +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ + "$forward_flow,udp(src=10000,dst=4789)"]) +OVS_WAIT_UNTIL_EQUAL([dp_hash_flow_count], [1]) + +dnl Reversing the complete L3/L4 tuple must produce the same hash. +AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ + "$reverse_flow,udp(src=4789,dst=10000)"]) +OVS_WAIT_UNTIL([ovs-appctl dpctl/dump-flows \ + | grep 'recirc_id(0),' | grep -q 'packets:1']) +AT_CHECK([dp_hash_flow_count], [0], [1 +]) + +dnl Vary only the UDP source port. At least one packet must produce a +dnl different hash value from the first packet. +for port in `seq 10001 10016`; do + AT_CHECK([ovs-appctl netdev-dummy/receive p1 \ + "$forward_flow,udp(src=$port,dst=4789)"]) +done +OVS_WAIT_UNTIL([test `dp_hash_flow_count` -gt 1]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([ofproto-dpif - select group with watch port]) OVS_VSWITCHD_START