From patchwork Mon Nov 4 11:04:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Huettner X-Patchwork-Id: 2006172 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=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=IxKk+Udq; dkim=fail reason="signature verification failed" (2048-bit key) header.d=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=IxKk+Udq; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 4XhpXH3zT5z1xxW for ; Mon, 4 Nov 2024 22:05:03 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 3858340586; Mon, 4 Nov 2024 11:05:01 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id c4j5hN3vYA4u; Mon, 4 Nov 2024 11:04:58 +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= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org A2A1A4062D Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=IxKk+Udq; dkim=fail reason="signature verification failed" (2048-bit key) header.d=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=IxKk+Udq Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id A2A1A4062D; Mon, 4 Nov 2024 11:04:52 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 74A87C08A6; Mon, 4 Nov 2024 11:04:52 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2C952C08A9 for ; Mon, 4 Nov 2024 11:04:51 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 7A821405C7 for ; Mon, 4 Nov 2024 11:04:29 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id egj_AhJUwcLL for ; Mon, 4 Nov 2024 11:04:27 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:2612::622; helo=eur05-am6-obe.outbound.protection.outlook.com; envelope-from=felix.huettner@stackit.cloud; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp4.osuosl.org 56D0C405C2 Authentication-Results: smtp4.osuosl.org; dmarc=pass (p=reject dis=none) header.from=stackit.cloud DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 56D0C405C2 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on20622.outbound.protection.outlook.com [IPv6:2a01:111:f403:2612::622]) by smtp4.osuosl.org (Postfix) with ESMTPS id 56D0C405C2 for ; Mon, 4 Nov 2024 11:04:27 +0000 (UTC) ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=J9zX2/e/Wl2IpxbPAfb5ctMGNgWwW0B9gsKQ7DHH35Cv5Fomvyh90QVle65Ez46B5Jh5NS/HzCu18jUcH1KxsxYXxBpm0hYCDbHHbhD43rX/0Rqrq8ivuJjaUyYh6xIY9AWSqSC1xQlPaN5e8SqMMipQuLdrd0u/BNmu8m6WPAazk2yKP6UqT3k2ZiQdgYq0xakVSHgPwHkZiGVbqhOfwRCHon+8aP/3yqtAwXshv74WokWjC0GRkjvFsZGTzY4zNXZOc1DcwGIPsR1jwdbhntaZRK5noYpJ5RQzHjJ0p03nohojfx2JaJfg5zibSVrHx8QK74U4T+XUmfWC4HQ+5w== ARC-Message-Signature: i=2; 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=FTk0EQPWnkFlrRw40EdbdIvPFdo98d7AJ2zpN4nbLNQ=; b=lVLdpQgUOVkEkFsQjhlABZCJEaX7oNbdTJ3TjWeocWZ+rt6KXV8sZlCWYRcETKDKFxtAZ1B4Z3xDSS8pJ7RVJlc5MiiF0P1HUobVC17FJufWinNTUdkR3oUpelH76KQ2pNM0Q+9KH9ISEGgchsdB67chVFpiJfsEGTG5YWL6VXZUoS7FXlcU1zY95EjRqGYsgnZvkdrlooABrQsVxXphs6TLIh51NeoEbT1sCdxd1FGGeKrcJ1uXUAtdzT+uuatd7/lMCl9i05bXfsj4l1vnfZ/Q86zDFZkZhCpWx4iyTLJvfmLky0R+kg7WGJXvTQlHrJdLF5qhzrtVoLBwuTvawQ== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=fail (sender ip is 104.40.229.156) smtp.rcpttodomain=openvswitch.org smtp.mailfrom=stackit.cloud; dmarc=pass (p=reject sp=none pct=100) action=none header.from=stackit.cloud; dkim=pass (signature was verified) header.d=stackit.cloud; arc=pass (0 oda=1 ltdi=1 spf=[1,1,smtp.mailfrom=stackit.cloud] dkim=[1,1,header.d=stackit.cloud] dmarc=[1,1,header.from=stackit.cloud]) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stackit.cloud; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FTk0EQPWnkFlrRw40EdbdIvPFdo98d7AJ2zpN4nbLNQ=; b=IxKk+UdqI4Wh7SHAJ9wqEkH+jIb7TO9nXNcX//Ss0Ag/hS9IpAkGdJ+8X/aCY4/JRvSm39vRQ0L/ZToxVZ16jsXbSkee57S2pXq44VuHFAgAKCX8CCX9dtDI4VhVzIWfZRp9kU8lJBnMX1rEko3Ji6VQ/JRJ0Vr2zPU5Vc5pjbQVqHsuaRsAzd8qBdgQSp33HcC5YqTRndMkb++Huwjs233CiSlUQf7fJ60DmT/8DMpy4U7rbze5uUMa9kIs1auyKkQ5Oq2i6VGQnswUNXGrVylpKHdSPQcKQ1WruHeJrlGCHTl//QI4MrTvj3DC4UqFjllNa5n6b2zP9hYETLTRdQ== Received: from DUZPR01CA0038.eurprd01.prod.exchangelabs.com (2603:10a6:10:468::12) by DB9PR10MB5716.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:10:2ef::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.17; Mon, 4 Nov 2024 11:04:22 +0000 Received: from DB1PEPF00050A00.eurprd03.prod.outlook.com (2603:10a6:10:468:cafe::66) by DUZPR01CA0038.outlook.office365.com (2603:10a6:10:468::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8114.30 via Frontend Transport; Mon, 4 Nov 2024 11:04:22 +0000 X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 104.40.229.156) smtp.mailfrom=stackit.cloud; dkim=pass (signature was verified) header.d=stackit.cloud;dmarc=pass action=none header.from=stackit.cloud; Received-SPF: Fail (protection.outlook.com: domain of stackit.cloud does not designate 104.40.229.156 as permitted sender) receiver=protection.outlook.com; client-ip=104.40.229.156; helo=eu1.smtp.exclaimer.net; Received: from eu1.smtp.exclaimer.net (104.40.229.156) by DB1PEPF00050A00.mail.protection.outlook.com (10.167.242.42) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.17 via Frontend Transport; Mon, 4 Nov 2024 11:04:21 +0000 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (104.47.17.105) by eu1.smtp.exclaimer.net (104.40.229.156) with Exclaimer Signature Manager ESMTP Proxy eu1.smtp.exclaimer.net (tlsversion=TLS12, tlscipher=TLS_DIFFIEHELLMAN_WITH_AES256_NONE); Mon, 4 Nov 2024 11:04:22 +0000 X-ExclaimerHostedSignatures-MessageProcessed: true X-ExclaimerProxyLatency: 6715929 X-ExclaimerImprintLatency: 2208332 X-ExclaimerImprintAction: 5bc29a80adac4d51af2f1820675fb270 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=m6BmpSTr47/tcaGDbmp5nEihXWovqqL6nYYJHAdQ1aSHh8zeJozLiR78+h2qzRPG5LdheIm92mRNw8Gvd1VzLgfe6GiDKlPtKAsk9Fb1F4/rOzcUkWuGQTwFVUPyvTicSWzs4bpyaokWyizTDQyJ5xuwwU/JXfr4+xwckFNOZsgiF8caD0BJrnmc2DbqjH/W5io03crTvV0dDtH8Kuf4AUSWcOODWzMLZ4l3Ng1UobtCKXLHFdZUCu/i31QJ9wZ5byRyM1CGFQX1xgGbIxDpDYTzhxz1YQwRF2nsj0iqEwGdDIhKTEN8pJB2LoCDs0JKxp1TiK3JUqjhzCqnndvBiw== 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=FTk0EQPWnkFlrRw40EdbdIvPFdo98d7AJ2zpN4nbLNQ=; b=WJIzJ/OkpmrJFMEYRKRexzGUrYgGQTfBUdKnQZy+DQOI/c3hYkLMwWyX0jmFSLJOjw/clxNy/IQcFaHxd9/QkPKVtfN9FY4l2yKsET8wkE369astYQa9CbVCf9JqijQcXWAY5Iu2K7Beas4D8/7IRKbt3B4ISgzBkMUF+wqJ2eAmT93RLCUzJczxrhVpURkvqvHDAg96Ium3NDjgT/JlroEAw5XZxE7Rd5cS8vTErj1ybD0wFNI+t2bB4XCbZe1pemeRFsXJ4fkmW8kLQAnpnrn8oDdigyRBm8mCO0kAI15NuC5tKj8Y14P9ACFr8+YtXyya7sorAgNEuYe6kIkXcg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=stackit.cloud; dmarc=pass action=none header.from=stackit.cloud; dkim=pass header.d=stackit.cloud; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=stackit.cloud; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FTk0EQPWnkFlrRw40EdbdIvPFdo98d7AJ2zpN4nbLNQ=; b=IxKk+UdqI4Wh7SHAJ9wqEkH+jIb7TO9nXNcX//Ss0Ag/hS9IpAkGdJ+8X/aCY4/JRvSm39vRQ0L/ZToxVZ16jsXbSkee57S2pXq44VuHFAgAKCX8CCX9dtDI4VhVzIWfZRp9kU8lJBnMX1rEko3Ji6VQ/JRJ0Vr2zPU5Vc5pjbQVqHsuaRsAzd8qBdgQSp33HcC5YqTRndMkb++Huwjs233CiSlUQf7fJ60DmT/8DMpy4U7rbze5uUMa9kIs1auyKkQ5Oq2i6VGQnswUNXGrVylpKHdSPQcKQ1WruHeJrlGCHTl//QI4MrTvj3DC4UqFjllNa5n6b2zP9hYETLTRdQ== Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=stackit.cloud; Received: from PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:30d::9) by PR3PR10MB4112.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:af::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.17; Mon, 4 Nov 2024 11:04:19 +0000 Received: from PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM ([fe80::f00d:feeb:e45e:54f8]) by PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM ([fe80::f00d:feeb:e45e:54f8%7]) with mapi id 15.20.8137.013; Mon, 4 Nov 2024 11:04:19 +0000 Date: Mon, 4 Nov 2024 12:04:12 +0100 To: dev@openvswitch.org Message-ID: <2e55a018ef91e458cb18a627a4a74d8acfa6cc9d.1730713432.git.felix.huettner@stackit.cloud> Mail-Followup-To: dev@openvswitch.org References: Content-Disposition: inline In-Reply-To: X-please-dont-add-a-signature: thanks X-ClientProxiedBy: FR3P281CA0115.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a3::10) To PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:30d::9) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: PAVPR10MB6914:EE_|PR3PR10MB4112:EE_|DB1PEPF00050A00:EE_|DB9PR10MB5716:EE_ X-MS-Office365-Filtering-Correlation-Id: 068ddf42-03b6-4731-c2cc-08dcfcc06ffd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info-Original: Yd13PRvE1AAqBt5FMFYc99GaKYYj5WXWLwV/lOzwBUY9JSyQ/f5btNJ0rezzppCZ4AcPfMmH6v1/6jne8z+OC32rDMsdUcvdO5bFfR+kE6Fqc9lammCF80hV9gNJ9MVpWJf4CfUcvQNgBvhk+1o+WMu0xjONUn+VCMNbK3a4dgP8pysmEMvSjHL28fBmsBvfkKpsd4EGhBrgYb7iyaFCTf2lEb77FUHqkRNtl+Y0dZghzJly5xvny9aMd0s7E5QRlPLBYQuJKiodk15cFXmvqfmWcULQkSZSVwRa8Rn0LRgbEkA1WWbvM1P/ujbYWi06PvayaB2hQ++p6dBwl/wR3raH9WPNEKQhjMq/IeUBfPx2slCASVSTsMfcPS6YpA1qgBlDYQrxOByok3UZ6PcZtKeZybsrjjy214MMVkixochdTl7A3/wLmQFTOsClPGTe66H+QOx6aYKjc2/DtI6s4vd5DB+lUhiGuxJv7xOUOeqeW05nsQLmXCHc0kg0bSHnNfVUTEXfMZQxTAK5eIfadEBE93nkbfXE1rwChdKwfZtArIyxupXTlMZHlHA+d8EJi5Wk9r1Ri25F+Bbr+2tzmsg6VPfFE2CEglQ2YWLcpY4XVzjKLWZYhNghkt+JgRAWF7JjJ57bmQdct5tkW+JUZ9vdDg5eDS4vQsZPqWi7/X2hALoAzj4gf2/tsmUtqJEV4Cgh3CdrcC24lz4tpsH93xiwYKeT/4+tX9SmtOrA/KqawLZcWbWIcthkEh60+Zo7UkSRcoimNzKj0W7QA1AB5KRtvf1k1AgJS7wyBwMdT7PPFl1BwpIYTIjsYqM+R+g/Wu8ijAI/3cAOLfSUoNhpenv7aV/HR0tfgjc4MKnsVAlxUni+gboEy625smztgd9CQHcGvc8CBWP9w76VKgYwYOWLkJE++eyQDM0keds7ByAB+wKOhAvSZ3WLojXLeFF6s0iG9hpu0NN9qxIL3KAjzDolusedy+8FVjkxfGEYDD0vNGlxmhj3WZ2Q0enMclH44AAVebW3A5nPH1hyOSX1lTx40jeUKv5MnrKP+GjbnfkvKkP77WMc4YZufFbaipLVE6I37GFklhq7q8gGy3xISa2+Uov2s74+cviTgDVF3DmSI9PxkLbQblWfa4VCj3v64RmdwJrMcDIb/5U4AvnZxoBvX075ZOWu/bq2JR7h9RAXaGWvBxKE9sjQ1Leqg0ZTZ6Z62xa7PgV4drsGRsu+4YkLis8u5/uGlYWXFAMpLIvSgFnh4GiisyYX1oyY5+waSATWqpHoAlGwkgbt96BMzUBzkS7P4Ks6PIVo45issPqXZop6pIOaEVUJHC7uq6r3 X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(13230040)(366016)(376014)(1800799024); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR10MB4112 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB1PEPF00050A00.eurprd03.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: d995d093-1ac0-457a-d367-08dcfcc06e61 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|376014|82310400026|1800799024|35042699022|14060799003; X-Microsoft-Antispam-Message-Info: AgmI0i0sNlFupKXBlifhMrJEAdQjLbWEiYvDWcw+yVNk/VaTWkxVHlox7sPoU7exzVtdENjme5O+RyjQHWv4DESJBfA7UNDKKIvD5TAgJ4TPFo7Ehh9Yt6eszgEjvVc04gZ1AO5Ilce+1q9XIUBhGrFwWo+qHpEwJKQhDkyzpBU3zkg/XW8IrUXZmLoEeT4eWMvZ/ghMZlErp0fEKRprWxEK0ikQ3ywB5tWauPxOgMI6WaQK/QHtlJw+hnYeQjQI32KHZpzQPCAB3JaM8ef3SZLYQn/B4O3ARCfAG1UdVG3esqBPku6woXgEC+GxrOC0QkSpiYVkn3ExuDtKDNmioiRnt+zGk/3hlSXA/x6GjgwIg07PKssbBXCPDQQqgVr2YUgaoZj+w34L2KPYtkkTSZXwDcAiKmJenH9rx5cNgThI/Wisl5o8XVPyKcTSkQL3olz/D2ncJjNM6ISdiJQt6CeNbj7OIbDSVHTGYkmU13Nfw45QQAR3/ln7MaHz2mDWhT/TZqoIjJ9OsNhDIaspMQNXTh9r1YJXEv8gBzvWBwaHu3il+F4RCl0F2HOIsLovlSnXYdOceBtiNX+iKjB54RQInNCoHR2cip1abTufMM6iHPDrgY77WQbou+ic5cLprAKjG3TInI7NjuvZGJaqWTC/hXfbfv2xpaZE1Ioy55hd2nYyT8S+GMSsdHklHFE+7AdP/cSxwXsf2f3N9PAquQtCOttAeiHy3U5dqpXnh3BF6NNz4tieMFc5aVdl2g24aUdQWxr+dK6yksExcOrC5R6k/2CtmjWH2+sA9q+m62X4iba4eZcgRzFSvckRxHlaifrAi/LRs5RJY2tRtXtfcpY5HUbNWF33dqEB3kI4OXdl+6oHoKDtTmOOluw5Qs9snSmiESgP7ZXzkjeeYXaUozqgwv7qkNrBgmEVlMY+WTJZBBccEvqqkjKnIKT/0vWCZ0YA/Eze2qystnrPoxKwE/YWiGKBx8gj9wZyjctv4bs2Pw1wpkomoaUgv+cJwl69PUcL6voNyyK5VrJSuHYtMPfLTfhzxqs1dHAyj9cZ42Rzgk8MeYxFEz8rt6CAexL3cAMF+ozW23xpeow9rdHTT9cneG310jt7WRofi3fc+PhBFAhTIfyQde5AJCnaUJzPAzdYnwm7pjVCrW1aVNSneSEhBYlXk3be49f+MhIAhHM+lJM1+jpKHaPU8F8lnxB/xM6mFpD3oLiVXnglDoLSLz++WT87scyj/PjkUUjorHlMeMRMJ1RFh51Ax/65dhvVqrJQJmtClsqxYjC1S8QAhq6qwt0tBoLePB7h/BJOhbNWvIHjkqb6MYNzh4hseMOHYbneG/H/U0C1H/LWIoTdORDKKy95DFdm5J/6xaY7syoGIwuhPpghA79gdTOuAbASDuTPmPrRSwBaPSMRecVkRg== X-Forefront-Antispam-Report: CIP:104.40.229.156; CTRY:NL; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:eu1.smtp.exclaimer.net; PTR:eu1.smtp.exclaimer.net; CAT:NONE; SFS:(13230040)(36860700013)(376014)(82310400026)(1800799024)(35042699022)(14060799003); DIR:OUT; SFP:1101; X-OriginatorOrg: stackit.cloud X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2024 11:04:21.9308 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 068ddf42-03b6-4731-c2cc-08dcfcc06ffd X-MS-Exchange-CrossTenant-Id: d04f4717-5a6e-4b98-b3f9-6918e0385f4c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d04f4717-5a6e-4b98-b3f9-6918e0385f4c; Ip=[104.40.229.156]; Helo=[eu1.smtp.exclaimer.net] X-MS-Exchange-CrossTenant-AuthSource: DB1PEPF00050A00.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR10MB5716 Subject: [ovs-dev] [PATCH ovn v2 11/32] northd: Add route table to southbound and sync. 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: Felix Huettner via dev From: Felix Huettner Reply-To: Felix Huettner Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" in order to exchange routes between OVN and the network fabric we introduce a new southbound table. This is used by northd to write in the routes which should be announced from a given Logical Router. ovn-controller will later use this table to share these routes to the outside. Additionally this table will be used as a way for ovn-controller to share learned routes back to northd. Users must explicitly opt-in to advertise the routes using this table. Signed-off-by: Felix Huettner --- ic/ovn-ic.c | 21 ----- lib/ovn-util.c | 22 +++++ lib/ovn-util.h | 1 + lib/stopwatch-names.h | 1 + northd/automake.mk | 2 + northd/en-routes-sync.c | 196 +++++++++++++++++++++++++++++++++++++++ northd/en-routes-sync.h | 28 ++++++ northd/inc-proc-northd.c | 9 +- northd/northd.c | 24 +++-- northd/northd.h | 4 +- ovn-nb.xml | 5 + ovn-sb.ovsschema | 17 +++- ovn-sb.xml | 50 ++++++++++ 13 files changed, 344 insertions(+), 36 deletions(-) create mode 100644 northd/en-routes-sync.c create mode 100644 northd/en-routes-sync.h diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c index 54dd73f18..6c4d26ebb 100644 --- a/ic/ovn-ic.c +++ b/ic/ovn-ic.c @@ -1007,27 +1007,6 @@ get_nexthop_from_lport_addresses(bool is_v4, return true; } -static bool -prefix_is_link_local(struct in6_addr *prefix, unsigned int plen) -{ - if (IN6_IS_ADDR_V4MAPPED(prefix)) { - /* Link local range is "169.254.0.0/16". */ - if (plen < 16) { - return false; - } - ovs_be32 lla; - inet_pton(AF_INET, "169.254.0.0", &lla); - return ((in6_addr_get_mapped_ipv4(prefix) & htonl(0xffff0000)) == lla); - } - - /* ipv6, link local range is "fe80::/10". */ - if (plen < 10) { - return false; - } - return (((prefix->s6_addr[0] & 0xff) == 0xfe) && - ((prefix->s6_addr[1] & 0xc0) == 0x80)); -} - static bool prefix_is_deny_listed(const struct smap *nb_options, struct in6_addr *prefix, diff --git a/lib/ovn-util.c b/lib/ovn-util.c index 1ad347419..55a081ab1 100644 --- a/lib/ovn-util.c +++ b/lib/ovn-util.c @@ -1331,3 +1331,25 @@ ovn_update_swconn_at(struct rconn *swconn, const char *target, return notify; } + +bool +prefix_is_link_local(const struct in6_addr *prefix, unsigned int plen) +{ + if (IN6_IS_ADDR_V4MAPPED(prefix)) { + /* Link local range is "169.254.0.0/16". */ + if (plen < 16) { + return false; + } + ovs_be32 lla; + inet_pton(AF_INET, "169.254.0.0", &lla); + return ((in6_addr_get_mapped_ipv4(prefix) & htonl(0xffff0000)) == lla); + } + + /* ipv6, link local range is "fe80::/10". */ + if (plen < 10) { + return false; + } + return (((prefix->s6_addr[0] & 0xff) == 0xfe) && + ((prefix->s6_addr[1] & 0xc0) == 0x80)); +} + diff --git a/lib/ovn-util.h b/lib/ovn-util.h index 2e2f31a36..98cb8e69d 100644 --- a/lib/ovn-util.h +++ b/lib/ovn-util.h @@ -498,5 +498,6 @@ streq(const char *s1, const char *s2) return false; } +bool prefix_is_link_local(const struct in6_addr *prefix, unsigned int plen); #endif /* OVN_UTIL_H */ diff --git a/lib/stopwatch-names.h b/lib/stopwatch-names.h index 660c653fb..87e5bff85 100644 --- a/lib/stopwatch-names.h +++ b/lib/stopwatch-names.h @@ -34,5 +34,6 @@ #define LR_NAT_RUN_STOPWATCH_NAME "lr_nat_run" #define LR_STATEFUL_RUN_STOPWATCH_NAME "lr_stateful" #define LS_STATEFUL_RUN_STOPWATCH_NAME "ls_stateful" +#define ROUTES_SYNC_RUN_STOPWATCH_NAME "routes_sync" #endif diff --git a/northd/automake.mk b/northd/automake.mk index 6566ad299..775422d43 100644 --- a/northd/automake.mk +++ b/northd/automake.mk @@ -34,6 +34,8 @@ northd_ovn_northd_SOURCES = \ northd/en-ls-stateful.h \ northd/en-sampling-app.c \ northd/en-sampling-app.h \ + northd/en-routes-sync.c \ + northd/en-routes-sync.h \ northd/inc-proc-northd.c \ northd/inc-proc-northd.h \ northd/ipam.c \ diff --git a/northd/en-routes-sync.c b/northd/en-routes-sync.c new file mode 100644 index 000000000..bb61e0d51 --- /dev/null +++ b/northd/en-routes-sync.c @@ -0,0 +1,196 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "openvswitch/vlog.h" +#include "stopwatch.h" +#include "northd.h" + +#include "en-routes-sync.h" +#include "lib/stopwatch-names.h" +#include "openvswitch/hmap.h" +#include "ovn-util.h" + +VLOG_DEFINE_THIS_MODULE(en_routes_sync); + +static void +routes_table_sync(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_route_table *sbrec_route_table, + const struct hmap *parsed_routes); + +void +*en_routes_sync_init(struct engine_node *node OVS_UNUSED, + struct engine_arg *arg OVS_UNUSED) +{ + return NULL; +} + +void +en_routes_sync_cleanup(void *data_ OVS_UNUSED) +{ +} + +void +en_routes_sync_run(struct engine_node *node, void *data_ OVS_UNUSED) +{ + struct routes_data *routes_data + = engine_get_input_data("routes", node); + const struct engine_context *eng_ctx = engine_get_context(); + const struct sbrec_route_table *sbrec_route_table = + EN_OVSDB_GET(engine_get_input("SB_route", node)); + + stopwatch_start(ROUTES_SYNC_RUN_STOPWATCH_NAME, time_msec()); + + routes_table_sync(eng_ctx->ovnsb_idl_txn, sbrec_route_table, + &routes_data->parsed_routes); + + stopwatch_stop(ROUTES_SYNC_RUN_STOPWATCH_NAME, time_msec()); + engine_set_node_state(node, EN_UPDATED); +} + +struct route_entry { + struct hmap_node hmap_node; + + const struct sbrec_route *sb_route; + const struct sbrec_datapath_binding *sb_db; + + char *logical_port; + char *ip_prefix; + char *type; + bool stale; +}; + +static struct route_entry * +route_alloc_entry(struct hmap *routes, + const struct sbrec_datapath_binding *sb_db, + char *logical_port, char *ip_prefix, char *route_type) +{ + struct route_entry *route_e = xzalloc(sizeof *route_e); + + route_e->sb_db = sb_db; + route_e->logical_port = xstrdup(logical_port); + route_e->ip_prefix = xstrdup(ip_prefix); + route_e->type = xstrdup(route_type); + route_e->stale = false; + uint32_t hash = uuid_hash(&sb_db->header_.uuid); + hash = hash_string(logical_port, hash); + hash = hash_string(ip_prefix, hash); + hmap_insert(routes, &route_e->hmap_node, hash); + + return route_e; +} + +static struct route_entry * +route_lookup_or_add(struct hmap *route_map, + const struct sbrec_datapath_binding *sb_db, + char *logical_port, const struct in6_addr *prefix, + unsigned int plen, char *route_type) +{ + struct route_entry *route_e; + uint32_t hash; + + char *ip_prefix = normalize_v46_prefix(prefix, plen); + + hash = uuid_hash(&sb_db->header_.uuid); + hash = hash_string(logical_port, hash); + hash = hash_string(ip_prefix, hash); + HMAP_FOR_EACH_WITH_HASH (route_e, hmap_node, hash, route_map) { + if (!strcmp(route_e->type, route_type)) { + free(ip_prefix); + return route_e; + } + } + + route_e = route_alloc_entry(route_map, sb_db, + logical_port, ip_prefix, route_type); + free(ip_prefix); + return route_e; +} + +static void +route_erase_entry(struct route_entry *route_e) +{ + free(route_e->logical_port); + free(route_e->ip_prefix); + free(route_e->type); + free(route_e); +} + +static void +routes_table_sync(struct ovsdb_idl_txn *ovnsb_txn, + const struct sbrec_route_table *sbrec_route_table, + const struct hmap *parsed_routes) +{ + if (!ovnsb_txn) { + return; + } + + struct hmap sync_routes = HMAP_INITIALIZER(&sync_routes); + + const struct parsed_route *route; + + struct route_entry *route_e; + const struct sbrec_route *sb_route; + SBREC_ROUTE_TABLE_FOR_EACH (sb_route, sbrec_route_table) { + route_e = route_alloc_entry(&sync_routes, + sb_route->datapath, + sb_route->logical_port, + sb_route->ip_prefix, + sb_route->type); + route_e->stale = true; + route_e->sb_route = sb_route; + } + + HMAP_FOR_EACH (route, key_node, parsed_routes) { + if (route->is_discard_route) { + continue; + } + if (prefix_is_link_local(&route->prefix, route->plen)) { + continue; + } + if (!smap_get_bool(&route->od->nbr->options, "dynamic-routing", + false)) { + continue; + } + route_e = route_lookup_or_add(&sync_routes, + route->od->sb, + route->out_port->key, + &route->prefix, + route->plen, + "advertise"); + route_e->stale = false; + + if (!route_e->sb_route) { + const struct sbrec_route *sr = sbrec_route_insert(ovnsb_txn); + sbrec_route_set_datapath(sr, route_e->sb_db); + sbrec_route_set_logical_port(sr, route_e->logical_port); + sbrec_route_set_ip_prefix(sr, route_e->ip_prefix); + sbrec_route_set_type(sr, route_e->type); + route_e->sb_route = sr; + } + } + + HMAP_FOR_EACH_POP (route_e, hmap_node, &sync_routes) { + /* `receive` routes are added by ovn-controller we should only read but + * not remove them */ + if (strcmp(route_e->sb_route->type, "receive") && + route_e->stale) { + sbrec_route_delete(route_e->sb_route); + } + route_erase_entry(route_e); + } + hmap_destroy(&sync_routes); +} + diff --git a/northd/en-routes-sync.h b/northd/en-routes-sync.h new file mode 100644 index 000000000..ecd41b0b9 --- /dev/null +++ b/northd/en-routes-sync.h @@ -0,0 +1,28 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef EN_ROUTES_SYNC_H +#define EN_ROUTES_SYNC_H 1 + +#include "lib/inc-proc-eng.h" + +/*struct routes_sync_data { + struct sset routes; +};*/ + +void *en_routes_sync_init(struct engine_node *, struct engine_arg *); +void en_routes_sync_cleanup(void *data); +void en_routes_sync_run(struct engine_node *, void *data); + + +#endif /* EN_ROUTES_SYNC_H */ diff --git a/northd/inc-proc-northd.c b/northd/inc-proc-northd.c index ddc16428a..bc361ce72 100644 --- a/northd/inc-proc-northd.c +++ b/northd/inc-proc-northd.c @@ -42,6 +42,7 @@ #include "en-sampling-app.h" #include "en-sync-sb.h" #include "en-sync-from-sb.h" +#include "en-routes-sync.h" #include "unixctl.h" #include "util.h" @@ -103,7 +104,8 @@ static unixctl_cb_func chassis_features_list; SB_NODE(fdb, "fdb") \ SB_NODE(static_mac_binding, "static_mac_binding") \ SB_NODE(chassis_template_var, "chassis_template_var") \ - SB_NODE(logical_dp_group, "logical_dp_group") + SB_NODE(logical_dp_group, "logical_dp_group") \ + SB_NODE(route, "route") enum sb_engine_node { #define SB_NODE(NAME, NAME_STR) SB_##NAME, @@ -162,6 +164,7 @@ static ENGINE_NODE(route_policies, "route_policies"); static ENGINE_NODE(routes, "routes"); static ENGINE_NODE(bfd, "bfd"); static ENGINE_NODE(bfd_sync, "bfd_sync"); +static ENGINE_NODE(routes_sync, "routes_sync"); void inc_proc_northd_init(struct ovsdb_idl_loop *nb, struct ovsdb_idl_loop *sb) @@ -264,6 +267,9 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, engine_add_input(&en_bfd_sync, &en_route_policies, NULL); engine_add_input(&en_bfd_sync, &en_northd, bfd_sync_northd_change_handler); + engine_add_input(&en_routes_sync, &en_routes, NULL); + engine_add_input(&en_routes_sync, &en_sb_route, NULL); + engine_add_input(&en_sync_meters, &en_nb_acl, NULL); engine_add_input(&en_sync_meters, &en_nb_meter, NULL); engine_add_input(&en_sync_meters, &en_sb_meter, NULL); @@ -277,6 +283,7 @@ void inc_proc_northd_init(struct ovsdb_idl_loop *nb, engine_add_input(&en_lflow, &en_bfd_sync, NULL); engine_add_input(&en_lflow, &en_route_policies, NULL); engine_add_input(&en_lflow, &en_routes, NULL); + engine_add_input(&en_lflow, &en_routes_sync, NULL); engine_add_input(&en_lflow, &en_global_config, node_global_config_handler); diff --git a/northd/northd.c b/northd/northd.c index c25c501d9..4ad760025 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -11053,7 +11053,8 @@ route_hash(struct parsed_route *route) } static bool -find_static_route_outport(struct ovn_datapath *od, const struct hmap *lr_ports, +find_static_route_outport(const struct ovn_datapath *od, + const struct hmap *lr_ports, const struct nbrec_logical_router_static_route *route, bool is_ipv4, const char **p_lrp_addr_s, struct ovn_port **p_out_port); @@ -11157,7 +11158,7 @@ parsed_route_add(const struct ovn_datapath *od, new_pr->route_table_id = route_table_id; new_pr->is_src_route = is_src_route; new_pr->hash = route_hash(new_pr); - new_pr->nbr = od->nbr; + new_pr->od = od; new_pr->ecmp_symmetric_reply = ecmp_symmetric_reply; new_pr->is_discard_route = is_discard_route; if (!is_discard_route) { @@ -11178,7 +11179,8 @@ parsed_route_add(const struct ovn_datapath *od, } static void -parsed_routes_add_static(struct ovn_datapath *od, const struct hmap *lr_ports, +parsed_routes_add_static(const struct ovn_datapath *od, + const struct hmap *lr_ports, const struct nbrec_logical_router_static_route *route, const struct hmap *bfd_connections, struct hmap *routes, struct simap *route_tables, @@ -11298,7 +11300,8 @@ parsed_routes_add_static(struct ovn_datapath *od, const struct hmap *lr_ports, } static void -parsed_routes_add_connected(struct ovn_datapath *od, const struct ovn_port *op, +parsed_routes_add_connected(const struct ovn_datapath *od, + const struct ovn_port *op, struct hmap *routes) { for (int i = 0; i < op->lrp_networks.n_ipv4_addrs; i++) { @@ -11327,14 +11330,14 @@ parsed_routes_add_connected(struct ovn_datapath *od, const struct ovn_port *op, } void -build_parsed_routes(struct ovn_datapath *od, const struct hmap *lr_ports, - const struct hmap *bfd_connections, struct hmap *routes, - struct simap *route_tables, - struct hmap *bfd_active_connections) +build_parsed_routes(const struct ovn_datapath *od, const struct hmap *lr_ports, + const struct hmap *bfd_connections, struct hmap *routes, + struct simap *route_tables, + struct hmap *bfd_active_connections) { struct parsed_route *pr; HMAP_FOR_EACH (pr, key_node, routes) { - if (pr->nbr == od->nbr) { + if (pr->od == od) { pr->stale = true; } } @@ -11542,7 +11545,8 @@ build_route_match(const struct ovn_port *op_inport, uint32_t rtb_id, /* Output: p_lrp_addr_s and p_out_port. */ static bool -find_static_route_outport(struct ovn_datapath *od, const struct hmap *lr_ports, +find_static_route_outport(const struct ovn_datapath *od, + const struct hmap *lr_ports, const struct nbrec_logical_router_static_route *route, bool is_ipv4, const char **p_lrp_addr_s, struct ovn_port **p_out_port) { diff --git a/northd/northd.h b/northd/northd.h index eb669f734..77faab65d 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -714,7 +714,7 @@ struct parsed_route { const struct nbrec_logical_router_static_route *route; bool ecmp_symmetric_reply; bool is_discard_route; - const struct nbrec_logical_router *nbr; + const struct ovn_datapath *od; bool stale; enum route_source source; char *lrp_addr_s; @@ -744,7 +744,7 @@ void northd_indices_create(struct northd_data *data, void route_policies_init(struct route_policies_data *); void route_policies_destroy(struct route_policies_data *); -void build_parsed_routes(struct ovn_datapath *, const struct hmap *, +void build_parsed_routes(const struct ovn_datapath *, const struct hmap *, const struct hmap *, struct hmap *, struct simap *, struct hmap *); uint32_t get_route_table_id(struct simap *, const char *); diff --git a/ovn-nb.xml b/ovn-nb.xml index 2836f58f5..1cdb2b770 100644 --- a/ovn-nb.xml +++ b/ovn-nb.xml @@ -2930,6 +2930,11 @@ or option is not present the limit is not set and the zone limit is derived from OvS default datapath limit. + + + If set to true then this + can participate in dynamic routing with components outside of OVN. + diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema index 73abf2c8d..22e43dc8a 100644 --- a/ovn-sb.ovsschema +++ b/ovn-sb.ovsschema @@ -1,7 +1,7 @@ { "name": "OVN_Southbound", - "version": "20.37.0", - "cksum": "1950136776 31493", + "version": "20.38.0", + "cksum": "956398967 32154", "tables": { "SB_Global": { "columns": { @@ -617,6 +617,19 @@ "type": {"key": "string", "value": "string", "min": 0, "max": "unlimited"}}}, "indexes": [["chassis"]], + "isRoot": true}, + "Route": { + "columns": { + "datapath": + {"type": {"key": {"type": "uuid", + "refTable": "Datapath_Binding"}}}, + "logical_port": {"type": "string"}, + "ip_prefix": {"type": "string"}, + "type": {"type": {"key": {"type": "string", + "enum": ["set", ["advertise", + "receive"]]}, + "min": 1, "max": 1}}}, + "indexes": [["datapath", "logical_port", "ip_prefix"]], "isRoot": true} } } diff --git a/ovn-sb.xml b/ovn-sb.xml index 5285cae30..a65bd2cbb 100644 --- a/ovn-sb.xml +++ b/ovn-sb.xml @@ -5180,4 +5180,54 @@ tcp.flags = RST; The set of variable values for a given chassis. + + +

+ Each record represents a route thas is export from ovn or imported to ovn + using some dynamic routing logic outside of ovn. + It is populated by ovn-northd based on the addresses, routes + and NAT Entries of a OVN_Northbound.Logical_Router_Port. +

+ + + The datapath belonging to the + OVN_Northbound.Logical_Router that this route is valid + for. + + + +

+ If the type is advertise then this is the logical_port + the router will send packets out. +

+ +

+ If the type is receive then this is the logical_port + the route was learned on. +

+
+ + +

+ IP prefix of this route (e.g. 192.168.100.0/24). +

+
+ + +

+ If the route is to be exported from OVN to the outside network or if + it is imported from the outside network. +

+
    +
  • + advertise: This route should be advertised to the + outside network. +
  • +
  • + receive: This route has been learned from the outside + network. +
  • +
+
+