[ovs-dev] [PATCH v3 07/12] ofp-actions: teach action-formatter intructions

Isaku Yamahata yamahata at valinux.co.jp
Mon Jul 23 08:08:46 UTC 2012


Signed-off-by: Isaku Yamahata <yamahata at valinux.co.jp>
---
v3
- modified for OFPACT_{CLEAR_ACTIONS, WRITE_ACTIONS, GOTO_TABLE}

v2
- changed for ofp_instruction
---
 lib/ofp-actions.c |   71 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index 25d600b..77250a8 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -1756,38 +1756,83 @@ ofpact_format(const struct ofpact *a, struct ds *s)
         break;
 
     case OFPACT_CLEAR_ACTIONS:
-        NOT_REACHED();  /* TODO:XXX */
-        break;
-
     case OFPACT_WRITE_ACTIONS:
-        NOT_REACHED();  /* TODO:XXX */
-        break;
-
+    /* TODO:XXX write_metadata */
     case OFPACT_GOTO_TABLE:
-        NOT_REACHED();  /* TODO:XXX */
+        NOT_REACHED();
         break;
     }
 }
 
+static void
+ofpacts_format_close_paren(struct ds *string, int n_actions)
+{
+    if (n_actions == 0) {
+        ds_put_cstr(string, "drop");
+    }
+    ds_put_cstr(string, ")");
+}
+
 /* Appends a string representing the 'ofpacts_len' bytes of ofpacts in
  * 'ofpacts' to 'string'. */
 void
 ofpacts_format(const struct ofpact *ofpacts, size_t ofpacts_len,
                struct ds *string)
 {
-    ds_put_cstr(string, "actions=");
+    const struct ofpact *a;
+    const char *prefix;
+    bool in_instruction = false;
+    int n_actions = 0;
+
+    prefix = "actions";
+    OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
+        if (ofpact_is_instruction(a)) {
+            prefix = "instructions";
+            break;
+        }
+    }
+    ds_put_format(string, "%s=", prefix);
     if (!ofpacts_len) {
         ds_put_cstr(string, "drop");
-    } else {
-        const struct ofpact *a;
+        return;
+    }
 
-        OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
-            if (a != ofpacts) {
-                ds_put_cstr(string, ",");
+    OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
+        if (a != ofpacts) {
+            ds_put_cstr(string, ",");
+        }
+
+        if (in_instruction && ofpact_is_instruction(a)) {
+            ofpacts_format_close_paren(string, n_actions);
+            in_instruction = false;
+            n_actions = 0;
+        }
+
+        if (a->type == OFPACT_CLEAR_ACTIONS) {
+            ds_put_cstr(string, "clear_actions");
+        } else if (a->type == OFPACT_WRITE_ACTIONS) {
+            ds_put_cstr(string, "write_actions(");
+            in_instruction = true;
+            n_actions = 0;
+        /* TODO:XXX write-metadata */
+        } else if (a->type == OFPACT_GOTO_TABLE) {
+            ds_put_format(string, "goto-table:%"PRIu8,
+                          ofpact_get_GOTO_TABLE(a)->table_id);
+        } else {
+            if (!in_instruction) {
+                ds_put_cstr(string, "apply_actions(");
+                in_instruction = true;
+                n_actions = 0;
             }
+
             ofpact_format(a, string);
+            n_actions++;
         }
     }
+
+    if (in_instruction) {
+        ofpacts_format_close_paren(string, n_actions);
+    }
 }
 
 /* Internal use by helpers. */
-- 
1.7.1.1




More information about the dev mailing list