From: Simon Horman Date: Tue, 21 Aug 2012 04:55:34 +0000 (+0900) Subject: ofp-util: Allow decoding of Open Flow 1.2 Flow Statistics Request Messages X-Git-Tag: sliver-openvswitch-1.8.90-0~48^2~9 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=0157ad3a08e849dae1223fe5ee0f33afc99235fc ofp-util: Allow decoding of Open Flow 1.2 Flow Statistics Request Messages Allow decoding of Open Flow 1.1 and 1.2 flow statistics request messages. Signed-off-by: Simon Horman Signed-off-by: Ben Pfaff --- diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 1226ace32..a2e950167 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1396,9 +1396,9 @@ ofputil_flow_mod_usable_protocols(const struct ofputil_flow_mod *fms, } static enum ofperr -ofputil_decode_ofpst_flow_request(struct ofputil_flow_stats_request *fsr, - const struct ofp10_flow_stats_request *ofsr, - bool aggregate) +ofputil_decode_ofpst10_flow_request(struct ofputil_flow_stats_request *fsr, + const struct ofp10_flow_stats_request *ofsr, + bool aggregate) { fsr->aggregate = aggregate; ofputil_cls_rule_from_ofp10_match(&ofsr->match, 0, &fsr->match); @@ -1409,6 +1409,33 @@ ofputil_decode_ofpst_flow_request(struct ofputil_flow_stats_request *fsr, return 0; } +static enum ofperr +ofputil_decode_ofpst11_flow_request(struct ofputil_flow_stats_request *fsr, + struct ofpbuf *b, bool aggregate) +{ + const struct ofp11_flow_stats_request *ofsr; + enum ofperr error; + + ofsr = ofpbuf_pull(b, sizeof *ofsr); + fsr->aggregate = aggregate; + 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(b, 0, &fsr->match, NULL); + if (error) { + return error; + } + + return 0; +} + static enum ofperr ofputil_decode_nxst_flow_request(struct ofputil_flow_stats_request *fsr, struct ofpbuf *b, bool aggregate) @@ -1447,10 +1474,13 @@ ofputil_decode_flow_stats_request(struct ofputil_flow_stats_request *fsr, raw = ofpraw_pull_assert(&b); switch ((int) raw) { case OFPRAW_OFPST10_FLOW_REQUEST: - return ofputil_decode_ofpst_flow_request(fsr, b.data, false); + return ofputil_decode_ofpst10_flow_request(fsr, b.data, false); case OFPRAW_OFPST_AGGREGATE_REQUEST: - return ofputil_decode_ofpst_flow_request(fsr, b.data, true); + return ofputil_decode_ofpst10_flow_request(fsr, b.data, true); + + case OFPRAW_OFPST11_FLOW_REQUEST: + return ofputil_decode_ofpst11_flow_request(fsr, &b, false); case OFPRAW_NXST_FLOW_REQUEST: return ofputil_decode_nxst_flow_request(fsr, &b, false); diff --git a/tests/ofp-print.at b/tests/ofp-print.at index 376f5b8b3..e01419f1f 100644 --- a/tests/ofp-print.at +++ b/tests/ofp-print.at @@ -645,7 +645,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 \ @@ -657,6 +657,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 - OF1.0]) AT_KEYWORDS([ofp-print OFPT_STATS_REPLY]) AT_CHECK([ovs-ofctl ofp-print "\