diff mbox series

[ovs-dev] Revert "controller: Properly handle localnet flows in I+P.".

Message ID 20241031171005.215778-1-xsimonar@redhat.com
State Superseded
Headers show
Series [ovs-dev] Revert "controller: Properly handle localnet flows in I+P.". | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/github-robot-_ovn-kubernetes success github build: passed

Commit Message

Xavier Simonart Oct. 31, 2024, 5:10 p.m. UTC
This reverts commit edc064b4c589ab1bb69352523481bd6d997aa1ca.

In setups with multiple localnet ports w/o vlans (or multiple localnet
ports with the same vlans), that patch was trying to create the same
flows with action conjunction multiple times, which caused the following
assert:
0  0x00007ffff77cd834 in __pthread_kill_implementation () from /lib64/libc.so.6
1  0x00007ffff777b8ee in raise () from /lib64/libc.so.6
2  0x00007ffff77638ff in abort () from /lib64/libc.so.6
3  0x000000000042f861 in flow_is_preferred (a=0xafe9a0, b=0xaf9380) at controller/ofctrl.c:966
4  0x000000000042f340 in link_installed_to_desired (i=0xb2eaf0, d=0xafe9a0) at controller/ofctrl.c:987
5  0x000000000042c17c in update_installed_flows_by_track (flow_table=0x813a80, bc=0x7ffffffcc740, installed_flows=0x7894e0 <installed_pflows>, msgs=0x7ffffffcc790) at controller/ofctrl.c:2583
6  0x000000000042af14 in ofctrl_put (lflow_table=0x810180, pflow_table=0x813a80, pending_ct_zones=0x8129b0, pending_lb_tuples=0x80e030, sbrec_meter_by_name=0x7e6840, req_cfg=0, lflows_changed=true, pflows_changed=true) at controller/ofctrl.c:2826
7  0x000000000045015c in main (argc=1, argv=0x7fffffffe218) at controller/ovn-controller.c:5788

Reverting that patch means that flows such as
  table_id=0, priority=180, vlan_tci=0x0000/0x1000, actions=conjunction(100,2/2)
remains after the localnet port is deleted.

Fixes: edc064b4c589 ("controller: Properly handle localnet flows in I+P.")
Reported-at: https://issues.redhat.com/browse/FDP-926

Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
---
 controller/physical.c |  9 ++--
 tests/ovn.at          | 98 +++++++++++++++++++------------------------
 2 files changed, 46 insertions(+), 61 deletions(-)

Comments

Mark Michelson Nov. 1, 2024, 2:03 p.m. UTC | #1
Thanks for the fix Xavier.

Acked-by: Mark Michelson <mmichels@redhat.com>

