From patchwork Mon Jan 13 23:47:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Zhou X-Patchwork-Id: 1222394 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.138; helo=whitealder.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ovn.org Received: from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47xVdX6MH7z9sNx for ; Tue, 14 Jan 2020 10:48:00 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 5937C852C7; Mon, 13 Jan 2020 23:47:58 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0wi2-pvDQgMo; Mon, 13 Jan 2020 23:47:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by whitealder.osuosl.org (Postfix) with ESMTP id EADBD85310; Mon, 13 Jan 2020 23:47:56 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CD290C1D80; Mon, 13 Jan 2020 23:47:56 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 49015C077D for ; Mon, 13 Jan 2020 23:47:55 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 3F5F785DF1 for ; Mon, 13 Jan 2020 23:47:55 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Bk1ECLE1ELGB for ; Mon, 13 Jan 2020 23:47:54 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net [217.70.183.197]) by fraxinus.osuosl.org (Postfix) with ESMTPS id EFAD485DEC for ; Mon, 13 Jan 2020 23:47:53 +0000 (UTC) X-Originating-IP: 216.113.160.77 Received: from localhost.localdomain.localdomain (unknown [216.113.160.77]) (Authenticated sender: hzhou@ovn.org) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 423701C0006; Mon, 13 Jan 2020 23:47:49 +0000 (UTC) From: Han Zhou To: dev@openvswitch.org Date: Mon, 13 Jan 2020 15:47:43 -0800 Message-Id: <1578959263-113782-1-git-send-email-hzhou@ovn.org> X-Mailer: git-send-email 2.1.0 Cc: Han Zhou Subject: [ovs-dev] [PATCH ovn v2] ofctrl.c: Update installed OVS flow cookie when lflow is changed. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" When an old lflow is replaced by a new lflow, if the OVS flows translated by the old and new lflows have same match, ofctrl will update existing OVS flow instead of deleting and adding a new one. However, when updating the existing flows, the cookie was not updated by current implementation, which results in discrepency between lflows and OVS flows, making debugging difficult and confuses tools such as ovn-trace. This patch fixes it. Note: since command OFPFC_MODIFY_STRICT in FLOW_MOD message doesn't support updating flow cookie after OpenFlow 1.1, this patch changes to use OFPFC_ADD command whenever cookie needs to be updated, which effectively modifies existing flow if a match is found. Signed-off-by: Han Zhou Acked-by: Mark Michelson --- v1->v2: According to Mark Michelson's comment, use OFPFC_MODIFY_STRICT when cookie doesn't need to be updated. controller/ofctrl.c | 12 +++++++++++- tests/ovn.at | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/controller/ofctrl.c b/controller/ofctrl.c index 10edd84..36e39ba 100644 --- a/controller/ofctrl.c +++ b/controller/ofctrl.c @@ -828,6 +828,7 @@ ovn_flow_to_string(const struct ovn_flow *f) { struct ds s = DS_EMPTY_INITIALIZER; ds_put_format(&s, "sb_uuid="UUID_FMT", ", UUID_ARGS(&f->sb_uuid)); + ds_put_format(&s, "cookie=%"PRIx64", ", f->cookie); ds_put_format(&s, "table_id=%"PRIu8", ", f->table_id); ds_put_format(&s, "priority=%"PRIu16", ", f->priority); minimatch_format(&f->match, NULL, NULL, &s, OFP_DEFAULT_PRIORITY); @@ -1176,7 +1177,8 @@ ofctrl_put(struct ovn_desired_flow_table *flow_table, i->sb_uuid = d->sb_uuid; } if (!ofpacts_equal(i->ofpacts, i->ofpacts_len, - d->ofpacts, d->ofpacts_len)) { + d->ofpacts, d->ofpacts_len) || + i->cookie != d->cookie) { /* Update actions in installed flow. */ struct ofputil_flow_mod fm = { .match = i->match, @@ -1186,6 +1188,14 @@ ofctrl_put(struct ovn_desired_flow_table *flow_table, .ofpacts_len = d->ofpacts_len, .command = OFPFC_MODIFY_STRICT, }; + /* Update cookie if it is changed. */ + if (i->cookie != d->cookie) { + fm.modify_cookie = true; + fm.new_cookie = htonll(d->cookie); + /* Use OFPFC_ADD so that cookie can be updated. */ + fm.command = OFPFC_ADD, + i->cookie = d->cookie; + } add_flow_mod(&fm, &msgs); ovn_flow_log(i, "updating installed"); diff --git a/tests/ovn.at b/tests/ovn.at index 411b768..adb677c 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -17338,3 +17338,39 @@ OVS_WAIT_UNTIL([ OVN_CLEANUP([hv1]) AT_CLEANUP + +AT_SETUP([ovn -- trace when flow cookie updated]) +AT_KEYWORDS([cookie]) +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 +ovs-vsctl add-port br-int vif1 -- \ + set interface vif1 external-ids:iface-id=lp1 ofport-request=1 + +ovn-nbctl ls-add lsw0 +ovn-nbctl lsp-add lsw0 lp1 +ovn-nbctl lsp-set-addresses lp1 "f0:00:00:00:00:01 10.0.0.1" +ovn-nbctl acl-add lsw0 from-lport 1000 'eth.type == 0x1234' drop + +ovn-nbctl --wait=hv --timeout=3 sync + +# Trace with --ovs should see ovs flow related to the ACL +AT_CHECK([ovn-trace --ovs lsw0 'inport == "lp1" && eth.type == 0x1234' | grep "dl_type=0x1234" | grep "cookie"], [0], [ignore]) + +# Replace the ACL with same match but different action. +ovn-nbctl acl-del lsw0 -- \ + acl-add lsw0 from-lport 1000 'eth.type == 0x1234' allow + +ovn-nbctl --wait=hv --timeout=3 sync + +# Trace with --ovs should still see the ovs flow related to the ACL, which +# means the OVS flow is updated with new cookie corresponding to the new lflow. +AT_CHECK([ovn-trace --ovs lsw0 'inport == "lp1" && eth.type == 0x1234' | grep "dl_type=0x1234 actions="], [0], [ignore]) + +OVN_CLEANUP([hv1]) + +AT_CLEANUP