[ovs-dev] [PATCH 2/2] ofp-actions: Prefer OFPAT11_DEC_TTL to NXAST_DEC_TTL for OpenFlow 1.1+.

Ben Pfaff blp at nicira.com
Thu Oct 18 18:13:05 UTC 2012


When "dec_ttl" is specified as the name of an action, in OpenFlow 1.1 and
later we should prefer to use the standardized action, rather than the
Nicira extension.

Reported-by: Isaku Yamahata <yamahata at valinux.co.jp>
Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 lib/ofp-actions.c |   19 ++++++++++++++-----
 lib/ofp-parse.c   |    9 ++++-----
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
index b774a61..ae20f8e 100644
--- a/lib/ofp-actions.c
+++ b/lib/ofp-actions.c
@@ -1426,6 +1426,19 @@ ofpact_output_to_openflow11(const struct ofpact_output *output,
 }
 
 static void
+ofpact_dec_ttl_to_openflow11(const struct ofpact_cnt_ids *dec_ttl,
+                             struct ofpbuf *out)
+{
+    if (dec_ttl->n_controllers == 1 && dec_ttl->cnt_ids[0] == 0
+        && (!dec_ttl->ofpact.compat ||
+            dec_ttl->ofpact.compat == OFPUTIL_OFPAT11_DEC_NW_TTL)) {
+        ofputil_put_OFPAT11_DEC_NW_TTL(out);
+    } else {
+        ofpact_dec_ttl_to_nxast(dec_ttl, out);
+    }
+}
+
+static void
 ofpact_to_openflow11(const struct ofpact *a, struct ofpbuf *out)
 {
     switch (a->type) {
@@ -1486,11 +1499,7 @@ ofpact_to_openflow11(const struct ofpact *a, struct ofpbuf *out)
         break;
 
     case OFPACT_DEC_TTL:
-        if (a->compat == OFPUTIL_OFPAT11_DEC_NW_TTL) {
-            ofputil_put_OFPAT11_DEC_NW_TTL(out);
-        } else {
-            ofpact_to_nxast(a, out);
-        }
+        ofpact_dec_ttl_to_openflow11(ofpact_get_DEC_TTL(a), out);
         break;
 
     case OFPACT_CLEAR_ACTIONS:
diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index a9d70de..f8cbcc6 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -279,13 +279,12 @@ parse_controller(struct ofpbuf *b, char *arg)
 }
 
 static void
-parse_noargs_dec_ttl(struct ofpbuf *b, enum ofputil_action_code compat)
+parse_noargs_dec_ttl(struct ofpbuf *b)
 {
     struct ofpact_cnt_ids *ids;
     uint16_t id = 0;
 
     ids = ofpact_put_DEC_TTL(b);
-    ids->ofpact.compat = compat;
     ofpbuf_put(b, &id, sizeof id);
     ids = b->l2;
     ids->n_controllers++;
@@ -293,10 +292,10 @@ parse_noargs_dec_ttl(struct ofpbuf *b, enum ofputil_action_code compat)
 }
 
 static void
-parse_dec_ttl(struct ofpbuf *b, char *arg, enum ofputil_action_code compat)
+parse_dec_ttl(struct ofpbuf *b, char *arg)
 {
     if (*arg == '\0') {
-        parse_noargs_dec_ttl(b, compat);
+        parse_noargs_dec_ttl(b);
     } else {
         struct ofpact_cnt_ids *ids;
         char *cntr;
@@ -516,7 +515,7 @@ parse_named_action(enum ofputil_action_code code, const struct flow *flow,
         break;
 
     case OFPUTIL_NXAST_DEC_TTL:
-        parse_dec_ttl(ofpacts, arg, code);
+        parse_dec_ttl(ofpacts, arg);
         break;
 
     case OFPUTIL_NXAST_FIN_TIMEOUT:
-- 
1.7.10.4




More information about the dev mailing list