On 10/31/24 13:10, Xavier Simonart wrote:
> This reverts commit edc064b4c589ab1bb69352523481bd6d997aa1ca.
> 
> In setups with multiple localnet ports w/o vlans (or multiple localnet
> ports with the same vlans), that patch was trying to create the same
> flows with action conjunction multiple times, which caused the following
> assert:
> 0  0x00007ffff77cd834 in __pthread_kill_implementation () from /lib64/libc.so.6
> 1  0x00007ffff777b8ee in raise () from /lib64/libc.so.6
> 2  0x00007ffff77638ff in abort () from /lib64/libc.so.6
> 3  0x000000000042f861 in flow_is_preferred (a=0xafe9a0, b=0xaf9380) at controller/ofctrl.c:966
> 4  0x000000000042f340 in link_installed_to_desired (i=0xb2eaf0, d=0xafe9a0) at controller/ofctrl.c:987
> 5  0x000000000042c17c in update_installed_flows_by_track (flow_table=0x813a80, bc=0x7ffffffcc740, installed_flows=0x7894e0 <installed_pflows>, msgs=0x7ffffffcc790) at controller/ofctrl.c:2583
> 6  0x000000000042af14 in ofctrl_put (lflow_table=0x810180, pflow_table=0x813a80, pending_ct_zones=0x8129b0, pending_lb_tuples=0x80e030, sbrec_meter_by_name=0x7e6840, req_cfg=0, lflows_changed=true, pflows_changed=true) at controller/ofctrl.c:2826
> 7  0x000000000045015c in main (argc=1, argv=0x7fffffffe218) at controller/ovn-controller.c:5788
> 
> Reverting that patch means that flows such as
>    table_id=0, priority=180, vlan_tci=0x0000/0x1000, actions=conjunction(100,2/2)
> remains after the localnet port is deleted.
> 
> Fixes: edc064b4c589 ("controller: Properly handle localnet flows in I+P.")
> Reported-at: https://issues.redhat.com/browse/FDP-926
> 
> Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
> ---
>   controller/physical.c |  9 ++--
>   tests/ovn.at          | 98 +++++++++++++++++++------------------------
>   2 files changed, 46 insertions(+), 61 deletions(-)
> 
> diff --git a/controller/physical.c b/controller/physical.c
> index 2aaa16cbd..c6db4f376 100644
> --- a/controller/physical.c
> +++ b/controller/physical.c
> @@ -699,7 +699,7 @@ put_replace_chassis_mac_flows(const struct shash *ct_zones,
>           put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p);
>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>                           rport_binding->header_.uuid.parts[0],
> -                        &match, ofpacts_p, &localnet_port->header_.uuid);
> +                        &match, ofpacts_p, hc_uuid);
>   
>           /* Provide second search criteria, i.e localnet port's
>            * vlan ID for conjunction flow */
> @@ -719,7 +719,7 @@ put_replace_chassis_mac_flows(const struct shash *ct_zones,
>           conj->clause = 1;
>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>                           rport_binding->header_.uuid.parts[0],
> -                        &match, ofpacts_p, &localnet_port->header_.uuid);
> +                        &match, ofpacts_p, hc_uuid);
>       }
>   }
>   
> @@ -2393,9 +2393,8 @@ physical_handle_flows_for_lport(const struct sbrec_port_binding *pb,
>       struct local_datapath *ldp =
>           get_local_datapath(p_ctx->local_datapaths,
>                              pb->datapath->tunnel_key);
> -    if (!strcmp(pb->type, "external") ||
> -        !strcmp(pb->type, "patch") || !strcmp(pb->type, "l3gateway")) {
> -        /* Those lports have a dependency on the localnet port.
> +    if (!strcmp(pb->type, "external")) {
> +        /* External lports have a dependency on the localnet port.
>            * We need to remove the flows of the localnet port as well
>            * and re-consider adding the flows for it.
>            */
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 10cd7a79b..dfb08fd1e 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -39495,62 +39495,6 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
>   OVN_CLEANUP([hv1])
>   AT_CLEANUP
>   ])
> -OVN_FOR_EACH_NORTHD([
> -AT_SETUP([localnet port flows after deletion])
> -ovn_start
> -net_add n1
> -
> -check ovn-nbctl ls-add sw0
> -
> -for i in 1 2; do
> -    check ovn-nbctl lsp-add sw0 sw0-p${i} -- lsp-set-addresses sw0-p${i} "00:00:10:01:02:0${i} 10.0.0.${i}"
> -    sim_add hv${i}
> -    as hv${i}
> -    ovs-vsctl add-br br-phys
> -    ovn_attach n1 br-phys 192.168.0.${i}
> -    ovs-vsctl set open . external_ids:ovn-bridge-mappings=physnet1:br-phys
> -    ovs-vsctl add-port br-int vif${i} -- \
> -        set Interface vif${i} external-ids:iface-id=sw0-p${i} \
> -                              options:tx_pcap=hv${i}/vif${i}-tx.pcap \
> -                              options:rxq_pcap=hv${i}/vif${i}-rx.pcap
> -done
> -
> -check ovn-nbctl lr-add lr0
> -check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.254/24
> -check ovn-nbctl lsp-add sw0 sw0-lr0
> -check ovn-nbctl lsp-set-type sw0-lr0 router
> -check ovn-nbctl lsp-set-addresses sw0-lr0 router
> -check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
> -
> -check ovn-nbctl --wait=hv sync
> -wait_for_ports_up
> -
> -# We should not have any flows in table OFTABLE_PHY_TO_LOG from in_port different from vif1 and ovn-hv2-0
> -OVN_WAIT_REMOTE_INPUT_FLOWS(["hv1"],["hv2"])
> -of1=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=vif1)
> -of2=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-hv2-0)
> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
> -0
> -])
> -
> -# Add localnet port to sw0
> -check ovn-nbctl lsp-add sw0 ln-sw0 -- lsp-set-addresses ln-sw0 unknown -- lsp-set-type ln-sw0 localnet
> -check ovn-nbctl --wait=hv lsp-set-options ln-sw0 network_name=physnet1 -- set logical_switch_port ln-sw0 tag_request=100
> -
> -OVN_WAIT_PATCH_PORT_FLOWS(["ln-sw0"], ["hv1"])
> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
> -2
> -])
> -
> -# Remove localnet port from sw0. Peer-ports flows should be deleted.
> -check ovn-nbctl --wait=hv lsp-del ln-sw0
> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
> -0
> -])
> -
> -OVN_CLEANUP([hv1],[hv2])
> -AT_CLEANUP
> -])
>   
>   AT_SETUP([Patch ports not owned by OVN])
>   
> @@ -39665,3 +39609,45 @@ check_patch_ports
>   
>   OVN_CLEANUP([hv1])
>   AT_CLEANUP
> +
> +OVN_FOR_EACH_NORTHD([
> +AT_SETUP([Multiple localnet ports without vlans])
> +AT_KEYWORDS([localnet])
> +
> +ovn_start
> +
> +net_add n1
> +sim_add hv1
> +ovs-vsctl add-br br-phys
> +ovn_attach n1 br-phys 192.168.0.1
> +ovn-appctl vlog/set dbg
> +ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=phys:br-phys
> +
> +check ovn-nbctl lr-add lr1
> +check ovn-nbctl lrp-add lr1 lr1-ls1 00:00:01:ff:02:03 192.168.1.254/24
> +
> +check ovn-nbctl ls-add ls1
> +check ovn-nbctl lsp-add ls1 ls1-lr1
> +check ovn-nbctl lsp-set-type ls1-lr1 router
> +check ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1
> +check ovn-nbctl lsp-set-addresses ls1-lr1 router
> +
> +check ovn-nbctl ls-add pub
> +check ovn-nbctl lsp-add pub pub-lr1
> +check ovn-nbctl lsp-set-type pub-lr1 router
> +check ovn-nbctl lsp-set-options pub-lr1 router-port=lr1-pub
> +check ovn-nbctl lsp-set-addresses pub-lr1 router
> +
> +check ovn-nbctl lrp-add lr1 lr1-pub 00:00:01:ff:01:03 172.16.1.254/24
> +check ovn-nbctl lrp-set-gateway-chassis lr1-pub hv1
> +
> +check ovn-nbctl --wait=hv sync
> +wait_for_ports_up
> +
> +check check ovn-nbctl -- lsp-add pub pub-ln -- lsp-set-type pub-ln localnet -- lsp-set-addresses pub-ln unknown -- lsp-set-options pub-ln network_name=phys
> +check check ovn-nbctl -- lsp-add ls1 ls1-ln -- lsp-set-type ls1-ln localnet -- lsp-set-addresses ls1-ln unknown -- lsp-set-options ls1-ln network_name=phys
> +
> +OVN_CLEANUP([hv1])
> +
> +AT_CLEANUP
> +])
Dumitru Ceara Nov. 4, 2024, 11:33 a.m. UTC | #2
Hi Xavier,

On 11/1/24 15:03, Mark Michelson wrote:
> Thanks for the fix Xavier.
> 

+1

