On 3/24/23 10:11, Ales Musil wrote: > On Wed, Mar 22, 2023 at 2:44 PM Enrique Llorente <ellor...@redhat.com> > wrote: > >> The localnet LSPs skip responding ARP/NDP [1], this change relax this >> restriction by allowing responding from localnet LSPs when owner >> switch has a router LSP with a proper arp_proxy configuration. >> >> [1] ovn-northd.8.xml >> >> Signed-off-by: Enrique Llorente <ellor...@redhat.com> >> --- >> northd/northd.c | 19 ++++++++++++------- >> northd/northd.h | 1 + >> northd/ovn-northd.8.xml | 7 ++++--- >> tests/system-ovn.at | 34 ++++++++++++++++++++++++++++++---- >> 4 files changed, 47 insertions(+), 14 deletions(-) >> >> diff --git a/northd/northd.c b/northd/northd.c >> index 5f0b436c2..ee44a2e8b 100644 >> --- a/northd/northd.c >> +++ b/northd/northd.c >> @@ -2721,12 +2721,17 @@ join_logical_ports(struct northd_input *input_data, >> */ >> const char *arp_proxy = >> smap_get(&op->nbsp->options,"arp_proxy"); >> int ofs = 0; >> - if (arp_proxy && >> - !extract_addresses(arp_proxy, &op->proxy_arp_addrs, &ofs) >> && >> - !extract_ip_addresses(arp_proxy, &op->proxy_arp_addrs)) { >> - static struct vlog_rate_limit rl = >> VLOG_RATE_LIMIT_INIT(1, 5); >> - VLOG_WARN_RL(&rl, "Invalid arp_proxy option: '%s' at lsp >> '%s'", >> - arp_proxy, op->nbsp->name); >> + if (arp_proxy) { >> + if (extract_addresses(arp_proxy, &op->proxy_arp_addrs, >> &ofs) || >> + extract_ip_addresses(arp_proxy, >> &op->proxy_arp_addrs)) { >> + op->od->has_arp_proxy_port = true; >> + } else { >> + static struct vlog_rate_limit rl = >> + VLOG_RATE_LIMIT_INIT(1, 5); >> + VLOG_WARN_RL(&rl, >> + "Invalid arp_proxy option: '%s' at lsp '%s'", >> + arp_proxy, op->nbsp->name); >> + } >> } >> } else if (op->nbrp && op->nbrp->peer && !op->l3dgw_port) { >> struct ovn_port *peer = ovn_port_find(ports, op->nbrp->peer); >> @@ -8428,7 +8433,7 @@ build_lswitch_arp_nd_responder_skip_local(struct >> ovn_port *op, >> struct hmap *lflows, >> struct ds *match) >> { >> - if (op->nbsp && lsp_is_localnet(op->nbsp)) { >> + if (op->nbsp && lsp_is_localnet(op->nbsp) && >> !op->od->has_arp_proxy_port) { >> > > This is checked at single place so we can do probably do !(op->od> > > >> ds_clear(match); >> ds_put_format(match, "inport == %s", op->json_key); >> ovn_lflow_add_with_lport_and_hint(lflows, op->od, >> diff --git a/northd/northd.h b/northd/northd.h >> index 4d9055296..5a666bbd3 100644 >> --- a/northd/northd.h >> +++ b/northd/northd.h >> @@ -214,6 +214,7 @@ struct ovn_datapath { >> bool has_unknown; >> bool has_acls; >> bool has_vtep_lports; >> + bool has_arp_proxy_port; >> >> /* IPAM data. */ >> struct ipam_info ipam_info; >> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml >> index 5d513e65a..7d400a7b8 100644 >> --- a/northd/ovn-northd.8.xml >> +++ b/northd/ovn-northd.8.xml >> @@ -1269,9 +1269,10 @@ >> >> <ul> >> <li> >> - Priority-100 flows to skip the ARP responder if inport is of type >> - <code>localnet</code> advances directly to the next table. ARP >> - requests sent to <code>localnet</code> ports can be received by >> + If the logical switch has no router ports with options:arp_proxy >> + configured add a priority-100 flows to skip the ARP responder if >> inport >> + is of type <code>localnet</code> advances directly to the next >> table. >> + ARP requests sent to <code>localnet</code> ports can be received >> by >> multiple hypervisors. Now, because the same mac binding rules are >> downloaded to all hypervisors, each of the multiple hypervisors >> will >> respond. This will confuse L2 learning on the source of the ARP >> diff --git a/tests/system-ovn.at b/tests/system-ovn.at >> index ad1188078..f820a5206 100644 >> --- a/tests/system-ovn.at >> +++ b/tests/system-ovn.at >> @@ -10431,6 +10431,8 @@ AT_SKIP_IF([test $HAVE_TCPDUMP = no]) >> ovn_start >> OVS_TRAFFIC_VSWITCHD_START() >> ADD_BR([br-int]) >> +ADD_BR([br-ext]) >> +ovs-ofctl add-flow br-ext action=normal >> >> # Set external-ids in br-int needed for ovn-controller >> ovs-vsctl \ >> @@ -10447,7 +10449,9 @@ start_daemon ovn-controller >> # One LR - R1 and two LSs - foo and bar, R1 has switches foo ( >> 192.168.1.0/24) and >> # bar (192.168.2.0/24) connected to it >> # >> -# foo -- R1 -- bar >> +# br-ext -- localnet -- foo -- R1 -- bar >> + >> +check ovs-vsctl set open . >> external-ids:ovn-bridge-mappings=provider:br-ext >> >> check ovn-nbctl lr-add R1 >> check ovn-nbctl ls-add foo >> @@ -10456,13 +10460,14 @@ 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 " 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" 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 >> check ovn-nbctl lsp-add bar rp-bar -- set Logical_Switch_Port rp-bar \ >> type=router options:arp_proxy="169.254.239.253" >> options:router-port=bar addresses='"router"' >> >> + >> # Logical port 'foo1' in switch 'foo'. >> ADD_NAMESPACES(foo1) >> ADD_VETH(foo1, foo1, br-int, "192.168.1.2/24", "f0:00:00:01:02:03", \ >> @@ -10484,12 +10489,20 @@ 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" >> >> +# 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", \ >> + "192.168.1.100",) >> +check ovn-nbctl lsp-add foo ln -- lsp-set-options ln network_name=provider >> +check ovn-nbctl lsp-set-type ln localnet >> +check ovn-nbctl lsp-set-addresses ln unknown >> + >> # Logical port 'bar1' in switch 'bar'. >> ADD_NAMESPACES(bar1) >> -ADD_VETH(bar1, bar1, br-int, "192.168.2.2/24", "f0:00:00:01:02:06", \ >> +ADD_VETH(bar1, bar1, br-int, "192.168.2.2/24", "f0:00:00:01:02:07", \ >> "169.254.239.253") >> check ovn-nbctl lsp-add bar bar1 \ >> --- lsp-set-addresses bar1 "f0:00:00:01:02:06 192.168.2.2" >> +-- lsp-set-addresses bar1 "f0:00:00:01:02:07 192.168.2.2" >> >> # wait for ovn-controller to catch up. >> check ovn-nbctl --wait=hv sync >> @@ -10533,6 +10546,19 @@ OVS_WAIT_UNTIL([ >> test "${total_pkts}" = "3" >> ]) >> >> +NETNS_DAEMONIZE([ext1], [tcpdump -l -nn -e -i ext1 'ether dst >> 0a:58:a9:fe:01:01 and icmp' > ext1-icmp.pcap 2>ext1-tcpdump.stderr], >> [ext1-icmp-tcpdump.pid]) >> +OVS_WAIT_UNTIL([grep "listening" ext1-tcpdump.stderr]) >> + >> +# 'ext1' should be able to ping 'bar1' >> +NS_CHECK_EXEC([ext1], [ping -q -c 3 -i 0.3 -w 2 192.168.2.2 | >> FORMAT_PING], \ >> +[0], [dnl >> +3 packets transmitted, 3 received, 0% packet loss, time 0ms >> +]) >> +OVS_WAIT_UNTIL([ >> + total_pkts=$(cat ext1-icmp.pcap| wc -l) >> + test "${total_pkts}" = "3" >> +]) >> + >> >> OVS_APP_EXIT_AND_WAIT([ovn-controller]) >> >> -- >> 2.32.0 >> >> _______________________________________________ >> 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> >
Thanks, Enrique and Ales! I checked with Ales offline and his comment above was just a leftover, no change was needed. I rebased this and applied it to the main branch. _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev