On Wed, Dec 2, 2020 at 12:31 AM Dumitru Ceara <[email protected]> wrote:
>
> On 12/2/20 8:45 AM, Han Zhou wrote:
> > Even when the option always_learn_from_arp_request is set to false for a
> > logical router, stale entries in MAC_Binding table should still be
updated.
> > (This behavior is defined in the ovn-nb(5) for the option.)
> >
> > Fixes: fdf295d5eb3 ("pinctrl: Honor always_learn_from_arp_request for
self created MAC_Bindings.")
> > Signed-off-by: Han Zhou <[email protected]>
> > ---
>
> Hi Han,
>
> I had misinterpreted that always_learn_from_arp_request==false means
> "never learn from arp request" instead of "only learn from arp request
> if the IP was already known".
>
> Thanks for the fix!
>
> I only have a couple minor nits on the test case below, with those
> addressed:
>
> Acked-by: Dumitru Ceara <[email protected]>

Thanks Dumitru. I updated the tests as suggested and applied to master,
also backported to branch-20.09.

>
> Thanks,
> Dumitru
>
> >  controller/pinctrl.c | 20 +++++++++++---------
> >  tests/ovn.at         | 11 ++++++++++-
> >  2 files changed, 21 insertions(+), 10 deletions(-)
> >
> > diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> > index c6540c109..7e3abf0a4 100644
> > --- a/controller/pinctrl.c
> > +++ b/controller/pinctrl.c
> > @@ -3861,7 +3861,8 @@ mac_binding_add(struct ovsdb_idl_txn
*ovnsb_idl_txn,
> >                  struct ovsdb_idl_index *sbrec_mac_binding_by_lport_ip,
> >                  const char *logical_port,
> >                  const struct sbrec_datapath_binding *dp,
> > -                struct eth_addr ea, const char *ip)
> > +                struct eth_addr ea, const char *ip,
> > +                bool update_only)
> >  {
> >      /* Convert ethernet argument to string form for database. */
> >      char mac_string[ETH_ADDR_STRLEN + 1];
> > @@ -3870,6 +3871,9 @@ mac_binding_add(struct ovsdb_idl_txn
*ovnsb_idl_txn,
> >      const struct sbrec_mac_binding *b =
> >          mac_binding_lookup(sbrec_mac_binding_by_lport_ip,
logical_port, ip);
> >      if (!b) {
> > +        if (update_only) {
> > +            return;
> > +        }
> >          b = sbrec_mac_binding_insert(ovnsb_idl_txn);
> >          sbrec_mac_binding_set_logical_port(b, logical_port);
> >          sbrec_mac_binding_set_ip(b, ip);
> > @@ -3907,19 +3911,16 @@ send_garp_locally(struct ovsdb_idl_txn
*ovnsb_idl_txn,
> >              continue;
> >          }
> >
> > -        /* Skip datapaths that don't automatically learn ARPs from
requests. */
> > -        if (!smap_get_bool(&remote->datapath->external_ids,
> > -                           "always_learn_from_arp_request",
> > -                           true)) {
> > -            continue;
> > -        }
> > +        bool update_only =
!smap_get_bool(&remote->datapath->external_ids,
> > +
 "always_learn_from_arp_request",
> > +                                          true);
> >
> >          struct ds ip_s = DS_EMPTY_INITIALIZER;
> >
> >          ip_format_masked(ip, OVS_BE32_MAX, &ip_s);
> >          mac_binding_add(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip,
> >                          remote->logical_port, remote->datapath,
> > -                        ea, ds_cstr(&ip_s));
> > +                        ea, ds_cstr(&ip_s), update_only);
> >          ds_destroy(&ip_s);
> >      }
> >  }
> > @@ -3951,7 +3952,8 @@ run_put_mac_binding(struct ovsdb_idl_txn
*ovnsb_idl_txn,
> >      struct ds ip_s = DS_EMPTY_INITIALIZER;
> >      ipv6_format_mapped(&pmb->ip_key, &ip_s);
> >      mac_binding_add(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip,
> > -                    pb->logical_port, pb->datapath, pmb->mac,
ds_cstr(&ip_s));
> > +                    pb->logical_port, pb->datapath, pmb->mac,
ds_cstr(&ip_s),
> > +                    false);
> >      ds_destroy(&ip_s);
> >  }
> >
> > diff --git a/tests/ovn.at b/tests/ovn.at
> > index 97e3e49e6..640ae85aa 100644
> > --- a/tests/ovn.at
> > +++ b/tests/ovn.at
> > @@ -15974,12 +15974,21 @@ check ovn-nbctl lr-nat-del lr1 dnat_and_snat
172.24.4.200
> >
> >  check ovn-sbctl --all destroy mac_binding
> >
> > +# Create a mac_binding entry on lr0-pub for 172.24.4.200 with a
> > +# wrong mac, expecting it to be updated with the real mac.
> > +lr0_dp=$(ovn-sbctl --bare --columns _uuid find datapath
external_ids:name=lr0)
>
> This could use the helper functions, e.g.:
>
> lr0_dp=$(fetch_column Datapath_Binding _uuid external_ids:name=lr0)
>
> > +ovn-sbctl create mac_binding datapath=$lr0_dp logical_port=lr0-pub \
> > +    ip=172.24.4.200 mac=\"aa:aa:aa:aa:aa:aa\"
> > +
> >  check ovn-nbctl lr-nat-add lr0 dnat_and_snat 172.24.4.100 10.0.0.10
> >  check ovn-nbctl lr-nat-add lr1 dnat_and_snat 172.24.4.200 20.0.0.10
> >  check ovn-nbctl --wait=hv sync
> >
> > -check_row_count MAC_Binding 0 logical_port=lr0-pub ip=172.24.4.200
> > +check_row_count MAC_Binding 1 logical_port=lr0-pub ip=172.24.4.200
> >  check_row_count MAC_Binding 0 logical_port=lr1-pub ip=172.24.4.100
> > +AT_CHECK([ovn-sbctl --bare --columns mac \
> > +         find mac_binding logical_port=lr0-pub ip=172.24.4.200], [0],
[f0:00:00:00:01:01
> > +])
>
> Same here:
> check_column "f0:00:00:00:01:01" MAC_Binding mac logical_port=lr0-pub
> ip=172.24.4.200
>
> >
> >  OVN_CLEANUP([hv1])
> >  AT_CLEANUP
> >
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to