> Acked-by: Mark Michelson <mmichels@redhat.com>
> 
> On 10/31/24 13:10, Xavier Simonart wrote:
>> This reverts commit edc064b4c589ab1bb69352523481bd6d997aa1ca.
>>
>> In setups with multiple localnet ports w/o vlans (or multiple localnet
>> ports with the same vlans), that patch was trying to create the same
>> flows with action conjunction multiple times, which caused the following
>> assert:
>> 0  0x00007ffff77cd834 in __pthread_kill_implementation () from
>> /lib64/libc.so.6
>> 1  0x00007ffff777b8ee in raise () from /lib64/libc.so.6
>> 2  0x00007ffff77638ff in abort () from /lib64/libc.so.6
>> 3  0x000000000042f861 in flow_is_preferred (a=0xafe9a0, b=0xaf9380) at
>> controller/ofctrl.c:966
>> 4  0x000000000042f340 in link_installed_to_desired (i=0xb2eaf0,
>> d=0xafe9a0) at controller/ofctrl.c:987
>> 5  0x000000000042c17c in update_installed_flows_by_track
>> (flow_table=0x813a80, bc=0x7ffffffcc740, installed_flows=0x7894e0
>> <installed_pflows>, msgs=0x7ffffffcc790) at controller/ofctrl.c:2583
>> 6  0x000000000042af14 in ofctrl_put (lflow_table=0x810180,
>> pflow_table=0x813a80, pending_ct_zones=0x8129b0,
>> pending_lb_tuples=0x80e030, sbrec_meter_by_name=0x7e6840, req_cfg=0,
>> lflows_changed=true, pflows_changed=true) at controller/ofctrl.c:2826
>> 7  0x000000000045015c in main (argc=1, argv=0x7fffffffe218) at
>> controller/ovn-controller.c:5788
>>
>> Reverting that patch means that flows such as
>>    table_id=0, priority=180, vlan_tci=0x0000/0x1000,
>> actions=conjunction(100,2/2)
>> remains after the localnet port is deleted.
>>
>> Fixes: edc064b4c589 ("controller: Properly handle localnet flows in
>> I+P.")
>> Reported-at: https://issues.redhat.com/browse/FDP-926
>>
>> Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
>> ---
>>   controller/physical.c |  9 ++--
>>   tests/ovn.at          | 98 +++++++++++++++++++------------------------
>>   2 files changed, 46 insertions(+), 61 deletions(-)
>>
>> diff --git a/controller/physical.c b/controller/physical.c
>> index 2aaa16cbd..c6db4f376 100644
>> --- a/controller/physical.c
>> +++ b/controller/physical.c
>> @@ -699,7 +699,7 @@ put_replace_chassis_mac_flows(const struct shash
>> *ct_zones,
>>           put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p);
>>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>>                           rport_binding->header_.uuid.parts[0],
>> -                        &match, ofpacts_p,
>> &localnet_port->header_.uuid);
>> +                        &match, ofpacts_p, hc_uuid);
>>             /* Provide second search criteria, i.e localnet port's
>>            * vlan ID for conjunction flow */
>> @@ -719,7 +719,7 @@ put_replace_chassis_mac_flows(const struct shash
>> *ct_zones,
>>           conj->clause = 1;
>>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>>                           rport_binding->header_.uuid.parts[0],
>> -                        &match, ofpacts_p,
>> &localnet_port->header_.uuid);
>> +                        &match, ofpacts_p, hc_uuid);
>>       }
>>   }
>>   @@ -2393,9 +2393,8 @@ physical_handle_flows_for_lport(const struct
>> sbrec_port_binding *pb,
>>       struct local_datapath *ldp =
>>           get_local_datapath(p_ctx->local_datapaths,
>>                              pb->datapath->tunnel_key);
>> -    if (!strcmp(pb->type, "external") ||
>> -        !strcmp(pb->type, "patch") || !strcmp(pb->type, "l3gateway")) {
>> -        /* Those lports have a dependency on the localnet port.
>> +    if (!strcmp(pb->type, "external")) {
>> +        /* External lports have a dependency on the localnet port.
>>            * We need to remove the flows of the localnet port as well
>>            * and re-consider adding the flows for it.
>>            */
>> diff --git a/tests/ovn.at b/tests/ovn.at
>> index 10cd7a79b..dfb08fd1e 100644
>> --- a/tests/ovn.at
>> +++ b/tests/ovn.at
>> @@ -39495,62 +39495,6 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
>>   OVN_CLEANUP([hv1])
>>   AT_CLEANUP
>>   ])
>> -OVN_FOR_EACH_NORTHD([
>> -AT_SETUP([localnet port flows after deletion])
>> -ovn_start
>> -net_add n1
>> -
>> -check ovn-nbctl ls-add sw0
>> -
>> -for i in 1 2; do
>> -    check ovn-nbctl lsp-add sw0 sw0-p${i} -- lsp-set-addresses
>> sw0-p${i} "00:00:10:01:02:0${i} 10.0.0.${i}"
>> -    sim_add hv${i}
>> -    as hv${i}
>> -    ovs-vsctl add-br br-phys
>> -    ovn_attach n1 br-phys 192.168.0.${i}
>> -    ovs-vsctl set open .
>> external_ids:ovn-bridge-mappings=physnet1:br-phys
>> -    ovs-vsctl add-port br-int vif${i} -- \
>> -        set Interface vif${i} external-ids:iface-id=sw0-p${i} \
>> -                              options:tx_pcap=hv${i}/vif${i}-tx.pcap \
>> -                              options:rxq_pcap=hv${i}/vif${i}-rx.pcap
>> -done
>> -
>> -check ovn-nbctl lr-add lr0
>> -check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.254/24
>> -check ovn-nbctl lsp-add sw0 sw0-lr0
>> -check ovn-nbctl lsp-set-type sw0-lr0 router
>> -check ovn-nbctl lsp-set-addresses sw0-lr0 router
>> -check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
>> -
>> -check ovn-nbctl --wait=hv sync
>> -wait_for_ports_up
>> -
>> -# We should not have any flows in table OFTABLE_PHY_TO_LOG from
>> in_port different from vif1 and ovn-hv2-0
>> -OVN_WAIT_REMOTE_INPUT_FLOWS(["hv1"],["hv2"])
>> -of1=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=vif1)
>> -of2=$(as hv1 ovs-vsctl --bare --columns ofport find Interface
>> name=ovn-hv2-0)
>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>> -v "in_port=$of2" | wc -l], [0], [dnl
>> -0
>> -])
>> -
>> -# Add localnet port to sw0
>> -check ovn-nbctl lsp-add sw0 ln-sw0 -- lsp-set-addresses ln-sw0
>> unknown -- lsp-set-type ln-sw0 localnet
>> -check ovn-nbctl --wait=hv lsp-set-options ln-sw0
>> network_name=physnet1 -- set logical_switch_port ln-sw0 tag_request=100
>> -
>> -OVN_WAIT_PATCH_PORT_FLOWS(["ln-sw0"], ["hv1"])
>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>> -v "in_port=$of2" | wc -l], [0], [dnl
>> -2
>> -])
>> -
>> -# Remove localnet port from sw0. Peer-ports flows should be deleted.
>> -check ovn-nbctl --wait=hv lsp-del ln-sw0
>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>> -v "in_port=$of2" | wc -l], [0], [dnl
>> -0
>> -])
>> -
>> -OVN_CLEANUP([hv1],[hv2])
>> -AT_CLEANUP
>> -])
>>     AT_SETUP([Patch ports not owned by OVN])
>>   @@ -39665,3 +39609,45 @@ check_patch_ports
>>     OVN_CLEANUP([hv1])
>>   AT_CLEANUP
>> +
>> +OVN_FOR_EACH_NORTHD([
>> +AT_SETUP([Multiple localnet ports without vlans])
>> +AT_KEYWORDS([localnet])
>> +
>> +ovn_start
>> +
>> +net_add n1
>> +sim_add hv1
>> +ovs-vsctl add-br br-phys
>> +ovn_attach n1 br-phys 192.168.0.1
>> +ovn-appctl vlog/set dbg
>> +ovs-vsctl set Open_vSwitch .
>> external-ids:ovn-bridge-mappings=phys:br-phys
>> +
>> +check ovn-nbctl lr-add lr1
>> +check ovn-nbctl lrp-add lr1 lr1-ls1 00:00:01:ff:02:03 192.168.1.254/24
>> +
>> +check ovn-nbctl ls-add ls1
>> +check ovn-nbctl lsp-add ls1 ls1-lr1
>> +check ovn-nbctl lsp-set-type ls1-lr1 router
>> +check ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1
>> +check ovn-nbctl lsp-set-addresses ls1-lr1 router
>> +
>> +check ovn-nbctl ls-add pub
>> +check ovn-nbctl lsp-add pub pub-lr1
>> +check ovn-nbctl lsp-set-type pub-lr1 router
>> +check ovn-nbctl lsp-set-options pub-lr1 router-port=lr1-pub
>> +check ovn-nbctl lsp-set-addresses pub-lr1 router
>> +
>> +check ovn-nbctl lrp-add lr1 lr1-pub 00:00:01:ff:01:03 172.16.1.254/24
>> +check ovn-nbctl lrp-set-gateway-chassis lr1-pub hv1
>> +
>> +check ovn-nbctl --wait=hv sync
>> +wait_for_ports_up
>> +
>> +check check ovn-nbctl -- lsp-add pub pub-ln -- lsp-set-type pub-ln

Nit: check check

>> localnet -- lsp-set-addresses pub-ln unknown -- lsp-set-options pub-ln
>> network_name=phys
>> +check check ovn-nbctl -- lsp-add ls1 ls1-ln -- lsp-set-type ls1-ln

Nit: check check

>> localnet -- lsp-set-addresses ls1-ln unknown -- lsp-set-options ls1-ln
>> network_name=phys
>> +

There's a potential for a race here.  We don't actually wait for
ovn-controller to get the SB updates that correspond to this NB change.

In general the test seems odd (out of context) because it's not obvious
that it's testing the ovn-controller flow processing part.  Should we at
least check that some of the relevant OpenFlow rules are installed here?

Thanks,
Dumitru

>> +OVN_CLEANUP([hv1])
>> +
>> +AT_CLEANUP
>> +])
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Xavier Simonart Nov. 4, 2024, 3:29 p.m. UTC | #3
Hi Dumitru

