Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v10 * Make use of enum ofp_version * Add ofp-print test v9 * Omitted v8 * Omitted v7 * Omitted v6 * No change v5 * Initial Post --- lib/ofp-print.c | 63 ++++++++++++++++++++++++++++++++++++++++-------------- tests/ofp-print.at | 56 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/lib/ofp-print.c b/lib/ofp-print.c index 20965a2..ae0e140 100644 --- a/lib/ofp-print.c +++ b/lib/ofp-print.c @@ -1082,12 +1082,6 @@ static void ofp_print_port_stat(struct ds *string, const char *leader, } } -static void print_port_stat(struct ds *string, const char *leader, - const ovs_32aligned_be64 *statp, int more) -{ - ofp_print_port_stat(string, leader, get_32aligned_be64(statp), more); -} - static void ofp_print_ofpst_port_request(struct ds *string, const struct ofp_header *oh) { @@ -1387,34 +1381,71 @@ static void ofp_print_ofpst_queue_reply(struct ds *string, const struct ofp_header *oh, int verbosity) { - struct ofp10_queue_stats *qs; struct ofpbuf b; size_t n; + struct ofp11_queue_stats qs; ofpbuf_use_const(&b, oh, ntohs(oh->length)); ofpraw_pull_assert(&b); - n = b.size / sizeof *qs; + /* This calculation is correct because + * struct ofp10_queue_stats and struct ofp11_queue_stats + * are the same size. + */ + n = b.size / sizeof qs; ds_put_format(string, " %zu queues\n", n); if (verbosity < 1) { return; } for (;;) { - qs = ofpbuf_try_pull(&b, sizeof *qs); - if (!qs) { - return; + uint16_t port_no; + + switch ((enum ofp_version)oh->version) { + case OFP11_VERSION: + case OFP12_VERSION: { + const struct ofp11_queue_stats *qs11; + + qs11 = ofpbuf_try_pull(&b, sizeof *qs11); + if (!qs11) { + return; + } + if (ofputil_port_from_ofp11(qs11->port_no, &port_no)) { + ds_put_cstr(string, "*** parse error: invalid port ***\n"); + return; + } + qs = *qs11; + break; + } + + case OFP10_VERSION: { + const struct ofp10_queue_stats *qs10; + + qs10 = ofpbuf_try_pull(&b, sizeof *qs10); + if (!qs10) { + return; + } + port_no = ntohs(qs10->port_no); + qs.queue_id = qs10->queue_id; + qs.tx_bytes = get_32aligned_be64(&qs10->tx_bytes); + qs.tx_packets = get_32aligned_be64(&qs10->tx_packets); + qs.tx_errors = get_32aligned_be64(&qs10->tx_errors); + break; + } + + default: + NOT_REACHED(); } ds_put_cstr(string, " port "); - ofputil_format_port(ntohs(qs->port_no), string); + ofputil_format_port(port_no, string); ds_put_cstr(string, " queue "); - ofp_print_queue_name(string, ntohl(qs->queue_id)); + ofp_print_queue_name(string, ntohl(qs.queue_id)); ds_put_cstr(string, ": "); - print_port_stat(string, "bytes=", &qs->tx_bytes, 1); - print_port_stat(string, "pkts=", &qs->tx_packets, 1); - print_port_stat(string, "errors=", &qs->tx_errors, 0); + ofp_print_port_stat(string, "bytes=", qs.tx_bytes, 1); + ofp_print_port_stat(string, "pkts=", qs.tx_packets, 1); + ofp_print_port_stat(string, "errors=", qs.tx_errors, 0); } } diff --git a/tests/ofp-print.at b/tests/ofp-print.at index 0871526..cd72cff 100644 --- a/tests/ofp-print.at +++ b/tests/ofp-print.at @@ -992,7 +992,7 @@ OFPST_QUEUE request (xid=0x1):port=ALL queue=ALL ]) AT_CLEANUP -AT_SETUP([OFPST_QUEUE reply]) +AT_SETUP([OFPST_QUEUE reply - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) AT_CHECK([ovs-ofctl ofp-print "\ 01 11 00 cc 00 00 00 01 00 05 00 00 00 03 00 00 \ @@ -1026,6 +1026,60 @@ OFPST_PORT_DESC request (xid=0x1): ]) AT_CLEANUP +AT_SETUP([OFPST_QUEUE reply - OF1.1]) +AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) +AT_CHECK([ovs-ofctl ofp-print "\ +02 13 00 d0 00 00 00 01 00 05 00 00 00 00 00 00 \ +00 00 00 03 00 00 00 01 00 00 00 00 00 00 01 2e \ +00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 \ +00 00 00 03 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 02 00 00 00 01 00 00 00 00 00 00 08 34 \ +00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 00 \ +00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +"], [0], [dnl +OFPST_QUEUE reply (OF1.1) (xid=0x1): 6 queues + port 3 queue 1: bytes=302, pkts=1, errors=0 + port 3 queue 2: bytes=0, pkts=0, errors=0 + port 2 queue 1: bytes=2100, pkts=20, errors=0 + port 2 queue 2: bytes=0, pkts=0, errors=0 + port 1 queue 1: bytes=0, pkts=0, errors=0 + port 1 queue 2: bytes=0, pkts=0, errors=0 +]) +AT_CLEANUP + +AT_SETUP([OFPST_QUEUE reply - OF1.2]) +AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) +AT_CHECK([ovs-ofctl ofp-print "\ +03 13 00 d0 00 00 00 01 00 05 00 00 00 00 00 00 \ +00 00 00 03 00 00 00 01 00 00 00 00 00 00 01 2e \ +00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 \ +00 00 00 03 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 02 00 00 00 01 00 00 00 00 00 00 08 34 \ +00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 00 \ +00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +"], [0], [dnl +OFPST_QUEUE reply (OF1.2) (xid=0x1): 6 queues + port 3 queue 1: bytes=302, pkts=1, errors=0 + port 3 queue 2: bytes=0, pkts=0, errors=0 + port 2 queue 1: bytes=2100, pkts=20, errors=0 + port 2 queue 2: bytes=0, pkts=0, errors=0 + port 1 queue 1: bytes=0, pkts=0, errors=0 + port 1 queue 2: bytes=0, pkts=0, errors=0 +]) +AT_CLEANUP + AT_SETUP([OFPST_PORT_DESC reply - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) AT_CHECK([ovs-ofctl ofp-print "\ -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev