On Wed, Nov 06, 2013 at 10:46:07PM +0800, Alexander Wu wrote:
> 
> V2:
>   Change calls of ofputil.
>   Fix CodingStyle accoring to Simon Horman's suggestions.
> 
> V1:
>   Add function to print OFPMP_TABLE_FEATURES.
>   But now the print is crude and dirty.
>   Fix it to bitmap or more desc later.
> 
> Signed-off-by: Alexander Wu <alexander...@huawei.com>
> ---
>  lib/ofp-print.c |  127 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 126 insertions(+), 1 deletions(-)
> 
> diff --git a/lib/ofp-print.c b/lib/ofp-print.c
> index 37e1f4f..a1b0379 100644
> --- a/lib/ofp-print.c
> +++ b/lib/ofp-print.c
> @@ -2485,6 +2485,131 @@ ofp_print_group_mod(struct ds *s, const struct 
> ofp_header *oh)
>      ofp_print_group(s, gm.group_id, gm.type, &gm.buckets);
>  }
> 
> +/* Appends a string representation of 'prop' to 's'. */
> +static void
> +table_feature_prop_format(const struct ofputil_table_feature_prop_header 
> *prop,
> +                           struct ds *s)

I think there is an extra leading space on the line above.

> +{
> +    int i = 0;
> +    int n = 0;
> +    int element_size = (int)table_feature_prop_get_length(prop->type);
> +
> +    if (!element_size) {
> +        /* FIXME LOG SOMETHING */

Please fix.

> +        return;
> +    } else {
> +        n = (prop->length - 4) / element_size;
> +    }
> +
> +    ds_put_format(s, "%s: ", table_feature_prop_get_name(prop->type));
> +
> +    switch (prop->type) {
> +    case OFPTFPT13_INSTRUCTIONS:
> +    case OFPTFPT13_INSTRUCTIONS_MISS: {
> +        struct ofp11_instruction *inst = (struct ofp11_instruction 
> *)prop->data;
> +
> +        /* FIXME ofpacts_format */
> +        for (i = 0; i < n; i++) {
> +            ds_put_format(s, "%"PRIu16, inst[i].type);
> +            if (i != n - 1)
> +                ds_put_format(s, ",");
> +        }
> +        break;
> +    }
> +    case OFPTFPT13_NEXT_TABLES:
> +    case OFPTFPT13_NEXT_TABLES_MISS: {
> +        uint8_t *ntables = prop->data;
> +        for (i = 0; i < n; i++) {
> +            ds_put_format(s, "%"PRIu8, ntables[i]);
> +            if (i != n - 1)
> +                ds_put_format(s, ",");
> +        }
> +        break;
> +    }
> +    case OFPTFPT13_WRITE_ACTIONS:
> +    case OFPTFPT13_WRITE_ACTIONS_MISS:
> +    case OFPTFPT13_APPLY_ACTIONS:
> +    case OFPTFPT13_APPLY_ACTIONS_MISS: {
> +        struct ofp_action_header *acts =(struct ofp_action_header 
> *)prop->data;
> +
> +        /* FIXME ofpacts_format */
> +        for (i = 0; i < n; i++) {
> +            ds_put_format(s, "%"PRIu16, acts[i].type);
> +            if (i != n - 1)
> +                ds_put_format(s, ",");
> +        }
> +        break;
> +    }
> +    case OFPTFPT13_MATCH:
> +    case OFPTFPT13_WILDCARDS:
> +    case OFPTFPT13_WRITE_SETFIELD:
> +    case OFPTFPT13_WRITE_SETFIELD_MISS:
> +    case OFPTFPT13_APPLY_SETFIELD:
> +    case OFPTFPT13_APPLY_SETFIELD_MISS: {
> +        uint32_t *oxm = (uint32_t *)prop->data;
> +
> +        for (i = 0; i < n; i++) {
> +            ds_put_format(s, "%s", get_oxm_name(oxm[i]));
> +            if (i != n - 1)
> +                ds_put_format(s, ",");
> +        }
> +        break;
> +    }
> +    case OFPTFPT13_EXPERIMENTER:
> +    case OFPTFPT13_EXPERIMENTER_MISS:
> +        ds_put_format(s, "experimenter");
> +        if (i != n - 1)
> +            ds_put_format(s, ",");
> +        break;
> +    default:
> +        ds_put_format(s, "unknown(%u)", prop->type);
> +        if (i != n - 1)
> +            ds_put_format(s, ",");
> +        break;
> +    }
> +}
> +
> +
> +static void
> +ofp_print_table_features_stats_single(struct ds *s,
> +                                      const struct ofputil_table_features 
> *tf)
> +{
> +    int i;
> +    ds_put_format(s, "\n  %"PRIu8":", tf->table_id);
> +    ds_put_format(s, " name:%s", tf->name);
> +    ds_put_format(s, " metadata_match:%"PRIx64, tf->metadata_match);
> +    ds_put_format(s, " metadata_write:%"PRIx64, tf->metadata_write);
> +    ds_put_format(s, " config:%"PRIx32, tf->config);
> +    ds_put_format(s, " max_entries:%"PRIu32, tf->max_entries);
> +
> +    ds_put_format(s, "\n    Properties:");
> +    for (i = 0; i < tf->n_property; i++) {
> +        if (tf->props[i].data == NULL || tf->props[i].length == 0)
> +            continue;
> +
> +        ds_put_format(s, "\n      ");
> +        table_feature_prop_format(&tf->props[i], s);
> +    }
> +    ds_put_format(s, "\n");
> +}
> +
> +static void
> +ofp_print_table_features_stats(struct ds *s, const struct ofp_header *oh)
> +{
> +    struct ofputil_table_features tfs[OFTABLE_NUM];
> +    int tfs_num;
> +    int i;
> +    int error;
> +    uint32_t flag;
> +
> +    memset(tfs, 0, sizeof(tfs));
> +    error = ofputil_pull_table_features(oh, &tfs_num, tfs, &flag);
> +
> +    for (i = 0; i < tfs_num; i++) {
> +        ofp_print_table_features_stats_single(s, &tfs[i]);
> +    }
> +}
> +
>  static void
>  ofp_to_string__(const struct ofp_header *oh, enum ofpraw raw,
>                  struct ds *string, int verbosity)
> @@ -2525,7 +2650,7 @@ ofp_to_string__(const struct ofp_header *oh, enum 
> ofpraw raw,
> 
>      case OFPTYPE_TABLE_FEATURES_STATS_REQUEST:
>      case OFPTYPE_TABLE_FEATURES_STATS_REPLY:
> -        ofp_print_not_implemented(string);
> +        ofp_print_table_features_stats(string, oh);
>          break;
> 
>      case OFPTYPE_HELLO:
> -- 
> 1.7.3.1.msysgit.0
> 
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to