[ovs-dev] [PATCH 2/9] ofp-actions: Add action bitmap abstraction.

Jarno Rajahalme jrajahalme at nicira.com
Thu Aug 7 23:03:21 UTC 2014


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

Three minor comments below,

  Jarno

On Aug 4, 2014, at 9:21 AM, Ben Pfaff <blp at nicira.com> wrote:

> Until now, sets of actions have been abstracted separately outside
> ofp-actions, as enum ofputil_action_bitmap.  Drawing sets of actions into
> ofp-actions, as done in this commit, makes for a better overall
> abstraction of actions, with better consistency.
> 
> A big part of this commit is shifting from using ofp12_table_stats as if
> it were an abstraction for OpenFlow table stats, toward using a new
> struct ofputil_table_stats, which is what we generally do with other
> OpenFlow structures and fits better with the rest of the code.
> 
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/ofp-actions.c          | 156 +++++++++++++++++++++++++
> lib/ofp-actions.h          | 145 +++++++++++------------
> lib/ofp-print.c            | 105 ++++-------------
> lib/ofp-util.c             | 280 ++++++++++++++++++++++-----------------------
> lib/ofp-util.h             |  66 ++++-------
> ofproto/ofproto-dpif.c     |  23 +---
> ofproto/ofproto-provider.h |  22 ++--
> ofproto/ofproto.c          |  85 ++++++--------
> tests/ofp-print.at         |  26 +++--
> tests/ofproto.at           |  20 ++--
> 10 files changed, 495 insertions(+), 433 deletions(-)
> 
> diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
> index e8fd922..3818b2d 100644
> --- a/lib/ofp-actions.c
> +++ b/lib/ofp-actions.c
> @@ -3091,6 +3091,151 @@ ofpacts_put_openflow_instructions(const struct ofpact ofpacts[],
>     }
> }
> 
> +/* Sets of supported actions. */
> +
> +struct ofpact_xlate {
> +    enum ofpact_type ofpact;
> +    int ofpat;

This would benefit from some comments:
- ‘ofpact’ OVS internal enumeration of all supported action types.
- ‘ofpat' the corresponding action number specified in a given version of the OpenFlow specification.

Also, this has nothing to do with ofproto-dpif-xlate, but “xlate” made me initially think this would be related.

> +};
> +
> +static const struct ofpact_xlate *
> +get_ofpact_xlate(enum ofp_version version)
> +{
> +    /* OpenFlow 1.0 actions. */
> +    static const struct ofpact_xlate of10[] = {
> +        { OFPACT_OUTPUT, 0 },
> +        { OFPACT_SET_VLAN_VID, 1 },
> +        { OFPACT_SET_VLAN_PCP, 2 },
> +        { OFPACT_STRIP_VLAN, 3 },
> +        { OFPACT_SET_ETH_SRC, 4 },
> +        { OFPACT_SET_ETH_DST, 5 },
> +        { OFPACT_SET_IPV4_SRC, 6 },
> +        { OFPACT_SET_IPV4_DST, 7 },
> +        { OFPACT_SET_IP_DSCP, 8 },
> +        { OFPACT_SET_L4_SRC_PORT, 9 },
> +        { OFPACT_SET_L4_DST_PORT, 10 },
> +        { OFPACT_ENQUEUE, 11 },
> +        { 0, -1 },
> +    };
> +

(snip)

> diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h
> index 8cb8862..5877151 100644
> --- a/lib/ofp-actions.h
> +++ b/lib/ofp-actions.h
> @@ -31,7 +31,7 @@
>  * This macro is used directly only internally by this header, but the list is
>  * still of interest to developers.
>  *
> - * Each DEFINE_OFPACT invocation has the following parameters:
> + * Each OFPACT invocation has the following parameters:
>  *
>  * 1. <ENUM>, used below in the enum definition of OFPACT_<ENUM>, and
>  *    elsewhere.

Add: 4. string name of the action.

(snip)

> +static const char *
> +group_type_to_string(enum ofp11_group_type type)
> +{
> +    switch (type) {
> +    case OFPGT11_ALL: return "all";
> +    case OFPGT11_SELECT: return "select";
> +    case OFPGT11_INDIRECT: return "indirect";
> +    case OFPGT11_FF: return "fast failover";
> +    default: OVS_NOT_REACHED();
> +    }
> +}
> +
> static void
> ofp_print_group_features(struct ds *string, const struct ofp_header *oh)
> {
>     struct ofputil_group_features features;
> +    int i;
> 
>     ofputil_decode_group_features_reply(oh, &features);
> 
> @@ -2470,32 +2443,15 @@ ofp_print_group_features(struct ds *string, const struct ofp_header *oh)
>     ds_put_format(string, "    Capabilities:  0x%"PRIx32"\n",
>                   features.capabilities);
> 
> -    if (features.types & (1u << OFPGT11_ALL)) {
> -        ds_put_format(string, "    All group :\n");
> -        ds_put_format(string,
> -                      "        max_groups = %#"PRIx32" actions=0x%08"PRIx32"\n",
> -                      features.max_groups[0], features.actions[0]);
> -    }
> -
> -    if (features.types & (1u << OFPGT11_SELECT)) {
> -        ds_put_format(string, "    Select group :\n");
> -        ds_put_format(string, "        max_groups = %#"PRIx32" "
> -                      "actions=0x%08"PRIx32"\n",
> -                      features.max_groups[1], features.actions[1]);
> -    }
> -
> -    if (features.types & (1u << OFPGT11_INDIRECT)) {
> -        ds_put_format(string, "    Indirect group :\n");
> -        ds_put_format(string, "        max_groups = %#"PRIx32" "
> -                      "actions=0x%08"PRIx32"\n",
> -                      features.max_groups[2], features.actions[2]);
> -    }
> -
> -    if (features.types & (1u << OFPGT11_FF)) {
> -        ds_put_format(string, "    Fast Failover group :\n");
> -        ds_put_format(string, "        max_groups = %#"PRIx32" "
> -                      "actions=0x%08"PRIx32"\n",
> -                      features.max_groups[3], features.actions[3]);
> +    for (i = 0; i < 4; i++) {

Using literal 4 here and the OVS_NOT_REACHED in group_type_to_string seems a bit fragile, we did not abort before if the features.types has unknown bits set. I see that the number 4 is hardwired also in the abstract group features structure. Maybe define a macro/enum for “4”?

> +        if (features.types & (1u << i)) {
> +            ds_put_format(string, "    %s group:\n", group_type_to_string(i));
> +            ds_put_format(string, "       max_groups=%#"PRIx32"\n",
> +                          features.max_groups[i]);
> +            ds_put_format(string, "       actions: ");
> +            ofpact_bitmap_format(features.ofpacts[i], string);
> +            ds_put_char(string, '\n');
> +        }
>     }
> }

(snip)

> @@ -1099,9 +1085,7 @@ struct ofputil_group_features {
>     uint32_t  types;           /* Bitmap of OFPGT_* values supported. */
>     uint32_t  capabilities;    /* Bitmap of OFPGFC12_* capability supported. */
>     uint32_t  max_groups[4];   /* Maximum number of groups for each type. */
> -
> -    /* Bitmaps of OFPAT_* that are supported.  OF1.2+ actions only. */
> -    uint32_t  actions[4];
> +    uint64_t  ofpacts[4];      /* Bitmaps of supported OFPACT_* */
> };
> 
> /* Group desc reply, independent of protocol. */




More information about the dev mailing list