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 <ho...@verge.net.au> --- v9 * First post --- lib/execute-actions.c | 3 ++- ofproto/ofproto-dpif.c | 46 +++++++--------------------------------------- 2 files changed, 9 insertions(+), 40 deletions(-) diff --git a/lib/execute-actions.c b/lib/execute-actions.c index 5e05dc5..1036ede 100644 --- a/lib/execute-actions.c +++ b/lib/execute-actions.c @@ -170,7 +170,8 @@ 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 bdb143f..329ff56 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -6813,6 +6813,7 @@ execute_controller_action(struct action_xlate_ctx *ctx, int len, { struct ofputil_packet_in pin; struct ofpbuf *packet; + struct flow key; ctx->slow |= SLOW_CONTROLLER; if (!ctx->packet) { @@ -6821,47 +6822,14 @@ execute_controller_action(struct action_xlate_ctx *ctx, int len, packet = ofpbuf_clone(ctx->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->flow.dl_src, sizeof eh->eth_src); - memcpy(eh->eth_dst, ctx->flow.dl_dst, sizeof eh->eth_dst); - - if (ctx->flow.vlan_tci & htons(VLAN_CFI)) { - eth_push_vlan(packet, ctx->flow.vlan_tci); - } - - mpls_depth = eth_mpls_depth(packet); - - if (mpls_depth < ctx->flow.mpls_depth) { - push_mpls(packet, ctx->flow.dl_type, ctx->flow.mpls_lse); - } else if (mpls_depth > ctx->flow.mpls_depth) { - pop_mpls(packet, ctx->flow.dl_type); - } else if (mpls_depth) { - set_mpls_lse(packet, ctx->flow.mpls_lse); - } - - if (packet->l4) { - if (ctx->flow.dl_type == htons(ETH_TYPE_IP)) { - packet_set_ipv4(packet, ctx->flow.nw_src, ctx->flow.nw_dst, - ctx->flow.nw_tos, ctx->flow.nw_ttl); - } + commit_odp_actions(&ctx->flow, &ctx->base_flow, ctx->odp_actions); - if (packet->l7) { - if (ctx->flow.nw_proto == IPPROTO_TCP) { - packet_set_tcp_port(packet, ctx->flow.tp_src, - ctx->flow.tp_dst); - } else if (ctx->flow.nw_proto == IPPROTO_UDP) { - packet_set_udp_port(packet, ctx->flow.tp_src, - ctx->flow.tp_dst); - } - } - } - } + ovs_assert(!execute_actions(NULL, packet, &key, ctx->odp_actions->data, + ctx->odp_actions->size, NULL, NULL)); pin.packet = packet->data; pin.packet_len = packet->size; -- 1.8.2.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev