[ovs-dev] [PATCH v3 17/41] ofp-util: Support encoding of OF1.4 flow monitor replies

Simon Horman horms at verge.net.au
Mon Jun 16 02:29:37 UTC 2014


At this time the encoding function is always called
with OFP10_VERSION. A subsequent patch will call it
with the prevailing version.

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

---
v2
* Re-arrange case statement to group unsupported versions with default
---
 lib/ofp-util.c    | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 lib/ofp-util.h    |   3 +-
 ofproto/connmgr.c |   2 +-
 ofproto/ofproto.c |   2 +-
 4 files changed, 106 insertions(+), 9 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 7296d89..c2767fb 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -5622,20 +5622,35 @@ ofputil_encode_flow_monitor_cancel(uint32_t id)
 }
 
 void
-ofputil_start_flow_update(struct list *replies)
+ofputil_start_flow_update(enum ofp_version ofp_version, struct list *replies)
 {
     struct ofpbuf *msg;
+    enum ofpraw raw;
+
+    switch (ofp_version) {
+    case OFP10_VERSION:
+        raw = OFPRAW_NXST_FLOW_MONITOR_REPLY;
+        break;
+    case OFP14_VERSION:
+    case OFP15_VERSION:
+        raw = OFPRAW_OFPST14_FLOW_MONITOR_REPLY;
+        break;
+    case OFP11_VERSION:
+    case OFP12_VERSION:
+    case OFP13_VERSION: /* XXX: Use OF extension! */
+    default:
+        OVS_NOT_REACHED();
+    }
 
-    msg = ofpraw_alloc_xid(OFPRAW_NXST_FLOW_MONITOR_REPLY, OFP10_VERSION,
-                           htonl(0), 1024);
+    msg = ofpraw_alloc_xid(raw, ofp_version, htonl(0), 1024);
 
     list_init(replies);
     list_push_back(replies, &msg->list_node);
 }
 
-void
-ofputil_append_flow_update(const struct ofputil_flow_update *update,
-                           struct list *replies)
+static void
+ofputil_nx_append_flow_update(const struct ofputil_flow_update *update,
+                              struct list *replies)
 {
     enum ofp_version version = ofpmp_version(replies);
     struct nx_flow_update_header *nfuh;
@@ -5691,6 +5706,87 @@ ofputil_append_flow_update(const struct ofputil_flow_update *update,
 
     ofpmp_postappend(replies, start_ofs);
 }
+
+static void
+ofputil_of_append_flow_update(const struct ofputil_flow_update *update,
+                              struct list *replies)
+{
+    enum ofp_version version = ofpmp_version(replies);
+    struct ofp14_flow_update_header *ofpfuh;
+    struct ofpbuf *msg;
+    size_t start_ofs;
+
+    msg = ofpbuf_from_list(list_back(replies));
+    start_ofs = ofpbuf_size(msg);
+
+    switch(update->event) {
+    case OFPFME14_ABBREV: {
+        struct ofp14_flow_update_abbrev *ofpfua;
+
+        ofpfua = ofpbuf_put_zeros(msg, sizeof *ofpfua);
+        ofpfua->xid = update->xid;
+        break;
+    }
+    case OFPFME14_INITIAL:
+    case OFPFME14_ADDED:
+    case OFPFME14_REMOVED:
+    case OFPFME14_MODIFIED: {
+        struct ofp14_flow_update_full *ofpfuf;
+
+        ofpbuf_put_zeros(msg, sizeof *ofpfuf);
+        oxm_put_match(msg, update->match, version);
+        ofpacts_put_openflow_instructions(update->ofpacts, update->ofpacts_len,
+                                          msg, version);
+        ofpfuf = ofpbuf_at_assert(msg, start_ofs, sizeof *ofpfuf);
+        ofpfuf->table_id = update->table_id;
+        ofpfuf->reason = update->reason;
+        ofpfuf->idle_timeout = htons(update->idle_timeout);
+        ofpfuf->hard_timeout = htons(update->hard_timeout);
+        ofpfuf->priority = htons(update->priority);
+        ofpfuf->cookie = update->cookie;
+        break;
+    }
+    case OFPFME14_PAUSED:
+    case OFPFME14_RESUMED: {
+        struct ofp14_flow_update_paused *ofpfup;
+
+        ofpfup = ofpbuf_put_zeros(msg, sizeof *ofpfup);
+        /* Other than values present in the header, which is set below,
+         * there is only a pad. So there nothing more to do here. */
+        break;
+    }
+    default:
+       OVS_NOT_REACHED();
+    }
+
+    ofpfuh = ofpbuf_at_assert(msg, start_ofs, sizeof *ofpfuh);
+    ofpfuh->length = htons(ofpbuf_size(msg) - start_ofs);
+    ofpfuh->event = htons(update->event);
+
+    ofpmp_postappend(replies, start_ofs);
+}
+
+void
+ofputil_append_flow_update(const struct ofputil_flow_update *update,
+                           struct list *replies)
+{
+    enum ofp_version version = ofpmp_version(replies);
+
+    switch (version) {
+    case OFP10_VERSION:
+        ofputil_nx_append_flow_update(update, replies);
+        break;
+    case OFP14_VERSION:
+    case OFP15_VERSION:
+        ofputil_of_append_flow_update(update, replies);
+        break;
+    case OFP11_VERSION:
+    case OFP12_VERSION:
+    case OFP13_VERSION: /* XXX: Use OF extension! */
+    default:
+        OVS_NOT_REACHED();
+    }
+}
 
 struct ofpbuf *
 ofputil_encode_packet_out(const struct ofputil_packet_out *po,
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index ef0c33e..4d280e7 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -877,7 +877,8 @@ struct ofputil_flow_update {
 
 int ofputil_decode_flow_update(struct ofputil_flow_update *,
                                struct ofpbuf *msg, struct ofpbuf *ofpacts);
-void ofputil_start_flow_update(struct list *replies);
+void ofputil_start_flow_update(enum ofp_version ofp_version,
+                               struct list *replies);
 void ofputil_append_flow_update(const struct ofputil_flow_update *,
                                 struct list *replies);
 
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
index d525227..2cc0bd4 100644
--- a/ofproto/connmgr.c
+++ b/ofproto/connmgr.c
@@ -2139,7 +2139,7 @@ ofmonitor_report(struct connmgr *mgr, struct rule *rule,
 
         if (flags) {
             if (list_is_empty(&ofconn->updates)) {
-                ofputil_start_flow_update(&ofconn->updates);
+                ofputil_start_flow_update(OFP10_VERSION, &ofconn->updates);
                 ofconn->sent_abbrev_update = false;
             }
 
diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
index cfef4ad..6bbf53a 100644
--- a/ofproto/ofproto.c
+++ b/ofproto/ofproto.c
@@ -4730,7 +4730,7 @@ ofproto_compose_flow_refresh_update(const struct rule *rule,
     fu.ofpacts_len = actions ? actions->ofpacts_len : 0;
 
     if (list_is_empty(msgs)) {
-        ofputil_start_flow_update(msgs);
+        ofputil_start_flow_update(OFP10_VERSION, msgs);
     }
     ofputil_append_flow_update(&fu, msgs);
 }
-- 
2.0.0.rc2




More information about the dev mailing list