[ovs-dev] [actions 5/5] ofp-util: New function for executing simple flow-modification actions.

Ben Pfaff blp at nicira.com
Fri Jun 24 22:02:11 UTC 2011


This simplifies ofproto-dpif somewhat and it allows for code reuse in an
upcoming commit.
---
 lib/ofp-util.c         |   84 ++++++++++++++++++++++++++++++++++++++++++++++++
 lib/ofp-util.h         |    3 ++
 ofproto/ofproto-dpif.c |   62 +++--------------------------------
 3 files changed, 92 insertions(+), 57 deletions(-)

diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 00f9ce8..2ab6cc9 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -2565,3 +2565,87 @@ ofputil_actions_clone(const union ofp_action *actions, size_t n)
 {
     return n ? xmemdup(actions, n * sizeof *actions) : NULL;
 }
+
+/* Executes action 'a' with the specified 'code' (which must be one of the
+ * actions that simply modifies the flow) by modifying 'flow' appropriately. */
+void
+ofputil_execute_action(const union ofp_action *a,
+                       enum ofputil_action_code code, struct flow *flow)
+{
+    const struct ofp_action_dl_addr *oada;
+    const struct nx_action_set_tunnel *nast;
+
+    switch (code) {
+    case OFPUTIL_OFPAT_SET_VLAN_VID:
+        flow->vlan_tci &= ~htons(VLAN_VID_MASK);
+        flow->vlan_tci |= a->vlan_vid.vlan_vid | htons(VLAN_CFI);
+        break;
+
+    case OFPUTIL_OFPAT_SET_VLAN_PCP:
+        flow->vlan_tci &= ~htons(VLAN_PCP_MASK);
+        flow->vlan_tci |= htons(
+            (a->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
+        break;
+
+    case OFPUTIL_OFPAT_STRIP_VLAN:
+        flow->vlan_tci = htons(0);
+        break;
+
+    case OFPUTIL_OFPAT_SET_DL_SRC:
+        oada = ((struct ofp_action_dl_addr *) a);
+        memcpy(flow->dl_src, oada->dl_addr, ETH_ADDR_LEN);
+        break;
+
+    case OFPUTIL_OFPAT_SET_DL_DST:
+        oada = ((struct ofp_action_dl_addr *) a);
+        memcpy(flow->dl_dst, oada->dl_addr, ETH_ADDR_LEN);
+        break;
+
+    case OFPUTIL_OFPAT_SET_NW_SRC:
+        flow->nw_src = a->nw_addr.nw_addr;
+        break;
+
+    case OFPUTIL_OFPAT_SET_NW_DST:
+        flow->nw_dst = a->nw_addr.nw_addr;
+        break;
+
+    case OFPUTIL_OFPAT_SET_NW_TOS:
+        flow->nw_tos = a->nw_tos.nw_tos;
+        break;
+
+    case OFPUTIL_OFPAT_SET_TP_SRC:
+        flow->tp_src = a->tp_port.tp_port;
+        break;
+
+    case OFPUTIL_OFPAT_SET_TP_DST:
+        flow->tp_dst = a->tp_port.tp_port;
+        break;
+
+    case OFPUTIL_NXAST_SET_TUNNEL:
+        nast = (const struct nx_action_set_tunnel *) a;
+        flow->tun_id = htonll(ntohl(nast->tun_id));
+        break;
+
+    case OFPUTIL_NXAST_REG_MOVE:
+        nxm_execute_reg_move((const struct nx_action_reg_move *) a, flow);
+        break;
+
+    case OFPUTIL_NXAST_REG_LOAD:
+        nxm_execute_reg_load((const struct nx_action_reg_load *) a, flow);
+        break;
+
+    case OFPUTIL_NXAST_SET_TUNNEL64:
+        flow->tun_id = ((const struct nx_action_set_tunnel64 *) a)->tun_id;
+        break;
+
+    case OFPUTIL_OFPAT_OUTPUT:
+    case OFPUTIL_OFPAT_ENQUEUE:
+    case OFPUTIL_NXAST_RESUBMIT:
+    case OFPUTIL_NXAST_SET_QUEUE:
+    case OFPUTIL_NXAST_POP_QUEUE:
+    case OFPUTIL_NXAST_NOTE:
+    case OFPUTIL_NXAST_MULTIPATH:
+    case OFPUTIL_NXAST_AUTOPATH:
+        NOT_REACHED();
+    }
+}
diff --git a/lib/ofp-util.h b/lib/ofp-util.h
index 48b0a4c..5537c09 100644
--- a/lib/ofp-util.h
+++ b/lib/ofp-util.h
@@ -350,6 +350,9 @@ int ofputil_pull_actions(struct ofpbuf *, unsigned int actions_len,
 bool ofputil_actions_equal(const union ofp_action *a, size_t n_a,
                            const union ofp_action *b, size_t n_b);
 union ofp_action *ofputil_actions_clone(const union ofp_action *, size_t n);
+
+void ofputil_execute_action(const union ofp_action *,
+                            enum ofputil_action_code, struct flow *);
 
 /* OpenFlow vendors.
  *
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 0696a98..2aec542 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -3063,14 +3063,11 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
     }
 
     OFPUTIL_ACTION_FOR_EACH_UNSAFE (ia, left, in, n_in) {
-        const struct ofp_action_dl_addr *oada;
         const struct nx_action_resubmit *nar;
-        const struct nx_action_set_tunnel *nast;
         const struct nx_action_set_queue *nasq;
         const struct nx_action_multipath *nam;
         const struct nx_action_autopath *naa;
         enum ofputil_action_code code;
-        ovs_be64 tun_id;
 
         code = ofputil_decode_action_unsafe(ia);
         switch (code) {
@@ -3079,48 +3076,20 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
             break;
 
         case OFPUTIL_OFPAT_SET_VLAN_VID:
-            ctx->flow.vlan_tci &= ~htons(VLAN_VID_MASK);
-            ctx->flow.vlan_tci |= ia->vlan_vid.vlan_vid | htons(VLAN_CFI);
-            break;
-
         case OFPUTIL_OFPAT_SET_VLAN_PCP:
-            ctx->flow.vlan_tci &= ~htons(VLAN_PCP_MASK);
-            ctx->flow.vlan_tci |= htons(
-                (ia->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT) | VLAN_CFI);
-            break;
-
         case OFPUTIL_OFPAT_STRIP_VLAN:
-            ctx->flow.vlan_tci = htons(0);
-            break;
-
         case OFPUTIL_OFPAT_SET_DL_SRC:
-            oada = ((struct ofp_action_dl_addr *) ia);
-            memcpy(ctx->flow.dl_src, oada->dl_addr, ETH_ADDR_LEN);
-            break;
-
         case OFPUTIL_OFPAT_SET_DL_DST:
-            oada = ((struct ofp_action_dl_addr *) ia);
-            memcpy(ctx->flow.dl_dst, oada->dl_addr, ETH_ADDR_LEN);
-            break;
-
         case OFPUTIL_OFPAT_SET_NW_SRC:
-            ctx->flow.nw_src = ia->nw_addr.nw_addr;
-            break;
-
         case OFPUTIL_OFPAT_SET_NW_DST:
-            ctx->flow.nw_dst = ia->nw_addr.nw_addr;
-            break;
-
         case OFPUTIL_OFPAT_SET_NW_TOS:
-            ctx->flow.nw_tos = ia->nw_tos.nw_tos;
-            break;
-
         case OFPUTIL_OFPAT_SET_TP_SRC:
-            ctx->flow.tp_src = ia->tp_port.tp_port;
-            break;
-
         case OFPUTIL_OFPAT_SET_TP_DST:
-            ctx->flow.tp_dst = ia->tp_port.tp_port;
+        case OFPUTIL_NXAST_SET_TUNNEL:
+        case OFPUTIL_NXAST_REG_MOVE:
+        case OFPUTIL_NXAST_REG_LOAD:
+        case OFPUTIL_NXAST_SET_TUNNEL64:
+            ofputil_execute_action(ia, code, &ctx->flow);
             break;
 
         case OFPUTIL_OFPAT_ENQUEUE:
@@ -3132,12 +3101,6 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
             xlate_table_action(ctx, ntohs(nar->in_port));
             break;
 
-        case OFPUTIL_NXAST_SET_TUNNEL:
-            nast = (const struct nx_action_set_tunnel *) ia;
-            tun_id = htonll(ntohl(nast->tun_id));
-            ctx->flow.tun_id = tun_id;
-            break;
-
         case OFPUTIL_NXAST_SET_QUEUE:
             nasq = (const struct nx_action_set_queue *) ia;
             xlate_set_queue_action(ctx, nasq);
@@ -3147,25 +3110,10 @@ do_xlate_actions(const union ofp_action *in, size_t n_in,
             ctx->priority = 0;
             break;
 
-        case OFPUTIL_NXAST_REG_MOVE:
-            nxm_execute_reg_move((const struct nx_action_reg_move *) ia,
-                                 &ctx->flow);
-            break;
-
-        case OFPUTIL_NXAST_REG_LOAD:
-            nxm_execute_reg_load((const struct nx_action_reg_load *) ia,
-                                 &ctx->flow);
-            break;
-
         case OFPUTIL_NXAST_NOTE:
             /* Nothing to do. */
             break;
 
-        case OFPUTIL_NXAST_SET_TUNNEL64:
-            tun_id = ((const struct nx_action_set_tunnel64 *) ia)->tun_id;
-            ctx->flow.tun_id = tun_id;
-            break;
-
         case OFPUTIL_NXAST_MULTIPATH:
             nam = (const struct nx_action_multipath *) ia;
             multipath_execute(nam, &ctx->flow);
-- 
1.7.4.4




More information about the dev mailing list