From: Simon Horman Date: Wed, 5 Jun 2013 05:28:50 +0000 (+0900) Subject: ofproto-dpif: Use execute_actions to execute controller actions X-Git-Tag: sliver-openvswitch-1.10.90-3~6^2~163 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=1ac7c9bdb2b6fdcbeb0728febdca820fdb447d2c ofproto-dpif: Use execute_actions to execute controller actions 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 Signed-off-by: Ben Pfaff --- diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 42ab4b3b3..c5c8c1605 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 096f0f246..a9d2ddd47 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" @@ -6180,6 +6181,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; @@ -6189,48 +6191,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;