Thanks Mohammad and Ales. I have pushed the change to main and all branches back to 22.03.

On 8/3/23 04:46, Ales Musil wrote:
On Mon, Jul 31, 2023 at 7:18 PM Mohammad Heib <mh...@redhat.com> wrote:

Currently when ovs interface ofport is updated
after setting external_ids:iface_id, the ovn-controller
will see this change but will not do much if it handles
this change incrementally.

This behavior leads to a mismatch between the ovs openflow
flows in table=0 (inaccurate in_port) and the ofport number
that the packet was received at which will lead to packets
drop in table=0.

This patch will resolve the above issue by triggering
flows recompute during the I-P processing only if the
affected port are associated with lport and has flows
that need to be updated.

Reported-at: https://issues.redhat.com/browse/FD-3063
Signed-off-by: Mohammad Heib <mh...@redhat.com>
---
  controller/binding.c    | 15 ++++++++++++++
  tests/ovn-controller.at | 45 +++++++++++++++++++++++++++++++++++++++++
  2 files changed, 60 insertions(+)

diff --git a/controller/binding.c b/controller/binding.c
index 9aa3fc6c4..cc4c2b0bb 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -2360,6 +2360,21 @@ consider_iface_claim(const struct ovsrec_interface
*iface_rec,
      /* Get the (updated) b_lport again for the lbinding. */
      b_lport = local_binding_get_primary_lport(lbinding);

+    /*
+     * Update the tracked_dp_bindings whenever an ofport
+     * on a specific ovs port changes.
+     * This update will trigger flow recomputation during
+     * the incremental processing run which updates the local
+     * flows in_port filed.
+     */
+    if (b_lport && ovsrec_interface_is_updated(iface_rec,
+                                    OVSREC_INTERFACE_COL_OFPORT)) {
+        tracked_datapath_lport_add(b_lport->pb, TRACKED_RESOURCE_UPDATED,
+                                   b_ctx_out->tracked_dp_bindings);
+        b_ctx_out->local_lports_changed = true;
+    }
+
+
      /* Update the child local_binding's iface (if any children) and try to
       *  claim the container lbindings. */
      LIST_FOR_EACH (b_lport, list_node, &lbinding->binding_lports) {
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
index e1b6491b3..f2216d245 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -2606,3 +2606,48 @@ AT_CHECK([ovn-sbctl get chassis $chassis_id
other_config:unsupported], [1], [ign
  OVN_CLEANUP([hv1])
  AT_CLEANUP
  ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([ovn-controller - ovs iface change ofport])
+AT_KEYWORDS([ovn])
+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 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
+
+
+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 10.0.0.3
1000::3"
+
+wait_for_ports_up
+ovn-nbctl --wait=hv sync
+
+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=0 | grep -c
in_port=1], [0],[dnl
+1
+])
+
+# update the ovs interface ofport from 1 to 24
+check as hv1 ovs-vsctl set Interface hv1-vif1 ofport-request=24
+OVS_WAIT_UNTIL([test x`as hv1 ovs-vsctl get Interface hv1-vif1 ofport` =
x24])
+
+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=0 | grep -c
in_port=24], [0],[dnl
+1
+])
+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=0 | grep -c
in_port=1], [1],[dnl
+0
+])
+
+OVN_CLEANUP([hv1])
+AT_CLEANUP
+])
--
2.34.3

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Looks good to me, thanks.

Acked-by: Ales Musil <amu...@redhat.com>


_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to