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>

-- 

Ales Musil

Senior Software Engineer - OVN Core

Red Hat EMEA <https://www.redhat.com>

amu...@redhat.com    IM: amusil
<https://red.ht/sig>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to