Skip to content

Commit

Permalink
binding: handle ovs ofport update
Browse files Browse the repository at this point in the history
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 <mheib@redhat.com>
Acked-by: Mark Michelson <mmichels@redhat.com>
Acked-by: Ales Musil <amusil@redhat.com>
Signed-off-by: Mark Michelson <mmichels@redhat.com>
  • Loading branch information
mohammadheib authored and putnopvut committed Aug 9, 2023
1 parent 1eb0983 commit 3ecf4bb
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 0 deletions.
15 changes: 15 additions & 0 deletions controller/binding.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
45 changes: 45 additions & 0 deletions tests/ovn-controller.at
Original file line number Diff line number Diff line change
Expand Up @@ -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
])

0 comments on commit 3ecf4bb

Please sign in to comment.