Allow decoding of Open Flow 1.1 and 1.2 flow and aggregate flow statistics request messages.
Signed-off-by: Simon Horman <ho...@verge.net.au> --- v10 * No change v10 * Manual rebase v9 * No change v8 * Manual rebase * Add ofp-print test v7 * Omitted v6 * No change v5 * Manual rebase v4 * Use OFPG11_ANY in place of OFPG_ANY. The value is the same, but it seems to make sense to use the Open Flow 1.1 constant when working with Open Flow 1.1. * Do not handle Open Flow 1.1, the parsing is slightly different and not supplied by this patch. * Use sizeof(struct ofp11_flow_stats_request) as the minimum size of the message, previously sizeof(struct ofp10_flow_stats_request) was incorrectly used. * Indicate that the message may be larger than the minimum size. * Handle OFPUTIL_OFPST11_FLOW_REQUEST and OFPUTIL_OFPST11_AGGREGATE_REQUEST in ofputil_decode_flow_stats_request(). * Add entry for Open Flow 1.2 aggregate request to ofputil_msg_types[] v3 * Initial post --- lib/ofp-util.c | 20 ++++++++++++++++++++ tests/ofp-print.at | 14 +++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index d5e8bbf..1afd29c 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1420,6 +1420,25 @@ ofputil_decode_ofpst_flow_request(struct ofputil_flow_stats_request *fsr, if (!msg->size) { return EOF; + } else if (raw == OFPRAW_OFPST11_FLOW_REQUEST) { + const struct ofp11_flow_stats_request *ofsr; + enum ofperr error; + + ofsr = ofpbuf_pull(msg, sizeof *ofsr); + fsr->table_id = ofsr->table_id; + error = ofputil_port_from_ofp11(ofsr->out_port, &fsr->out_port); + if (error) { + return error; + } + if (ofsr->out_group != htonl(OFPG11_ANY)) { + return OFPERR_NXFMFC_GROUPS_NOT_SUPPORTED; + } + fsr->cookie = ofsr->cookie; + fsr->cookie_mask = ofsr->cookie_mask; + error = ofputil_pull_ofp11_match(msg, 0, &fsr->match, NULL); + if (error) { + return error; + } } else if (raw == OFPRAW_OFPST10_FLOW_REQUEST || raw == OFPRAW_OFPST_AGGREGATE_REQUEST) { const struct ofp10_flow_stats_request *ofsr = msg->data; @@ -1473,6 +1492,7 @@ ofputil_decode_flow_stats_request(struct ofputil_flow_stats_request *fsr, raw = ofpraw_pull_assert(&b); switch ((int) raw) { case OFPRAW_OFPST10_FLOW_REQUEST: + case OFPRAW_OFPST11_FLOW_REQUEST: return ofputil_decode_ofpst_flow_request(fsr, &b, false); case OFPRAW_OFPST_AGGREGATE_REQUEST: diff --git a/tests/ofp-print.at b/tests/ofp-print.at index 827d4f3..910d146 100644 --- a/tests/ofp-print.at +++ b/tests/ofp-print.at @@ -634,7 +634,7 @@ DP Description: None ]) AT_CLEANUP -AT_SETUP([OFPST_FLOW request]) +AT_SETUP([OFPST_FLOW request - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REQUEST]) AT_CHECK([ovs-ofctl ofp-print "\ 01 10 00 38 00 00 00 04 00 01 00 00 00 38 20 ff \ @@ -646,6 +646,18 @@ OFPST_FLOW request (xid=0x4): @&t@ ]) AT_CLEANUP +AT_SETUP([OFPST_FLOW request - OF1.2]) +AT_KEYWORDS([ofp-print OFPT_STATS_REQUEST]) +AT_CHECK([ovs-ofctl ofp-print "\ +03 12 00 38 00 00 00 02 00 01 00 00 00 00 00 00 \ +ff 00 00 00 ff ff ff ff ff ff ff ff 00 00 00 00 \ +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ +00 01 00 04 00 00 00 00 \ +"], [0], [dnl +OFPST_FLOW request (OF1.2) (xid=0x2): @&t@ +]) +AT_CLEANUP + AT_SETUP([OFPST_FLOW reply]) 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