[ovs-dev] [PATCH 44/48] ofp-util: Allow decoding of Open Flow 1.1 & 1.2 Flow Aggregate Statistics Response Messages

Simon Horman horms at verge.net.au
Mon Jun 25 06:44:47 UTC 2012


Signed-off-by: Simon Horman <horms at verge.net.au>

---

v4
* Use OFPUTIL_OFPST11_AGGREGATE_REPLY as code for Open Flow 1.1 and 1.2
  messages.
* Don't explicitly pull message header pad,
  it is now handled by ofputil_make_stats_reply()
* Manual rebase

v3
* Initial post
---
 include/openflow/openflow-1.1.h | 10 ++++++++++
 lib/ofp-print.c                 | 18 ++++++++++++------
 lib/ofp-util.c                  | 14 +++++++++++++-
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h
index dd87247..4cf2d74 100644
--- a/include/openflow/openflow-1.1.h
+++ b/include/openflow/openflow-1.1.h
@@ -617,6 +617,16 @@ OFP_ASSERT(sizeof(struct ofp11_flow_stats) == 48);
 /* Body for ofp_stats_request of type OFPST_AGGREGATE. */
 /* Identical to ofp11_flow_stats_request */
 
+/* Reply to OFPST_AGGREGATE request. */
+/* Same elements as ofp10_aggregate_stats_reply but different alignment */
+struct ofp11_aggregate_stats_reply {
+    ovs_be64 packet_count;    /* Number of packets in flows. */
+    ovs_be64 byte_count;      /* Number of bytes in flows. */
+    ovs_be32 flow_count;      /* Number of flows. */
+    uint8_t pad[4];           /* Align to 64 bits. */
+};
+OFP_ASSERT(sizeof(struct ofp11_aggregate_stats_reply) == 24);
+
 /* Body of reply to OFPST_TABLE request. */
 struct ofp11_table_stats {
     uint8_t table_id;        /* Identifier of table. Lower numbered tables
diff --git a/lib/ofp-print.c b/lib/ofp-print.c
index 8dc4fb3..01d5076 100644
--- a/lib/ofp-print.c
+++ b/lib/ofp-print.c
@@ -1003,13 +1003,19 @@ ofp_print_flow_stats_reply(struct ds *string, const struct ofp_header *oh)
 static void
 ofp_print_ofpst_aggregate_reply(struct ds *string, const struct ofp_header *oh)
 {
-    const struct ofp10_aggregate_stats_reply *asr;
+    struct ofp11_aggregate_stats_reply *asr = ofputil_stats_msg_body(oh);
 
-    asr = ofputil_stats_msg_body(oh);
-    ds_put_format(string, " packet_count=%"PRIu64,
-                  ntohll(get_32aligned_be64(&asr->packet_count)));
-    ds_put_format(string, " byte_count=%"PRIu64,
-                  ntohll(get_32aligned_be64(&asr->byte_count)));
+    if (oh->version == OFP10_VERSION) {
+        const struct ofp10_aggregate_stats_reply *a10sr;
+
+        a10sr = ofputil_stats_msg_body(oh);
+        asr->packet_count = get_32aligned_be64(&a10sr->packet_count);
+        asr->byte_count = get_32aligned_be64(&a10sr->byte_count);
+        asr->flow_count = a10sr->flow_count;
+    }
+
+    ds_put_format(string, " packet_count=%"PRIu64, ntohll(asr->packet_count));
+    ds_put_format(string, " byte_count=%"PRIu64, ntohll(asr->byte_count));
     ds_put_format(string, " flow_count=%"PRIu32, ntohl(asr->flow_count));
 }
 
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 7f576dc..83f187f 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -940,6 +940,8 @@ static const struct ofputil_msg_type ofputil_msg_types[] = {
     }
     OFPST11_REPLY(OFPST_DESC, OFPST_DESC,
                   sizeof(struct ofp_desc_stats), 0),
+    OFPST11_REPLY(OFPST11_AGGREGATE, OFPST_AGGREGATE,
+                  sizeof(struct ofp11_aggregate_stats_reply), 0),
 #undef OFPST11_REPLY
 
 #define OFPST12_REPLY(STAT, RAW_STAT, MIN_SIZE, EXTRA_MULTIPLE)  \
@@ -952,6 +954,8 @@ static const struct ofputil_msg_type ofputil_msg_types[] = {
     }
     OFPST12_REPLY(OFPST_DESC, OFPST_DESC,
                   sizeof(struct ofp_desc_stats), 0),
+    OFPST12_REPLY(OFPST11_AGGREGATE, OFPST_AGGREGATE,
+                  sizeof(struct ofp11_aggregate_stats_reply), 0),
     OFPST12_REPLY(OFPST11_FLOW, OFPST_FLOW, 0, 1),
 #undef OFPST12_REPLY
 
@@ -2448,7 +2452,15 @@ ofputil_encode_aggregate_stats_reply(
 
     ofputil_decode_msg_type(request, &type);
     code = ofputil_msg_type_code(type);
-    if (code == OFPUTIL_OFPST10_AGGREGATE_REQUEST) {
+    if (code == OFPUTIL_OFPST11_AGGREGATE_REQUEST) {
+        struct ofp11_stats_msg *osm;
+        struct ofp11_aggregate_stats_reply *asr;
+
+        asr = ofputil_make_stats_reply(sizeof *asr, request, &msg);
+        asr->packet_count = htonll(unknown_to_zero(stats->packet_count));
+        asr->byte_count = htonll(unknown_to_zero(stats->byte_count));
+        asr->flow_count = htonl(stats->flow_count);
+    } else if (code == OFPUTIL_OFPST10_AGGREGATE_REQUEST) {
         struct ofp10_aggregate_stats_reply *asr;
 
         asr = ofputil_make_stats_reply(sizeof *asr, request, &msg);
-- 
1.7.10.2.484.gcd07cc5




More information about the dev mailing list