Thanks for the review and the comments.

On Mon, Nov 4, 2024 at 12:34 PM Dumitru Ceara <dceara@redhat.com> wrote:

> Hi Xavier,
>
> On 11/1/24 15:03, Mark Michelson wrote:
> > Thanks for the fix Xavier.
> >
>
> +1
>
> > Acked-by: Mark Michelson <mmichels@redhat.com>
> >
> > On 10/31/24 13:10, Xavier Simonart wrote:
> >> This reverts commit edc064b4c589ab1bb69352523481bd6d997aa1ca.
> >>
> >> In setups with multiple localnet ports w/o vlans (or multiple localnet
> >> ports with the same vlans), that patch was trying to create the same
> >> flows with action conjunction multiple times, which caused the following
> >> assert:
> >> 0  0x00007ffff77cd834 in __pthread_kill_implementation () from
> >> /lib64/libc.so.6
> >> 1  0x00007ffff777b8ee in raise () from /lib64/libc.so.6
> >> 2  0x00007ffff77638ff in abort () from /lib64/libc.so.6
> >> 3  0x000000000042f861 in flow_is_preferred (a=0xafe9a0, b=0xaf9380) at
> >> controller/ofctrl.c:966
> >> 4  0x000000000042f340 in link_installed_to_desired (i=0xb2eaf0,
> >> d=0xafe9a0) at controller/ofctrl.c:987
> >> 5  0x000000000042c17c in update_installed_flows_by_track
> >> (flow_table=0x813a80, bc=0x7ffffffcc740, installed_flows=0x7894e0
> >> <installed_pflows>, msgs=0x7ffffffcc790) at controller/ofctrl.c:2583
> >> 6  0x000000000042af14 in ofctrl_put (lflow_table=0x810180,
> >> pflow_table=0x813a80, pending_ct_zones=0x8129b0,
> >> pending_lb_tuples=0x80e030, sbrec_meter_by_name=0x7e6840, req_cfg=0,
> >> lflows_changed=true, pflows_changed=true) at controller/ofctrl.c:2826
> >> 7  0x000000000045015c in main (argc=1, argv=0x7fffffffe218) at
> >> controller/ovn-controller.c:5788
> >>
> >> Reverting that patch means that flows such as
> >>    table_id=0, priority=180, vlan_tci=0x0000/0x1000,
> >> actions=conjunction(100,2/2)
> >> remains after the localnet port is deleted.
> >>
> >> Fixes: edc064b4c589 ("controller: Properly handle localnet flows in
> >> I+P.")
> >> Reported-at: https://issues.redhat.com/browse/FDP-926
> >>
> >> Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
> >> ---
> >>   controller/physical.c |  9 ++--
> >>   tests/ovn.at          | 98
> +++++++++++++++++++------------------------
> >>   2 files changed, 46 insertions(+), 61 deletions(-)
> >>
> >> diff --git a/controller/physical.c b/controller/physical.c
> >> index 2aaa16cbd..c6db4f376 100644
> >> --- a/controller/physical.c
> >> +++ b/controller/physical.c
> >> @@ -699,7 +699,7 @@ put_replace_chassis_mac_flows(const struct shash
> >> *ct_zones,
> >>           put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p);
> >>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
> >>                           rport_binding->header_.uuid.parts[0],
> >> -                        &match, ofpacts_p,
> >> &localnet_port->header_.uuid);
> >> +                        &match, ofpacts_p, hc_uuid);
> >>             /* Provide second search criteria, i.e localnet port's
> >>            * vlan ID for conjunction flow */
> >> @@ -719,7 +719,7 @@ put_replace_chassis_mac_flows(const struct shash
> >> *ct_zones,
> >>           conj->clause = 1;
> >>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
> >>                           rport_binding->header_.uuid.parts[0],
> >> -                        &match, ofpacts_p,
> >> &localnet_port->header_.uuid);
> >> +                        &match, ofpacts_p, hc_uuid);
> >>       }
> >>   }
> >>   @@ -2393,9 +2393,8 @@ physical_handle_flows_for_lport(const struct
> >> sbrec_port_binding *pb,
> >>       struct local_datapath *ldp =
> >>           get_local_datapath(p_ctx->local_datapaths,
> >>                              pb->datapath->tunnel_key);
> >> -    if (!strcmp(pb->type, "external") ||
> >> -        !strcmp(pb->type, "patch") || !strcmp(pb->type, "l3gateway")) {
> >> -        /* Those lports have a dependency on the localnet port.
> >> +    if (!strcmp(pb->type, "external")) {
> >> +        /* External lports have a dependency on the localnet port.
> >>            * We need to remove the flows of the localnet port as well
> >>            * and re-consider adding the flows for it.
> >>            */
> >> diff --git a/tests/ovn.at b/tests/ovn.at
> >> index 10cd7a79b..dfb08fd1e 100644
> >> --- a/tests/ovn.at
> >> +++ b/tests/ovn.at
> >> @@ -39495,62 +39495,6 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
> >>   OVN_CLEANUP([hv1])
> >>   AT_CLEANUP
> >>   ])
> >> -OVN_FOR_EACH_NORTHD([
> >> -AT_SETUP([localnet port flows after deletion])
> >> -ovn_start
> >> -net_add n1
> >> -
> >> -check ovn-nbctl ls-add sw0
> >> -
> >> -for i in 1 2; do
> >> -    check ovn-nbctl lsp-add sw0 sw0-p${i} -- lsp-set-addresses
> >> sw0-p${i} "00:00:10:01:02:0${i} 10.0.0.${i}"
> >> -    sim_add hv${i}
> >> -    as hv${i}
> >> -    ovs-vsctl add-br br-phys
> >> -    ovn_attach n1 br-phys 192.168.0.${i}
> >> -    ovs-vsctl set open .
> >> external_ids:ovn-bridge-mappings=physnet1:br-phys
> >> -    ovs-vsctl add-port br-int vif${i} -- \
> >> -        set Interface vif${i} external-ids:iface-id=sw0-p${i} \
> >> -                              options:tx_pcap=hv${i}/vif${i}-tx.pcap \
> >> -                              options:rxq_pcap=hv${i}/vif${i}-rx.pcap
> >> -done
> >> -
> >> -check ovn-nbctl lr-add lr0
> >> -check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.254/24
> >> -check ovn-nbctl lsp-add sw0 sw0-lr0
> >> -check ovn-nbctl lsp-set-type sw0-lr0 router
> >> -check ovn-nbctl lsp-set-addresses sw0-lr0 router
> >> -check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
> >> -
> >> -check ovn-nbctl --wait=hv sync
> >> -wait_for_ports_up
> >> -
> >> -# We should not have any flows in table OFTABLE_PHY_TO_LOG from
> >> in_port different from vif1 and ovn-hv2-0
> >> -OVN_WAIT_REMOTE_INPUT_FLOWS(["hv1"],["hv2"])
> >> -of1=$(as hv1 ovs-vsctl --bare --columns ofport find Interface
> name=vif1)
> >> -of2=$(as hv1 ovs-vsctl --bare --columns ofport find Interface
> >> name=ovn-hv2-0)
> >> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
> >> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
> >> -v "in_port=$of2" | wc -l], [0], [dnl
> >> -0
> >> -])
> >> -
> >> -# Add localnet port to sw0
> >> -check ovn-nbctl lsp-add sw0 ln-sw0 -- lsp-set-addresses ln-sw0
> >> unknown -- lsp-set-type ln-sw0 localnet
> >> -check ovn-nbctl --wait=hv lsp-set-options ln-sw0
> >> network_name=physnet1 -- set logical_switch_port ln-sw0 tag_request=100
> >> -
> >> -OVN_WAIT_PATCH_PORT_FLOWS(["ln-sw0"], ["hv1"])
> >> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
> >> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
> >> -v "in_port=$of2" | wc -l], [0], [dnl
> >> -2
> >> -])
> >> -
> >> -# Remove localnet port from sw0. Peer-ports flows should be deleted.
> >> -check ovn-nbctl --wait=hv lsp-del ln-sw0
> >> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
> >> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
> >> -v "in_port=$of2" | wc -l], [0], [dnl
> >> -0
> >> -])
> >> -
> >> -OVN_CLEANUP([hv1],[hv2])
> >> -AT_CLEANUP
> >> -])
> >>     AT_SETUP([Patch ports not owned by OVN])
> >>   @@ -39665,3 +39609,45 @@ check_patch_ports
> >>     OVN_CLEANUP([hv1])
> >>   AT_CLEANUP
> >> +
> >> +OVN_FOR_EACH_NORTHD([
> >> +AT_SETUP([Multiple localnet ports without vlans])
> >> +AT_KEYWORDS([localnet])
> >> +
> >> +ovn_start
> >> +
> >> +net_add n1
> >> +sim_add hv1
> >> +ovs-vsctl add-br br-phys
> >> +ovn_attach n1 br-phys 192.168.0.1
> >> +ovn-appctl vlog/set dbg
> >> +ovs-vsctl set Open_vSwitch .
> >> external-ids:ovn-bridge-mappings=phys:br-phys
> >> +
> >> +check ovn-nbctl lr-add lr1
> >> +check ovn-nbctl lrp-add lr1 lr1-ls1 00:00:01:ff:02:03 192.168.1.254/24
> >> +
> >> +check ovn-nbctl ls-add ls1
> >> +check ovn-nbctl lsp-add ls1 ls1-lr1
> >> +check ovn-nbctl lsp-set-type ls1-lr1 router
> >> +check ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1
> >> +check ovn-nbctl lsp-set-addresses ls1-lr1 router
> >> +
> >> +check ovn-nbctl ls-add pub
> >> +check ovn-nbctl lsp-add pub pub-lr1
> >> +check ovn-nbctl lsp-set-type pub-lr1 router
> >> +check ovn-nbctl lsp-set-options pub-lr1 router-port=lr1-pub
> >> +check ovn-nbctl lsp-set-addresses pub-lr1 router
> >> +
> >> +check ovn-nbctl lrp-add lr1 lr1-pub 00:00:01:ff:01:03 172.16.1.254/24
> >> +check ovn-nbctl lrp-set-gateway-chassis lr1-pub hv1
> >> +
> >> +check ovn-nbctl --wait=hv sync
> >> +wait_for_ports_up
> >> +
> >> +check check ovn-nbctl -- lsp-add pub pub-ln -- lsp-set-type pub-ln
>
> Nit: check check
>
> >> localnet -- lsp-set-addresses pub-ln unknown -- lsp-set-options pub-ln
> >> network_name=phys
> >> +check check ovn-nbctl -- lsp-add ls1 ls1-ln -- lsp-set-type ls1-ln
>
> Nit: check check
>
> >> localnet -- lsp-set-addresses ls1-ln unknown -- lsp-set-options ls1-ln
> >> network_name=phys
> >> +
>
> There's a potential for a race here.  We don't actually wait for
> ovn-controller to get the SB updates that correspond to this NB change.
>
> In general the test seems odd (out of context) because it's not obvious
> that it's testing the ovn-controller flow processing part.  Should we at
> least check that some of the relevant OpenFlow rules are installed here?
>
> I agree that the test should be better documented.
However, I do not think that there is a race: OVN_CLEANUP is doing (2x)
ovn-nbctl --wait=hv sync and then some recompute.
So, the real check of the test is within OVN_CLEANUP: before this revert
patch, the test would fail the ovn-nbctl --wait=hv sync part of OVN_CLEANUP.
I'll anyhow send a v2 adding some flow check (and remove the double check),
so the test would be less obscure.

> Thanks,
> Dumitru
>
> Thanks
Xavier

> >> +OVN_CLEANUP([hv1])
> >> +
> >> +AT_CLEANUP
> >> +])
> >
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
> >
>
>
Dumitru Ceara Nov. 4, 2024, 3:31 p.m. UTC | #4
On 11/4/24 16:29, Xavier Simonart wrote:
> Hi Dumitru
> 
> Thanks for the review and the comments.
> 
> On Mon, Nov 4, 2024 at 12:34 PM Dumitru Ceara <dceara@redhat.com> wrote:
> 
>> Hi Xavier,
>>
>> On 11/1/24 15:03, Mark Michelson wrote:
>>> Thanks for the fix Xavier.
>>>
>>
>> +1
>>
>>> Acked-by: Mark Michelson <mmichels@redhat.com>
>>>
>>> On 10/31/24 13:10, Xavier Simonart wrote:
>>>> This reverts commit edc064b4c589ab1bb69352523481bd6d997aa1ca.
>>>>
>>>> In setups with multiple localnet ports w/o vlans (or multiple localnet
>>>> ports with the same vlans), that patch was trying to create the same
>>>> flows with action conjunction multiple times, which caused the following
>>>> assert:
>>>> 0  0x00007ffff77cd834 in __pthread_kill_implementation () from
>>>> /lib64/libc.so.6
>>>> 1  0x00007ffff777b8ee in raise () from /lib64/libc.so.6
>>>> 2  0x00007ffff77638ff in abort () from /lib64/libc.so.6
>>>> 3  0x000000000042f861 in flow_is_preferred (a=0xafe9a0, b=0xaf9380) at
>>>> controller/ofctrl.c:966
>>>> 4  0x000000000042f340 in link_installed_to_desired (i=0xb2eaf0,
>>>> d=0xafe9a0) at controller/ofctrl.c:987
>>>> 5  0x000000000042c17c in update_installed_flows_by_track
>>>> (flow_table=0x813a80, bc=0x7ffffffcc740, installed_flows=0x7894e0
>>>> <installed_pflows>, msgs=0x7ffffffcc790) at controller/ofctrl.c:2583
>>>> 6  0x000000000042af14 in ofctrl_put (lflow_table=0x810180,
>>>> pflow_table=0x813a80, pending_ct_zones=0x8129b0,
>>>> pending_lb_tuples=0x80e030, sbrec_meter_by_name=0x7e6840, req_cfg=0,
>>>> lflows_changed=true, pflows_changed=true) at controller/ofctrl.c:2826
>>>> 7  0x000000000045015c in main (argc=1, argv=0x7fffffffe218) at
>>>> controller/ovn-controller.c:5788
>>>>
>>>> Reverting that patch means that flows such as
>>>>    table_id=0, priority=180, vlan_tci=0x0000/0x1000,
>>>> actions=conjunction(100,2/2)
>>>> remains after the localnet port is deleted.
>>>>
>>>> Fixes: edc064b4c589 ("controller: Properly handle localnet flows in
>>>> I+P.")
>>>> Reported-at: https://issues.redhat.com/browse/FDP-926
>>>>
>>>> Signed-off-by: Xavier Simonart <xsimonar@redhat.com>
>>>> ---
>>>>   controller/physical.c |  9 ++--
>>>>   tests/ovn.at          | 98
>> +++++++++++++++++++------------------------
>>>>   2 files changed, 46 insertions(+), 61 deletions(-)
>>>>
>>>> diff --git a/controller/physical.c b/controller/physical.c
>>>> index 2aaa16cbd..c6db4f376 100644
>>>> --- a/controller/physical.c
>>>> +++ b/controller/physical.c
>>>> @@ -699,7 +699,7 @@ put_replace_chassis_mac_flows(const struct shash
>>>> *ct_zones,
>>>>           put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p);
>>>>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>>>>                           rport_binding->header_.uuid.parts[0],
>>>> -                        &match, ofpacts_p,
>>>> &localnet_port->header_.uuid);
>>>> +                        &match, ofpacts_p, hc_uuid);
>>>>             /* Provide second search criteria, i.e localnet port's
>>>>            * vlan ID for conjunction flow */
>>>> @@ -719,7 +719,7 @@ put_replace_chassis_mac_flows(const struct shash
>>>> *ct_zones,
>>>>           conj->clause = 1;
>>>>           ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
>>>>                           rport_binding->header_.uuid.parts[0],
>>>> -                        &match, ofpacts_p,
>>>> &localnet_port->header_.uuid);
>>>> +                        &match, ofpacts_p, hc_uuid);
>>>>       }
>>>>   }
>>>>   @@ -2393,9 +2393,8 @@ physical_handle_flows_for_lport(const struct
>>>> sbrec_port_binding *pb,
>>>>       struct local_datapath *ldp =
>>>>           get_local_datapath(p_ctx->local_datapaths,
>>>>                              pb->datapath->tunnel_key);
>>>> -    if (!strcmp(pb->type, "external") ||
>>>> -        !strcmp(pb->type, "patch") || !strcmp(pb->type, "l3gateway")) {
>>>> -        /* Those lports have a dependency on the localnet port.
>>>> +    if (!strcmp(pb->type, "external")) {
>>>> +        /* External lports have a dependency on the localnet port.
>>>>            * We need to remove the flows of the localnet port as well
>>>>            * and re-consider adding the flows for it.
>>>>            */
>>>> diff --git a/tests/ovn.at b/tests/ovn.at
>>>> index 10cd7a79b..dfb08fd1e 100644
>>>> --- a/tests/ovn.at
>>>> +++ b/tests/ovn.at
>>>> @@ -39495,62 +39495,6 @@ OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
>>>>   OVN_CLEANUP([hv1])
>>>>   AT_CLEANUP
>>>>   ])
>>>> -OVN_FOR_EACH_NORTHD([
>>>> -AT_SETUP([localnet port flows after deletion])
>>>> -ovn_start
>>>> -net_add n1
>>>> -
>>>> -check ovn-nbctl ls-add sw0
>>>> -
>>>> -for i in 1 2; do
>>>> -    check ovn-nbctl lsp-add sw0 sw0-p${i} -- lsp-set-addresses
>>>> sw0-p${i} "00:00:10:01:02:0${i} 10.0.0.${i}"
>>>> -    sim_add hv${i}
>>>> -    as hv${i}
>>>> -    ovs-vsctl add-br br-phys
>>>> -    ovn_attach n1 br-phys 192.168.0.${i}
>>>> -    ovs-vsctl set open .
>>>> external_ids:ovn-bridge-mappings=physnet1:br-phys
>>>> -    ovs-vsctl add-port br-int vif${i} -- \
>>>> -        set Interface vif${i} external-ids:iface-id=sw0-p${i} \
>>>> -                              options:tx_pcap=hv${i}/vif${i}-tx.pcap \
>>>> -                              options:rxq_pcap=hv${i}/vif${i}-rx.pcap
>>>> -done
>>>> -
>>>> -check ovn-nbctl lr-add lr0
>>>> -check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.254/24
>>>> -check ovn-nbctl lsp-add sw0 sw0-lr0
>>>> -check ovn-nbctl lsp-set-type sw0-lr0 router
>>>> -check ovn-nbctl lsp-set-addresses sw0-lr0 router
>>>> -check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
>>>> -
>>>> -check ovn-nbctl --wait=hv sync
>>>> -wait_for_ports_up
>>>> -
>>>> -# We should not have any flows in table OFTABLE_PHY_TO_LOG from
>>>> in_port different from vif1 and ovn-hv2-0
>>>> -OVN_WAIT_REMOTE_INPUT_FLOWS(["hv1"],["hv2"])
>>>> -of1=$(as hv1 ovs-vsctl --bare --columns ofport find Interface
>> name=vif1)
>>>> -of2=$(as hv1 ovs-vsctl --bare --columns ofport find Interface
>>>> name=ovn-hv2-0)
>>>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>>>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>>>> -v "in_port=$of2" | wc -l], [0], [dnl
>>>> -0
>>>> -])
>>>> -
>>>> -# Add localnet port to sw0
>>>> -check ovn-nbctl lsp-add sw0 ln-sw0 -- lsp-set-addresses ln-sw0
>>>> unknown -- lsp-set-type ln-sw0 localnet
>>>> -check ovn-nbctl --wait=hv lsp-set-options ln-sw0
>>>> network_name=physnet1 -- set logical_switch_port ln-sw0 tag_request=100
>>>> -
>>>> -OVN_WAIT_PATCH_PORT_FLOWS(["ln-sw0"], ["hv1"])
>>>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>>>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>>>> -v "in_port=$of2" | wc -l], [0], [dnl
>>>> -2
>>>> -])
>>>> -
>>>> -# Remove localnet port from sw0. Peer-ports flows should be deleted.
>>>> -check ovn-nbctl --wait=hv lsp-del ln-sw0
>>>> -AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG
>>>> | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep
>>>> -v "in_port=$of2" | wc -l], [0], [dnl
>>>> -0
>>>> -])
>>>> -
>>>> -OVN_CLEANUP([hv1],[hv2])
>>>> -AT_CLEANUP
>>>> -])
>>>>     AT_SETUP([Patch ports not owned by OVN])
>>>>   @@ -39665,3 +39609,45 @@ check_patch_ports
>>>>     OVN_CLEANUP([hv1])
>>>>   AT_CLEANUP
>>>> +
>>>> +OVN_FOR_EACH_NORTHD([
>>>> +AT_SETUP([Multiple localnet ports without vlans])
>>>> +AT_KEYWORDS([localnet])
>>>> +
>>>> +ovn_start
>>>> +
>>>> +net_add n1
>>>> +sim_add hv1
>>>> +ovs-vsctl add-br br-phys
>>>> +ovn_attach n1 br-phys 192.168.0.1
>>>> +ovn-appctl vlog/set dbg
>>>> +ovs-vsctl set Open_vSwitch .
>>>> external-ids:ovn-bridge-mappings=phys:br-phys
>>>> +
>>>> +check ovn-nbctl lr-add lr1
>>>> +check ovn-nbctl lrp-add lr1 lr1-ls1 00:00:01:ff:02:03 192.168.1.254/24
>>>> +
>>>> +check ovn-nbctl ls-add ls1
>>>> +check ovn-nbctl lsp-add ls1 ls1-lr1
>>>> +check ovn-nbctl lsp-set-type ls1-lr1 router
>>>> +check ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1
>>>> +check ovn-nbctl lsp-set-addresses ls1-lr1 router
>>>> +
>>>> +check ovn-nbctl ls-add pub
>>>> +check ovn-nbctl lsp-add pub pub-lr1
>>>> +check ovn-nbctl lsp-set-type pub-lr1 router
>>>> +check ovn-nbctl lsp-set-options pub-lr1 router-port=lr1-pub
>>>> +check ovn-nbctl lsp-set-addresses pub-lr1 router
>>>> +
>>>> +check ovn-nbctl lrp-add lr1 lr1-pub 00:00:01:ff:01:03 172.16.1.254/24
>>>> +check ovn-nbctl lrp-set-gateway-chassis lr1-pub hv1
>>>> +
>>>> +check ovn-nbctl --wait=hv sync
>>>> +wait_for_ports_up
>>>> +
>>>> +check check ovn-nbctl -- lsp-add pub pub-ln -- lsp-set-type pub-ln
>>
>> Nit: check check
>>
>>>> localnet -- lsp-set-addresses pub-ln unknown -- lsp-set-options pub-ln
>>>> network_name=phys
>>>> +check check ovn-nbctl -- lsp-add ls1 ls1-ln -- lsp-set-type ls1-ln
>>
>> Nit: check check
>>
>>>> localnet -- lsp-set-addresses ls1-ln unknown -- lsp-set-options ls1-ln
>>>> network_name=phys
>>>> +
>>
>> There's a potential for a race here.  We don't actually wait for
>> ovn-controller to get the SB updates that correspond to this NB change.
>>
>> In general the test seems odd (out of context) because it's not obvious
>> that it's testing the ovn-controller flow processing part.  Should we at
>> least check that some of the relevant OpenFlow rules are installed here?
>>
>> I agree that the test should be better documented.
> However, I do not think that there is a race: OVN_CLEANUP is doing (2x)
> ovn-nbctl --wait=hv sync and then some recompute.

Ah, good point.

> So, the real check of the test is within OVN_CLEANUP: before this revert
> patch, the test would fail the ovn-nbctl --wait=hv sync part of OVN_CLEANUP.
> I'll anyhow send a v2 adding some flow check (and remove the double check),
> so the test would be less obscure.
> 

OK, sounds good, thanks!

Regards,
Dumitru
diff mbox series

Patch

diff --git a/controller/physical.c b/controller/physical.c
index 2aaa16cbd..c6db4f376 100644
--- a/controller/physical.c
+++ b/controller/physical.c
@@ -699,7 +699,7 @@  put_replace_chassis_mac_flows(const struct shash *ct_zones,
         put_resubmit(OFTABLE_LOG_INGRESS_PIPELINE, ofpacts_p);
         ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
                         rport_binding->header_.uuid.parts[0],
-                        &match, ofpacts_p, &localnet_port->header_.uuid);
+                        &match, ofpacts_p, hc_uuid);
 
         /* Provide second search criteria, i.e localnet port's
          * vlan ID for conjunction flow */
@@ -719,7 +719,7 @@  put_replace_chassis_mac_flows(const struct shash *ct_zones,
         conj->clause = 1;
         ofctrl_add_flow(flow_table, OFTABLE_PHY_TO_LOG, 180,
                         rport_binding->header_.uuid.parts[0],
-                        &match, ofpacts_p, &localnet_port->header_.uuid);
+                        &match, ofpacts_p, hc_uuid);
     }
 }
 
