From: Ben Pfaff <blp@nicira.com>
Date: Thu, 21 Jul 2011 21:44:54 +0000 (-0700)
Subject: ovs-ofctl: Fix dump-ports and queue-stats commands.
X-Git-Tag: v1.2.0~20
X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=eaa6eb2afd76819de5df0ae9ed753627504ed7e4;p=sliver-openvswitch.git

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 <hzheng@nicira.com>
---

diff --git a/tests/ofproto.at b/tests/ofproto.at
index f29921843..ca8a558ed 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 e948c662b..fef7fdacc 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);
 }