[ovs-dev] [PATCH v2 05/16] ofp-util: Abstract table miss configuration and fix related bugs.

Jarno Rajahalme jrajahalme at nicira.com
Fri Aug 8 18:32:40 UTC 2014


Acked-by: Jarno Rajahalme <jrajahalme at nicira.com>

Two small nits and a comment error (?) spotted below,

  Jarno

On Aug 7, 2014, at 4:13 PM, Ben Pfaff <blp at nicira.com> wrote:

> The ofproto implementation has had an abstraction layer on top of
> OFPTC11_TABLE_MISS for a while.  This commit pushes that abstraction layer
> farther down, into ofp-util.  This will be more useful in an upcoming
> commit.
> 
> During the conversion I realized that the previous implementation was
> not entirely correct.  In particular, the OpenFlow 1.3+ "table mod" was
> still being treated as if it had table miss configuration bits, even
> though it doesn't.  This commit fixes that issue and updates the tests.
> 
> OpenFlow 1.4 adds some more OFPTC_* flags that this new abstraction doesn't
> yet support, but OVS didn't support those flags any better before this
> commit, so abstracting those is left as future work.
> 
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/ofp-parse.c            |    9 +-
> lib/ofp-print.c            |  408 ++++++++++--------------------
> lib/ofp-util.c             |  589 +++++++++++++++++++++++++++++++++-----------
> lib/ofp-util.h             |   67 +++--
> ofproto/connmgr.c          |   13 +-
> ofproto/ofproto-dpif.c     |   43 ++--
> ofproto/ofproto-provider.h |   72 ++----
> ofproto/ofproto.c          |  216 ++++++++++------
> ofproto/ofproto.h          |   20 +-
> tests/ofp-print.at         |  107 +++++---
> tests/ofproto-dpif.at      |   59 +++--
> tests/ofproto.at           |  109 +++++---
> 12 files changed, 1011 insertions(+), 701 deletions(-)
> 

(snip)

> +
> +static struct mf_bitmap
> +mf_bitmap_from_of10(ovs_be32 wc10)
> +{
> +    struct mf_bitmap fields = MF_BITMAP_INITIALIZER;
> +    const struct ofp10_wc_map *p;
> +
> +    for (p = ofp10_wc_map; p < &ofp10_wc_map[ARRAY_SIZE(ofp10_wc_map)]; p++) {
> +        if (wc10 & htonl(p->wc10)) {

Maybe ntohl(wc10) once outside the loop?

> +            bitmap_set1(fields.bm, p->mf);
> +        }
> +    }
> +    return fields;
> +}
> +

(snip)

> +static struct mf_bitmap
> +mf_bitmap_from_of11(ovs_be32 wc11)
> +{
> +    struct mf_bitmap fields = MF_BITMAP_INITIALIZER;
> +    const struct ofp11_wc_map *p;
> +
> +    for (p = ofp11_wc_map; p < &ofp11_wc_map[ARRAY_SIZE(ofp11_wc_map)]; p++) {
> +        if (wc11 & htonl(p->wc11)) {

Ditto.

> +            bitmap_set1(fields.bm, p->mf);
>         }
>     }
> -    return htonl(fmf11);
> +    return fields;
> }

(snip)

> diff --git a/lib/ofp-util.h b/lib/ofp-util.h
> index 6c7559a..b9d2ae8 100644
> --- a/lib/ofp-util.h
> +++ b/lib/ofp-util.h
> @@ -578,10 +578,38 @@ enum ofperr ofputil_decode_port_mod(const struct ofp_header *,
> struct ofpbuf *ofputil_encode_port_mod(const struct ofputil_port_mod *,
>                                        enum ofputil_protocol);
> 
> +/* Abstract version of OFPTC11_TABLE_MISS_*.
> + *
> + * OpenFlow 1.0 always sends packets that miss to the controller.
> + *
> + * OpenFlow 1.1 and 1.2 can configure table miss behavior via a "table-mod"
> + * that specifies "send to controller", "miss", or "drop".
> + *
> + * OpenFlow 1.3 and later never sends packets that miss to the controller.
> + */
> +enum ofputil_table_miss {
> +    /* Protocol-specific default behavior.  On OpenFlow 1.0 through 1.2
> +     * connections, the packet is sent to the controller, and on OpenFlow 1.3
> +     * and later connections, the packet is dropped.
> +     *
> +     * This is also used as a result of decoding OpenFlow 1.3+ "config" values
> +     * in table-mods, to indicate that no table-miss was specified. */
> +    OFPUTIL_TABLE_MISS_DEFAULT,    /* Protocol default behavior. */
> +
> +    /* These constants have the same meanings as those in OpenFlow with the
> +     * same names. */
> +    OFPUTIL_TABLE_MISS_CONTROLLER, /* Send to controller. */
> +    OFPUTIL_TABLE_MISS_CONTINUE,   /* Go to next table, like OF1.0. */

The comment here does not seem to match the one above (“OpenFlow 1.0 always sends packets that miss to the controller.”)

> +    OFPUTIL_TABLE_MISS_DROP,       /* Drop the packet. */
> +};
> +
> +ovs_be32 ofputil_table_miss_to_config(enum ofputil_table_miss,
> +                                      enum ofp_version);
> +

(snip)





More information about the dev mailing list