@@ -2393,9 +2393,8 @@  physical_handle_flows_for_lport(const struct sbrec_port_binding *pb,
     struct local_datapath *ldp =
         get_local_datapath(p_ctx->local_datapaths,
                            pb->datapath->tunnel_key);
-    if (!strcmp(pb->type, "external") ||
-        !strcmp(pb->type, "patch") || !strcmp(pb->type, "l3gateway")) {
-        /* Those lports have a dependency on the localnet port.
+    if (!strcmp(pb->type, "external")) {
+        /* External lports have a dependency on the localnet port.
          * We need to remove the flows of the localnet port as well
          * and re-consider adding the flows for it.
          */
diff --git a/tests/ovn.at b/tests/ovn.at
index 10cd7a79b..dfb08fd1e 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -39495,62 +39495,6 @@  OVS_APP_EXIT_AND_WAIT([ovs-vswitchd])
 OVN_CLEANUP([hv1])
 AT_CLEANUP
 ])
-OVN_FOR_EACH_NORTHD([
-AT_SETUP([localnet port flows after deletion])
-ovn_start
-net_add n1
-
-check ovn-nbctl ls-add sw0
-
-for i in 1 2; do
-    check ovn-nbctl lsp-add sw0 sw0-p${i} -- lsp-set-addresses sw0-p${i} "00:00:10:01:02:0${i} 10.0.0.${i}"
-    sim_add hv${i}
-    as hv${i}
-    ovs-vsctl add-br br-phys
-    ovn_attach n1 br-phys 192.168.0.${i}
-    ovs-vsctl set open . external_ids:ovn-bridge-mappings=physnet1:br-phys
-    ovs-vsctl add-port br-int vif${i} -- \
-        set Interface vif${i} external-ids:iface-id=sw0-p${i} \
-                              options:tx_pcap=hv${i}/vif${i}-tx.pcap \
-                              options:rxq_pcap=hv${i}/vif${i}-rx.pcap
-done
-
-check ovn-nbctl lr-add lr0
-check ovn-nbctl lrp-add lr0 lr0-sw0 00:00:00:00:ff:01 10.0.0.254/24
-check ovn-nbctl lsp-add sw0 sw0-lr0
-check ovn-nbctl lsp-set-type sw0-lr0 router
-check ovn-nbctl lsp-set-addresses sw0-lr0 router
-check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
-
-check ovn-nbctl --wait=hv sync
-wait_for_ports_up
-
-# We should not have any flows in table OFTABLE_PHY_TO_LOG from in_port different from vif1 and ovn-hv2-0
-OVN_WAIT_REMOTE_INPUT_FLOWS(["hv1"],["hv2"])
-of1=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=vif1)
-of2=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-hv2-0)
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
-0
-])
-
-# Add localnet port to sw0
-check ovn-nbctl lsp-add sw0 ln-sw0 -- lsp-set-addresses ln-sw0 unknown -- lsp-set-type ln-sw0 localnet
-check ovn-nbctl --wait=hv lsp-set-options ln-sw0 network_name=physnet1 -- set logical_switch_port ln-sw0 tag_request=100
-
-OVN_WAIT_PATCH_PORT_FLOWS(["ln-sw0"], ["hv1"])
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
-2
-])
-
-# Remove localnet port from sw0. Peer-ports flows should be deleted.
-check ovn-nbctl --wait=hv lsp-del ln-sw0
-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_PHY_TO_LOG | grep -v NXST_FLOW | grep "in_port=" | grep -v "in_port=$of1" | grep -v "in_port=$of2" | wc -l], [0], [dnl
-0
-])
-
-OVN_CLEANUP([hv1],[hv2])
-AT_CLEANUP
-])
 
 AT_SETUP([Patch ports not owned by OVN])
 
