Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v10 * Manual rebase v9 * No change v8 * Manual rebase * Add ofp-print test v7 * Omitted v6 * No change v5 * Manual rebase * Use padded_match_len parameter of ofputil_pull_ofp12_match() to obtain the length of a match. Using the remaining length of the message only works for the last flow. v4 * Don't explicitly pill the pad of the header of the message. This is now handled ofputil_pull_stats_msg() * Use OFPST11_FLOW as the message code, it already exists and seems appropriate as struct ofp11_flow_stats is used. * Log a warning if match parsing fails * Log a warning if instruction parsing fails * Correct length passed to ofpacts_pull_openflow11_instructions() v3 * Initial post --- lib/ofp-util.c | 41 +++++++++++++++++++++++++++++++++++++++++ tests/ofp-print.at | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 2a12d95..309aca3 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1635,6 +1635,47 @@ ofputil_decode_flow_stats_reply(struct ofputil_flow_stats *fs, if (!msg->size) { return EOF; + } else if (raw == OFPRAW_OFPST11_FLOW_REPLY) { + const struct ofp11_flow_stats *ofs; + size_t length; + uint16_t padded_match_len; + + ofs = ofpbuf_try_pull(msg, sizeof *ofs); + if (!ofs) { + VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply has %zu leftover " + "bytes at end", msg->size); + return EINVAL; + } + + length = ntohs(ofs->length); + if (length < sizeof *ofs) { + VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply claims invalid " + "length %zu", length); + return EINVAL; + } + + if (ofputil_pull_ofp11_match(msg, ntohs(ofs->priority), &fs->rule, + &padded_match_len)) { + VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply bad match"); + return EINVAL; + } + + if (ofpacts_pull_openflow11_instructions(msg, length - sizeof *ofs - + padded_match_len, ofpacts)) { + VLOG_WARN_RL(&bad_ofmsg_rl, "OFPST_FLOW reply bad instructions"); + return EINVAL; + } + + fs->table_id = ofs->table_id; + fs->duration_sec = ntohl(ofs->duration_sec); + fs->duration_nsec = ntohl(ofs->duration_nsec); + fs->idle_timeout = ntohs(ofs->idle_timeout); + fs->hard_timeout = ntohs(ofs->hard_timeout); + fs->idle_age = -1; + fs->hard_age = -1; + fs->cookie = ofs->cookie; + fs->packet_count = ntohll(ofs->packet_count); + fs->byte_count = ntohll(ofs->byte_count); } else if (raw == OFPRAW_OFPST10_FLOW_REPLY) { const struct ofp10_flow_stats *ofs; size_t length; diff --git a/tests/ofp-print.at b/tests/ofp-print.at index 910d146..c6e55c9 100644 --- a/tests/ofp-print.at +++ b/tests/ofp-print.at @@ -658,7 +658,7 @@ OFPST_FLOW request (OF1.2) (xid=0x2): @&t@ ]) AT_CLEANUP -AT_SETUP([OFPST_FLOW reply]) +AT_SETUP([OFPST_FLOW reply - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) AT_CHECK([ovs-ofctl ofp-print "\ 01 11 01 e4 00 00 00 04 00 01 00 00 00 60 00 00 \ @@ -702,6 +702,41 @@ OFPST_FLOW reply (xid=0x4): ]) AT_CLEANUP +AT_SETUP([OFPST_FLOW reply - OF1.2]) +AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) +AT_CHECK([ovs-ofctl ofp-print "\ +03 13 01 78 00 00 00 02 00 01 00 00 00 00 00 00 \ +00 78 00 00 00 00 00 03 01 5e f3 c0 80 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 00 00 00 00 62 \ +00 01 00 2d 80 00 00 04 00 00 00 02 80 00 06 06 \ +ca da ad d6 0d 37 80 00 0a 02 08 00 80 00 10 01 \ +00 80 00 04 08 00 00 00 00 00 00 00 00 00 00 00 \ +00 04 00 18 00 00 00 00 00 00 00 10 00 00 00 02 \ +05 dc 00 00 00 00 00 00 00 78 00 00 00 00 00 04 \ +20 7c 0a 40 80 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 00 00 00 00 8c 00 01 00 2d 80 00 00 04 \ +00 00 00 02 80 00 06 06 52 54 00 c3 00 89 80 00 \ +0a 02 08 00 80 00 10 01 00 80 00 04 08 00 00 00 \ +00 00 00 00 00 00 00 00 00 04 00 18 00 00 00 00 \ +00 00 00 10 00 00 00 02 05 dc 00 00 00 00 00 00 \ +00 78 00 00 00 00 00 04 20 a9 d1 00 80 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 00 00 00 00 2a \ +00 01 00 2d 80 00 00 04 00 00 00 02 80 00 06 06 \ +52 54 00 97 00 69 80 00 0a 02 08 00 80 00 10 01 \ +00 80 00 04 08 00 00 00 00 00 00 00 00 00 00 00 \ +00 04 00 18 00 00 00 00 00 00 00 10 00 00 00 02 \ +05 dc 00 00 00 00 00 00 \ +"], [0], [dnl +OFPST_FLOW reply (OF1.2) (xid=0x2): + cookie=0x0, duration=3.023s, table=0, n_packets=1, n_bytes=98, ip,metadata=0,in_port=2,dl_dst=ca:da:ad:d6:0d:37,nw_tos=0 actions=output:2 + cookie=0x0, duration=4.545s, table=0, n_packets=2, n_bytes=140, ip,metadata=0,in_port=2,dl_dst=52:54:00:c3:00:89,nw_tos=0 actions=output:2 + cookie=0x0, duration=4.548s, table=0, n_packets=1, n_bytes=42, ip,metadata=0,in_port=2,dl_dst=52:54:00:97:00:69,nw_tos=0 actions=output:2 +]) +AT_CLEANUP + AT_SETUP([OFPST_AGGREGATE request]) AT_KEYWORDS([ofp-print OFPT_STATS_REQUEST]) AT_CHECK([ovs-ofctl ofp-print "\ -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev