[ovs-dev] [PATCH 18/63] ofp-actions: Enhance ofpacts_to_openflow11 to encode instructions

Simon Horman horms at verge.net.au
Wed Jun 27 08:19:54 UTC 2012


This adds support for ofpacts_to_openflow11() to encode instructions
although at this point only the OFPIT11_APPLY_ACTIONS instruction
type is supported.

I am unsure if it would be better to use a new function that
wraps the existing ofpacts_to_openflow11(). But for now
I have simply modified ofpacts_to_openflow11().

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

---

v5
* No change

v4
* No change

v3
* Initial post
---
 lib/ofp-actions.c | 36 +++++++++++++++++++++++++++++++++---
 lib/ofp-actions.h |  3 ++-
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index 17c8142..0f2a024 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -1371,12 +1371,42 @@ ofpact_to_openflow11(const struct ofpact *a, struct ofpbuf *out)
  * 1.1 actions in 'openflow', appending the actions to any existing data in
  * 'openflow'. */
 void
-ofpacts_to_openflow11(const struct ofpact ofpacts[], struct ofpbuf *openflow)
+ofpacts_to_openflow11(const struct ofpact ofpacts[], struct ofpbuf *openflow,
+                      enum ofp11_instruction_type type)
 {
     const struct ofpact *a;
 
-    OFPACT_FOR_EACH (a, ofpacts) {
-        ofpact_to_openflow11(a, openflow);
+    switch (type) {
+    case OFPIT11_GOTO_TABLE:
+    case OFPIT11_WRITE_METADATA:
+    case OFPIT11_WRITE_ACTIONS:
+        /* FIXME: Implementation needed */
+        NOT_REACHED();
+
+    case OFPIT11_APPLY_ACTIONS: {
+        struct ofp11_instruction_actions *oia;
+        size_t start_len = openflow->size;
+
+        ofpbuf_put_uninit(openflow, sizeof *oia);
+        OFPACT_FOR_EACH (a, ofpacts) {
+            ofpact_to_openflow11(a, openflow);
+        }
+        oia = (struct ofp11_instruction_actions *)((char *)openflow->data +
+                                                   start_len);
+        oia->type = htons(type);
+        oia->len = htons(openflow->size - start_len);
+        memset(oia->pad, 0, sizeof oia->pad);
+
+        break;
+    }
+
+    case OFPIT11_CLEAR_ACTIONS:
+    case OFPIT11_EXPERIMENTER:
+        /* FIXME: Implementation needed */
+        NOT_REACHED();
+
+    default:
+        NOT_REACHED();
     }
 }
 
diff --git a/lib/ofp-actions.h b/lib/ofp-actions.h
index 49c2c27..7cf1eb5 100644
--- a/lib/ofp-actions.h
+++ b/lib/ofp-actions.h
@@ -390,7 +390,8 @@ enum ofperr ofpacts_check(const struct ofpact[],
 
 /* Converting ofpacts to OpenFlow. */
 void ofpacts_to_openflow10(const struct ofpact[], struct ofpbuf *openflow);
-void ofpacts_to_openflow11(const struct ofpact[], struct ofpbuf *openflow);
+void ofpacts_to_openflow11(const struct ofpact[], struct ofpbuf *openflow,
+                           enum ofp11_instruction_type type);
 
 /* Working with ofpacts. */
 bool ofpacts_output_to_port(const struct ofpact[], uint16_t port);
-- 
1.7.10.2.484.gcd07cc5




More information about the dev mailing list