From 94aa0d197d3898264ed9761dd5a2089fed40fca3 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 3 May 2013 17:14:19 -0700 Subject: [PATCH] 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 --- ofproto/ofproto-dpif.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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; } } -- 2.43.0