From eaa6eb2afd76819de5df0ae9ed753627504ed7e4 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Thu, 21 Jul 2011 14:44:54 -0700 Subject: [PATCH] ovs-ofctl: Fix dump-ports and queue-stats commands. These ovs-ofctl commands have been sending malformed stats requests since commit 63f2140a553 "openflow: Make stats replies more like other OpenFlow messages." This commit fixes the problem and adds basic unit tests that should prevent similar regressions. Reported-by: Hao Zheng --- tests/ofproto.at | 24 ++++++++++++++++++++++++ utilities/ovs-ofctl.c | 9 +++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/tests/ofproto.at b/tests/ofproto.at index f2992184..ca8a558e 100644 --- a/tests/ofproto.at +++ b/tests/ofproto.at @@ -21,6 +21,30 @@ OFPT_GET_CONFIG_REPLY: frags=normal miss_send_len=0 OFPROTO_STOP AT_CLEANUP +dnl This is really bare-bones. +dnl It at least checks request and reply serialization and deserialization. +AT_SETUP([ofproto - port stats]) +OFPROTO_START +AT_CHECK([ovs-ofctl -vANY:ANY:WARN dump-ports br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_PORT reply: 1 ports + port 65534: rx pkts=0, bytes=0, drop=0, errs=0, frame=0, over=0, crc=0 + tx pkts=0, bytes=0, drop=0, errs=0, coll=0 +]) +OFPROTO_STOP +AT_CLEANUP + +dnl This is really bare-bones. +dnl It at least checks request and reply serialization and deserialization. +AT_SETUP([ofproto - queue stats]) +OFPROTO_START +AT_CHECK([ovs-ofctl -vANY:ANY:WARN queue-stats br0], [0], [stdout]) +AT_CHECK([STRIP_XIDS stdout], [0], [dnl +OFPST_QUEUE reply: 0 queues +]) +OFPROTO_STOP +AT_CLEANUP + AT_SETUP([ofproto - mod-port]) OFPROTO_START for command_config_state in \ diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index e948c662..fef7fdac 100644 --- a/utilities/ovs-ofctl.c +++ b/utilities/ovs-ofctl.c @@ -272,13 +272,14 @@ open_vconn(const char *name, struct vconn **vconnp) } static void * -alloc_stats_request(size_t body_len, uint16_t type, struct ofpbuf **bufferp) +alloc_stats_request(size_t rq_len, uint16_t type, struct ofpbuf **bufferp) { struct ofp_stats_msg *rq; - rq = make_openflow(sizeof *rq + body_len, OFPT_STATS_REQUEST, bufferp); + + rq = make_openflow(rq_len, OFPT_STATS_REQUEST, bufferp); rq->type = htons(type); rq->flags = htons(0); - return rq + 1; + return rq; } static void @@ -344,7 +345,7 @@ static void dump_trivial_stats_transaction(const char *vconn_name, uint8_t stats_type) { struct ofpbuf *request; - alloc_stats_request(0, stats_type, &request); + alloc_stats_request(sizeof(struct ofp_stats_msg), stats_type, &request); dump_stats_transaction(vconn_name, request); } -- 2.30.2