[ovs-dev] [PATCH 1/3] ofproto-dpif-upcall: Translate input port as part of upcall translation.

Daniele Di Proietto diproiettod at ovn.org
Mon Jun 13 20:16:02 UTC 2016


2016-06-09 17:46 GMT-07:00 Jesse Gross <jesse at kernel.org>:

> When we generate wildcards for upcalled flows, the flows and therefore
> the wildcards, are in OpenFlow format. These are mostly the same but
> one exception is the input port. We work around this problem by simply
> performing an exact match on the input port when generating netlink
> formatted keys. (This does not lose any information in practice because
> action translation also always exact matches on input port.)
>
> While this works fine for kernel based flows, it misses the userspace
> datapath, which directly consumes the OFP format mask for the input
> port. The effect of this is that the in_port mask is sometimes only
> the lower 16 bits of the field. (This is because OFP format is a 16-bit
> value stored in a 32-bit field. The full width of the field is initialized
> with an exact match mask but certain operations result in cleaving this
> down to 16 bits.) In practice this does not cause a problem because
> datapath
> port numbers are almost always in the lower 16 bits of the range anyways.
>
> This moves the masking of the datapath format field to translation so that
> all datapaths see the same result. This also makes more sense conceptually
> as the input port in the flow is also in ODP format at this stage.
>
> Signed-off-by: Jesse Gross <jesse at kernel.org>
> ---
>  ofproto/ofproto-dpif-upcall.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
> index a18fc5a..9400ef9 100644
> --- a/ofproto/ofproto-dpif-upcall.c
> +++ b/ofproto/ofproto-dpif-upcall.c
> @@ -1083,7 +1083,16 @@ upcall_xlate(struct udpif *udpif, struct upcall
> *upcall,
>
>      upcall->dump_seq = seq_read(udpif->dump_seq);
>      upcall->reval_seq = seq_read(udpif->reval_seq);
> +
>      xlate_actions(&xin, &upcall->xout);
> +    if (wc) {
> +        /* Convert the input port wildcard from OFP to ODP format.
> There's no
> +         * real way to do this for arbitrary bitmasks since the numbering
> spaces
> +         * aren't the same. However, flow translation always exact
> matches the
> +         * whole thing, so we can do the same here. */
> +        WC_MASK_FIELD(wc, in_port.odp_port);
> +    }
> +
>

I guess the above could be done in xlate_wc_finish().

Either way this looks good to me.

Acked-by: Daniele Di Proietto <diproiettod at vmware.com>

Thanks


>      upcall->xout_initialized = true;
>
>      if (!upcall->xout.slow) {
> @@ -1489,7 +1498,7 @@ ukey_create_from_upcall(struct upcall *upcall,
> struct flow_wildcards *wc)
>      atomic_read_relaxed(&enable_megaflows, &megaflow);
>      ofpbuf_use_stack(&maskbuf, &maskstub, sizeof maskstub);
>      if (megaflow) {
> -        odp_parms.odp_in_port = ODPP_NONE;
> +        odp_parms.odp_in_port = wc->masks.in_port.odp_port;
>          odp_parms.key_buf = &keybuf;
>
>          odp_flow_key_from_mask(&odp_parms, &maskbuf);
> --
> 2.5.0
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list