From patchwork Thu Sep 19 10:42:30 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shibir Basak X-Patchwork-Id: 1987337 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=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=proofpoint20171006 header.b=Wlx6/xrG; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=selector1 header.b=IVPjv+qY; 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 4X8XCw2Wj0z1y1m for ; Thu, 19 Sep 2024 20:42:50 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 45F5A4035C; Thu, 19 Sep 2024 10:42:48 +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 YVt18MjpjddD; Thu, 19 Sep 2024 10:42:46 +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 D26B5402E6 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=proofpoint20171006 header.b=Wlx6/xrG; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=selector1 header.b=IVPjv+qY Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id D26B5402E6; Thu, 19 Sep 2024 10:42:45 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id B02CDC0012; Thu, 19 Sep 2024 10:42:45 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 31E2AC0011 for ; Thu, 19 Sep 2024 10:42:44 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 127CA8452B for ; Thu, 19 Sep 2024 10:42:44 +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 leIyAoal1m8K for ; Thu, 19 Sep 2024 10:42:42 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=148.163.155.12; helo=mx0b-002c1b01.pphosted.com; envelope-from=shibir.basak@nutanix.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp1.osuosl.org 3A92484518 Authentication-Results: smtp1.osuosl.org; dmarc=pass (p=quarantine dis=none) header.from=nutanix.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 3A92484518 Authentication-Results: smtp1.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=proofpoint20171006 header.b=Wlx6/xrG; dkim=pass (2048-bit key, unprotected) header.d=nutanix.com header.i=@nutanix.com header.a=rsa-sha256 header.s=selector1 header.b=IVPjv+qY Received: from mx0b-002c1b01.pphosted.com (mx0b-002c1b01.pphosted.com [148.163.155.12]) by smtp1.osuosl.org (Postfix) with ESMTPS id 3A92484518 for ; Thu, 19 Sep 2024 10:42:41 +0000 (UTC) Received: from pps.filterd (m0127843.ppops.net [127.0.0.1]) by mx0b-002c1b01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 48JAdFDM009572 for ; Thu, 19 Sep 2024 03:42:40 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; h= cc:content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=proofpoint20171006; bh=+ySGRkh1hm1iN /cqnEZCXM53/18g1QbHJow3HwC9rmo=; b=Wlx6/xrGnB9pyghA52KtkmGTxnkRQ AiqwlSbrY4o9Z8DBoQuiQM9FoKEQJqDL0FL1zKoUz270FoQSwLbtCmsG+LxaEdBx jJ7hnutke94sDgQpx9E5YCAOYncYKWvY/9AHKK+/kqM+czturp19h7XfAOHWy18+ gPU+qy3HycTKUIjpik2TsNFVK0Y0oETeq7TZw6Cyy2pANLitp9hcEuKkQQneL23I b5k4o7FZs5ivN3/NqlhZbxAWBzFYeaNBc7/9sKa+m3e7Pvz5r8H/aCtcBItEjsuU A5JZAwwAoQE5ymn3Vk6dh6Usx/kEtPuig6h6ki3dbyHleBF0kWQicSblg== Received: from bn1pr04cu002.outbound.protection.outlook.com (mail-eastus2azlp17010005.outbound.protection.outlook.com [40.93.12.5]) by mx0b-002c1b01.pphosted.com (PPS) with ESMTPS id 41q6sjwyk0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT) for ; Thu, 19 Sep 2024 03:42:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NUbmiJxfZ8deADmRZNr32JBYaYG4t3uD6gQTXNANBddlueYKLFJN2LC0VFxdIIEfQvWP22zyAyVQsp4qMNH5NjvrKPYA+nypqlEGjVyfca0dUqGkglwCV0SvtpPjyUrHPlO0Jitin36urI7Zrk7/u59sCqOuG414DFIqsDDFfhBEX5CH71ncdBZaRSC0RdXwPxaSn03OEiqmgZCkAWPbsDJ6lKMCbg6/jFWX/2XaqNzApzjx2Gs8Zjfbew38QNVQ/Ng23pDoQoZGguzqt7mT/dV/lk/Bgyk5Umu/N6MtWp5N97d9HZ/sK38pYgAh3d3cR3Ha4ObEaivCy3gYzOg+yQ== 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=+ySGRkh1hm1iN/cqnEZCXM53/18g1QbHJow3HwC9rmo=; b=bv8Jop9bEYsuK0yKemwBbrGG1aH6KD41Cvi48phWjEX5tlRHbGQc6SREd+SpUv1WviWAIIYopt23HPu5mLzvGv658p/fp7Hcxu5qTPD2ZUcgoq1zrYbqViCndS9u4zZPg7aOG90cbo4PE3jOUph+WQKctt0grq0BcBFy0tN/n3tJSafPkdgP2K2WCW1nwTqJ4Kf4OvgQjuMVETEoyjbsqWZ951D3JAJXU92LSzsuRKvWTLyWcosD5loG/WY/YTD8MGNfDKgvSxz5eGb5ff15kcUlZnhTR3EBpmBg6WqIX8HqGlB0rmk20ItbGjkQAS/ra/IolMWQ1mYJLO8539ki+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nutanix.com; dmarc=pass action=none header.from=nutanix.com; dkim=pass header.d=nutanix.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nutanix.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+ySGRkh1hm1iN/cqnEZCXM53/18g1QbHJow3HwC9rmo=; b=IVPjv+qYoMjUoKTsCA5reLBA6bOOmLX+Lu/d1ihYURbRYoeL+ABSrkN07GuA/NcfAVsZHyveednKb5LZ8WexXtfxKgPUVXxOeVc91Gn4wXWEyKmSbWP3wSOad83WAHWaXxojw8PJm4TAnbwRen8lnalQwmeB3dbZ9wuvtBm9LBbdTScs46wzA/7cjALTo+n0v7U9aVgkNc+0uQ5KBhUAKhbmoK9UYS/c1p9KHTZ4IfpB19JMPOQYGJCIKWEKDQsnCwyKePx7e9ciYrvU8xmf5DVUdyBilxpiE7rix/RZX2LQk5pEPNwpXVYwHD9lwkh5mP4KlsgSVK3s8cudEMYmPQ== Received: from DM6PR02MB5529.namprd02.prod.outlook.com (2603:10b6:5:30::11) by DM8PR02MB8279.namprd02.prod.outlook.com (2603:10b6:5:314::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7982.21; Thu, 19 Sep 2024 10:42:34 +0000 Received: from DM6PR02MB5529.namprd02.prod.outlook.com ([fe80::baa7:c095:e8a8:5c0c]) by DM6PR02MB5529.namprd02.prod.outlook.com ([fe80::baa7:c095:e8a8:5c0c%7]) with mapi id 15.20.7982.012; Thu, 19 Sep 2024 10:42:34 +0000 To: dev@openvswitch.org Date: Thu, 19 Sep 2024 10:42:30 +0000 Message-Id: <20240919104230.132283-1-shibir.basak@nutanix.com> X-Mailer: git-send-email 2.22.3 X-ClientProxiedBy: BYAPR02CA0058.namprd02.prod.outlook.com (2603:10b6:a03:54::35) To DM6PR02MB5529.namprd02.prod.outlook.com (2603:10b6:5:30::11) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR02MB5529:EE_|DM8PR02MB8279:EE_ X-MS-Office365-Filtering-Correlation-Id: 68537bec-36c2-4051-eb01-08dcd897c4dd x-proofpoint-crosstenant: true X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|376014|52116014|366016|38350700014; X-Microsoft-Antispam-Message-Info: tI0eobZYznljafTGPxZfZlLbItpyVC9XeUsD2i8zVfOz+KBKlF1/yYCplg5RuMUBdmgnZ29rYsXh3gdUafCnE69w4z17x06D4PPpyO82ldnRlvy2iqpfBdtZiv4YTf10yZFGZo4IGWxZMACfFwpYGIeljf3BubsRVx4IL1V6cMYHtyFdmqJDHod2RmmaUJSy+hjSvvLo2Yf8La8T44fON8vYrNTwF7vmeES7tVSmypxxOOu7GKr5vfpEKBEpZ8UxVxc2deihylyM34Qe5gwXi5JG/hFu/4YDY8F1K5n+zsg3ByIJybEtV9YZDRsh/zyBTFnY/qO6EA/VckrV9eS7/l07Y56ixwrH4/gtDHHhTLc0uwbbIJE9zQDGB8LUmJkzV0m94CarFvbxExaKthvC4lnIdQ7Zo41h+tTuvrb/e+VL/Sp9qTw5u8MHhBIs+zHs9WvzPLpovCNIDgimv0Zb9detOLIBT/T0QviwQ96kFZDTbhwyOE98V1WmE3aJDeTq+TlUv3XHrSmxlkcFW9LXCRu9/y/tUH8/qLWjbVj/nJZtNt5fiiopNeDVpcEOZfW62kkxaBPe53zaAM0HDaDwTPF6mzf2dYcHB9lat8HroUUNgS3PAVTvverrRyg03Yxpbii6C/LsIdcrvA4cuBi2XSY81i7Zyy9/2hMlvAE3UqURfxpxZh+PxnkyR//MTMzEYNCWrBTAA1zDYygxOZVzTpFzx6sYdu5BMQDhNZL1ZgCOvBJia1buFeulzZZuFhIADQb/NQAXd0binXRP0zUXDGd9Ym2K2UTozgs8TEpVEnOMHiYBdfIYc09ilWlAifmqVjnJ0HCZ/eUyOD3KTMy1AdvLzTKKy0dAhFaHBx48CITEKSOhwwIdjlraXcGAXZrssVvK/BwpzbVkHmsji6RfJ053x2teyx6bI66SdBDQy4wxdqfRdyRcd11sGzqjEb36bodi04k9+BsTB5qSGUyNzS1LLVfk3NBMH+O3CGDC/ooO+foRCW1tZJBwk95W5qLRI+SdgF4iSWap01kr3+R8UfmJV5LLNuslEORaZxvFeoc9n1/H1QsyuU+LoswHrSUvaBa1sPGulshf18ZB379WIxSPY3HhHfyzDmU6FstlMMXymSw5CQ18ES2vpAfSLN8Ur/f/jlC2zAaifNKdkIhbze0e3o0WZDj/z2X1iRtuVBAbgqN+OzbmEl+w0l67sp2i4YKhoxiNx5A19X9d5vPwREaW4ZcvgpLxWZNBS5eluWciYgMDCx07+gYMwzL3lqYoYSA+XiAamRorfYtRlquhKMbZoia15V7cEUqYsE4O4p1w7idiY1XGEamy55Q75EaHoRmI15KK6gagJjPaWttRBEWHxB3ahS7dxyyDJM4pFCmTvHCda42LYaaw2ifCz6vTdczn+J2ZK3zTWp1UJkbSEw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DM6PR02MB5529.namprd02.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(1800799024)(376014)(52116014)(366016)(38350700014); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: FHltzfzvHxV0yAWSrxsgQuz/h7AppVH7KPGUOvYZi6MTBx2FncqS+XATSGFOLRjpyf9J+tSYheI+YGzHRe2MSj/RToU3zioRG30uycy9G29/xFJ+YGhIgOoQcvODPWR6gZuN6FRAtvkX9vTG7SceWqK02rBrL4i8RwqV+eUUK2VjJJQXfkMlynVpYJ/2z9BbCgpWCBSYt7hBGirtySwt8Gn9KyHnl5TBXb8Ca614UR4OVpW+NSIIHiEIRFvBhOfCtqHH/zKZSTwnN2ZHfAkU7dlSS8cAV6iNozEKh577/FBoS/JbLK/2ccr6ebOm9h4X3lGmh8W5ykekjZ5JYSFSBXtmhR9XFjxDdYQugC7Mx4zAm6Eeh0h42necVbwfdAsPFR0HZlc+/vN65FllsVizk8kAHESrSKKOe/4tvaMQvex3FJJAxaS6V3+PGddqH6Zf7EHIZrPlsXj9dwr0/GIdaOGGzDFr5A9BAWnygXZFnIcPlbI8XhqD33U68I3DoJh2t02+RQLep9X7wpX3+pp7hSjGwcMLlG4NjfTHSnItrwG15VYCX3vmstEwG/kvfUUZYJUJZ3CsBHdEw9RSZzIq1cJ57xGgDDizZm9GL7vldYoCkHn+1NGeZOcwoz5IyuaI3jFuS5IzNC/IxWA3+7R33rcA7lNPlccMBnU03g2x+4kV4TV8oAsR5FJb7RtS7ry58QlCDFnyWPKSiXKwascr53Erv1ZctJa6tCI/XFA0/38lvRjoCIDIMkIuRTRUCDoN+yeqGq3yMLytGDpz6WExrQ3BcA6aqexXI6M6oG4UDeKoX+wXFBU9rT03hv8hxDIUmV87FHTt+7Nxwh4Qvk0eEOaUqMaHof1RyDgbGJcQTqVt+1AnL906/EZj5Ep2vLGn7pdL8MEeH9NVWvxAsFeZiuz6VnXqPsrr+Ja9GlJi4NSyNeWZCYHVN8wRvCQ21ewEuF2Kd8xztMp6ymDSKM4lU1im93tj1p6N78t8ggkkKnEFDJ4lf1jsC+uKuXyAoSosE7laNUdra6G5dOG8MgxG7CvCFIDZZU0lg5SeHAiYEV7l0ZhND9dQZzRlgCwnmkFJiA44Fu4JURgxvQ0xBVMTNPyMmtBoRbxCtzLNrJ1/VwTWEpE42gw/RpxJxLUhZQANKarLGgYCTVHXBJODj1VkMKe+LjusA76S1LZl5VK7q9/Y9bGxCiQbR0ykYitqP4u+Nu1hTQ+cbofhol8HhqsHBLU10VuUA7ooghDRcN7sektnrxk/nacgAGyDE2QReDenvI5NS7DeSNeJQothf1otoiJRRuIDxGMFKLTClfErsD6mN8DOpeq1g2D+5B7h7oSGFQ4vHtXcWYY/3fJhRfMSMgyWZFOjWkyPH56Bdk7k0Z1eiPugLXVxvCTLHAL8IpBwQkahzdBHb1vDGj/hLm5m+Rf19mrLq1IO/iPmV5wP99RAY1cTjrwFQH4GWcucVC+fO63h90z9EXLvJVcKgt0t+aDSA+LQHwSihjOlPrrs3DMLiec5CfKAgEf9ZOU9A1aB13edsN+0xKDKds5lEp/S/6mmE8ME0ZCadBMWKBgKyq43foG9ZsGx9ozID8xcaGN9aER/ZBjvY2STjhIeRuxzwA== X-OriginatorOrg: nutanix.com X-MS-Exchange-CrossTenant-Network-Message-Id: 68537bec-36c2-4051-eb01-08dcd897c4dd X-MS-Exchange-CrossTenant-AuthSource: DM6PR02MB5529.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2024 10:42:34.1085 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: bb047546-786f-4de1-bd75-24e5b6f79043 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oY97IAGF5nqXmjtDHNFLu7C9rNRQVUC0OIyjzv1gVsqoVB7h6/48rjPG0PCrEkkAHUCxkmyR8nInKx4JBUnIQuSvHK/sb2ZA9Bq0ngKATYQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR02MB8279 X-Proofpoint-GUID: X8ykR3F0DeolQwK95rb1vKElBJ9fXHKe X-Authority-Analysis: v=2.4 cv=RvyXLzmK c=1 sm=1 tr=0 ts=66ec0020 cx=c_pps a=xHYxGUywFvkkdmbedG1HCQ==:117 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=EaEq8P2WXUwA:10 a=0034W8JfsZAA:10 a=0kUYKlekyDsA:10 a=64Cc0HZtAAAA:8 a=mV9VRH-2AAAA:8 a=FmbUh0O1ZX4gQ4pvfnoA:9 a=14NRyaPF5x3gF6G45PvQ:22 X-Proofpoint-ORIG-GUID: X8ykR3F0DeolQwK95rb1vKElBJ9fXHKe X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1051,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-19_08,2024-09-18_01,2024-09-02_01 X-Proofpoint-Spam-Reason: safe Subject: [ovs-dev] [PATCH ovn v3] controller: Cleanup FDB entries when a VIF goes down. 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: Shibir Basak via dev From: Shibir Basak Reply-To: Shibir Basak Cc: Shibir Basak Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" When a VIF port goes down, all FDB entries associated with it are deleted. This helps is reducing traffic outage due to stale FDB entries present until the lsp is removed. Acked-by: Naveen Yerramneni Signed-off-by: Shibir Basak --- v1: initial version v2: Rebase on top of latest main Addressed review comments from Dumitru v3: Addressed review comments from Dumitru --- controller/ovn-controller.c | 5 ++++ controller/pinctrl.c | 58 ++++++++++++++++++++----------------- controller/pinctrl.h | 1 + lib/automake.mk | 4 ++- lib/fdb.c | 49 +++++++++++++++++++++++++++++++ lib/fdb.h | 29 +++++++++++++++++++ northd/northd.c | 17 +---------- tests/ovn.at | 50 ++++++++++++++++++++++++++++++++ 8 files changed, 170 insertions(+), 43 deletions(-) create mode 100644 lib/fdb.c create mode 100644 lib/fdb.h diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 64be08ce3..1dca2d579 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -4939,6 +4939,10 @@ main(int argc, char *argv[]) = ovsdb_idl_index_create2(ovnsb_idl_loop.idl, &sbrec_fdb_col_mac, &sbrec_fdb_col_dp_key); + struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port + = ovsdb_idl_index_create2(ovnsb_idl_loop.idl, + &sbrec_fdb_col_port_key, + &sbrec_fdb_col_dp_key); struct ovsdb_idl_index *sbrec_mac_binding_by_datapath = mac_binding_by_datapath_index_create(ovnsb_idl_loop.idl); struct ovsdb_idl_index *sbrec_static_mac_binding_by_datapath @@ -5645,6 +5649,7 @@ main(int argc, char *argv[]) sbrec_igmp_group, sbrec_ip_multicast, sbrec_fdb_by_dp_key_mac, + sbrec_fdb_by_dp_and_port, sbrec_dns_table_get(ovnsb_idl_loop.idl), sbrec_controller_event_table_get( ovnsb_idl_loop.idl), diff --git a/controller/pinctrl.c b/controller/pinctrl.c index c86b4f940..44ad72987 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -62,6 +62,7 @@ #include "lflow.h" #include "ip-mcast.h" #include "ovn-sb-idl.h" +#include "lib/fdb.h" VLOG_DEFINE_THIS_MODULE(pinctrl); @@ -236,6 +237,7 @@ static void send_garp_rarp_prepare( struct ovsdb_idl_index *sbrec_port_binding_by_datapath, struct ovsdb_idl_index *sbrec_port_binding_by_name, struct ovsdb_idl_index *sbrec_mac_binding_by_lport_ip, + struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, const struct ovsrec_bridge *, const struct sbrec_chassis *, const struct hmap *local_datapaths, @@ -376,9 +378,6 @@ static void bfd_monitor_run(struct ovsdb_idl_txn *ovnsb_idl_txn, OVS_REQUIRES(pinctrl_mutex); static void init_fdb_entries(void); static void destroy_fdb_entries(void); -static const struct sbrec_fdb *fdb_lookup( - struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, - uint32_t dp_key, const char *mac); static void run_put_fdb(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, struct ovsdb_idl_index *sbrec_port_binding_by_key, @@ -4146,6 +4145,7 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_igmp_groups, struct ovsdb_idl_index *sbrec_ip_multicast_opts, struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, + struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, const struct sbrec_dns_table *dns_table, const struct sbrec_controller_event_table *ce_table, const struct sbrec_service_monitor_table *svc_mon_table, @@ -4167,7 +4167,8 @@ pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, sbrec_port_binding_by_key, chassis); send_garp_rarp_prepare(ovnsb_idl_txn, sbrec_port_binding_by_datapath, sbrec_port_binding_by_name, - sbrec_mac_binding_by_lport_ip, br_int, chassis, + sbrec_mac_binding_by_lport_ip, + sbrec_fdb_by_dp_and_port, br_int, chassis, local_datapaths, active_tunnels, ovs_table); prepare_ipv6_ras(local_active_ports_ras, sbrec_port_binding_by_name); prepare_ipv6_prefixd(ovnsb_idl_txn, sbrec_port_binding_by_name, @@ -5035,6 +5036,7 @@ struct garp_rarp_data { * announcement (in msecs). */ uint32_t dp_key; /* Datapath used to output this GARP. */ uint32_t port_key; /* Port to inject the GARP into. */ + bool enabled; /* is garp/rarp announcement enabled */ }; /* Contains GARPs/RARPs to be sent. Protected by pinctrl_mutex*/ @@ -5055,7 +5057,7 @@ destroy_send_garps_rarps(void) /* Runs with in the main ovn-controller thread context. */ static void add_garp_rarp(const char *name, const struct eth_addr ea, ovs_be32 ip, - uint32_t dp_key, uint32_t port_key) + uint32_t dp_key, uint32_t port_key, bool enabled) { struct garp_rarp_data *garp_rarp = xmalloc(sizeof *garp_rarp); garp_rarp->ea = ea; @@ -5064,6 +5066,7 @@ add_garp_rarp(const char *name, const struct eth_addr ea, ovs_be32 ip, garp_rarp->backoff = 1000; /* msec. */ garp_rarp->dp_key = dp_key; garp_rarp->port_key = port_key; + garp_rarp->enabled = enabled; shash_add(&send_garp_rarp_data, name, garp_rarp); /* Notify pinctrl_handler so that it can wakeup and process @@ -5082,6 +5085,8 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, bool garp_continuous) { volatile struct garp_rarp_data *garp_rarp = NULL; + bool is_garp_rarp_enabled = !smap_get_bool(&binding_rec->options, + "disable_garp_rarp", false); /* Skip localports as they don't need to be announced */ if (!strcmp(binding_rec->type, "localport")) { @@ -5105,6 +5110,7 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, if (garp_rarp) { garp_rarp->dp_key = binding_rec->datapath->tunnel_key; garp_rarp->port_key = binding_rec->tunnel_key; + garp_rarp->enabled = is_garp_rarp_enabled; if (garp_max_timeout != garp_rarp_max_timeout || garp_continuous != garp_rarp_continuous) { /* reset backoff */ @@ -5115,7 +5121,8 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, add_garp_rarp(name, laddrs->ea, laddrs->ipv4_addrs[i].addr, binding_rec->datapath->tunnel_key, - binding_rec->tunnel_key); + binding_rec->tunnel_key, + is_garp_rarp_enabled); send_garp_locally(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, local_datapaths, binding_rec, laddrs->ea, @@ -5135,6 +5142,7 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, if (garp_rarp) { garp_rarp->dp_key = binding_rec->datapath->tunnel_key; garp_rarp->port_key = binding_rec->tunnel_key; + garp_rarp->enabled = is_garp_rarp_enabled; if (garp_max_timeout != garp_rarp_max_timeout || garp_continuous != garp_rarp_continuous) { /* reset backoff */ @@ -5144,7 +5152,8 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, } else { add_garp_rarp(name, laddrs->ea, 0, binding_rec->datapath->tunnel_key, - binding_rec->tunnel_key); + binding_rec->tunnel_key, + is_garp_rarp_enabled); } free(name); } @@ -5160,6 +5169,7 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, if (garp_rarp) { garp_rarp->dp_key = binding_rec->datapath->tunnel_key; garp_rarp->port_key = binding_rec->tunnel_key; + garp_rarp->enabled = is_garp_rarp_enabled; if (garp_max_timeout != garp_rarp_max_timeout || garp_continuous != garp_rarp_continuous) { /* reset backoff */ @@ -5185,7 +5195,8 @@ send_garp_rarp_update(struct ovsdb_idl_txn *ovnsb_idl_txn, add_garp_rarp(binding_rec->logical_port, laddrs.ea, ip, binding_rec->datapath->tunnel_key, - binding_rec->tunnel_key); + binding_rec->tunnel_key, + is_garp_rarp_enabled); if (ip) { send_garp_locally(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, local_datapaths, binding_rec, laddrs.ea, ip); @@ -6548,6 +6559,10 @@ send_garp_rarp_run(struct rconn *swconn, long long int *send_garp_rarp_time) long long int current_time = time_msec(); *send_garp_rarp_time = LLONG_MAX; SHASH_FOR_EACH (iter, &send_garp_rarp_data) { + struct garp_rarp_data *garp_rarp = iter->data; + if (!garp_rarp->enabled) { + continue; + } long long int next_announce = send_garp_rarp(swconn, iter->data, current_time); if (*send_garp_rarp_time > next_announce) { @@ -6563,6 +6578,7 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_port_binding_by_datapath, struct ovsdb_idl_index *sbrec_port_binding_by_name, struct ovsdb_idl_index *sbrec_mac_binding_by_lport_ip, + struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, const struct ovsrec_bridge *br_int, const struct sbrec_chassis *chassis, const struct hmap *local_datapaths, @@ -6598,12 +6614,18 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, &nat_ip_keys, &local_l3gw_ports, chassis, active_tunnels, &nat_addresses); + /* For deleted ports and deleted nat ips, remove from * send_garp_rarp_data. */ struct shash_node *iter; SHASH_FOR_EACH_SAFE (iter, &send_garp_rarp_data) { if (!sset_contains(&localnet_vifs, iter->name) && !sset_contains(&nat_ip_keys, iter->name)) { + struct garp_rarp_data *data = iter->data; + /* Cleanup FDB entries for inactive ports */ + delete_fdb_entries(sbrec_fdb_by_dp_and_port, + data->dp_key, + data->port_key); send_garp_rarp_delete(iter->name); } } @@ -6613,7 +6635,7 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, SSET_FOR_EACH (iface_id, &localnet_vifs) { const struct sbrec_port_binding *pb = lport_lookup_by_name( sbrec_port_binding_by_name, iface_id); - if (pb && !smap_get_bool(&pb->options, "disable_garp_rarp", false)) { + if (pb) { send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, local_datapaths, pb, &nat_addresses, @@ -6626,7 +6648,7 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, SSET_FOR_EACH (gw_port, &local_l3gw_ports) { const struct sbrec_port_binding *pb = lport_lookup_by_name(sbrec_port_binding_by_name, gw_port); - if (pb && !smap_get_bool(&pb->options, "disable_garp_rarp", false)) { + if (pb) { send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, local_datapaths, pb, &nat_addresses, garp_max_timeout, garp_continuous); @@ -8884,22 +8906,6 @@ destroy_fdb_entries(void) hmap_destroy(&put_fdbs); } -static const struct sbrec_fdb * -fdb_lookup(struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, uint32_t dp_key, - const char *mac) -{ - struct sbrec_fdb *fdb = sbrec_fdb_index_init_row(sbrec_fdb_by_dp_key_mac); - sbrec_fdb_index_set_dp_key(fdb, dp_key); - sbrec_fdb_index_set_mac(fdb, mac); - - const struct sbrec_fdb *retval - = sbrec_fdb_index_find(sbrec_fdb_by_dp_key_mac, fdb); - - sbrec_fdb_index_destroy_row(fdb); - - return retval; -} - static void run_put_fdb(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, diff --git a/controller/pinctrl.h b/controller/pinctrl.h index 3462b670c..6613c87e4 100644 --- a/controller/pinctrl.h +++ b/controller/pinctrl.h @@ -49,6 +49,7 @@ void pinctrl_run(struct ovsdb_idl_txn *ovnsb_idl_txn, struct ovsdb_idl_index *sbrec_igmp_groups, struct ovsdb_idl_index *sbrec_ip_multicast_opts, struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, + struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, const struct sbrec_dns_table *, const struct sbrec_controller_event_table *, const struct sbrec_service_monitor_table *, diff --git a/lib/automake.mk b/lib/automake.mk index b69e854b0..3ff098331 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -49,7 +49,9 @@ lib_libovn_la_SOURCES = \ lib/stopwatch-names.h \ lib/vif-plug-provider.h \ lib/vif-plug-provider.c \ - lib/vif-plug-providers/dummy/vif-plug-dummy.c + lib/vif-plug-providers/dummy/vif-plug-dummy.c \ + lib/fdb.c \ + lib/fdb.h nodist_lib_libovn_la_SOURCES = \ lib/ovn-dirs.c \ lib/ovn-nb-idl.c \ diff --git a/lib/fdb.c b/lib/fdb.c new file mode 100644 index 000000000..80e20ab30 --- /dev/null +++ b/lib/fdb.c @@ -0,0 +1,49 @@ +/* Copyright (c) 2024, Nutanix, Inc. + * + * 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 "lib/fdb.h" + +void +delete_fdb_entries(struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, + uint32_t dp_key, uint32_t port_key) +{ + struct sbrec_fdb *target = + sbrec_fdb_index_init_row(sbrec_fdb_by_dp_and_port); + sbrec_fdb_index_set_dp_key(target, dp_key); + sbrec_fdb_index_set_port_key(target, port_key); + + struct sbrec_fdb *fdb_e; + SBREC_FDB_FOR_EACH_EQUAL (fdb_e, target, sbrec_fdb_by_dp_and_port) { + sbrec_fdb_delete(fdb_e); + } + sbrec_fdb_index_destroy_row(target); +} + +const struct sbrec_fdb * +fdb_lookup(struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, uint32_t dp_key, + const char *mac) +{ + struct sbrec_fdb *fdb = sbrec_fdb_index_init_row(sbrec_fdb_by_dp_key_mac); + sbrec_fdb_index_set_dp_key(fdb, dp_key); + sbrec_fdb_index_set_mac(fdb, mac); + + const struct sbrec_fdb *retval + = sbrec_fdb_index_find(sbrec_fdb_by_dp_key_mac, fdb); + + sbrec_fdb_index_destroy_row(fdb); + + return retval; +} diff --git a/lib/fdb.h b/lib/fdb.h new file mode 100644 index 000000000..b214ce626 --- /dev/null +++ b/lib/fdb.h @@ -0,0 +1,29 @@ +/* Copyright (c) 2024, Nutanix, Inc. + * + * 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 OVN_FDB_H +#define OVN_FDB_H 1 + +#include "ovsdb-idl.h" +#include "ovn-sb-idl.h" + +void +delete_fdb_entries(struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, + uint32_t dp_key, uint32_t port_key); +const struct sbrec_fdb * +fdb_lookup(struct ovsdb_idl_index *sbrec_fdb_by_dp_key_mac, + uint32_t dp_key, const char *mac); + +#endif diff --git a/northd/northd.c b/northd/northd.c index a267cd5f8..793641662 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -42,6 +42,7 @@ #include "lib/ovn-sb-idl.h" #include "lib/ovn-util.h" #include "lib/lb.h" +#include "lib/fdb.h" #include "lflow-mgr.h" #include "memory.h" #include "northd.h" @@ -3398,22 +3399,6 @@ cleanup_stale_fdb_entries(const struct sbrec_fdb_table *sbrec_fdb_table, } } -static void -delete_fdb_entries(struct ovsdb_idl_index *sbrec_fdb_by_dp_and_port, - uint32_t dp_key, uint32_t port_key) -{ - struct sbrec_fdb *target = - sbrec_fdb_index_init_row(sbrec_fdb_by_dp_and_port); - sbrec_fdb_index_set_dp_key(target, dp_key); - sbrec_fdb_index_set_port_key(target, port_key); - - struct sbrec_fdb *fdb_e; - SBREC_FDB_FOR_EACH_EQUAL (fdb_e, target, sbrec_fdb_by_dp_and_port) { - sbrec_fdb_delete(fdb_e); - } - sbrec_fdb_index_destroy_row(target); -} - struct service_monitor_info { struct hmap_node hmap_node; const struct sbrec_service_monitor *sbrec_mon; diff --git a/tests/ovn.at b/tests/ovn.at index 4b6e8132f..2b4346814 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -31794,6 +31794,56 @@ OVN_CLEANUP([hv1], [hv2], [hv3]) AT_CLEANUP ]) +OVN_FOR_EACH_NORTHD([ +AT_SETUP([FDB cleanup when vif goes down]) +ovn_start + +net_add n1 + +check ovn-nbctl ls-add ls0 + +check ovn-nbctl lsp-add ls0 ln_port +check ovn-nbctl lsp-set-addresses ln_port unknown +check ovn-nbctl lsp-set-type ln_port localnet +check ovn-nbctl lsp-set-options ln_port network_name=physnet1 +check ovn-nbctl set logical_switch_port ln_port options:localnet_learn_fdb=true + +check ovn-nbctl lsp-add ls0 vif0 +check ovn-nbctl lsp-set-addresses vif0 "00:00:00:00:10:10 192.168.10.10" unknown + +sim_add hv1 +as hv1 +check ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +check ovs-vsctl -- add-port br-int vif0 -- \ + set interface vif0 external-ids:iface-id=vif0 +check ovs-vsctl -- add-port br-phys ext0 +check ovs-vsctl set open . external_ids:ovn-bridge-mappings=physnet1:br-phys + +wait_for_ports_up +check ovn-nbctl --wait=hv sync +ls0_key=$(fetch_column datapath_binding tunnel_key external_ids:name=ls0) +vif0_key=$(fetch_column port_binding tunnel_key logical_port=vif0) + +ovn-sbctl create FDB mac="00\:00\:00\:00\:10\:10" dp_key=$ls0_key port_key=$vif0_key +ovn-sbctl create FDB mac="00\:00\:00\:00\:20\:20" dp_key=$ls0_key port_key=$vif0_key +wait_row_count sb:FDB 2 +check ovn-nbctl --wait=hv sync + +# vif going down should purge all relevant FDB entries +ovs-vsctl del-port br-int vif0 +OVS_WAIT_UNTIL([test x`ovn-nbctl lsp-get-up vif0` = xdown]) +check ovn-nbctl --wait=hv sync +wait_row_count sb:FDB 0 mac="00:00:00:00:10:10" +wait_row_count sb:FDB 0 mac="00:00:00:00:20:20" + +# vif0 should not be a local datapath in hv1 as vif0 is down +# Hence ln_port should not be a related port. +OVN_CLEANUP([hv1 +ln_port]) +AT_CLEANUP +]) + OVN_FOR_EACH_NORTHD([ AT_SETUP([container port changed to normal port and then deleted]) ovn_start