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