[ovs-dev] [PATCH v12 4/8] ofproto-dpif: Use execute_actions to execute controller actions

Simon Horman horms at verge.net.au
Wed Jun 5 05:28:50 UTC 2013


Now that execute_actions() is available it can be used as a generic
replacement for special-case action execution in
execute_controller_action().

As suggested by Jesse Gross.

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

---

v12
* Rebase

v11
* No change

v10
* As suggested by Ben Pfaff
- use {} with if statement for OVS_ACTION_ATTR_OUTPUT in execute_actions()
- Do not put required side effects in conditions for ovs_assert();

v9
* First post
---
 lib/odp-execute.c      |  4 +++-
 ofproto/ofproto-dpif.c | 49 +++++++++----------------------------------------
 2 files changed, 12 insertions(+), 41 deletions(-)

diff --git a/lib/odp-execute.c b/lib/odp-execute.c
index 42ab4b3..c5c8c16 100644
--- a/lib/odp-execute.c
+++ b/lib/odp-execute.c
@@ -170,7 +170,9 @@ odp_execute_actions(void *dp, struct ofpbuf *packet, struct flow *key,
 
         switch ((enum ovs_action_attr) type) {
         case OVS_ACTION_ATTR_OUTPUT:
-            output(dp, packet, nl_attr_get_u32(a));
+            if (output) {
+                output(dp, packet, nl_attr_get_u32(a));
+            }
             break;
 
         case OVS_ACTION_ATTR_USERSPACE: {
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 7016e73..29dfd4c 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -41,6 +41,7 @@
 #include "netlink.h"
 #include "nx-match.h"
 #include "odp-util.h"
+#include "odp-execute.h"
 #include "ofp-util.h"
 #include "ofpbuf.h"
 #include "ofp-actions.h"
@@ -6168,6 +6169,7 @@ execute_controller_action(struct xlate_ctx *ctx, int len,
 {
     struct ofputil_packet_in pin;
     struct ofpbuf *packet;
+    struct flow key;
 
     ovs_assert(!ctx->xout->slow || ctx->xout->slow == SLOW_CONTROLLER);
     ctx->xout->slow = SLOW_CONTROLLER;
@@ -6177,48 +6179,15 @@ execute_controller_action(struct xlate_ctx *ctx, int len,
 
     packet = ofpbuf_clone(ctx->xin->packet);
 
-    if (packet->l2 && packet->l3) {
-        struct eth_header *eh;
-        uint16_t mpls_depth;
+    key.skb_priority = 0;
+    key.skb_mark = 0;
+    memset(&key.tunnel, 0, sizeof key.tunnel);
 
-        eth_pop_vlan(packet);
-        eh = packet->l2;
-
-        memcpy(eh->eth_src, ctx->xin->flow.dl_src, sizeof eh->eth_src);
-        memcpy(eh->eth_dst, ctx->xin->flow.dl_dst, sizeof eh->eth_dst);
-
-        if (ctx->xin->flow.vlan_tci & htons(VLAN_CFI)) {
-            eth_push_vlan(packet, ctx->xin->flow.vlan_tci);
-        }
-
-        mpls_depth = eth_mpls_depth(packet);
-
-        if (mpls_depth < ctx->xin->flow.mpls_depth) {
-            push_mpls(packet, ctx->xin->flow.dl_type, ctx->xin->flow.mpls_lse);
-        } else if (mpls_depth > ctx->xin->flow.mpls_depth) {
-            pop_mpls(packet, ctx->xin->flow.dl_type);
-        } else if (mpls_depth) {
-            set_mpls_lse(packet, ctx->xin->flow.mpls_lse);
-        }
-
-        if (packet->l4) {
-            if (ctx->xin->flow.dl_type == htons(ETH_TYPE_IP)) {
-                packet_set_ipv4(packet, ctx->xin->flow.nw_src,
-                                ctx->xin->flow.nw_dst, ctx->xin->flow.nw_tos,
-                                ctx->xin->flow.nw_ttl);
-            }
+    commit_odp_actions(&ctx->xin->flow, &ctx->base_flow,
+                       &ctx->xout->odp_actions);
 
-            if (packet->l7) {
-                if (ctx->xin->flow.nw_proto == IPPROTO_TCP) {
-                    packet_set_tcp_port(packet, ctx->xin->flow.tp_src,
-                                        ctx->xin->flow.tp_dst);
-                } else if (ctx->xin->flow.nw_proto == IPPROTO_UDP) {
-                    packet_set_udp_port(packet, ctx->xin->flow.tp_src,
-                                        ctx->xin->flow.tp_dst);
-                }
-            }
-        }
-    }
+    odp_execute_actions(NULL, packet, &key, ctx->xout->odp_actions.data,
+                        ctx->xout->odp_actions.size, NULL, NULL);
 
     pin.packet = packet->data;
     pin.packet_len = packet->size;
-- 
1.8.2.1




More information about the dev mailing list