From: Ben Pfaff Date: Sat, 4 May 2013 00:14:19 +0000 (-0700) Subject: ofproto-dpif: Avoid figuring out sFlow and IPFIX actions twice. X-Git-Tag: sliver-openvswitch-1.10.90-3~16^2~22 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=94aa0d197d3898264ed9761dd5a2089fed40fca3;p=sliver-openvswitch.git ofproto-dpif: Avoid figuring out sFlow and IPFIX actions twice. Not only is it easier to re-use the actions we already have, this avoids potential problems due to the state that add_sflow_action() and add_ipfix_action() look at having possibly been changed by do_xlate_actions(). Currently those functions appear to look only at the flow's 'in_port', which currently can't change. However, an upcoming commit will make it possible for actions to change the flow's 'in_port', and in addition, with this change, one doesn't have to wonder whether these functions might look at other state that translation might change. Signed-off-by: Ben Pfaff --- diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 0272e4cab..b4fd73af9 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -7192,6 +7192,7 @@ xlate_actions(struct action_xlate_ctx *ctx, } else { static struct vlog_rate_limit trace_rl = VLOG_RATE_LIMIT_INIT(1, 1); struct initial_vals initial_vals; + size_t sample_actions_len; uint32_t local_odp_port; initial_vals.vlan_tci = ctx->base_flow.vlan_tci; @@ -7199,6 +7200,7 @@ xlate_actions(struct action_xlate_ctx *ctx, add_sflow_action(ctx); add_ipfix_action(ctx); + sample_actions_len = ctx->odp_actions->size; if (tunnel_ecn_ok(ctx) && (!in_port || may_receive(in_port, ctx))) { do_xlate_actions(ofpacts, ofpacts_len, ctx); @@ -7206,9 +7208,7 @@ xlate_actions(struct action_xlate_ctx *ctx, /* We've let OFPP_NORMAL and the learning action look at the * packet, so drop it now if forwarding is disabled. */ if (in_port && !stp_forward_in_state(in_port->stp_state)) { - ofpbuf_clear(ctx->odp_actions); - add_sflow_action(ctx); - add_ipfix_action(ctx); + ctx->odp_actions->size = sample_actions_len; } }