[ovs-dev] [PATCH 38/41] ofproto-dpif-rid: Use UUID, not pointer, to identify ofprotos for recirc.

Jarno Rajahalme jarno at ovn.org
Thu Jan 21 00:17:30 UTC 2016


Acked-by: Jarno Rajahalme <jarno at ovn.org>

> On Jan 18, 2016, at 11:27 PM, Ben Pfaff <blp at ovn.org> wrote:
> 
> An upcoming commit will make it possible to essentially serialize the
> recirculation state into an OpenFlow message.  For that purpose, we can't
> sensibly pass a "struct ofproto *", but a randomly generated UUID works
> just as well.
> 
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
> ofproto/ofproto-dpif-rid.c   |  9 +++++----
> ofproto/ofproto-dpif-rid.h   |  5 +++--
> ofproto/ofproto-dpif-xlate.c | 22 +++++++++++++++++++---
> ofproto/ofproto-dpif.c       | 11 +++++++++++
> ofproto/ofproto-dpif.h       |  4 +++-
> 5 files changed, 41 insertions(+), 10 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif-rid.c b/ofproto/ofproto-dpif-rid.c
> index eab5baa..ba6237d 100644
> --- a/ofproto/ofproto-dpif-rid.c
> +++ b/ofproto/ofproto-dpif-rid.c
> @@ -130,7 +130,7 @@ recirc_state_hash(const struct recirc_state *state)
> {
>     uint32_t hash;
> 
> -    hash = hash_pointer(state->ofproto, 0);
> +    hash = uuid_hash(&state->ofproto_uuid);
>     hash = hash_int(state->table_id, hash);
>     if (flow_tnl_dst_is_set(state->metadata.tunnel)) {
>         /* We may leave remainder bytes unhashed, but that is unlikely as
> @@ -164,7 +164,7 @@ recirc_state_equal(const struct recirc_state *a,
>                       const struct recirc_state *b)
> {
>     return (a->table_id == b->table_id
> -            && a->ofproto == b->ofproto
> +            && uuid_equals(&a->ofproto_uuid, &b->ofproto_uuid)
>             && flow_tnl_equal(a->metadata.tunnel, b->metadata.tunnel)
>             && !memcmp(&a->metadata.metadata, &b->metadata.metadata,
>                        sizeof a->metadata - sizeof a->metadata.tunnel)
> @@ -310,7 +310,7 @@ recirc_alloc_id(struct ofproto_dpif *ofproto)
>     tunnel.ipv6_dst = in6addr_any;
>     struct recirc_state state = {
>         .table_id = TBL_INTERNAL,
> -        .ofproto = ofproto,
> +        .ofproto_uuid = *ofproto_dpif_get_uuid(ofproto),
>         .metadata = { .tunnel = &tunnel, .in_port = OFPP_NONE },
>     };
>     return recirc_alloc_id__(&state, recirc_state_hash(&state))->id;
> @@ -363,8 +363,9 @@ recirc_free_ofproto(struct ofproto_dpif *ofproto, const char *ofproto_name)
> {
>     struct recirc_id_node *n;
> 
> +    const struct uuid *ofproto_uuid = ofproto_dpif_get_uuid(ofproto);
>     CMAP_FOR_EACH (n, metadata_node, &metadata_map) {
> -        if (n->state.ofproto == ofproto) {
> +        if (uuid_equals(&n->state.ofproto_uuid, ofproto_uuid)) {
>             VLOG_ERR("recirc_id %"PRIu32
>                      " left allocated when ofproto (%s)"
>                      " is destructed", n->id, ofproto_name);
> diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h
> index 654c95c..04ec037 100644
> --- a/ofproto/ofproto-dpif-rid.h
> +++ b/ofproto/ofproto-dpif-rid.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2014, 2015 Nicira, Inc.
> + * Copyright (c) 2014, 2015, 2016 Nicira, Inc.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -25,6 +25,7 @@
> #include "ofp-actions.h"
> #include "ofproto-dpif-mirror.h"
> #include "ovs-thread.h"
> +#include "uuid.h"
> 
> struct ofproto_dpif;
> struct rule;
> @@ -135,7 +136,7 @@ struct recirc_state {
>     uint8_t table_id;
> 
>     /* Pipeline context for post-recirculation processing. */
> -    struct ofproto_dpif *ofproto; /* Post-recirculation bridge. */
> +    struct uuid ofproto_uuid;     /* Post-recirculation bridge. */
>     struct recirc_metadata metadata; /* Flow metadata. */
>     union mf_subvalue *stack;     /* Stack if any. */
>     size_t n_stack;
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index e3b46ab..8ab4b2a 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -506,6 +506,8 @@ static void compose_output_action(struct xlate_ctx *, ofp_port_t ofp_port,
> 
> static struct xbridge *xbridge_lookup(struct xlate_cfg *,
>                                       const struct ofproto_dpif *);
> +static struct xbridge *xbridge_lookup_by_uuid(struct xlate_cfg *,
> +                                              const struct uuid *);
> static struct xbundle *xbundle_lookup(struct xlate_cfg *,
>                                       const struct ofbundle *);
> static struct xport *xport_lookup(struct xlate_cfg *,
> @@ -1233,6 +1235,19 @@ xbridge_lookup(struct xlate_cfg *xcfg, const struct ofproto_dpif *ofproto)
>     return NULL;
> }
> 
> +static struct xbridge *
> +xbridge_lookup_by_uuid(struct xlate_cfg *xcfg, const struct uuid *uuid)
> +{
> +    struct xbridge *xbridge;
> +
> +    HMAP_FOR_EACH (xbridge, hmap_node, &xcfg->xbridges) {
> +        if (uuid_equals(ofproto_dpif_get_uuid(xbridge->ofproto), uuid)) {
> +            return xbridge;
> +        }
> +    }
> +    return NULL;
> +}
> +
> static struct xbundle *
> xbundle_lookup(struct xlate_cfg *xcfg, const struct ofbundle *ofbundle)
> {
> @@ -3624,7 +3639,7 @@ compose_recirculate_action__(struct xlate_ctx *ctx, uint8_t table)
> 
>     struct recirc_state state = {
>         .table_id = table,
> -        .ofproto = ctx->xbridge->ofproto,
> +        .ofproto_uuid = *ofproto_dpif_get_uuid(ctx->xbridge->ofproto),
>         .metadata = md,
>         .stack = ctx->stack.data,
>         .n_stack = ctx->stack.size / sizeof(union mf_subvalue),
> @@ -5138,10 +5153,11 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
>         }
> 
>         /* Set the bridge for post-recirculation processing if needed. */
> -        if (ctx.xbridge->ofproto != state->ofproto) {
> +        if (!uuid_equals(ofproto_dpif_get_uuid(ctx.xbridge->ofproto),
> +                         &state->ofproto_uuid)) {
>             struct xlate_cfg *xcfg = ovsrcu_get(struct xlate_cfg *, &xcfgp);
>             const struct xbridge *new_bridge
> -                = xbridge_lookup(xcfg, state->ofproto);
> +                = xbridge_lookup_by_uuid(xcfg, &state->ofproto_uuid);
> 
>             if (OVS_UNLIKELY(!new_bridge)) {
>                 /* Drop the packet if the bridge cannot be found. */
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 3281eaa..89e06aa 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -296,6 +296,10 @@ struct ofproto_dpif {
>     struct ofproto up;
>     struct dpif_backer *backer;
> 
> +    /* Unique identifier for this instantiation of this bridge in this running
> +     * process.  */
> +    struct uuid uuid;
> +
>     ATOMIC(cls_version_t) tables_version;  /* For classifier lookups. */
> 
>     uint64_t dump_seq; /* Last read of udpif_dump_seq(). */
> @@ -1312,6 +1316,7 @@ construct(struct ofproto *ofproto_)
>         return error;
>     }
> 
> +    uuid_generate(&ofproto->uuid);
>     atomic_init(&ofproto->tables_version, CLS_MIN_VERSION);
>     ofproto->netflow = NULL;
>     ofproto->sflow = NULL;
> @@ -5713,6 +5718,12 @@ ofproto_dpif_delete_internal_flow(struct ofproto_dpif *ofproto,
>     return 0;
> }
> 
> +const struct uuid *
> +ofproto_dpif_get_uuid(const struct ofproto_dpif *ofproto)
> +{
> +    return &ofproto->uuid;
> +}
> +
> const struct ofproto_class ofproto_dpif_class = {
>     init,
>     enumerate_types,
> diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
> index 61a28ea..0064178 100644
> --- a/ofproto/ofproto-dpif.h
> +++ b/ofproto/ofproto-dpif.h
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
> +/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -178,6 +178,8 @@ int ofproto_dpif_add_internal_flow(struct ofproto_dpif *,
>                                    struct rule **rulep);
> int ofproto_dpif_delete_internal_flow(struct ofproto_dpif *, struct match *,
>                                       int priority);
> +
> +const struct uuid *ofproto_dpif_get_uuid(const struct ofproto_dpif *);
> 
> /* struct rule_dpif has struct rule as it's first member. */
> #define RULE_CAST(RULE) ((struct rule *)RULE)
> -- 
> 2.1.3
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev




More information about the dev mailing list