[ovs-dev] [PATCH v3 09/16] lport: Add index for logical datapaths.

Mickey Spiegel mickeys.dev at gmail.com
Mon Dec 19 00:15:50 UTC 2016


On Sun, Dec 18, 2016 at 12:18 AM, Ben Pfaff <blp at ovn.org> wrote:

> This will have its first real user in an upcoming commit.
>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
>

Acked-by: Mickey Spiegel <mickeys.dev at gmail.com>

---
>  ovn/controller/lport.c          | 62 ++++++++++++++++++++++++++++++
> +++++++++++
>  ovn/controller/lport.h          | 33 ++++++++++++++++++++--
>  ovn/controller/ovn-controller.c |  4 +++
>  3 files changed, 97 insertions(+), 2 deletions(-)
>
> diff --git a/ovn/controller/lport.c b/ovn/controller/lport.c
> index 38aca22..906fda2 100644
> --- a/ovn/controller/lport.c
> +++ b/ovn/controller/lport.c
> @@ -22,6 +22,68 @@
>
>  VLOG_DEFINE_THIS_MODULE(lport);
>
> +static struct ldatapath *ldatapath_lookup_by_key__(
> +    const struct ldatapath_index *, uint32_t dp_key);
> +
> +void
> +ldatapath_index_init(struct ldatapath_index *ldatapaths,
> +                     struct ovsdb_idl *ovnsb_idl)
> +{
> +    hmap_init(&ldatapaths->by_key);
> +
> +    const struct sbrec_port_binding *pb;
> +    SBREC_PORT_BINDING_FOR_EACH (pb, ovnsb_idl) {
> +        if (!pb->datapath) {
> +            continue;
> +        }
> +        uint32_t dp_key = pb->datapath->tunnel_key;
> +        struct ldatapath *ld = ldatapath_lookup_by_key__(ldatapaths,
> dp_key);
> +        if (!ld) {
> +            ld = xzalloc(sizeof *ld);
> +            hmap_insert(&ldatapaths->by_key, &ld->by_key_node, dp_key);
> +            ld->db = pb->datapath;
> +        }
> +
> +        if (ld->n_lports >= ld->allocated_lports) {
> +            ld->lports = x2nrealloc(ld->lports, &ld->allocated_lports,
> +                                    sizeof *ld->lports);
> +        }
> +        ld->lports[ld->n_lports++] = pb;
> +    }
> +}
> +
> +void
> +ldatapath_index_destroy(struct ldatapath_index *ldatapaths)
> +{
> +    if (!ldatapaths) {
> +        return;
> +    }
> +
> +    struct ldatapath *ld, *ld_next;
> +    HMAP_FOR_EACH_SAFE (ld, ld_next, by_key_node, &ldatapaths->by_key) {
> +        hmap_remove(&ldatapaths->by_key, &ld->by_key_node);
> +        free(ld->lports);
> +        free(ld);
> +    }
> +    hmap_destroy(&ldatapaths->by_key);
> +}
> +
> +static struct ldatapath *ldatapath_lookup_by_key__(
> +    const struct ldatapath_index *ldatapaths, uint32_t dp_key)
> +{
> +    struct ldatapath *ld;
> +    HMAP_FOR_EACH_WITH_HASH (ld, by_key_node, dp_key,
> &ldatapaths->by_key) {
> +        return ld;
> +    }
> +    return NULL;
> +}
> +
> +const struct ldatapath *ldatapath_lookup_by_key(
> +    const struct ldatapath_index *ldatapaths, uint32_t dp_key)
> +{
> +    return ldatapath_lookup_by_key__(ldatapaths, dp_key);
> +}
> +
>  /* A logical port. */
>  struct lport {
>      struct hmap_node name_node; /* Index by name. */
> diff --git a/ovn/controller/lport.h b/ovn/controller/lport.h
> index 0cad74a..fe0e430 100644
> --- a/ovn/controller/lport.h
> +++ b/ovn/controller/lport.h
> @@ -22,8 +22,37 @@
>  struct ovsdb_idl;
>  struct sbrec_datapath_binding;
>
> -/* Logical port and multicast group indexes
> - * ========================================
> +/* Database indexes.
> + * =================
> + *
> + * If the database IDL were a little smarter, it would allow us to
> directly
> + * look up data based on values of its fields.  It's not that smart
> (yet), so
> + * instead we define our own indexes.
> + */
> +
> +/* Logical datapath index
> + * ======================
> + */
> +
> +struct ldatapath {
> +    struct hmap_node by_key_node; /* Index by tunnel key. */
> +    const struct sbrec_datapath_binding *db;
> +    const struct sbrec_port_binding **lports;
> +    size_t n_lports, allocated_lports;
> +};
> +
> +struct ldatapath_index {
> +    struct hmap by_key;
> +};
> +
> +void ldatapath_index_init(struct ldatapath_index *, struct ovsdb_idl *);
> +void ldatapath_index_destroy(struct ldatapath_index *);
> +
> +const struct ldatapath *ldatapath_lookup_by_key(
> +    const struct ldatapath_index *, uint32_t dp_key);
> +
> +/* Logical port index
> + * ==================
>   *
>   * This data structure holds multiple indexes over logical ports, to
> allow for
>   * efficient searching for logical ports by name or number.
> diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-
> controller.c
> index efbd026..5a07f2f 100644
> --- a/ovn/controller/ovn-controller.c
> +++ b/ovn/controller/ovn-controller.c
> @@ -507,8 +507,10 @@ main(int argc, char *argv[])
>          const struct ovsrec_bridge *br_int = get_br_int(&ctx);
>          const char *chassis_id = get_chassis_id(ctx.ovs_idl);
>
> +        struct ldatapath_index ldatapaths;
>          struct lport_index lports;
>          struct mcgroup_index mcgroups;
> +        ldatapath_index_init(&ldatapaths, ctx.ovnsb_idl);
>          lport_index_init(&lports, ctx.ovnsb_idl);
>          mcgroup_index_init(&mcgroups, ctx.ovnsb_idl);
>
> @@ -556,6 +558,8 @@ main(int argc, char *argv[])
>
>          mcgroup_index_destroy(&mcgroups);
>          lport_index_destroy(&lports);
> +        ldatapath_index_destroy(&ldatapaths);
> +
>          sset_destroy(&all_lports);
>
>          struct local_datapath *cur_node, *next_node;
> --
> 2.10.2
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>


More information about the dev mailing list