From patchwork Tue Oct 15 13:53:05 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xavier Simonart X-Patchwork-Id: 1997442 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" (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OORilASI; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::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 4XSbCg0Mq1z1xsc for ; Wed, 16 Oct 2024 00:53:19 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 45BC5405AE; Tue, 15 Oct 2024 13:53:17 +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 p58rVVQvs10n; Tue, 15 Oct 2024 13:53:15 +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 52504405DF Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=OORilASI Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp4.osuosl.org (Postfix) with ESMTPS id 52504405DF; Tue, 15 Oct 2024 13:53:15 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 318D2C08A6; Tue, 15 Oct 2024 13:53:15 +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 104A5C08A3 for ; Tue, 15 Oct 2024 13:53:14 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 8148D405C8 for ; Tue, 15 Oct 2024 13:53:13 +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 z7mq08BtBV8g for ; Tue, 15 Oct 2024 13:53:10 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124; helo=us-smtp-delivery-124.mimecast.com; envelope-from=xsimonar@redhat.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp4.osuosl.org 36B80405D1 Authentication-Results: smtp4.osuosl.org; dmarc=pass (p=none dis=none) header.from=redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 36B80405D1 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 36B80405D1 for ; Tue, 15 Oct 2024 13:53:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729000388; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=N9gik6nv25EjupNfA5NHtSI949e8L2UfrRW0aJiIh28=; b=OORilASIPF39OedgVb8P+4nq7i39znK5O7tTJ4oewE+wivnQtuDEFmC5pwmUVtXGjJUENc AwCJq/K8WHIge1NR3/Ic9potjPn3Ec0VSXwAapIy/kwT0Y576ZtdTMj/LhG7F3YihavjMz r533Ndlp7hKz2eqITJo1lrwaERKY344= Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-515-doa00xFXO9ai0tHb3H6gRw-1; Tue, 15 Oct 2024 09:53:07 -0400 X-MC-Unique: doa00xFXO9ai0tHb3H6gRw-1 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id DBD101955F41 for ; Tue, 15 Oct 2024 13:53:06 +0000 (UTC) Received: from wsfd-netdev90.ntdv.lab.eng.bos.redhat.com (wsfd-netdev90.anl.eng.rdu2.dc.redhat.com [10.6.38.135]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 62BAA1956056; Tue, 15 Oct 2024 13:53:06 +0000 (UTC) From: Xavier Simonart To: xsimonar@redhat.com, dev@openvswitch.org Date: Tue, 15 Oct 2024 15:53:05 +0200 Message-Id: <20241015135305.2140051-1-xsimonar@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [ovs-dev] [PATCH ovn] controller: Delete flows on port delete/add. 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: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" When a logical_port is deleted and added back, in two sb transactions being handled within one ovn-controller loop, some flows belonging to the deleted pb (such as flows in OFTABLE_CHK_IN_PORT_SEC) were not properly deleted. Reported-at: https://issues.redhat.com/browse/FDP-873 Signed-off-by: Xavier Simonart --- controller/lflow.c | 3 +++ controller/local_data.c | 26 ++++++++++++++++++++++++-- tests/ovn.at | 40 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/controller/lflow.c b/controller/lflow.c index 13c3a0d73..987de3f06 100644 --- a/controller/lflow.c +++ b/controller/lflow.c @@ -2287,6 +2287,9 @@ lflow_handle_flows_for_lport(const struct sbrec_port_binding *pb, * port binding'uuid', then this function should handle it properly. */ ofctrl_remove_flows(l_ctx_out->flow_table, &pb->header_.uuid); + if (sbrec_port_binding_is_deleted(pb)) { + return true; + } if (pb->n_port_security && shash_find(l_ctx_in->binding_lports, pb->logical_port)) { diff --git a/controller/local_data.c b/controller/local_data.c index f889fb76b..9ee5d9171 100644 --- a/controller/local_data.c +++ b/controller/local_data.c @@ -359,15 +359,37 @@ tracked_datapath_lport_add(const struct sbrec_port_binding *pb, } /* Check if the lport is already present or not. - * If it is already present, then just update the 'pb' field. */ + * If it is already present, then check whether it is the same pb. + * We might have two different pb with the same logical_port if it was + * deleted and added back within the same loop. + * If the same pb was already present, just update the 'pb' field. + * Otherwise, add the second pb */ struct tracked_lport *lport = shash_find_data(&tracked_dp->lports, pb->logical_port); if (!lport) { lport = xmalloc(sizeof *lport); shash_add(&tracked_dp->lports, pb->logical_port, lport); + } else if (pb != lport->pb) { + bool found = false; + /* There is at least another pb with the same logical_port. + * However, our pb might already be shash_added (e.g. pb1 deleted, pb2 + * added, pb2 deleted). This is not really optimal, but this loop + * only runs in a very uncommon race condition (same logical port + * deleted and added within same loop */ + struct shash_node *node; + SHASH_FOR_EACH (node, &tracked_dp->lports) { + lport = (struct tracked_lport *) node->data; + if (lport->pb == pb) { + found = true; + break; + } + } + if (!found) { + lport = xmalloc(sizeof *lport); + shash_add(&tracked_dp->lports, pb->logical_port, lport); + } } - lport->pb = pb; lport->tracked_type = tracked_type; } diff --git a/tests/ovn.at b/tests/ovn.at index d7f01169c..4835612ce 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -39233,3 +39233,43 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd]) OVN_CLEANUP([hv1]) AT_CLEANUP ]) + +OVN_FOR_EACH_NORTHD([ +AT_SETUP([Port Deleted and added back]) +ovn_start + +net_add n1 + +sim_add hv1 +as hv1 +ovs-vsctl add-br br-phys +ovn_attach n1 br-phys 192.168.0.1 +ovn-appctl vlog/set dbg +check ovs-vsctl -- add-port br-int hv1-vif1 -- \ + set interface hv1-vif1 external-ids:iface-id=sw0-p1 \ + options:tx_pcap=hv1/vif1-tx.pcap \ + options:rxq_pcap=hv1/vif1-rx.pcap \ + ofport-request=1 + +check ovn-nbctl ls-add sw0 +check ovn-nbctl lsp-add sw0 sw0-p1 +check ovn-nbctl lsp-set-addresses sw0-p1 "50:54:00:00:00:03 2001::3" +check ovn-nbctl lsp-set-port-security sw0-p1 "50:54:00:00:00:03 2001::3" + +OVN_POPULATE_ARP +wait_for_ports_up +check ovn-nbctl --wait=hv sync + +# Delete sw0-p1 +sleep_controller hv1 +check ovn-nbctl --wait=sb lsp-del sw0-p1 + +# Add back sw0-p1 but without any address set. +check ovn-nbctl --wait=sb lsp-add sw0 sw0-p1 +wake_up_controller hv1 + +CHECK_FLOWS_AFTER_RECOMPUTE([hv1], [hv1]) + +OVN_CLEANUP([hv1]) +AT_CLEANUP +])