[ovs-dev] [PATCH 17/41] ofp-util: Prepare Flow Statistics Request Decoder for other Open Flow versions

Simon Horman horms at verge.net.au
Tue Aug 7 21:49:52 UTC 2012


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

---

v10
* No change

v9
* No change

v8
* Initial post
---
 lib/ofp-util.c | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 878d307..d5e8bbf 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -1404,14 +1404,33 @@ 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)
+                                  struct ofpbuf *msg, bool aggregate)
 {
+    enum ofperr error;
+    enum ofpraw raw;
+
+    error = (msg->l2
+             ? ofpraw_decode(&raw, msg->l2)
+             : ofpraw_pull(&raw, msg));
+    if (error) {
+        return error;
+    }
+
     fsr->aggregate = aggregate;
-    ofputil_cls_rule_from_ofp10_match(&ofsr->match, 0, &fsr->match);
-    fsr->out_port = ntohs(ofsr->out_port);
-    fsr->table_id = ofsr->table_id;
-    fsr->cookie = fsr->cookie_mask = htonll(0);
+
+    if (!msg->size) {
+        return EOF;
+    } else if (raw == OFPRAW_OFPST10_FLOW_REQUEST ||
+               raw == OFPRAW_OFPST_AGGREGATE_REQUEST) {
+        const struct ofp10_flow_stats_request *ofsr = msg->data;
+
+        ofputil_cls_rule_from_ofp10_match(&ofsr->match, 0, &fsr->match);
+        fsr->out_port = ntohs(ofsr->out_port);
+        fsr->table_id = ofsr->table_id;
+        fsr->cookie = fsr->cookie_mask = htonll(0);
+    } else {
+        NOT_REACHED();
+    }
 
     return 0;
 }
@@ -1454,10 +1473,10 @@ 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_ofpst_flow_request(fsr, &b, false);
 
     case OFPRAW_OFPST_AGGREGATE_REQUEST:
-        return ofputil_decode_ofpst_flow_request(fsr, b.data, true);
+        return ofputil_decode_ofpst_flow_request(fsr, &b, true);
 
     case OFPRAW_NXST_FLOW_REQUEST:
         return ofputil_decode_nxst_flow_request(fsr, &b, false);
-- 
1.7.10.2.484.gcd07cc5




More information about the dev mailing list