On Wed, Nov 4, 2020 at 12:33 PM Ben Pfaff <b...@ovn.org> wrote:
>
> From: Justin Pettit <jpet...@ovn.org>
>
> The upcoming ddlog implementation of northd needs these functions too,
> so they should be in a common library.
>
> Signed-off-by: Justin Pettit <jpet...@ovn.org>

Acked-by: Numan Siddique <num...@ovn.org>

One question: Does a submitter of a patch need to add a signed-off tag
when he/she is not an author of the patch ?

One small nit below.

Thanks
Numan


>
> ovn: Break out functions needed for ddlog.
> ---
>  lib/ovn-util.c      | 79 +++++++++++++++++++++++++++++++++++++++------
>  lib/ovn-util.h      | 11 +++++++
>  northd/ovn-northd.c | 51 -----------------------------
>  3 files changed, 80 insertions(+), 61 deletions(-)
>
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index 321fc89e275a..abe6b04a7701 100644
> --- a/lib/ovn-util.c
> +++ b/lib/ovn-util.c
> @@ -13,17 +13,21 @@
>   */
>
>  #include <config.h>
> +
> +#include "ovn-util.h"
> +
> +#include <ctype.h>
>  #include <unistd.h>
>
>  #include "daemon.h"
> -#include "ovn-util.h"
> -#include "ovn-dirs.h"
> -#include "openvswitch/vlog.h"
>  #include "openvswitch/ofp-parse.h"
> +#include "openvswitch/vlog.h"
> +#include "ovn-dirs.h"
>  #include "ovn-nb-idl.h"
>  #include "ovn-sb-idl.h"
> +#include "socket-util.h"
> +#include "svec.h"
>  #include "unixctl.h"
> -#include <ctype.h>
>
>  VLOG_DEFINE_THIS_MODULE(ovn_util);
>
> @@ -240,27 +244,37 @@ extract_ip_addresses(const char *address, struct 
> lport_addresses *laddrs)
>  bool
>  extract_lrp_networks(const struct nbrec_logical_router_port *lrp,
>                       struct lport_addresses *laddrs)
> +{
> +    return extract_lrp_networks__(lrp->mac, lrp->networks, lrp->n_networks,
> +                                  laddrs);
> +}
> +
> +/* Separate out the body of 'extract_lrp_networks()' for use from DDlog,
> + * which does not know the 'nbrec_logical_router_port' type. */
> +bool
> +extract_lrp_networks__(char *mac, char **networks, size_t n_networks,
> +                       struct lport_addresses *laddrs)
>  {
>      memset(laddrs, 0, sizeof *laddrs);
>
> -    if (!eth_addr_from_string(lrp->mac, &laddrs->ea)) {
> +    if (!eth_addr_from_string(mac, &laddrs->ea)) {
>          laddrs->ea = eth_addr_zero;
>          return false;
>      }
>      snprintf(laddrs->ea_s, sizeof laddrs->ea_s, ETH_ADDR_FMT,
>               ETH_ADDR_ARGS(laddrs->ea));
>
> -    for (int i = 0; i < lrp->n_networks; i++) {
> +    for (int i = 0; i < n_networks; i++) {
>          ovs_be32 ip4;
>          struct in6_addr ip6;
>          unsigned int plen;
>          char *error;
>
> -        error = ip_parse_cidr(lrp->networks[i], &ip4, &plen);
> +        error = ip_parse_cidr(networks[i], &ip4, &plen);
>          if (!error) {
>              if (!ip4) {
>                  static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 
> 1);
> -                VLOG_WARN_RL(&rl, "bad 'networks' %s", lrp->networks[i]);
> +                VLOG_WARN_RL(&rl, "bad 'networks' %s", networks[i]);
>                  continue;
>              }
>
> @@ -269,13 +283,13 @@ extract_lrp_networks(const struct 
> nbrec_logical_router_port *lrp,
>          }
>          free(error);
>
> -        error = ipv6_parse_cidr(lrp->networks[i], &ip6, &plen);
> +        error = ipv6_parse_cidr(networks[i], &ip6, &plen);
>          if (!error) {
>              add_ipv6_netaddr(laddrs, ip6, plen);
>          } else {
>              static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
>              VLOG_INFO_RL(&rl, "invalid syntax '%s' in networks",
> -                         lrp->networks[i]);
> +                         networks[i]);
>              free(error);
>          }
>      }
> @@ -333,6 +347,23 @@ destroy_lport_addresses(struct lport_addresses *laddrs)
>      free(laddrs->ipv6_addrs);
>  }
>
> +/* Go through 'addresses' and add found IPv4 addresses to 'ipv4_addrs' and
> + * IPv6 addresses to 'ipv6_addrs'. */
> +void
> +split_addresses(const char *addresses, struct svec *ipv4_addrs,
> +                struct svec *ipv6_addrs)
> +{
> +    struct lport_addresses laddrs;
> +    extract_lsp_addresses(addresses, &laddrs);
> +    for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
> +        svec_add(ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
> +    }
> +    for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
> +        svec_add(ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
> +    }
> +    destroy_lport_addresses(&laddrs);
> +}
> +
>  /* Allocates a key for NAT conntrack zone allocation for a provided
>   * 'key' record and a 'type'.
>   *
> @@ -663,3 +694,31 @@ ovn_smap_get_uint(const struct smap *smap, const char 
> *key, unsigned int def)
>
>      return u_value;
>  }
> +
> +/* For a 'key' of the form "IP:port" or just "IP", sets 'port' and
> + * 'ip_address'.  The caller must free() the memory allocated for
> + * 'ip_address'.
> + * Returns true if parsing of 'key' was successful, false otherwise.
> + */
> +bool
> +ip_address_and_port_from_lb_key(const char *key, char **ip_address,
> +                                uint16_t *port, int *addr_family)
> +{
> +    struct sockaddr_storage ss;
> +    if (!inet_parse_active(key, 0, &ss, false)) {
> +        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
> +        VLOG_WARN_RL(&rl, "bad ip address or port for load balancer key %s",
> +                     key);
> +        *ip_address = NULL;
> +        *port = 0;
> +        *addr_family = 0;
> +        return false;
> +    }
> +
> +    struct ds s = DS_EMPTY_INITIALIZER;
> +    ss_format_address_nobracks(&ss, &s);
> +    *ip_address = ds_steal_cstr(&s);
> +    *port = ss_get_port(&ss);
> +    *addr_family = ss.ss_family;
> +    return true;
> +}
> diff --git a/lib/ovn-util.h b/lib/ovn-util.h
> index 6162f30225b3..a39cbef5a47e 100644
> --- a/lib/ovn-util.h
> +++ b/lib/ovn-util.h
> @@ -27,6 +27,7 @@
>
>  struct nbrec_logical_router_port;
>  struct sbrec_logical_flow;
> +struct svec;
>  struct uuid;
>  struct eth_addr;
>  struct sbrec_port_binding;
> @@ -75,9 +76,16 @@ bool extract_lrp_networks(const struct 
> nbrec_logical_router_port *,
>                            struct lport_addresses *);
>  bool extract_sbrec_binding_first_mac(const struct sbrec_port_binding 
> *binding,
>                                       struct eth_addr *ea);
> +
> +bool extract_lrp_networks__(char *mac, char **networks, size_t n_networks,
> +                            struct lport_addresses *laddrs);
> +
>  bool lport_addresses_is_empty(struct lport_addresses *);
>  void destroy_lport_addresses(struct lport_addresses *);
>
> +void split_addresses(const char *addresses, struct svec *ipv4_addrs,
> +                     struct svec *ipv6_addrs);
> +
>  char *alloc_nat_zone_key(const struct uuid *key, const char *type);
>
>  const char *default_nb_db(void);
> @@ -219,4 +227,7 @@ char *str_tolower(const char *orig);
>          case OVN_OPT_MONITOR:                       \
>          case OVN_OPT_USER_GROUP:
>
> +bool ip_address_and_port_from_lb_key(const char *key, char **ip_address,
> +                                     uint16_t *port, int *addr_family);
> +
>  #endif
> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
> index 8800a3d3c10c..b55e154ef294 100644
> --- a/northd/ovn-northd.c
> +++ b/northd/ovn-northd.c
> @@ -125,7 +125,6 @@ enum ovn_datapath_type {
>   * functions can't be used in enums or switch cases.) */
>  #define OVN_STAGE_BUILD(DP_TYPE, PIPELINE, TABLE) \
>      (((DP_TYPE) << 9) | ((PIPELINE) << 8) | (TABLE))
> -

nit: seems like an unrelated change.


>  /* A stage within an OVN logical switch or router.
>   *
>   * An "enum ovn_stage" indicates whether the stage is part of a logical 
> switch
> @@ -2552,10 +2551,6 @@ join_logical_ports(struct northd_context *ctx,
>      }
>  }
>
> -static bool
> -ip_address_and_port_from_lb_key(const char *key, char **ip_address,
> -                                uint16_t *port, int *addr_family);
> -
>  static void
>  get_router_load_balancer_ips(const struct ovn_datapath *od,
>                               struct sset *all_ips_v4, struct sset 
> *all_ips_v6)
> @@ -5079,34 +5074,6 @@ build_pre_acls(struct ovn_datapath *od, struct hmap 
> *lflows)
>      }
>  }
>
> -/* For a 'key' of the form "IP:port" or just "IP", sets 'port' and
> - * 'ip_address'.  The caller must free() the memory allocated for
> - * 'ip_address'.
> - * Returns true if parsing of 'key' was successful, false otherwise.
> - */
> -static bool
> -ip_address_and_port_from_lb_key(const char *key, char **ip_address,
> -                                uint16_t *port, int *addr_family)
> -{
> -    struct sockaddr_storage ss;
> -    if (!inet_parse_active(key, 0, &ss, false)) {
> -        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
> -        VLOG_WARN_RL(&rl, "bad ip address or port for load balancer key %s",
> -                     key);
> -        *ip_address = NULL;
> -        *port = 0;
> -        *addr_family = 0;
> -        return false;
> -    }
> -
> -    struct ds s = DS_EMPTY_INITIALIZER;
> -    ss_format_address_nobracks(&ss, &s);
> -    *ip_address = ds_steal_cstr(&s);
> -    *port = ss_get_port(&ss);
> -    *addr_family = ss.ss_family;
> -    return true;
> -}
> -
>  /*
>   * Returns true if logical switch is configured with DNS records, false
>   * otherwise.
> @@ -11513,24 +11480,6 @@ sync_address_set(struct northd_context *ctx, const 
> char *name,
>                                      addrs, n_addrs);
>  }
>
> -/* Go through 'addresses' and add found IPv4 addresses to 'ipv4_addrs' and 
> IPv6
> - * addresses to 'ipv6_addrs'.
> - */
> -static void
> -split_addresses(const char *addresses, struct svec *ipv4_addrs,
> -                struct svec *ipv6_addrs)
> -{
> -    struct lport_addresses laddrs;
> -    extract_lsp_addresses(addresses, &laddrs);
> -    for (size_t k = 0; k < laddrs.n_ipv4_addrs; k++) {
> -        svec_add(ipv4_addrs, laddrs.ipv4_addrs[k].addr_s);
> -    }
> -    for (size_t k = 0; k < laddrs.n_ipv6_addrs; k++) {
> -        svec_add(ipv6_addrs, laddrs.ipv6_addrs[k].addr_s);
> -    }
> -    destroy_lport_addresses(&laddrs);
> -}
> -
>  /* OVN_Southbound Address_Set table contains same records as in north
>   * bound, plus the records generated from Port_Group table in north bound.
>   *
> --
> 2.26.2
>
> _______________________________________________
> 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