Signed-off-by: Simon Horman <ho...@verge.net.au> ---
v5 * Manual rebase v4 * Initial post --- lib/ofp-util.c | 29 ++++++++++++++++++++++++----- lib/ofp-util.h | 5 +++-- utilities/ovs-ofctl.c | 12 ++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 6613015..69fa0e2 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -1862,6 +1862,7 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr, enum ofputil_protocol protocol) { struct ofpbuf *msg; + uint8_t ofp_version = ofputil_protocol_to_ofp_version(protocol); switch (protocol) { case OFPUTIL_P_OF10: @@ -1870,7 +1871,8 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr, int type; type = fsr->aggregate ? OFPST_AGGREGATE : OFPST_FLOW; - ofsr = ofputil_make_stats_request(sizeof *ofsr, type, 0, &msg); + ofsr = ofputil_make_stats_request(sizeof *ofsr, ofp_version, + type, 0, &msg); ofputil_cls_rule_to_ofp10_match(&fsr->match, &ofsr->match); ofsr->table_id = fsr->table_id; ofsr->out_port = htons(fsr->out_port); @@ -1884,7 +1886,8 @@ ofputil_encode_flow_stats_request(const struct ofputil_flow_stats_request *fsr, int subtype; subtype = fsr->aggregate ? NXST_AGGREGATE : NXST_FLOW; - ofputil_make_stats_request(sizeof *nfsr, OFPST_VENDOR, subtype, &msg); + ofputil_make_stats_request(sizeof *nfsr, ofp_version, + OFPST_VENDOR, subtype, &msg); match_len = nx_put_match(msg, false, &fsr->match, fsr->cookie, fsr->cookie_mask); @@ -3235,8 +3238,9 @@ put_stats__(ovs_be32 xid, uint8_t ofp_version, uint8_t ofp_type, * Appends 'body_len' bytes of zeroes to the reply as the body and returns the * first byte of the body. */ void * -ofputil_make_stats_request(size_t body_len, uint16_t ofpst_type, - uint32_t nxst_subtype, struct ofpbuf **bufferp) +ofputil_make_stats_request(size_t body_len, uint8_t ofp_version, + uint16_t ofpst_type, uint32_t nxst_subtype, + struct ofpbuf **bufferp) { enum { HEADER_LEN = MAX(MAX(sizeof(struct ofp10_stats_msg), @@ -3244,9 +3248,24 @@ ofputil_make_stats_request(size_t body_len, uint16_t ofpst_type, sizeof(struct nicira10_stats_msg)) }; struct ofpbuf *msg; + uint8_t ofp_type; + + switch (ofp_version) { + case OFP12_VERSION: + case OFP11_VERSION: + ofp_type = OFPT11_STATS_REQUEST; + break; + + case OFP10_VERSION: + ofp_type = OFPT10_STATS_REQUEST; + break; + + default: + NOT_REACHED(); + } msg = *bufferp = ofpbuf_new(HEADER_LEN + body_len); - put_stats__(alloc_xid(), OFP10_VERSION, OFPT10_STATS_REQUEST, + put_stats__(alloc_xid(), ofp_version, ofp_type, htons(ofpst_type), htonl(nxst_subtype), msg); return ofpbuf_put_zeros(msg, body_len); diff --git a/lib/ofp-util.h b/lib/ofp-util.h index 99c2f5e..b171cf0 100644 --- a/lib/ofp-util.h +++ b/lib/ofp-util.h @@ -538,8 +538,9 @@ void *put_nxmsg_xid(size_t openflow_len, uint32_t subtype, ovs_be32 xid, void update_openflow_length(struct ofpbuf *); /* Encoding OpenFlow stats messages. */ -void *ofputil_make_stats_request(size_t body_len, uint16_t type, - uint32_t subtype, struct ofpbuf **); +void *ofputil_make_stats_request(size_t body_len, uint8_t ofp_version, + uint16_t type, uint32_t subtype, + struct ofpbuf **); void *ofputil_make_stats_reply(size_t body_len, const struct ofp_header *request, struct ofpbuf **); diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index 58f1928..472e42c 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -403,7 +403,8 @@ dump_trivial_stats_transaction(const char *vconn_name, uint8_t stats_type) struct vconn *vconn; open_vconn(vconn_name, &vconn); - ofputil_make_stats_request(0, stats_type, 0, &request); + ofputil_make_stats_request(0, vconn_get_version(vconn), + stats_type, 0, &request); dump_stats_transaction(vconn, request); vconn_close(vconn); } @@ -595,7 +596,8 @@ fetch_port_by_stats(const char *vconn_name, open_vconn(vconn_name, &vconn); - ofputil_make_stats_request(0, OFPST_PORT_DESC, 0, &request); + ofputil_make_stats_request(0, vconn_get_version(vconn), + OFPST_PORT_DESC, 0, &request); send_xid = ((struct ofp_header *) request->data)->xid; send_openflow_buffer(vconn, request); @@ -790,7 +792,8 @@ do_queue_stats(int argc, char *argv[]) open_vconn(argv[1], &vconn); - req = ofputil_make_stats_request(sizeof *req, OFPST_QUEUE, 0, &request); + req = ofputil_make_stats_request(sizeof *req, OFP10_VERSION, + OFPST_QUEUE, 0, &request); if (argc > 2 && argv[2][0] && strcasecmp(argv[2], "all")) { req->port_no = htons(str_to_port_no(argv[1], argv[2])); @@ -1205,7 +1208,8 @@ do_dump_ports(int argc, char *argv[]) open_vconn(argv[1], &vconn); - req = ofputil_make_stats_request(sizeof *req, OFPST_PORT, 0, &request); + req = ofputil_make_stats_request(sizeof *req, OFP10_VERSION, + OFPST_PORT, 0, &request); port = argc > 2 ? str_to_port_no(argv[1], argv[2]) : OFPP_NONE; req->port_no = htons(port); dump_stats_transaction(vconn, request); -- 1.7.10.2.484.gcd07cc5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev