Skip to content

Commit

Permalink
controller: Update physical flows for peer port when the patch port i…
Browse files Browse the repository at this point in the history
…s removed.

Similar to commit 1431276 ("controller: fix ovn patch port
incremental processing"), update peer logical flows when the related
patch port is removed.

Reported-at: https://issues.redhat.com/browse/FDP-947
Signed-off-by: Lorenzo Bianconi <[email protected]>
  • Loading branch information
LorenzoBianconi authored and numansiddique committed Jan 17, 2025
1 parent a5d6329 commit 92a8ad0
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 6 deletions.
5 changes: 5 additions & 0 deletions controller/ovn-controller.c
Original file line number Diff line number Diff line change
Expand Up @@ -4567,6 +4567,11 @@ pflow_output_sb_port_binding_handler(struct engine_node *node,
*/
const struct sbrec_port_binding *pb;
SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb, p_ctx.port_binding_table) {
/* Trigger a full recompute if type column is updated. */
if (sbrec_port_binding_is_updated(pb, SBREC_PORT_BINDING_COL_TYPE)) {
destroy_physical_ctx(&p_ctx);
return false;
}
bool removed = sbrec_port_binding_is_deleted(pb);
if (!physical_handle_flows_for_lport(pb, removed, &p_ctx,
&pfo->flow_table)) {
Expand Down
20 changes: 14 additions & 6 deletions controller/physical.c
Original file line number Diff line number Diff line change
Expand Up @@ -2412,13 +2412,21 @@ physical_handle_flows_for_lport(const struct sbrec_port_binding *pb,
physical_multichassis_reprocess(pb, p_ctx, flow_table);
}

if (!removed) {
/* Always update pb and the configured peer for patch ports. */
if (!removed || !strcmp(pb->type, "patch")) {
physical_eval_port_binding(p_ctx, pb, flow_table);
if (!strcmp(pb->type, "patch")) {
const struct sbrec_port_binding *peer =
get_binding_peer(p_ctx->sbrec_port_binding_by_name, pb);
if (peer) {
physical_eval_port_binding(p_ctx, peer, flow_table);
}

if (!strcmp(pb->type, "patch")) {
if (removed) {
ofctrl_remove_flows(flow_table, &pb->header_.uuid);
}
const struct sbrec_port_binding *peer =
get_binding_peer(p_ctx->sbrec_port_binding_by_name, pb);
if (peer) {
physical_eval_port_binding(p_ctx, peer, flow_table);
if (removed) {
ofctrl_remove_flows(flow_table, &peer->header_.uuid);
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions tests/ovn-controller.at
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,13 @@ check ovn-nbctl lrp-add lr0 rp-ls1 00:00:01:01:02:03 192.168.1.254/24

OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int | grep table=OFTABLE_LOCAL_OUTPUT | grep -q "reg15=0x${port},metadata=0x${meta}"])

# Check we have a full recompute if type column is updated
AT_CHECK([ovn-appctl -t ovn-controller inc-engine/clear-stats])
check ovn-nbctl lsp-set-type ls0-rp localnet
AT_CHECK([ovn-appctl -t ovn-controller inc-engine/show-stats | grep physical_flow_output -A 1 | awk '/recompute/{print $3}'],[0],[dnl
1
])

OVN_CLEANUP([hv1])
AT_CLEANUP
])
Expand Down
47 changes: 47 additions & 0 deletions tests/ovn.at
Original file line number Diff line number Diff line change
Expand Up @@ -40754,3 +40754,50 @@ AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v
OVN_CLEANUP([hv1],[hv2])
AT_CLEANUP
])

OVN_FOR_EACH_NORTHD([
AT_SETUP([requested-tnl-key-recompute])
AT_KEYWORDS([requested-tnl-key-recompute])

m4_define([OFTABLE_LOG_TO_PHY], [65])

ovn_start
net_add n1

check ovn-nbctl ls-add ls
check ovn-nbctl lsp-add ls lsp -- lsp-set-addresses lsp "00:00:10:01:02:01 10.0.0.1"

check ovn-nbctl lr-add lr
check ovn-nbctl set logical_router lr options:mac_binding_age_threshold=3600
check ovn-nbctl lrp-add lr lr-ls 00:00:00:00:ff:01 10.0.0.254/24
check ovn-nbctl lsp-add ls ls-lr
check ovn-nbctl lsp-set-type ls-lr router
check ovn-nbctl lsp-set-addresses ls-lr router
check ovn-nbctl lsp-set-options ls-lr router-port=lr-ls

sim_add hv1

as hv1
ovs-vsctl add-br br-phys
ovn_attach n1 br-phys 192.168.0.1
ovs-vsctl set open . external_ids:ovn-bridge-mappings=physnet1:br-phys
ovs-vsctl add-port br-int vif -- set Interface vif external-ids:iface-id=lsp

check ovn-nbctl --wait=hv sync
wait_for_ports_up

check ovn-nbctl --wait=hv set logical_router_port lr-ls options:requested-tnl-key=42
ls_tnl_key=$(fetch_column datapath_binding tunnel_key external_ids:name=ls)
AT_CHECK([ovs-ofctl dump-flows br-int table=OFTABLE_LOG_TO_PHY | grep metadata=0x${ls_tnl_key} | grep -q load:0x2a->NXM_NX_REG14])

check ovn-nbctl lrp-del lr-ls
check ovn-nbctl \
-- lrp-add lr lr-ls 00:00:00:00:10:00 192.168.10.1/24 \
-- set logical_router_port lr-ls options:requested-tnl-key=43
check ovn-nbctl --wait=hv sync

AT_CHECK([ovs-ofctl dump-flows br-int table=OFTABLE_LOG_TO_PHY | grep metadata=0x${ls_tnl_key} | grep -q load:0x2b->NXM_NX_REG14])

OVN_CLEANUP([hv1])
AT_CLEANUP
])

0 comments on commit 92a8ad0

Please sign in to comment.