Signed-off-by: Jarno Rajahalme <jarno.rajaha...@nsn.com> --- ofproto/ofproto-dpif.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 61f3a04..96f6452 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -5921,8 +5921,8 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port, if (netdev_vport_is_patch(ofport->up.netdev)) { struct ofport_dpif *peer = ofport_get_peer(ofport); - struct flow old_flow = *flow; - const struct ofproto_dpif *peer_ofproto; + struct flow new_flow; + struct ofproto_dpif *peer_ofproto; enum slow_path_reason special; struct ofport_dpif *in_port; @@ -5937,32 +5937,35 @@ compose_output_action__(struct xlate_ctx *ctx, uint16_t ofp_port, return; } - ctx->ofproto = ofproto_dpif_cast(peer->up.ofproto); - flow->in_port = peer->up.ofp_port; - flow->metadata = htonll(0); - memset(&flow->tunnel, 0, sizeof flow->tunnel); - memset(flow->regs, 0, sizeof flow->regs); + new_flow = *flow; - in_port = get_ofp_port(ctx->ofproto, flow->in_port); - special = process_special(ctx->ofproto, flow, in_port, + ctx->ofproto = peer_ofproto; + new_flow.in_port = peer->up.ofp_port; + new_flow.metadata = htonll(0); + memset(&new_flow.tunnel, 0, sizeof new_flow.tunnel); + memset(new_flow.regs, 0, sizeof new_flow.regs); + + in_port = get_ofp_port(ctx->ofproto, new_flow.in_port); + special = process_special(ctx->ofproto, &new_flow, in_port, ctx->xin->packet); if (special) { ctx->xout->slow = special; - } else if (!in_port || may_receive(in_port, flow)) { + } else if (!in_port || may_receive(in_port, &new_flow)) { + ctx->xin->flow = &new_flow; if (!in_port || stp_forward_in_state(in_port->stp_state)) { - xlate_table_action(ctx, flow->in_port, 0, true); + xlate_table_action(ctx, new_flow.in_port, 0, true); } else { /* Forwarding is disabled by STP. Let OFPP_NORMAL and the * learning action look at the packet, then drop it. */ struct flow old_base_flow = ctx->base_flow; size_t old_size = ctx->xout->odp_actions.size; - xlate_table_action(ctx, flow->in_port, 0, true); + xlate_table_action(ctx, new_flow.in_port, 0, true); ctx->base_flow = old_base_flow; ctx->xout->odp_actions.size = old_size; } + ctx->xin->flow = flow; /* Restore flow pointer */ } - *flow = old_flow; ctx->ofproto = ofproto_dpif_cast(ofport->up.ofproto); if (ctx->xin->resubmit_stats) { -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev