From patchwork Mon Nov 4 11:04:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Huettner X-Patchwork-Id: 2006188 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=FW4XhEOS; 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=FW4XhEOS; 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 4Xhpb30YqFz1xwF for ; Mon, 4 Nov 2024 22:07:26 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id E354E60FEF; Mon, 4 Nov 2024 11:07:16 +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 SDxxbsLlVxFI; Mon, 4 Nov 2024 11:07:13 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org DFA4760C2C Authentication-Results: smtp3.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=FW4XhEOS; 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=FW4XhEOS Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp3.osuosl.org (Postfix) with ESMTPS id DFA4760C2C; Mon, 4 Nov 2024 11:06:48 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 8A54FC08A6; Mon, 4 Nov 2024 11:06:48 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 26932C08A9 for ; Mon, 4 Nov 2024 11:06:47 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 397674064A for ; Mon, 4 Nov 2024 11:05:08 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id HJcVM68dx6q5 for ; Mon, 4 Nov 2024 11:05:05 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:2608::627; helo=eur02-db5-obe.outbound.protection.outlook.com; envelope-from=felix.huettner@stackit.cloud; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp2.osuosl.org F1335409E5 Authentication-Results: smtp2.osuosl.org; dmarc=pass (p=reject dis=none) header.from=stackit.cloud DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org F1335409E5 Authentication-Results: smtp2.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=FW4XhEOS; dkim=pass (2048-bit key) header.d=stackit.cloud header.i=@stackit.cloud header.a=rsa-sha256 header.s=selector1 header.b=FW4XhEOS Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02on20627.outbound.protection.outlook.com [IPv6:2a01:111:f403:2608::627]) by smtp2.osuosl.org (Postfix) with ESMTPS id F1335409E5 for ; Mon, 4 Nov 2024 11:04:56 +0000 (UTC) ARC-Seal: i=2; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=pass; b=Aj1k4jxJtxpYoc/5vuLkQjQWrmzI9J+P58WR7U6YVLhnbOb4dyrWytQGPzWz5qKWTP1bqXBIUsj8caaH4/DKqpuEbDHI6G+TNbP16Lo4qDTcFVY9NQBitq7jxniiQYtsraOSqSAmry+bltA2rdANpdDVFywMQD4FHkEIt0x6/ef6u/i62tBmbcYohh0FXW8vhQks082pC+XRG299fehOsb9buVwRi7cmL7YiaqCd3fZxQSnSwV6+3Udjcz7Y98Ywx2HgDoMMq86rr2Jjt7FbpSV0ff/hjv5jXOltYpr6ehN0N/LgNUvcYhKZBFpZ7IkDW1XVMmZVVTbrqeRTCSvmKw== 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=wa6i4vCev+D8pKQ9/2F8jKdBXaibzodbS8j8e9pGnUw=; b=rJjU6NUNgRksXvs4HoaaI7vJwVZGgMJhpjUbptjMbD9slidEVuVoIH3Ld+dyJZ6ZqMc6KpcnjfmnotW9tzP7Xbdzg/41uiP3aN4FVJMIZnZ/1bx+qo3phrZKjX2CBf3HaIZuCeAFlKEGZ46cRMBpAhkQOLFjhi1Y493oz0X5YvRdeKHjYzTK0LSZlXzVip/kUqreIJrYJgLYh6mHn2XC21SOTwvJPQlqvHKwnQcLE+BN1h68gD3+CtmajCW2g9qGWM775w5urIkFmrloYxiAsn9HIU4uQajgPfY6KcTlBUOl+mBbLau8e+JY7lo5Ge3ajLqidYBVqjwrQCW6xzRyVg== ARC-Authentication-Results: i=2; mx.microsoft.com 1; spf=fail (sender ip is 52.169.0.179) 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=wa6i4vCev+D8pKQ9/2F8jKdBXaibzodbS8j8e9pGnUw=; b=FW4XhEOSUHEaWD6JlMc4OUr8dQZXVZErUPi/134eLUYNerARg82DfbcAdC2qj1O/UVTVSxVxI0Zf3UBkXqCQd6JK8AOROte41eHgZ2aeG6dCfM9RF6dofmTwmNDMtwIdL/QJy3hu1JSgqczrj/kIt8a7hBa4bAj5w+1SUTZ3ylCEjS2mCH60YiijbabrwRbHiqAPkA7R76kbaKSiguypM7YaxFmR4a532CxbNW0XMe0DubwOFugUDcCjY8yzJ7PRHO3q4uadXSDw1QoGiJsTzmO+DKBZw/ewHj+wvMsdmBxSuvs26VhkdSG6K+4c1WjKkQSVkUm9SW/rSGgEd4Ynow== Received: from DU7P251CA0006.EURP251.PROD.OUTLOOK.COM (2603:10a6:10:551::7) by DU0PR10MB7167.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:10:44d::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.14; Mon, 4 Nov 2024 11:04:51 +0000 Received: from DB5PEPF00014B89.eurprd02.prod.outlook.com (2603:10a6:10:551:cafe::fb) by DU7P251CA0006.outlook.office365.com (2603:10a6:10:551::7) 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:51 +0000 X-MS-Exchange-Authentication-Results: spf=fail (sender IP is 52.169.0.179) 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 52.169.0.179 as permitted sender) receiver=protection.outlook.com; client-ip=52.169.0.179; helo=eu2.smtp.exclaimer.net; Received: from eu2.smtp.exclaimer.net (52.169.0.179) by DB5PEPF00014B89.mail.protection.outlook.com (10.167.8.197) 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:51 +0000 Received: from EUR05-AM6-obe.outbound.protection.outlook.com (104.47.18.112) by eu2.smtp.exclaimer.net (52.169.0.179) with Exclaimer Signature Manager ESMTP Proxy eu2.smtp.exclaimer.net (tlsversion=TLS12, tlscipher=TLS_DIFFIEHELLMAN_WITH_AES256_NONE); Mon, 4 Nov 2024 11:04:51 +0000 X-ExclaimerHostedSignatures-MessageProcessed: true X-ExclaimerProxyLatency: 4834594 X-ExclaimerImprintLatency: 1694577 X-ExclaimerImprintAction: 403f093032c9432ca8a87a6e0d762954 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=f3oLvyZaz6yDmUwKAPAoJuRea6FM34qOuUPQI3KKqozFjaPJ/ozDaalTENt0fgiukKKuuHQCvULKeaADctcZD4eBmpMFe0CoMVKYshZOOQPUzQpKbDnsO63C6r3tawzsvO8p0TFLXyhmS67uqvllWotcEYmqnahwipdDnmRDztv10ukTVQbnIhzoC+XtRV9Hl2fVnjwGIQUfnAaWWE5gDCoyYT+FXkbEcaKLJS/Lq4qYsT1hDP7d2mH4tLQ4c/BVu8BzCa3OwOxO64ft2CxHTCZaWlg0EZ6Ly2QsCl3zrZvnfwWw9kYiocWG9/MQaPStSDdlJY5b10lDM9o7OJmR9Q== 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=wa6i4vCev+D8pKQ9/2F8jKdBXaibzodbS8j8e9pGnUw=; b=n5CfTmy9K85bGEelM6E5liyYGIqBie651sFY25sGZ+wZmcdsSlbWTC6zn0KRaEItMV2NC7NiDV9020ve0geLWTCPE4HLxxhCzOLHaJtmVd4CUoe4v8Qf1XQZxNoJg0WSFt4IOXkrQnFRbbBHKyN1OW0tUv3mjAWZzk/puCfhdm0LDYXByPC1JW8XKBADWzFxKt4wXwsyzg9Xk3JrCdXmU2fe40CQl6SU5RxE5XsVkABoKE6n+1b8F2z9VP7Ni+xlMOlZptvT2i6aAcSpERN0sRFg16wp096ySGGlCTWbdeujwAjuxTW5CrCzL/93uvr9nFUVc3CB+Xl/+2BlKdS5rA== 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=wa6i4vCev+D8pKQ9/2F8jKdBXaibzodbS8j8e9pGnUw=; b=FW4XhEOSUHEaWD6JlMc4OUr8dQZXVZErUPi/134eLUYNerARg82DfbcAdC2qj1O/UVTVSxVxI0Zf3UBkXqCQd6JK8AOROte41eHgZ2aeG6dCfM9RF6dofmTwmNDMtwIdL/QJy3hu1JSgqczrj/kIt8a7hBa4bAj5w+1SUTZ3ylCEjS2mCH60YiijbabrwRbHiqAPkA7R76kbaKSiguypM7YaxFmR4a532CxbNW0XMe0DubwOFugUDcCjY8yzJ7PRHO3q4uadXSDw1QoGiJsTzmO+DKBZw/ewHj+wvMsdmBxSuvs26VhkdSG6K+4c1WjKkQSVkUm9SW/rSGgEd4Ynow== 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 PA2PR10MB8449.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:425::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8137.16; Mon, 4 Nov 2024 11:04:49 +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:49 +0000 Date: Mon, 4 Nov 2024 12:04:47 +0100 To: dev@openvswitch.org Message-ID: Mail-Followup-To: dev@openvswitch.org References: Content-Disposition: inline In-Reply-To: X-please-dont-add-a-signature: thanks X-ClientProxiedBy: FR3P281CA0118.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a3::13) To PAVPR10MB6914.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:102:30d::9) MIME-Version: 1.0 X-MS-TrafficTypeDiagnostic: PAVPR10MB6914:EE_|PA2PR10MB8449:EE_|DB5PEPF00014B89:EE_|DU0PR10MB7167:EE_ X-MS-Office365-Filtering-Correlation-Id: 6f3bebf7-0da3-49e6-696c-08dcfcc0814f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info-Original: P4R/3de8RSB9DTuTfLRelI2Mgl9DWLSUw1+PVsgoFPcygdfEjQN2r0V5OdNtoNMlLn+IUHTiRqEVlVMgsrSKr8TA9Ih2p6sMUjzHHd3MhiGZSjxlJ+Qh26wvcXb6+wHHeqE2cM6qfWFbsCeJiP/7m7lrxQrOgVgLIE5qo4OIiofzwOIvGhpwfO+AlwvrOC4X2xbD/OpKd/xf8yMfvkNJAiGCaSMXqb52fKMlkLt8tI6b1ch89354Sz9qzxu4c7oETdZl7e3qZ1oHKzBLOLAdn9WSYsW6mPZ+kvIyTd1qY+brD6JZg0jVyEB3/mtuh4xsay3z28lLdhp6zKPbeBQ2qrEnsS6Kn/dYBLCbVeTab0+CE3rz9OF+2PepD215ecuZ2mAY/FRd525XgSz/Q9wCFMELKyvRu6bQpH1MjEWietuW4kZ7dW1ZIu/7usfS3p+H4SspQ8QgQoIeYCHjOZ2KHvTX0BvatMf48MW3Q675RRQjin4R5dXlpJX2kxpW559qhyjxtWzN6ZIFvnk0D3CWkAASd5vy8IR7DvfCfAqJz9JsLm5mRHIff3aRRK3hh5Ju3RTVfeLSAzz/r7+/3cti3CQ8c3Xd2cwz8yBLlC5T+u8vzACFAqtGplPnQ5ykjBlhmt5slv4aM2Nik7hbg4diWLEmdd3VDMT1JT8OIKf+BcsBZEaEHMZ9N/fpw2rXbdTZ8ie2LN8/F487bvZ2gPRdcwuvcJM5xQKXToHymX5jg1WzPqW7HpPUenwnbHDQBgRrKzbwRlIS5LfBIst6bEmmpFlUJuPZSjDm9BIrzCsPghA0zKevkinjUW6qzpYA66171gKhN/tFLkWS3unNO/XZLCU+rSwy33bDZYU6n81TPOIj44cB2KAN56SWc+lPQYG7+pfCKhOvHxQqEToQNpNJ+WU7o/WFAGNMSsrk7G1ns2CkTFnSUOVAN/+LsbgEnyGSL2phc3lkC+Dr6RpuvM89/F+8AtXENJ53STo9dbB0kDblqR1e2F48v0UlqzXDTlc9FcU2s6MdpidAjdzbWTCMeOUz8BZpQg0Dk+0mtqJd5vcpE80EJUQpRp8e+bl7u2V9WxhAQW1P6NrxWatNZ1uX3jXFNmLj40su+sv93q7/SozBtYOXHz8StIrqFiTpq+SKBdywhO8GAJBuiFhmD39djer8Pnacyw/Vrcvd05IEHB2IIYR5WjiAA2JunuvFfFwUC/VqUixg0Odu8HEi+j22M8qcQia9JXhrGFZsW7HOvketGjaQOscTWfKNjQjPfivasoJ2z2pYT9x0Vup4NJIFqRpALuS+AH2h7A7ZkmX6vwdh5kdce6MLFCkwchH5wPak 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)(376014)(1800799024)(366016); DIR:OUT; SFP:1101; X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA2PR10MB8449 X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5PEPF00014B89.eurprd02.prod.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: e2ebaa8f-6db6-46b7-3fb8-08dcfcc08024 X-Microsoft-Antispam: BCL:0; ARA:13230040|36860700013|376014|82310400026|1800799024|35042699022|14060799003; X-Microsoft-Antispam-Message-Info: yv3X7mBZPMGZTIWm5Yk8nrb36QVbvIU7UVogcYSYu/soaOkYT23fejMCZkaOq6hOeh9xcE6ntt6p8HoxkQmj4wk8qRkVlh8txOaDiz6Wv8nnH7lOsBzMl9FnPnLEF+E8RiBq0lUcpRqrEH0d3vOEOhrtbPjlXbLVCs0yzn/xIFZ2BzIcRP97KrceYpFQIoQoVOyzFAR4ClzZCcxVXuC0fekO6dXJxRFHu6FtyoxnYbFi2iUZ9psEUx6rqlTEZgYMBuIWwP9RElaTFRCyvKdhxlm9RBlbQuk6lBBWGUA8p5gmZ6n0PtkRFPJVfJQalQhqRU5iLBgs+r3P85x9C9krYXZWGZWIgD4SC7UKZ4vNzfnF/TJH3hquvFLdVaxuqRGWXT1PQWJvb/fTbXRiAbZ2rbNmdoXMM/kA17FqnM+Pe46hFMaWRpSX95MOZSUbNQdfuU0Ey2909J33aWga7osvIZEIJadEU0nW3D/sF/kxiYG15XbnjZgti113Ibb0dUS/kn4ffeA7hnbyBwYvnrLv7GGv/yx1GRmM9rwGsYnz1JI6NRgQJ7FRmp7pLcExSLrztDBBFXOqQVcKgQw+jillqp3zdaNSipCqVMMbo4okGfArOPcyN//L2MnAs61+SQKdXWnrEqhrhFE8Y9aLIhYAYQmqS8qXOusoUVRoTkAKdU2/0vUlaVaJYoop3xo3LYLXkKMmfpsdC0cLCMN/jGBMupyEk0iBpSWn6FO1Cg7W3LIj1ndDXOlryQpxOKZNf8JICrAff4W7NBNtmRdLDQfJXo794d0VeN4OGKPOEwhIA5a4gkwLVe+oIuD15qo2XttpJzfWDV9bi2gmOS6Yb6yxxg2kycf4y0VhjU/JeHMf6ieoMJChMFQYOQA3nVHUoW6mmJgtPlMJI51lV17OhVtBbpR6azxfoCFpLiOordr+10WMJor5il6ivGDYXVq/qdU0Ca8Zxwmqa/rjaVxyiJCkQTc+ILH21nuzMnPfNDt8bVIgSivN2VLLR7c7aPnjpqfPfz/xaoQzSuzSxCqfxnmlDVoYR7M4WzNA4p70QYzMPKFqx7DMsd8VX01pTjH6yMlI+gFdjt0+d3Hkn52h4HwGSamtrqx+syYQLG+zd4MT86MHtpK1hckuvYIxejCOuMhdQG9kWlW/pzleUsBX6yYhQry//YKucW1EllPTnhPFoYer/BKpwQWMya6YXxYpa3r55E+vwlve3xkX3ZNIRFEKYXtTsxRbpskYxZ61ctXvU/ON/U1Z17QjZOWgbDjUKI7K+Wjcr76Htd8RVqF/u+F+iGOByzOtOsSL0finc+DiIG/YfkrDlkGrUMUeCACnZYcbRM4IKEA5I/tIVWIOMP2AKvzdRQOAooe1IC75S2atvKYCQgz1K9/wM9ha8jUeHUziEer7C68C1LmYCogPT8vldg== X-Forefront-Antispam-Report: CIP:52.169.0.179; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:eu2.smtp.exclaimer.net; PTR:eu2.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:51.0965 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6f3bebf7-0da3-49e6-696c-08dcfcc0814f X-MS-Exchange-CrossTenant-Id: d04f4717-5a6e-4b98-b3f9-6918e0385f4c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=d04f4717-5a6e-4b98-b3f9-6918e0385f4c; Ip=[52.169.0.179]; Helo=[eu2.smtp.exclaimer.net] X-MS-Exchange-CrossTenant-AuthSource: DB5PEPF00014B89.eurprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR10MB7167 Subject: [ovs-dev] [PATCH ovn v2 26/32] controller: Watch for route changes. 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" for each vrf/network namespace we use we open a netlink watcher. This allows us to reconcile on changed route entries from outside routing agents. Signed-off-by: Felix Huettner --- controller/automake.mk | 7 +- controller/ovn-controller.c | 48 +++++++++ controller/route-exchange-netlink.c | 8 +- controller/route-exchange-netlink.h | 2 + controller/route-exchange-stub.c | 6 -- controller/route-exchange.c | 9 +- controller/route-exchange.h | 3 + controller/route-table-notify-stub.c | 37 +++++++ controller/route-table-notify.c | 154 +++++++++++++++++++++++++++ controller/route-table-notify.h | 43 ++++++++ 10 files changed, 307 insertions(+), 10 deletions(-) create mode 100644 controller/route-table-notify-stub.c create mode 100644 controller/route-table-notify.c create mode 100644 controller/route-table-notify.h diff --git a/controller/automake.mk b/controller/automake.mk index b1bb23e78..6d3bd9b59 100644 --- a/controller/automake.mk +++ b/controller/automake.mk @@ -51,6 +51,7 @@ controller_ovn_controller_SOURCES = \ controller/ct-zone.h \ controller/ct-zone.c \ controller/route-exchange.h \ + controller/route-table-notify.h \ controller/route.h \ controller/route.c @@ -58,10 +59,12 @@ if HAVE_NETLINK controller_ovn_controller_SOURCES += \ controller/route-exchange-netlink.h \ controller/route-exchange-netlink.c \ - controller/route-exchange.c + controller/route-exchange.c \ + controller/route-table-notify.c else controller_ovn_controller_SOURCES += \ - controller/route-exchange-stub.c + controller/route-exchange-stub.c \ + controller/route-table-notify-stub.c endif controller_ovn_controller_LDADD = lib/libovn.la $(OVS_LIBDIR)/libopenvswitch.la diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index cd14db8de..3091128c7 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -89,6 +89,7 @@ #include "ct-zone.h" #include "route.h" #include "route-exchange.h" +#include "route-table-notify.h" VLOG_DEFINE_THIS_MODULE(main); @@ -4968,9 +4969,13 @@ en_route_exchange_run(struct engine_node *node, void *data OVS_UNUSED) struct route_exchange_ctx_out r_ctx_out = { }; + hmap_init(&r_ctx_out.route_table_watches); route_exchange_run(&r_ctx_in, &r_ctx_out); + route_table_notify_update_watches(&r_ctx_out.route_table_watches); + hmap_destroy(&r_ctx_out.route_table_watches); + engine_set_node_state(node, EN_UPDATED); } @@ -4986,6 +4991,38 @@ static void en_route_exchange_cleanup(void *data OVS_UNUSED) {} +struct ed_type_route_table_notify { + /* For incremental processing this could be tracked per datapath in + * the future. */ + bool changed; +}; + +static void +en_route_table_notify_run(struct engine_node *node, void *data) +{ + struct ed_type_route_table_notify *rtn = data; + if (rtn->changed) { + engine_set_node_state(node, EN_UPDATED); + } else { + engine_set_node_state(node, EN_UNCHANGED); + } + rtn->changed = false; +} + + +static void * +en_route_table_notify_init(struct engine_node *node OVS_UNUSED, + struct engine_arg *arg OVS_UNUSED) +{ + struct ed_type_route_table_notify *rtn = xzalloc(sizeof(*rtn)); + rtn->changed = true; + return rtn; +} + +static void +en_route_table_notify_cleanup(void *data OVS_UNUSED) +{} + /* Returns false if the northd internal version stored in SB_Global * and ovn-controller internal version don't match. */ @@ -5280,6 +5317,7 @@ main(int argc, char *argv[]) ENGINE_NODE(mac_cache, "mac_cache"); ENGINE_NODE(bfd_chassis, "bfd_chassis"); ENGINE_NODE_WITH_CLEAR_TRACK_DATA(route, "route"); + ENGINE_NODE(route_table_notify, "route_table_notify"); ENGINE_NODE(route_exchange, "route_exchange"); #define SB_NODE(NAME, NAME_STR) ENGINE_NODE_SB(NAME, NAME_STR); @@ -5312,6 +5350,7 @@ main(int argc, char *argv[]) engine_add_input(&en_route, &en_sb_route, engine_noop_handler); engine_add_input(&en_route_exchange, &en_route, NULL); + engine_add_input(&en_route_exchange, &en_route_table_notify, NULL); engine_add_input(&en_route_exchange, &en_sb_route, engine_noop_handler); @@ -5816,6 +5855,14 @@ main(int argc, char *argv[]) &transport_zones, bridge_table); + if (route_table_notify_run()) { + struct ed_type_route_table_notify *rtn = + engine_get_internal_data(&en_route_table_notify); + if (rtn) { + rtn->changed = true; + } + } + stopwatch_start(CONTROLLER_LOOP_STOPWATCH_NAME, time_msec()); if (ovnsb_idl_txn) { @@ -6092,6 +6139,7 @@ main(int argc, char *argv[]) } binding_wait(); + route_table_notify_wait(); } unixctl_server_run(unixctl); diff --git a/controller/route-exchange-netlink.c b/controller/route-exchange-netlink.c index f2d72c3a7..284161144 100644 --- a/controller/route-exchange-netlink.c +++ b/controller/route-exchange-netlink.c @@ -252,6 +252,12 @@ handle_route_msg_delete_routes(const struct route_table_msg *msg, void *data) } } +char * +re_nl_get_netns_name(uint32_t table_id) +{ + return xasprintf("ovnns%d", table_id); +} + void re_nl_sync_routes(uint32_t table_id, const struct hmap *routes, struct hmap *learned_routes, @@ -260,7 +266,7 @@ re_nl_sync_routes(uint32_t table_id, char * netns = NULL; if (use_netns) { - netns = xasprintf("ovnns%d", table_id); + netns = re_nl_get_netns_name(table_id); table_id = RT_TABLE_MAIN; } diff --git a/controller/route-exchange-netlink.h b/controller/route-exchange-netlink.h index 11f989cf6..5d48cbfd7 100644 --- a/controller/route-exchange-netlink.h +++ b/controller/route-exchange-netlink.h @@ -34,6 +34,8 @@ struct re_nl_received_route_node { struct in6_addr nexthop; }; +char * re_nl_get_netns_name(uint32_t table_id); + int re_nl_create_vrf(const char *ifname, uint32_t table_id); int re_nl_delete_vrf(const char *ifname); diff --git a/controller/route-exchange-stub.c b/controller/route-exchange-stub.c index 2ca644b06..7225e67a8 100644 --- a/controller/route-exchange-stub.c +++ b/controller/route-exchange-stub.c @@ -19,12 +19,6 @@ #include "openvswitch/compiler.h" #include "route-exchange.h" -bool -route_exchange_relevant_port(const struct sbrec_port_binding *pb OVS_UNUSED) -{ - return false; -} - void route_exchange_run(struct route_exchange_ctx_in *r_ctx_in OVS_UNUSED, struct route_exchange_ctx_out *r_ctx_out OVS_UNUSED) diff --git a/controller/route-exchange.c b/controller/route-exchange.c index a5a5afee5..12204e42a 100644 --- a/controller/route-exchange.c +++ b/controller/route-exchange.c @@ -25,6 +25,7 @@ #include "ha-chassis.h" #include "local_data.h" #include "route.h" +#include "route-table-notify.h" #include "route-exchange.h" #include "route-exchange-netlink.h" @@ -169,7 +170,7 @@ sb_sync_learned_routes(const struct sbrec_datapath_binding *datapath, void route_exchange_run(struct route_exchange_ctx_in *r_ctx_in, - struct route_exchange_ctx_out *r_ctx_out OVS_UNUSED) + struct route_exchange_ctx_out *r_ctx_out) { struct sset old_maintained_vrfs = SSET_INITIALIZER(&old_maintained_vrfs); sset_swap(&_maintained_vrfs, &old_maintained_vrfs); @@ -203,6 +204,12 @@ route_exchange_run(struct route_exchange_ctx_in *r_ctx_in, r_ctx_in->ovnsb_idl_txn, r_ctx_in->sbrec_route_by_datapath); + struct route_table_watch_request *wr = xzalloc(sizeof(*wr)); + wr->table_id = ad->key; + wr->is_netns = ad->use_netns; + hmap_insert(&r_ctx_out->route_table_watches, &wr->node, + route_table_notify_hash_watch(wr->table_id, wr->is_netns)); + out: re_nl_received_routes_destroy(&received_routes); } diff --git a/controller/route-exchange.h b/controller/route-exchange.h index d19e83403..986194e81 100644 --- a/controller/route-exchange.h +++ b/controller/route-exchange.h @@ -16,6 +16,7 @@ #define ROUTE_EXCHANGE_H 1 #include +#include "openvswitch/hmap.h" struct route_exchange_ctx_in { struct ovsdb_idl_txn *ovnsb_idl_txn; @@ -25,6 +26,8 @@ struct route_exchange_ctx_in { }; struct route_exchange_ctx_out { + /* contains route_table_watch */ + struct hmap route_table_watches; }; void route_exchange_run(struct route_exchange_ctx_in *, diff --git a/controller/route-table-notify-stub.c b/controller/route-table-notify-stub.c new file mode 100644 index 000000000..d6de9852e --- /dev/null +++ b/controller/route-table-notify-stub.c @@ -0,0 +1,37 @@ +/* + * 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 + +#include "openvswitch/compiler.h" +#include "route-table-notify.h" + +bool +route_table_notify_run(void) +{ + return false; +} + +void +route_table_notify_wait(void) +{ +} + +void +route_table_notify_update_watches(struct hmap *route_table_watches OVS_UNUSED) +{ +} + diff --git a/controller/route-table-notify.c b/controller/route-table-notify.c new file mode 100644 index 000000000..fcfd833fd --- /dev/null +++ b/controller/route-table-notify.c @@ -0,0 +1,154 @@ +/* + * 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 +#include + +#include "netlink-notifier.h" +#include "openvswitch/vlog.h" + +#include "binding.h" +#include "route-table.h" +#include "route.h" +#include "route-table-notify.h" +#include "route-exchange-netlink.h" + + +VLOG_DEFINE_THIS_MODULE(route_table_notify); + +struct route_table_watch_entry { + struct hmap_node node; + uint32_t table_id; + bool is_netns; + struct nln *nln; + struct nln_notifier *route_notifier; + struct nln_notifier *route6_notifier; + /* used in update_watches to ensure we clean up */ + bool stale; +}; + +static struct hmap watches = HMAP_INITIALIZER(&watches); +static bool any_route_table_changed = false; +static struct route_table_msg rtmsg; + +static struct route_table_watch_entry* +find_watch_entry(uint32_t table_id, bool is_netns) +{ + struct route_table_watch_entry *we; + uint32_t hash = route_table_notify_hash_watch(table_id, is_netns); + HMAP_FOR_EACH_WITH_HASH (we, node, hash, &watches) { + if (table_id == we->table_id && is_netns == we->is_netns) { + return we; + } + } + return NULL; +} + +static void +route_table_change(const struct route_table_msg *change OVS_UNUSED, + void *aux OVS_UNUSED) +{ + if (change && change->rd.rtm_protocol != RTPROT_OVN) { + any_route_table_changed = true; + } +} + +static void +add_watch_entry(uint32_t table_id, bool is_netns) +{ + struct route_table_watch_entry *we; + uint32_t hash = route_table_notify_hash_watch(table_id, is_netns); + we = xzalloc(sizeof(*we)); + we->table_id = table_id; + we->is_netns = is_netns; + we->stale = false; + char *netns = NULL; + if (is_netns) { + netns = re_nl_get_netns_name(table_id); + } + VLOG_DBG("registering new route table watcher for table %d and netns %s", + table_id, netns); + we->nln = nln_create(netns, NETLINK_ROUTE, route_table_parse, &rtmsg); + free(netns); + + we->route_notifier = + nln_notifier_create(we->nln, RTNLGRP_IPV4_ROUTE, + (nln_notify_func *) route_table_change, NULL); + we->route6_notifier = + nln_notifier_create(we->nln, RTNLGRP_IPV6_ROUTE, + (nln_notify_func *) route_table_change, NULL); + hmap_insert(&watches, &we->node, hash); +} + +static void +remove_watch_entry(struct route_table_watch_entry *we) +{ + hmap_remove(&watches, &we->node); + nln_notifier_destroy(we->route_notifier); + nln_notifier_destroy(we->route6_notifier); + nln_destroy(we->nln); + free(we); +} + +bool +route_table_notify_run(void) +{ + any_route_table_changed = false; + + struct route_table_watch_entry *we; + HMAP_FOR_EACH (we, node, &watches) { + nln_run(we->nln); + } + + return any_route_table_changed; +} + +void +route_table_notify_wait(void) +{ + struct route_table_watch_entry *we; + HMAP_FOR_EACH (we, node, &watches) { + nln_wait(we->nln); + } +} + +void +route_table_notify_update_watches(struct hmap *route_table_watches) +{ + struct route_table_watch_entry *we; + HMAP_FOR_EACH (we, node, &watches) { + we->stale = true; + } + + struct route_table_watch_request *wr; + HMAP_FOR_EACH_SAFE (wr, node, route_table_watches) { + we = find_watch_entry(wr->table_id, wr->is_netns); + if (we) { + we->stale = false; + } else { + add_watch_entry(wr->table_id, wr->is_netns); + } + hmap_remove(route_table_watches, &wr->node); + free(wr); + } + + HMAP_FOR_EACH_SAFE (we, node, &watches) { + if (we->stale) { + remove_watch_entry(we); + } + } + +} diff --git a/controller/route-table-notify.h b/controller/route-table-notify.h new file mode 100644 index 000000000..4fdbc0366 --- /dev/null +++ b/controller/route-table-notify.h @@ -0,0 +1,43 @@ +/* + * 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 ROUTE_TABLE_NOTIFY_H +#define ROUTE_TABLE_NOTIFY_H 1 + +#include +#include "openvswitch/hmap.h" +#include "hash.h" + +struct route_table_watch_request { + struct hmap_node node; + uint32_t table_id; + bool is_netns; +}; + +static inline uint32_t +route_table_notify_hash_watch(uint32_t table_id, bool is_netns) +{ + uint32_t hash = hash_add(0, table_id); + return hash_boolean(is_netns, hash); +} + +/* returns true if any route table has changed enough that we need to learn + * new routes. */ +bool route_table_notify_run(void); +void route_table_notify_wait(void); +/* updates the list of route table watches that are currently active. + * hmap should contain struct route_table_watch_request */ +void route_table_notify_update_watches(struct hmap *route_table_watches); + +#endif /* ROUTE_TABLE_NOTIFY_H */