[ovs-dev] [classifier-opt 11/28] flow: Fully separate FWW_* from OFPFW10_*.
Ethan Jackson
ethan at nicira.com
Mon Jul 30 22:07:04 UTC 2012
Looks like a win to me, thanks.
Ethan
On Fri, Jul 20, 2012 at 4:25 PM, Ben Pfaff <blp at nicira.com> wrote:
> It might have been a useful optimization at one point to have FWW_*
> correspond in OFPFW10_* where possible, but it doesn't seem worthwhile for
> only 3 corresponding values. It also makes the code somewhat more
> confusing.
>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/flow.h | 12 +++++-------
> lib/ofp-util.c | 48 +++++++++++++++++++++---------------------------
> 2 files changed, 26 insertions(+), 34 deletions(-)
>
> diff --git a/lib/flow.h b/lib/flow.h
> index 0cec1c9..c007758 100644
> --- a/lib/flow.h
> +++ b/lib/flow.h
> @@ -148,14 +148,12 @@ flow_hash(const struct flow *flow, uint32_t basis)
>
> typedef unsigned int OVS_BITWISE flow_wildcards_t;
>
> -/* Same values and meanings as corresponding OFPFW10_* bits. */
> #define FWW_IN_PORT ((OVS_FORCE flow_wildcards_t) (1 << 0))
> -#define FWW_DL_TYPE ((OVS_FORCE flow_wildcards_t) (1 << 4))
> -#define FWW_NW_PROTO ((OVS_FORCE flow_wildcards_t) (1 << 5))
> -/* No corresponding OFPFW10_* bits. */
> -#define FWW_NW_DSCP ((OVS_FORCE flow_wildcards_t) (1 << 1))
> -#define FWW_NW_ECN ((OVS_FORCE flow_wildcards_t) (1 << 2))
> -#define FWW_NW_TTL ((OVS_FORCE flow_wildcards_t) (1 << 3))
> +#define FWW_DL_TYPE ((OVS_FORCE flow_wildcards_t) (1 << 1))
> +#define FWW_NW_PROTO ((OVS_FORCE flow_wildcards_t) (1 << 2))
> +#define FWW_NW_DSCP ((OVS_FORCE flow_wildcards_t) (1 << 3))
> +#define FWW_NW_ECN ((OVS_FORCE flow_wildcards_t) (1 << 4))
> +#define FWW_NW_TTL ((OVS_FORCE flow_wildcards_t) (1 << 5))
> #define FWW_ALL ((OVS_FORCE flow_wildcards_t) (((1 << 6)) - 1))
>
> /* Remember to update FLOW_WC_SEQ when adding or removing FWW_*. */
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index 4d5dfbb..ab47778 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -76,27 +76,6 @@ ofputil_netmask_to_wcbits(ovs_be32 netmask)
> return 32 - ip_count_cidr_bits(netmask);
> }
>
> -/* A list of the FWW_* and OFPFW10_ bits that have the same value, meaning, and
> - * name. */
> -#define WC_INVARIANT_LIST \
> - WC_INVARIANT_BIT(IN_PORT) \
> - WC_INVARIANT_BIT(DL_TYPE) \
> - WC_INVARIANT_BIT(NW_PROTO)
> -
> -/* Verify that all of the invariant bits (as defined on WC_INVARIANT_LIST)
> - * actually have the same names and values. */
> -#define WC_INVARIANT_BIT(NAME) BUILD_ASSERT_DECL(FWW_##NAME == OFPFW10_##NAME);
> - WC_INVARIANT_LIST
> -#undef WC_INVARIANT_BIT
> -
> -/* WC_INVARIANTS is the invariant bits (as defined on WC_INVARIANT_LIST) all
> - * OR'd together. */
> -static const flow_wildcards_t WC_INVARIANTS = 0
> -#define WC_INVARIANT_BIT(NAME) | FWW_##NAME
> - WC_INVARIANT_LIST
> -#undef WC_INVARIANT_BIT
> -;
> -
> /* Converts the OpenFlow 1.0 wildcards in 'ofpfw' (OFPFW10_*) into a
> * flow_wildcards in 'wc' for use in struct cls_rule. It is the caller's
> * responsibility to handle the special case where the flow match's dl_vlan is
> @@ -108,14 +87,20 @@ ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)
>
> /* Initialize most of rule->wc. */
> flow_wildcards_init_catchall(wc);
> - wc->wildcards = (OVS_FORCE flow_wildcards_t) ofpfw & WC_INVARIANTS;
>
> - /* Wildcard fields that aren't defined by ofp10_match. */
> - wc->wildcards |= FWW_NW_ECN | FWW_NW_TTL;
> + /* Start with wildcard fields that aren't defined by ofp10_match. */
> + wc->wildcards = FWW_NW_ECN | FWW_NW_TTL;
>
> + if (ofpfw & OFPFW10_IN_PORT) {
> + wc->wildcards |= FWW_IN_PORT;
> + }
> + if (ofpfw & OFPFW10_DL_TYPE) {
> + wc->wildcards |= FWW_DL_TYPE;
> + }
> + if (ofpfw & OFPFW10_NW_PROTO) {
> + wc->wildcards |= FWW_NW_PROTO;
> + }
> if (ofpfw & OFPFW10_NW_TOS) {
> - /* OpenFlow 1.0 defines a TOS wildcard, but it's much later in
> - * the enum than we can use. */
> wc->wildcards |= FWW_NW_DSCP;
> }
>
> @@ -204,7 +189,16 @@ ofputil_cls_rule_to_ofp10_match(const struct cls_rule *rule,
> uint32_t ofpfw;
>
> /* Figure out most OpenFlow wildcards. */
> - ofpfw = (OVS_FORCE uint32_t) (wc->wildcards & WC_INVARIANTS);
> + ofpfw = 0;
> + if (wc->wildcards & FWW_IN_PORT) {
> + ofpfw |= OFPFW10_IN_PORT;
> + }
> + if (wc->wildcards & FWW_DL_TYPE) {
> + ofpfw |= OFPFW10_DL_TYPE;
> + }
> + if (wc->wildcards & FWW_NW_PROTO) {
> + ofpfw |= OFPFW10_NW_PROTO;
> + }
> ofpfw |= (ofputil_netmask_to_wcbits(wc->nw_src_mask)
> << OFPFW10_NW_SRC_SHIFT);
> ofpfw |= (ofputil_netmask_to_wcbits(wc->nw_dst_mask)
> --
> 1.7.2.5
>
More information about the dev
mailing list