On Sat, Feb 19, 2022 at 1:38 AM Han Zhou <hz...@ovn.org> wrote:
>
> On Fri, Feb 18, 2022 at 10:38 AM Vladislav Odintsov <odiv...@gmail.com>
> wrote:
> >
> > When transport node has multiple interfaces (vlans) and
> > ovn-encap-ip on different hosts need to be configured
> > from different VLANs source IP for encapsulated packet
> > can be not the same, which is expected by remote system.
> >
> > Explicitely setting local_ip resolves such problem.
> >
> > Signed-off-by: Vladislav Odintsov <odiv...@gmail.com>
> > ---
> >  controller/encaps.c             | 43 +++++++++++++++++++++------------
> >  controller/ovn-controller.8.xml |  7 ++++++
> >  tests/ovn-controller.at         |  9 +++++++
> >  3 files changed, 44 insertions(+), 15 deletions(-)
> >
> > diff --git a/controller/encaps.c b/controller/encaps.c
> > index 66e0cd8cd..8e6d290c1 100644
> > --- a/controller/encaps.c
> > +++ b/controller/encaps.c
> > @@ -23,6 +23,7 @@
> >  #include "openvswitch/vlog.h"
> >  #include "lib/ovn-sb-idl.h"
> >  #include "ovn-controller.h"
> > +#include "smap.h"
> >
> >  VLOG_DEFINE_THIS_MODULE(encaps);
> >
> > @@ -176,8 +177,31 @@ tunnel_add(struct tunnel_ctx *tc, const struct
> sbrec_sb_global *sbg,
> >          smap_add(&options, "dst_port", dst_port);
> >      }
> >
> > +    const struct ovsrec_open_vswitch *cfg =
> > +        ovsrec_open_vswitch_table_first(ovs_table);
> > +
> > +    bool set_local_ip = false;
> > +    if (cfg) {
> > +        /* If the tos option is configured, get it */
> > +        const char *encap_tos = smap_get_def(&cfg->external_ids,
> > +           "ovn-encap-tos", "none");
> > +
> > +        if (encap_tos && strcmp(encap_tos, "none")) {
> > +            smap_add(&options, "tos", encap_tos);
> > +        }
> > +
> > +        /* If ovn-set-local-ip option is configured, get it */
> > +        set_local_ip = smap_get_bool(&cfg->external_ids,
> "ovn-set-local-ip",
> > +                                     false);
> > +    }
> > +
> >      /* Add auth info if ipsec is enabled. */
> >      if (sbg->ipsec) {
> > +        set_local_ip = true;
> > +        smap_add(&options, "remote_name", new_chassis_id);
> > +    }
> > +
> > +    if (set_local_ip) {
> >          const struct sbrec_chassis *this_chassis = tc->this_chassis;
> >          const char *local_ip = NULL;
> >
> > @@ -187,8 +211,10 @@ tunnel_add(struct tunnel_ctx *tc, const struct
> sbrec_sb_global *sbg,
> >           */
> >          for (int i = 0; i < this_chassis->n_encaps; i++) {
> >              if (local_ip && strcmp(local_ip,
> this_chassis->encaps[i]->ip)) {
> > -                VLOG_ERR("ovn-encap-ip has been configured as a list.
> This "
> > -                         "is unsupported for IPsec.");
> > +                static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(5, 1);
> > +                VLOG_ERR_RL(&rl, "ovn-encap-ip has been configured as a
> list. "
> > +                            "This is unsupported for IPsec and explicit "
> > +                            "local_ip configuration.");
> >                  /* No need to loop further as we know this condition has
> been
> >                   * hit */
> >                  break;
> > @@ -200,19 +226,6 @@ tunnel_add(struct tunnel_ctx *tc, const struct
> sbrec_sb_global *sbg,
> >          if (local_ip) {
> >              smap_add(&options, "local_ip", local_ip);
> >          }
> > -        smap_add(&options, "remote_name", new_chassis_id);
> > -    }
> > -
> > -    const struct ovsrec_open_vswitch *cfg =
> > -        ovsrec_open_vswitch_table_first(ovs_table);
> > -    /* If the tos option is configured, get it */
> > -    if (cfg) {
> > -        const char *encap_tos = smap_get_def(&cfg->external_ids,
> > -           "ovn-encap-tos", "none");
> > -
> > -        if (encap_tos && strcmp(encap_tos, "none")) {
> > -            smap_add(&options, "tos", encap_tos);
> > -        }
> >      }
> >
> >      /* If there's an existing chassis record that does not need any
> change,
> > diff --git a/controller/ovn-controller.8.xml
> b/controller/ovn-controller.8.xml
> > index e9708fe64..cc9a7d1c2 100644
> > --- a/controller/ovn-controller.8.xml
> > +++ b/controller/ovn-controller.8.xml
> > @@ -304,6 +304,13 @@
> >          of how many entries there are in the cache.  By default this is
> set to
> >          30000 (30 seconds).
> >        </dd>
> > +      <dt><code>external_ids:ovn-set-local-ip</code></dt>
> > +      <dd>
> > +        The boolean flag indicates if <code>ovn-controller</code> when
> create
> > +        tunnel ports should set <code>local_ip</code> parameter.  Can be
> > +        heplful to pin source outer IP for the tunnel when multiple
> interfaces
> > +        are used on the host for overlay traffic.
> > +      </dd>
> >      </dl>
> >
> >      <p>
> > diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
> > index e99eec1d6..89ae2c9e1 100644
> > --- a/tests/ovn-controller.at
> > +++ b/tests/ovn-controller.at
> > @@ -298,6 +298,15 @@ OVS_WAIT_UNTIL([check_tunnel_property type geneve])
> >  ovs-vsctl del-port ovn-fakech-0
> >  OVS_WAIT_UNTIL([check_tunnel_property type geneve])
> >
> > +# set `ovn-set-local-ip` option to true and check if tunnel parameters
> > +OVS_WAIT_WHILE([check_tunnel_property options:local_ip
> "\"192.168.0.1\""])
> > +ovs-vsctl set open . external_ids:ovn-set-local-ip=true
> > +OVS_WAIT_UNTIL([check_tunnel_property options:local_ip
> "\"192.168.0.1\""])
> > +
> > +# Change the local_ip on the OVS side and check than OVN fixes it
> > +ovs-vsctl set interface ovn-fakech-0 options:local_ip="1.1.1.1"
> > +OVS_WAIT_UNTIL([check_tunnel_property options:local_ip
> "\"192.168.0.1\""])
> > +
> >  # Gracefully terminate daemons
> >  OVN_CLEANUP_SBOX([hv])
> >  OVN_CLEANUP_VSWITCH([main])
> > --
> > 2.26.3
> >
> > _______________________________________________
> > dev mailing list
> > d...@openvswitch.org
> > https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
> Thanks Vladislav.
>
> Acked-by: Han Zhou <hz...@ovn.org>
>
> I will let Numan confirm again.

Thanks.  I applied the patch to the main branch.

Numan

> _______________________________________________
> 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

Reply via email to