On Tue, Feb 8, 2022 at 5:28 AM Dumitru Ceara <[email protected]> wrote:
>
> We already store whether a datapath is a switch or not.  No need to do
> an smap lookup through its external IDs every time we need this
> information.
>
> Also, move the functions that inspect Datapath_Binding.external_ids
> out of ovn-util.c.  It makes more sense to just define them where
> they're used.
>
> Signed-off-by: Dumitru Ceara <[email protected]>

Thanks for the patch.  I applied this patch to the main branch.

Numan

> ---
> v2:
> - Per Mark's comment: don't expose datapath_is_switch().
> - Also moved other similar functions.
> ---
>  controller/lflow.c          | 25 ++++++++++++++-----------
>  controller/local_data.c     | 15 +++++++++++++++
>  controller/ovn-controller.c | 10 ++++++++--
>  controller/pinctrl.c        |  2 +-
>  lib/ovn-util.c              | 18 ------------------
>  lib/ovn-util.h              |  3 ---
>  6 files changed, 38 insertions(+), 35 deletions(-)
>
> diff --git a/controller/lflow.c b/controller/lflow.c
> index b976c7d562..055c53a751 100644
> --- a/controller/lflow.c
> +++ b/controller/lflow.c
> @@ -622,7 +622,7 @@ lflow_parse_ctrl_meter(const struct sbrec_logical_flow 
> *lflow,
>
>  static void
>  add_matches_to_flow_table(const struct sbrec_logical_flow *lflow,
> -                          const struct sbrec_datapath_binding *dp,
> +                          const struct local_datapath *ldp,
>                            struct hmap *matches, uint8_t ptable,
>                            uint8_t output_ptable, struct ofpbuf *ovnacts,
>                            bool ingress, struct lflow_ctx_in *l_ctx_in,
> @@ -632,7 +632,7 @@ add_matches_to_flow_table(const struct sbrec_logical_flow 
> *lflow,
>          .sbrec_multicast_group_by_name_datapath
>              = l_ctx_in->sbrec_multicast_group_by_name_datapath,
>          .sbrec_port_binding_by_name = l_ctx_in->sbrec_port_binding_by_name,
> -        .dp = dp,
> +        .dp = ldp->datapath,
>          .lflow = lflow,
>          .lfrr = l_ctx_out->lfrr,
>          .chassis_tunnels = l_ctx_in->chassis_tunnels,
> @@ -652,7 +652,7 @@ add_matches_to_flow_table(const struct sbrec_logical_flow 
> *lflow,
>          .lookup_port = lookup_port_cb,
>          .tunnel_ofport = tunnel_ofport_cb,
>          .aux = &aux,
> -        .is_switch = datapath_is_switch(dp),
> +        .is_switch = ldp->is_switch,
>          .group_table = l_ctx_out->group_table,
>          .meter_table = l_ctx_out->meter_table,
>          .lflow_uuid = lflow->header_.uuid,
> @@ -674,13 +674,13 @@ add_matches_to_flow_table(const struct 
> sbrec_logical_flow *lflow,
>
>      struct expr_match *m;
>      HMAP_FOR_EACH (m, hmap_node, matches) {
> -        match_set_metadata(&m->match, htonll(dp->tunnel_key));
> -        if (datapath_is_switch(dp)) {
> +        match_set_metadata(&m->match, htonll(ldp->datapath->tunnel_key));
> +        if (ldp->is_switch) {
>              unsigned int reg_index
>                  = (ingress ? MFF_LOG_INPORT : MFF_LOG_OUTPORT) - MFF_REG0;
>              int64_t port_id = m->match.flow.regs[reg_index];
>              if (port_id) {
> -                int64_t dp_id = dp->tunnel_key;
> +                int64_t dp_id = ldp->datapath->tunnel_key;
>                  char buf[16];
>                  get_unique_lport_key(dp_id, port_id, buf, sizeof(buf));
>                  if (!sset_contains(l_ctx_in->related_lport_ids, buf)) {
> @@ -731,7 +731,7 @@ add_matches_to_flow_table(const struct sbrec_logical_flow 
> *lflow,
>   */
>  static struct expr *
>  convert_match_to_expr(const struct sbrec_logical_flow *lflow,
> -                      const struct sbrec_datapath_binding *dp,
> +                      const struct local_datapath *ldp,
>                        struct expr **prereqs,
>                        const struct shash *addr_sets,
>                        const struct shash *port_groups,
> @@ -744,7 +744,8 @@ convert_match_to_expr(const struct sbrec_logical_flow 
> *lflow,
>
>      struct expr *e = expr_parse_string(lflow->match, &symtab, addr_sets,
>                                         port_groups, &addr_sets_ref,
> -                                       &port_groups_ref, dp->tunnel_key,
> +                                       &port_groups_ref,
> +                                       ldp->datapath->tunnel_key,
>                                         &error);
>      const char *addr_set_name;
>      SSET_FOR_EACH (addr_set_name, &addr_sets_ref) {
> @@ -791,7 +792,9 @@ consider_logical_flow__(const struct sbrec_logical_flow 
> *lflow,
>                          struct lflow_ctx_in *l_ctx_in,
>                          struct lflow_ctx_out *l_ctx_out)
>  {
> -    if (!get_local_datapath(l_ctx_in->local_datapaths, dp->tunnel_key)) {
> +    struct local_datapath *ldp = 
> get_local_datapath(l_ctx_in->local_datapaths,
> +                                                    dp->tunnel_key);
> +    if (!ldp) {
>          VLOG_DBG("lflow "UUID_FMT" is not for local datapath, skip",
>                   UUID_ARGS(&lflow->header_.uuid));
>          return;
> @@ -904,7 +907,7 @@ consider_logical_flow__(const struct sbrec_logical_flow 
> *lflow,
>      /* Get match expr, either from cache or from lflow match. */
>      switch (lcv_type) {
>      case LCACHE_T_NONE:
> -        expr = convert_match_to_expr(lflow, dp, &prereqs, 
> l_ctx_in->addr_sets,
> +        expr = convert_match_to_expr(lflow, ldp, &prereqs, 
> l_ctx_in->addr_sets,
>                                       l_ctx_in->port_groups, l_ctx_out->lfrr,
>                                       &pg_addr_set_ref);
>          if (!expr) {
> @@ -968,7 +971,7 @@ consider_logical_flow__(const struct sbrec_logical_flow 
> *lflow,
>          break;
>      }
>
> -    add_matches_to_flow_table(lflow, dp, matches, ptable, output_ptable,
> +    add_matches_to_flow_table(lflow, ldp, matches, ptable, output_ptable,
>                                &ovnacts, ingress, l_ctx_in, l_ctx_out);
>
>      /* Update cache if needed. */
> diff --git a/controller/local_data.c b/controller/local_data.c
> index 1857bfd1ba..98445902b7 100644
> --- a/controller/local_data.c
> +++ b/controller/local_data.c
> @@ -50,6 +50,9 @@ static struct tracked_datapath *tracked_datapath_create(
>      enum en_tracked_resource_type tracked_type,
>      struct hmap *tracked_datapaths);
>
> +static bool datapath_is_switch(const struct sbrec_datapath_binding *);
> +static bool datapath_is_transit_switch(const struct sbrec_datapath_binding 
> *);
> +
>  static uint64_t local_datapath_usage;
>
>  struct local_datapath *
> @@ -605,3 +608,15 @@ local_datapath_peer_port_add(struct local_datapath *ld,
>      ld->peer_ports[ld->n_peer_ports - 1].local = local;
>      ld->peer_ports[ld->n_peer_ports - 1].remote = remote;
>  }
> +
> +static bool
> +datapath_is_switch(const struct sbrec_datapath_binding *ldp)
> +{
> +    return smap_get(&ldp->external_ids, "logical-switch") != NULL;
> +}
> +
> +static bool
> +datapath_is_transit_switch(const struct sbrec_datapath_binding *ldp)
> +{
> +    return smap_get(&ldp->external_ids, "interconn-ts") != NULL;
> +}
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index 8631bccbc1..1a80ea87e2 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -634,6 +634,12 @@ alloc_id_to_ct_zone(const char *zone_name, struct simap 
> *ct_zones,
>      return true;
>  }
>
> +static int
> +get_snat_ct_zone(const struct sbrec_datapath_binding *dp)
> +{
> +    return smap_get_int(&dp->external_ids, "snat-ct-zone", -1);
> +}
> +
>  static void
>  update_ct_zones(const struct shash *binding_lports,
>                  const struct hmap *local_datapaths,
> @@ -665,7 +671,7 @@ update_ct_zones(const struct shash *binding_lports,
>          shash_add(&all_lds, dnat, ld);
>          shash_add(&all_lds, snat, ld);
>
> -        int req_snat_zone = datapath_snat_ct_zone(ld->datapath);
> +        int req_snat_zone = get_snat_ct_zone(ld->datapath);
>          if (req_snat_zone >= 0) {
>              simap_put(&req_snat_zones, snat, req_snat_zone);
>          }
> @@ -1851,7 +1857,7 @@ ct_zones_datapath_binding_handler(struct engine_node 
> *node, void *data)
>              return false;
>          }
>
> -        int req_snat_zone = datapath_snat_ct_zone(dp);
> +        int req_snat_zone = get_snat_ct_zone(dp);
>          if (req_snat_zone == -1) {
>              /* datapath snat ct zone is not set.  This condition will also 
> hit
>               * when CMS clears the snat-ct-zone for the logical router.
> diff --git a/controller/pinctrl.c b/controller/pinctrl.c
> index 293aecea27..08eb90e6ec 100644
> --- a/controller/pinctrl.c
> +++ b/controller/pinctrl.c
> @@ -4290,7 +4290,7 @@ run_buffered_binding(struct ovsdb_idl_index 
> *sbrec_mac_binding_by_lport_ip,
>           * a router datapath. Hence we can skip logical switch
>           * datapaths.
>           * */
> -        if (datapath_is_switch(ld->datapath)) {
> +        if (ld->is_switch) {
>              continue;
>          }
>
> diff --git a/lib/ovn-util.c b/lib/ovn-util.c
> index e6d0f73565..a22ae84fee 100644
> --- a/lib/ovn-util.c
> +++ b/lib/ovn-util.c
> @@ -559,24 +559,6 @@ ovn_logical_flow_hash_datapath(const struct uuid 
> *logical_datapath,
>      return hash_add(hash, uuid_hash(logical_datapath));
>  }
>
> -bool
> -datapath_is_switch(const struct sbrec_datapath_binding *ldp)
> -{
> -    return smap_get(&ldp->external_ids, "logical-switch") != NULL;
> -}
> -
> -bool
> -datapath_is_transit_switch(const struct sbrec_datapath_binding *ldp)
> -{
> -    return smap_get(&ldp->external_ids, "interconn-ts") != NULL;
> -}
> -
> -int
> -datapath_snat_ct_zone(const struct sbrec_datapath_binding *dp)
> -{
> -    return smap_get_int(&dp->external_ids, "snat-ct-zone", -1);
> -}
> -
>
>  struct tnlid_node {
>      struct hmap_node hmap_node;
> diff --git a/lib/ovn-util.h b/lib/ovn-util.h
> index 743d28745f..1fe91ba994 100644
> --- a/lib/ovn-util.h
> +++ b/lib/ovn-util.h
> @@ -117,9 +117,6 @@ uint32_t ovn_logical_flow_hash(uint8_t table_id, enum 
> ovn_pipeline pipeline,
>                                 const char *match, const char *actions);
>  uint32_t ovn_logical_flow_hash_datapath(const struct uuid *logical_datapath,
>                                          uint32_t hash);
> -bool datapath_is_switch(const struct sbrec_datapath_binding *);
> -bool datapath_is_transit_switch(const struct sbrec_datapath_binding *ldp);
> -int datapath_snat_ct_zone(const struct sbrec_datapath_binding *ldp);
>  void ovn_conn_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
>                     const char *argv[] OVS_UNUSED, void *idl_);
>
> --
> 2.27.0
>
> _______________________________________________
> 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