On 6/5/24 16:52, Brendan Doyle via dev wrote: > > > So I'm wondering will this break the LSP option: >> *o**p**t**i**o**n**s* *:* *a**r**p**_**p**r**o**x**y*: >> optional string >> Optional. A list of MAC and addresses/cidrs or >> just ad‐ >> dresses/cidrs that this logical >> switch*r**o**u**t**e**r* port will reply to >> ARP/NDP requests. >> Examples:*1**6**9**.**2**5**4**.**2**3**9**.**2**5**4* >> *1**6**9**.**2**5**4**.**2**3**9**.**2*, >> >> *0**a**:**5**8**:**a**9**:**f**e**:**0**1**:**0**1* >> *1**6**9**.**2**5**4**.**2**3**9**.**2**5**4* >> *1**6**9**.**2**5**4**.**2**3**9**.**2* >> >> *1**6**9**.**2**5**4**.**2**3**8**.**0**/**2**4*,*f**d**7**b**:**6**b**4**d**:**7**b**2**5**:**d**2**2**f**:**:**1* >> *f**d**7**b**:**6**b**4**d**:**7**b**2**5**:**d**2**2**f**:**:**2*, >> *0**a**:**5**8**:**a**9**:**f**e**:**0**1**:**0**1* >> *f**d**7**b**:**6**b**4**d**:**7**b**2**5**:**d**2**2**f**:**:**0**/**6**4*. >> The*o**p**t**i**o**n**s**:**r**o**u**t**e**r**-* >> *p**o**r**t*’s logical router should have a route >> to forward packets >> sent to configured proxy ARP MAC/IPs to an appropriate >> destina‐ >> tion. >
Hi Brendan, I'm not sure I understand what breaks. Do you have a specific scenario in mind? The patch is for the arp-proxy feature. I doubt that people rely on ARP requests originated by logical routers being handled by the arp proxy on the connected logical switch port. But I might be wrong. Thanks, Dumitru > > On 05/06/2024 13:03, Enrique Llorente Pastora wrote: >> On Wed, Jun 5, 2024 at 12:12 PM Lorenzo Bianconi < >> lorenzo.bianc...@redhat.com> wrote: >> >>>> On 5/14/24 18:44, Lorenzo Bianconi wrote: >>>>> Skip proxy-arp logical flows for traffic that is entering the logical >>>>> switch pipeline from a lsp of type router. This patch will avoid >>>>> recirculating back the traffic entering by the logical router >>>>> pipeline if proxy-arp hasn been configured by the CMS. >>>>> >>>>> Reported-at:https://urldefense.com/v3/__https://issues.redhat.com/browse/FDP-96__;!!ACWV5N9M2RV99hQ!LZCOnrD03VQXa0QBfUgAD0IntqpkCU4P2Mz0jhlfAcJ0Joe1ehsAIloa28JszFGBjchui8U4OL2MfnKJQEhn$ >>>>> Signed-off-by: Lorenzo Bianconi<lorenzo.bianc...@redhat.com> >>>>> --- >>>> Hi Lorenzo, >>>> >>>> This change looks OK but I'd like to double check that it doesn't break >>>> CNV/ovn-kubernetes use cases. >>>> >>>> Hi Enrique, >>>> >>>> Would you mind double checking that on one of your setups? >>>> >>>> If I'm not wrong our upstream ovn-kubernetes (in ovn-org/ovn) tests >>>> don't enable anything CNV specific: >>>> https://urldefense.com/v3/__https://github.com/ovsrobot/ovn/actions/runs/9083258143__;!!ACWV5N9M2RV99hQ!LZCOnrD03VQXa0QBfUgAD0IntqpkCU4P2Mz0jhlfAcJ0Joe1ehsAIloa28JszFGBjchui8U4OL2MflAqga4Q$ >>>> >>>> Thanks, >>>> Dumitru >>> Hi Dumitru, >>> >>> Thx, for the review. That's a good idea :) >>> >> Live migration tests look fine with this change, both IC and non IC, >> let's >> also activate the >> kubevirt lanes so we gate with them too. >> >> Tested-by:<ellor...@redhat.com> >> >> >>> Regards, >>> Lorenzo >>> >>>>> northd/northd.c | 15 +++++++++++++-- >>>>> tests/ovn.at | 8 ++++---- >>>>> tests/system-ovn.at | 22 +++++++++++++++++++++- >>>>> 3 files changed, 38 insertions(+), 7 deletions(-) >>>>> >>>>> diff --git a/northd/northd.c b/northd/northd.c >>>>> index 0cabda7ea..29dc58ef4 100644 >>>>> --- a/northd/northd.c >>>>> +++ b/northd/northd.c >>>>> @@ -118,6 +118,7 @@ static bool default_acl_drop; >>>>> #define REGBIT_PORT_SEC_DROP "reg0[15]" >>>>> #define REGBIT_ACL_STATELESS "reg0[16]" >>>>> #define REGBIT_ACL_HINT_ALLOW_REL "reg0[17]" >>>>> +#define REGBIT_FROM_ROUTER_PORT "reg0[18]" >>>>> >>>>> #define REG_ORIG_DIP_IPV4 "reg1" >>>>> #define REG_ORIG_DIP_IPV6 "xxreg1" >>>>> @@ -5785,6 +5786,13 @@ build_lswitch_port_sec_op(struct ovn_port *op, >>> struct lflow_table *lflows, >>>>> &op->od->localnet_ports[0]->nbsp->header_, >>>>> op->lflow_ref); >>>>> } >>>>> + } else if (lsp_is_router(op->nbsp)) { >>>>> + ds_put_format(actions, REGBIT_FROM_ROUTER_PORT" = 1; next;"); >>>>> + ovn_lflow_add_with_lport_and_hint(lflows, op->od, >>>>> + S_SWITCH_IN_CHECK_PORT_SEC, >>> 70, >>>>> + ds_cstr(match), >>> ds_cstr(actions), >>>>> + op->key, >>>>> &op->nbsp->header_, >>>>> + op->lflow_ref); >>>>> } >>>>> } >>>>> >>>>> @@ -9051,7 +9059,9 @@ build_lswitch_arp_nd_responder_known_ips(struct >>> ovn_port *op, >>>>> if (op->proxy_arp_addrs.n_ipv4_addrs) { >>>>> /* Match rule on all proxy ARP IPs. */ >>>>> ds_clear(match); >>>>> - ds_put_cstr(match, "arp.op == 1 && arp.tpa == {"); >>>>> + ds_put_cstr(match, >>>>> + REGBIT_FROM_ROUTER_PORT" == 0 " >>>>> + "&& arp.op == 1 && arp.tpa == {"); >>>>> >>>>> for (i = 0; i < op->proxy_arp_addrs.n_ipv4_addrs; i++) { >>>>> ds_put_format(match, "%s/%u,", >>>>> @@ -9105,7 +9115,8 @@ build_lswitch_arp_nd_responder_known_ips(struct >>> ovn_port *op, >>>>> ds_truncate(&nd_target_match, nd_target_match.length >>>>> - 2); >>>>> ds_clear(match); >>>>> ds_put_format(match, >>>>> - "nd_ns " >>>>> + REGBIT_FROM_ROUTER_PORT" == 0 " >>>>> + "&& nd_ns " >>>>> "&& ip6.dst == { %s } " >>>>> "&& nd.target == { %s }", >>>>> ds_cstr(&ip6_dst_match), >>>>> diff --git a/tests/ovn.at b/tests/ovn.at >>>>> index 486680649..e419516a7 100644 >>>>> --- a/tests/ovn.at >>>>> +++ b/tests/ovn.at >>>>> @@ -32640,7 +32640,7 @@ AT_CHECK([ovn-sbctl dump-flows | >>>>> grep ls_in_arp_rsp | >>>>> grep "${arp_proxy_ls1[[1]]}" | >>>>> ovn_strip_lflows], [0], [dnl >>>>> - table=??(ls_in_arp_rsp ), priority=30 , match=(arp.op == 1 >>> && dnl >>>>> + table=??(ls_in_arp_rsp ), priority=30 , match=(reg0[[18]] == >>> 0 && arp.op == 1 && dnl >>>>> arp.tpa == {169.254.238.0/24,169.254.239.2/32} >>> <https://urldefense.com/v3/__http://169.254.238.0/24,169.254.239.2/32*7D__;JQ!!ACWV5N9M2RV99hQ!LZCOnrD03VQXa0QBfUgAD0IntqpkCU4P2Mz0jhlfAcJ0Joe1ehsAIloa28JszFGBjchui8U4OL2MfjM6HO9o$ >>> >), dnl >>>>> action=(eth.dst = eth.src; eth.src = 00:00:00:01:02:f1; arp.op = 2; >>> dnl >>>>> /* ARP reply */ arp.tha = arp.sha; arp.sha = 00:00:00:01:02:f1; dnl >>>>> @@ -32653,7 +32653,7 @@ AT_CHECK([ovn-sbctl dump-flows | >>>>> grep "${arp_proxy_ls1[[3]]}" | >>>>> ovn_strip_lflows], [0], [dnl >>>>> table=??(ls_in_arp_rsp ), priority=30 , dnl >>>>> -match=(nd_ns && ip6.dst == { fd7b:6b4d:7b25:d22d::/64, >>> ff02::1:ff00:0/64, dnl >>>>> +match=(reg0[[18]] == 0 && nd_ns && ip6.dst == { >>> fd7b:6b4d:7b25:d22d::/64, ff02::1:ff00:0/64, dnl >>>>> fd7b:6b4d:7b25:d22f::1/128, ff02::1:ff00:1/128 } && dnl >>>>> nd.target == { fd7b:6b4d:7b25:d22d::/64, fd7b:6b4d:7b25:d22f::1/128 >>> }), dnl >>>>> action=(nd_na_router { eth.src = 00:00:00:01:02:f1; ip6.src = >>> nd.target; dnl >>>>> @@ -32667,7 +32667,7 @@ AT_CHECK([ovn-sbctl dump-flows | >>>>> grep "${arp_proxy_ls2[[2]]}" | >>>>> ovn_strip_lflows], [0], [dnl >>>>> table=??(ls_in_arp_rsp ), priority=30 , dnl >>>>> -match=(arp.op == 1 && arp.tpa == {169.254.236.0/24,169.254.237.2/32} >>> <https://urldefense.com/v3/__http://169.254.236.0/24,169.254.237.2/32*7D__;JQ!!ACWV5N9M2RV99hQ!LZCOnrD03VQXa0QBfUgAD0IntqpkCU4P2Mz0jhlfAcJ0Joe1ehsAIloa28JszFGBjchui8U4OL2Mfuwz0Yd3$ >>> >), dnl >>>>> +match=(reg0[[18]] == 0 && arp.op == 1 && arp.tpa == { >>> 169.254.236.0/24,169.254.237.2/32} >>> <https://urldefense.com/v3/__http://169.254.236.0/24,169.254.237.2/32*7D__;JQ!!ACWV5N9M2RV99hQ!LZCOnrD03VQXa0QBfUgAD0IntqpkCU4P2Mz0jhlfAcJ0Joe1ehsAIloa28JszFGBjchui8U4OL2Mfuwz0Yd3$ >>> >), dnl >>>>> action=(eth.dst = eth.src; eth.src = 00:00:00:02:02:f1; arp.op = 2; >>> dnl >>>>> /* ARP reply */ arp.tha = arp.sha; arp.sha = 00:00:00:02:02:f1; dnl >>>>> arp.tpa <-> arp.spa; outport = inport; flags.loopback = 1; output;) >>>>> @@ -32679,7 +32679,7 @@ AT_CHECK([ovn-sbctl dump-flows | >>>>> grep "${arp_proxy_ls2[[4]]}" | >>>>> ovn_strip_lflows], [0], [dnl >>>>> table=??(ls_in_arp_rsp ), priority=30 , dnl >>>>> -match=(nd_ns && ip6.dst == { fd7b:6b4d:7b25:d22b::/64, >>> ff02::1:ff00:0/64, dnl >>>>> +match=(reg0[[18]] == 0 && nd_ns && ip6.dst == { >>> fd7b:6b4d:7b25:d22b::/64, ff02::1:ff00:0/64, dnl >>>>> fd7b:6b4d:7b25:d22c::1/128, ff02::1:ff00:1/128 } && dnl >>>>> nd.target == { fd7b:6b4d:7b25:d22b::/64, fd7b:6b4d:7b25:d22c::1/128 >>> }), dnl >>>>> action=(nd_na_router { eth.src = 00:00:00:02:02:f1; ip6.src = >>> nd.target; dnl >>>>> diff --git a/tests/system-ovn.at b/tests/system-ovn.at >>>>> index 86fd240d2..e6cfb07f6 100644 >>>>> --- a/tests/system-ovn.at >>>>> +++ b/tests/system-ovn.at >>>>> @@ -10756,7 +10756,7 @@ check ovn-nbctl ls-add bar >>>>> # Connect foo to R1 >>>>> check ovn-nbctl lrp-add R1 foo 00:00:01:01:02:03 192.168.1.1/24 >>>>> check ovn-nbctl lsp-add foo rp-foo -- set Logical_Switch_Port >>>>> rp-foo \ >>>>> - type=router options:arp_proxy="0a:58:a9:fe:01:01 169.254.239.254 >>> 169.254.239.2 169.254.238.0/24 192.168.1.100" options:router-port=foo >>> addresses='"router"' >>>>> + type=router options:arp_proxy="0a:58:a9:fe:01:01 169.254.239.254 >>> 169.254.239.2 169.254.238.0/24 192.168.1.100 192.168.1.200" >>> options:router-port=foo addresses='"router"' >>>>> # Connect bar to R1 >>>>> check ovn-nbctl lrp-add R1 bar 00:00:01:01:02:04 192.168.2.1/24 >>>>> @@ -10785,6 +10785,12 @@ ADD_VETH(foo3, foo3, br-int, >>>>> "192.168.1.4/24", >>> "f0:00:00:01:02:05", \ >>>>> check ovn-nbctl lsp-add foo foo3 \ >>>>> -- lsp-set-addresses foo3 "f0:00:00:01:02:05 192.168.1.4" >>>>> >>>>> +ADD_NAMESPACES(foo4) >>>>> +ADD_VETH(foo4, foo4, br-int, "192.168.1.6/24", "f0:00:00:01:02:11", \ >>>>> + "192.168.1.1") >>>>> +check ovn-nbctl lsp-add foo foo4 \ >>>>> +-- lsp-set-addresses foo4 "f0:00:00:01:02:11 192.168.1.6" >>>>> + >>>>> # Logical port 'ext1' in switch 'foo' >>>>> ADD_NAMESPACES(ext1) >>>>> ADD_VETH(ext1, ext1, br-ext, "192.168.1.5/24", >>>>> "f0:00:00:01:02:06", \ >>>>> @@ -10800,6 +10806,12 @@ ADD_VETH(bar1, bar1, br-int, >>>>> "192.168.2.2/24", >>> "f0:00:00:01:02:07", \ >>>>> check ovn-nbctl lsp-add bar bar1 \ >>>>> -- lsp-set-addresses bar1 "f0:00:00:01:02:07 192.168.2.2" >>>>> >>>>> +ADD_NAMESPACES(bar2) >>>>> +ADD_VETH(bar2, bar2, br-int, "192.168.2.3/24", "f0:00:00:01:02:10", \ >>>>> +"192.168.2.1") >>>>> +check ovn-nbctl lsp-add bar bar2 \ >>>>> +-- lsp-set-addresses bar2 "f0:00:00:01:10:10 192.168.2.3" >>>>> + >>>>> # wait for ovn-controller to catch up. >>>>> check ovn-nbctl --wait=hv sync >>>>> >>>>> @@ -10851,6 +10863,14 @@ OVS_WAIT_UNTIL([ >>>>> test "${total_pkts}" = "3" >>>>> ]) >>>>> >>>>> +check ovn-nbctl lr-route-add R1 169.254.240.0/24 192.168.1.200 >>>>> +NETNS_START_TCPDUMP([foo4], [-nn -c 4 -e -i foo4 >>> arp[[24:4]]=0xc0a801c8], [foo4-arp]) >>>>> + >>>>> +NS_CHECK_EXEC([bar2], [ping -q -c 5 -i 0.3 -w 2 >>> 169.254.240.10],[ignore],[ignore]) >>>>> +OVS_WAIT_UNTIL([ >>>>> + total_pkts=$(cat foo4-arp.tcpdump| wc -l) >>>>> + test "${total_pkts}" = "4" >>>>> +]) >>>>> >>>>> OVS_APP_EXIT_AND_WAIT([ovn-controller]) >>>>> >> > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev