On Thu, Feb 17, 2022 at 12:34 PM Lorenzo Bianconi
<[email protected]> wrote:
>
> Introduce nat-only-router flag for nat-addresses option in order to
> advertise in GARPs packets all SNAT/DNAT configured in the connected
> logical router but skip all configured load_balancers.
>
> Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2054394
> Signed-off-by: Lorenzo Bianconi <[email protected]>

Hi Lorenzo,

This patch needs a rebase.  Looking into the linked BZ,  it seems like
an issue from ovn-kubernetes point of view.

Can you please update the commit message with the issue faced.  Maybe
this can be a candidate for the  backport.


> ---
>  northd/northd.c | 53 ++++++++++++++++++++++++++++---------------------
>  ovn-nb.xml      | 21 ++++++++++++++++++++
>  tests/ovn.at    | 38 +++++++++++++++++++++++++++++++++++
>  3 files changed, 89 insertions(+), 23 deletions(-)
>
> diff --git a/northd/northd.c b/northd/northd.c
> index 4f9c10648..e6483658e 100644
> --- a/northd/northd.c
> +++ b/northd/northd.c
> @@ -1641,13 +1641,13 @@ destroy_routable_addresses(struct 
> ovn_port_routable_addresses *ra)
>  }
>
>  static char **get_nat_addresses(const struct ovn_port *op, size_t *n,
> -                                bool routable_only);
> +                                bool routable_only, bool nat_only);
>
>  static void
>  assign_routable_addresses(struct ovn_port *op)
>  {
>      size_t n;
> -    char **nats = get_nat_addresses(op, &n, true);
> +    char **nats = get_nat_addresses(op, &n, true, false);
>
>      if (!nats) {
>          return;
> @@ -2711,7 +2711,8 @@ join_logical_ports(struct northd_input *input_data,
>   * The caller must free each of the n returned strings with free(),
>   * and must free the returned array when it is no longer needed. */
>  static char **
> -get_nat_addresses(const struct ovn_port *op, size_t *n, bool routable_only)
> +get_nat_addresses(const struct ovn_port *op, size_t *n, bool routable_only,
> +                  bool nat_only)

The argument 'nat_only' is used more as a negation below.  So I'd
suggest changing the name
as - "include_lb_ips" or a better name if you've in mind.


Otherwise the patch LGTM.

Thanks
Numan

>  {
>      size_t n_nats = 0;
>      struct eth_addr mac;
> @@ -2791,24 +2792,26 @@ get_nat_addresses(const struct ovn_port *op, size_t 
> *n, bool routable_only)
>          }
>      }
>
> -    const char *ip_address;
> -    if (routable_only) {
> -        SSET_FOR_EACH (ip_address, &op->od->lb_ips_v4_routable) {
> -            ds_put_format(&c_addresses, " %s", ip_address);
> -            central_ip_address = true;
> -        }
> -        SSET_FOR_EACH (ip_address, &op->od->lb_ips_v6_routable) {
> -            ds_put_format(&c_addresses, " %s", ip_address);
> -            central_ip_address = true;
> -        }
> -    } else {
> -        SSET_FOR_EACH (ip_address, &op->od->lb_ips_v4) {
> -            ds_put_format(&c_addresses, " %s", ip_address);
> -            central_ip_address = true;
> -        }
> -        SSET_FOR_EACH (ip_address, &op->od->lb_ips_v6) {
> -            ds_put_format(&c_addresses, " %s", ip_address);
> -            central_ip_address = true;
> +    if (!nat_only) {
> +        const char *ip_address;
> +        if (routable_only) {
> +            SSET_FOR_EACH (ip_address, &op->od->lb_ips_v4_routable) {
> +                ds_put_format(&c_addresses, " %s", ip_address);
> +                central_ip_address = true;
> +            }
> +            SSET_FOR_EACH (ip_address, &op->od->lb_ips_v6_routable) {
> +                ds_put_format(&c_addresses, " %s", ip_address);
> +                central_ip_address = true;
> +            }
> +        } else {
> +            SSET_FOR_EACH (ip_address, &op->od->lb_ips_v4) {
> +                ds_put_format(&c_addresses, " %s", ip_address);
> +                central_ip_address = true;
> +            }
> +            SSET_FOR_EACH (ip_address, &op->od->lb_ips_v6) {
> +                ds_put_format(&c_addresses, " %s", ip_address);
> +                central_ip_address = true;
> +            }
>          }
>      }
>
> @@ -3375,10 +3378,14 @@ ovn_port_update_sbrec(struct northd_input *input_data,
>              char **nats = NULL;
>              bool l3dgw_ports = op->peer && op->peer->od &&
>                                 op->peer->od->n_l3dgw_ports;
> -            if (nat_addresses && !strcmp(nat_addresses, "router")) {
> +            if (nat_addresses &&
> +                (!strcmp(nat_addresses, "router") ||
> +                 !strcmp(nat_addresses, "nat-only-router"))) {
>                  if (op->peer && op->peer->od
>                      && (chassis || op->peer->od->n_l3dgw_ports)) {
> -                    nats = get_nat_addresses(op->peer, &n_nats, false);
> +                    nats = get_nat_addresses(op->peer, &n_nats, false,
> +                                             !strcmp(nat_addresses,
> +                                                     "nat-only-router"));
>                  }
>              /* Only accept manual specification of ethernet address
>               * followed by IPv4 addresses on type "l3gateway" ports. */
> diff --git a/ovn-nb.xml b/ovn-nb.xml
> index e8aa8b863..e5947ac63 100644
> --- a/ovn-nb.xml
> +++ b/ovn-nb.xml
> @@ -913,6 +913,27 @@
>                </p>
>              </dd>
>
> +            <dt><code>nat-only-router</code></dt>
> +            <dd>
> +              <p>
> +                Gratuitous ARPs will be sent for all SNAT and DNAT external 
> IP
> +                addresses defined on the <ref column="options"
> +                key="router-port"/>'s logical router, using the
> +                <ref column="options" key="router-port"/>'s MAC address.
> +              </p>
> +
> +              <p>
> +                This form of <ref column="options" key="nat-addresses"/> is
> +                valid for logical switch ports where <ref column="options"
> +                key="router-port"/> is the name of a port on a gateway 
> router,
> +                or the name of a distributed gateway port.
> +              </p>
> +
> +              <p>
> +                Supported only in OVN 2.21.12.1 and later.
> +              </p>
> +            </dd>
> +
>              <dt><code>Ethernet address followed by one or more IPv4 
> addresses</code></dt>
>              <dd>
>                <p>
> diff --git a/tests/ovn.at b/tests/ovn.at
> index 184594831..b80ab803f 100644
> --- a/tests/ovn.at
> +++ b/tests/ovn.at
> @@ -8651,6 +8651,44 @@ 
> expected="fffffffffffff0000000000108060001080006040001f00000000001c0a80003000000
>  echo $expected >> expout
>  AT_CHECK([sort packets], [0], [expout])
>
> +# Temporarily remove nat-addresses option to avoid race conditions
> +# due to GARP backoff
> +ovn-nbctl lsp-set-options lrp0-rp router-port=lrp0 nat-addresses=""
> +
> +reset_pcap_file() {
> +    local iface=$1
> +    local pcap_file=$2
> +    ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \
> +options:rxq_pcap=dummy-rx.pcap
> +    rm -f ${pcap_file}*.pcap
> +    ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \
> +options:rxq_pcap=${pcap_file}-rx.pcap
> +}
> +
> +as hv1 reset_pcap_file snoopvif hv1/snoopvif
> +
> +# Re-add nat-addresses option
> +ovn-nbctl lsp-set-options lrp0-rp router-port=lrp0 
> nat-addresses="nat-only-router"
> +
> +# Wait for packets to be received.
> +OVS_WAIT_UNTIL([test `wc -c < "hv1/snoopvif-tx.pcap"` -ge 250])
> +trim_zeros() {
> +    sed 's/\(00\)\{1,\}$//'
> +}
> +
> +$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" hv1/snoopvif-tx.pcap | 
> trim_zeros > packets
> +g0="fffffffffffff0000000000108060001080006040001f00000000001c0a80001000000000000c0a80001"
> +echo $g0 > expout
> +g1="fffffffffffff0000000000108060001080006040001f00000000001c0a80002000000000000c0a80002"
> +echo $g1 >> expout
> +
> +grep $g0 packets | head -1 > exp
> +grep $g1 packets | head -1 >> exp
> +AT_CHECK([cat exp], [0], [expout])
> +
> +g3="fffffffffffff0000000000108060001080006040001f00000000001c0a80003000000000000c0a80003"
> +AT_CHECK([grep -q $g3 packets], [1])
> +
>  OVN_CLEANUP([hv1])
>
>  AT_CLEANUP
> --
> 2.35.1
>
> _______________________________________________
> 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