> On Wed, Apr 16, 2014 at 04:39:24PM +0900, YAMAMOTO Takashi wrote:
>> > @@ -1762,6 +1765,10 @@ compose_output_action__(struct xlate_ctx *ctx, 
>> > ofp_port_t ofp_port,
>> >          } else if (may_receive(peer, ctx)) {
>> >              if (xport_stp_forward_state(peer)) {
>> >                  xlate_table_action(ctx, flow->in_port.ofp_port, 0, true, 
>> > true);
>> > +                if (ctx->xout->recirc_ofproto == ctx->xbridge->ofproto &&
>> > +                    ctx->xout->recirc_md.in_port.odp_port == 
>> > peer->odp_port) {
>> > +                    ctx->xout->recirc_md.in_port.ofp_port = 
>> > peer->ofp_port;
>> > +                }
>> 
>> can you explain this?
> 
> In the case where recirculation occurs after a packet is output
> to a patch port the ofproto and in_port may differ from that when
> the packet was originally received or executed.
> 
> The ofproto at the time when a recirculation action is composed is
> saved in ctx->xout->recirc_ofproto by compose_recirculate_action().
> 
> I could not work out how to obtain the odp_port at that time
> so I deferred saving in ctx->xout->recirc_md.in_port.ofp_port until
> here.
> 
> The reason I had trouble obtaining it in compose_recirculate_action()
> is that at that point an odp_port is available. But it is not
> useful for converting to an ofp_port as my analysis is that
> all patch ports use the same odp_port (2^32 - 2, IIRC).

thanks for explanation.

just to be sure, do you know that md.in_port is a union?
which field of recirc_md.in_port is expected to be used, before and
after the block?

as the ofp port counterpart is used in the most parts of xlate code,
the conditional on recirc_md.in_port.odp_port looks weird to me.

> 
> 
> The update ofproto and ctx->xout->recirc_md values
> are used to perform recirculation outside the datapath in cases
> where it doesn't seem logical to receive recirculated packets from the 
> datapath
> because the in_port of the packet does not correspond to an port the datapath.
> In particular:
> 
> * Packets processed due to packet out with an in_port that doesn't
>   exist in the datapath. E.g. the CONTROLLER port.
> * Packets where recirculation occurs after a packet is output
>   to a patch port. As I mention above all patch ports seem to
>   share the same ODP port. And it does not appear to exist in the datapath.

does your patch work for "output:1,2", where 1 and 2 are patch
ports, both requiring recirculation?

YAMAMOTO Takashi

> 
> 
> I will work some documentation of the above into the code,
> something I should have done before posting.
> 
>> > @@ -3074,6 +3238,9 @@ xlate_actions__(struct xlate_in *xin, struct 
>> > xlate_out *xout)
>> >      ctx.xout->has_fin_timeout = false;
>> >      ctx.xout->nf_output_iface = NF_OUT_DROP;
>> >      ctx.xout->mirrors = 0;
>> > +    ctx.xout->recirc_ofproto = NULL;
>> > +    memset(&ctx.xout->recirc_md, 0, sizeof ctx.xout->recirc_ofproto);
>> 
>> this looks like a typo.
> 
> Thanks, I will fix that.
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to