From 26df8b3e3b288aae3340059faebcbda8eb22fbdb Mon Sep 17 00:00:00 2001 From: Simon Horman Date: Thu, 9 Aug 2012 17:49:34 +0900 Subject: [PATCH] ofp-print: Enable display of Open Flow 1.1 & 1.2 Table Stats Reply Messages Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- lib/ofp-print.c | 162 +++++++++++++++++++++++++++++++++++++++++---- tests/ofp-print.at | 57 +++++++++++++++- 2 files changed, 204 insertions(+), 15 deletions(-) diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 5a8b86748..013561f3f 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -1141,8 +1141,124 @@ ofp_print_ofpst_port_reply(struct ds *string, const struct ofp_header *oh, } static void -ofp_print_ofpst_table_reply(struct ds *string, const struct ofp_header *oh, - int verbosity) +ofp_print_one_ofpst_table_reply(struct ds *string, enum ofp_version ofp_version, + const char *name, struct ofp12_table_stats *ts) +{ + char name_[OFP_MAX_TABLE_NAME_LEN + 1]; + + ovs_strlcpy(name_, name, sizeof name_); + + ds_put_format(string, " %d: %-8s: ", ts->table_id, name_); + ds_put_format(string, "wild=0x%05"PRIx64", ", ntohll(ts->wildcards)); + ds_put_format(string, "max=%6"PRIu32", ", ntohl(ts->max_entries)); + ds_put_format(string, "active=%"PRIu32"\n", ntohl(ts->active_count)); + ds_put_cstr(string, " "); + ds_put_format(string, "lookup=%"PRIu64", ", ntohll(ts->lookup_count)); + ds_put_format(string, "matched=%"PRIu64"\n", ntohll(ts->matched_count)); + + if (ofp_version < OFP11_VERSION) { + return; + } + + ds_put_cstr(string, " "); + ds_put_format(string, "match=0x%08"PRIx64", ", ntohll(ts->match)); + ds_put_format(string, "instructions=0x%08"PRIx32", ", + ntohl(ts->instructions)); + ds_put_format(string, "config=0x%08"PRIx32"\n", ntohl(ts->config)); + ds_put_cstr(string, " "); + ds_put_format(string, "write_actions=0x%08"PRIx32", ", + ntohl(ts->write_actions)); + ds_put_format(string, "apply_actions=0x%08"PRIx32"\n", + ntohl(ts->apply_actions)); + + if (ofp_version < OFP12_VERSION) { + return; + } + + ds_put_cstr(string, " "); + ds_put_format(string, "write_setfields=0x%016"PRIx64"\n", + ntohll(ts->write_setfields)); + ds_put_cstr(string, " "); + ds_put_format(string, "apply_setfields=0x%016"PRIx64"\n", + ntohll(ts->apply_setfields)); + ds_put_cstr(string, " "); + ds_put_format(string, "metadata_match=0x%016"PRIx64"\n", + ntohll(ts->metadata_match)); + ds_put_cstr(string, " "); + ds_put_format(string, "metadata_write=0x%016"PRIx64"\n", + ntohll(ts->metadata_write)); +} + +static void +ofp_print_ofpst_table_reply12(struct ds *string, const struct ofp_header *oh, + int verbosity) +{ + struct ofp12_table_stats *ts; + struct ofpbuf b; + size_t n; + + ofpbuf_use_const(&b, oh, ntohs(oh->length)); + ofpraw_pull_assert(&b); + + n = b.size / sizeof *ts; + ds_put_format(string, " %zu tables\n", n); + if (verbosity < 1) { + return; + } + + for (;;) { + ts = ofpbuf_try_pull(&b, sizeof *ts); + if (!ts) { + return; + } + + ofp_print_one_ofpst_table_reply(string, OFP12_VERSION, ts->name, ts); + } +} + +static void +ofp_print_ofpst_table_reply11(struct ds *string, const struct ofp_header *oh, + int verbosity) +{ + struct ofp11_table_stats *ts; + struct ofpbuf b; + size_t n; + + ofpbuf_use_const(&b, oh, ntohs(oh->length)); + ofpraw_pull_assert(&b); + + n = b.size / sizeof *ts; + ds_put_format(string, " %zu tables\n", n); + if (verbosity < 1) { + return; + } + + for (;;) { + struct ofp12_table_stats ts12; + + ts = ofpbuf_try_pull(&b, sizeof *ts); + if (!ts) { + return; + } + + ts12.table_id = ts->table_id; + ts12.wildcards = htonll(ntohl(ts->wildcards)); + ts12.max_entries = ts->max_entries; + ts12.active_count = ts->active_count; + ts12.lookup_count = ts->lookup_count; + ts12.matched_count = ts->matched_count; + ts12.match = htonll(ntohl(ts->match)); + ts12.instructions = ts->instructions; + ts12.config = ts->config; + ts12.write_actions = ts->write_actions; + ts12.apply_actions = ts->apply_actions; + ofp_print_one_ofpst_table_reply(string, OFP11_VERSION, ts->name, &ts12); + } +} + +static void +ofp_print_ofpst_table_reply10(struct ds *string, const struct ofp_header *oh, + int verbosity) { struct ofp10_table_stats *ts; struct ofpbuf b; @@ -1158,27 +1274,45 @@ ofp_print_ofpst_table_reply(struct ds *string, const struct ofp_header *oh, } for (;;) { - char name[OFP_MAX_TABLE_NAME_LEN + 1]; + struct ofp12_table_stats ts12; ts = ofpbuf_try_pull(&b, sizeof *ts); if (!ts) { return; } - ovs_strlcpy(name, ts->name, sizeof name); - - ds_put_format(string, " %d: %-8s: ", ts->table_id, name); - ds_put_format(string, "wild=0x%05"PRIx32", ", ntohl(ts->wildcards)); - ds_put_format(string, "max=%6"PRIu32", ", ntohl(ts->max_entries)); - ds_put_format(string, "active=%"PRIu32"\n", ntohl(ts->active_count)); - ds_put_cstr(string, " "); - ds_put_format(string, "lookup=%"PRIu64", ", - ntohll(get_32aligned_be64(&ts->lookup_count))); - ds_put_format(string, "matched=%"PRIu64"\n", - ntohll(get_32aligned_be64(&ts->matched_count))); + ts12.table_id = ts->table_id; + ts12.wildcards = htonll(ntohl(ts->wildcards)); + ts12.max_entries = ts->max_entries; + ts12.active_count = ts->active_count; + ts12.lookup_count = get_32aligned_be64(&ts->lookup_count); + ts12.matched_count = get_32aligned_be64(&ts->matched_count); + ofp_print_one_ofpst_table_reply(string, OFP10_VERSION, ts->name, &ts12); } } +static void +ofp_print_ofpst_table_reply(struct ds *string, const struct ofp_header *oh, + int verbosity) +{ + switch ((enum ofp_version)oh->version) { + case OFP12_VERSION: + ofp_print_ofpst_table_reply12(string, oh, verbosity); + break; + + case OFP11_VERSION: + ofp_print_ofpst_table_reply11(string, oh, verbosity); + break; + + case OFP10_VERSION: + ofp_print_ofpst_table_reply10(string, oh, verbosity); + break; + + default: + NOT_REACHED(); + } +} + static void ofp_print_queue_name(struct ds *string, uint32_t queue_id) { diff --git a/tests/ofp-print.at b/tests/ofp-print.at index 4dbae5c6a..23449801b 100644 --- a/tests/ofp-print.at +++ b/tests/ofp-print.at @@ -766,7 +766,7 @@ OFPST_TABLE request (xid=0x1): ]) AT_CLEANUP -AT_SETUP([OFPST_TABLE reply]) +AT_SETUP([OFPST_TABLE reply - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) AT_CHECK([ovs-ofctl ofp-print "\ 01 11 00 4c 00 00 00 01 00 03 00 00 00 00 00 00 \ @@ -781,6 +781,61 @@ OFPST_TABLE reply (xid=0x1): 1 tables ]) AT_CLEANUP +AT_SETUP([OFPST_TABLE reply - OF1.2]) +AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) +(mid="wild=0xfffffffff, max=1000000," + tail=" + match=0xfffffffff, instructions=0x00000007, config=0x00000000 + write_actions=0x00000000, apply_actions=0x00000000 + write_setfields=0x0000000fffffffff + apply_setfields=0x0000000fffffffff + metadata_match=0x0000000000000000 + metadata_write=0x0000000000000000" + echo "OFPST_TABLE reply (OF1.2) (xid=0x2): 255 tables + 0: classifier: $mid active=1 + lookup=74614, matched=106024$tail" + x=1 + while test $x -lt 254; do + printf " %d: %-8s: $mid active=0 + lookup=0, matched=0$tail +" $x table$x + x=`expr $x + 1` + done + echo " 254: table254: $mid active=2 + lookup=0, matched=0$tail") > expout + +(pad32="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + pad7="00 00 00 00 00 00 00 " + mid="00 00 00 0f ff ff ff ff \ +00 00 00 0f ff ff ff ff 00 00 00 00 00 00 00 00 \ +00 00 00 0f ff ff ff ff 00 00 00 0f ff ff ff ff \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 07 00 00 00 00 00 0f 42 40 " + tail="00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" + + echo -n "03 13 7f 90 00 00 00 02 00 03 00 00 00 00 00 00 " + + x=0 + printf "%02x $pad7" $x + printf "%s$pad32" "classifier" | od -A n -t x1 -v -N 32 | tr '\n' ' ' + echo -n "$mid 00 00 00 01 " + echo -n "00 00 00 00 00 01 23 76 00 00 00 00 00 01 9e 28 " + + x=1 + while test $x -lt 254; do + printf "%02x $pad7" $x + printf "%s$pad32" "table$x" | od -A n -t x1 -v -N 32 | tr '\n' ' ' + echo -n "$mid 00 00 00 00 $tail " + x=`expr $x + 1` + done + + x=254 + printf "%02x $pad7" $x + printf "%s$pad32" "table$x" | od -A n -t x1 -v -N 32 | tr '\n' ' ' + echo -n "$mid 00 00 00 02 $tail") > in +AT_CHECK([ovs-ofctl ofp-print "$(cat in)"], [0], [expout]) +AT_CLEANUP + AT_SETUP([OFPST_PORT request]) AT_KEYWORDS([ofp-print OFPT_STATS_REQUEST]) AT_CHECK([ovs-ofctl ofp-print "\ -- 2.43.0