@@ -39665,3 +39609,45 @@  check_patch_ports
 
 OVN_CLEANUP([hv1])
 AT_CLEANUP
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([Multiple localnet ports without vlans])
+AT_KEYWORDS([localnet])
+
+ovn_start
+
+net_add n1
+sim_add hv1
+ovs-vsctl add-br br-phys
+ovn_attach n1 br-phys 192.168.0.1
+ovn-appctl vlog/set dbg
+ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=phys:br-phys
+
+check ovn-nbctl lr-add lr1
+check ovn-nbctl lrp-add lr1 lr1-ls1 00:00:01:ff:02:03 192.168.1.254/24
+
+check ovn-nbctl ls-add ls1
+check ovn-nbctl lsp-add ls1 ls1-lr1
+check ovn-nbctl lsp-set-type ls1-lr1 router
+check ovn-nbctl lsp-set-options ls1-lr1 router-port=lr1-ls1
+check ovn-nbctl lsp-set-addresses ls1-lr1 router
+
+check ovn-nbctl ls-add pub
+check ovn-nbctl lsp-add pub pub-lr1
+check ovn-nbctl lsp-set-type pub-lr1 router
+check ovn-nbctl lsp-set-options pub-lr1 router-port=lr1-pub
+check ovn-nbctl lsp-set-addresses pub-lr1 router
+
+check ovn-nbctl lrp-add lr1 lr1-pub 00:00:01:ff:01:03 172.16.1.254/24
+check ovn-nbctl lrp-set-gateway-chassis lr1-pub hv1
+
+check ovn-nbctl --wait=hv sync
+wait_for_ports_up
+
+check check ovn-nbctl -- lsp-add pub pub-ln -- lsp-set-type pub-ln localnet -- lsp-set-addresses pub-ln unknown -- lsp-set-options pub-ln network_name=phys
+check check ovn-nbctl -- lsp-add ls1 ls1-ln -- lsp-set-type ls1-ln localnet -- lsp-set-addresses ls1-ln unknown -- lsp-set-options ls1-ln network_name=phys
+
+OVN_CLEANUP([hv1])
+
+AT_CLEANUP
+])