On 19 May 2014 13:05, Andy Zhou <az...@nicira.com> wrote:

> On Thu, May 15, 2014 at 9:52 PM, Joe Stringer <joestrin...@nicira.com>
> wrote:
> > The userspace and kernel datapaths previously differed on their
> > treatment of the recirc_id and dp_hash fields when sending upcalls.
> > While the kernel datapath would always serialise these fields, the
> > userspace would not. When using the userspace datapath, this would cause
> > a mismatch between the odp flow key in an upcall compared to the one
> > that is serialised upon flow_dump.
> >
> > This patch brings the userspace datapath behaviour back in line with the
> > kernel datapath by always serialising recirc_id and dp_hash to odp.
> >
> > Signed-off-by: Joe Stringer <joestrin...@nicira.com>
> Acked-by: Andy Zhou <az...@nicira.com>
> > ---
> > v4: Simplify. Pass only a new "recirc" support parameter to
> >       odp_flow_key_from_flow__().
> > v3: Allow users to specify context for serialising fields.
> >     Don't always match dp_hash.
> > v2: Always match dp_hash.
> > v1: Initial post.
> > ---
> >  lib/dpif-netdev.c             |    6 +-
> >  lib/odp-util.c                |   30 ++++++----
> >  lib/odp-util.h                |    5 +-
> >  ofproto/ofproto-dpif-upcall.c |    5 +-
> >  ofproto/ofproto-dpif.c        |    4 +-
> >  tests/odp.at                  |   20 +++----
> >  tests/ofproto-dpif.at         |  126
> ++++++++++++++++++++---------------------
> >  tests/test-odp.c              |    2 +-
> >  8 files changed, 104 insertions(+), 94 deletions(-)
> >
> > diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> > index a255a96..d3f9c7e 100644
> > --- a/lib/dpif-netdev.c
> > +++ b/lib/dpif-netdev.c
> > @@ -1455,7 +1455,7 @@ dpif_netdev_flow_dump_next(const struct dpif
> *dpif, void *iter_, void *state_,
> >
> >          ofpbuf_use_stack(&buf, &state->keybuf, sizeof state->keybuf);
> >          odp_flow_key_from_flow(&buf, &netdev_flow->flow, &wc.masks,
> > -                               netdev_flow->flow.in_port.odp_port);
> > +                               netdev_flow->flow.in_port.odp_port,
> true);
> >
> >          *key = ofpbuf_data(&buf);
> >          *key_len = ofpbuf_size(&buf);
> > @@ -1467,7 +1467,7 @@ dpif_netdev_flow_dump_next(const struct dpif
> *dpif, void *iter_, void *state_,
> >          ofpbuf_use_stack(&buf, &state->maskbuf, sizeof state->maskbuf);
> >          odp_flow_key_from_mask(&buf, &wc.masks, &netdev_flow->flow,
> >                                 odp_to_u32(wc.masks.in_port.odp_port),
> > -                               SIZE_MAX);
> > +                               SIZE_MAX, true);
> >
> >          *mask = ofpbuf_data(&buf);
> >          *mask_len = ofpbuf_size(&buf);
> > @@ -2063,7 +2063,7 @@ dp_netdev_output_userspace(struct dp_netdev *dp,
> struct ofpbuf *packet,
> >
> >          /* Put ODP flow. */
> >          miniflow_expand(key, &flow);
> > -        odp_flow_key_from_flow(buf, &flow, NULL, flow.in_port.odp_port);
> > +        odp_flow_key_from_flow(buf, &flow, NULL, flow.in_port.odp_port,
> true);
> >          upcall->key = ofpbuf_data(buf);
> >          upcall->key_len = ofpbuf_size(buf);
> >
> > diff --git a/lib/odp-util.c b/lib/odp-util.c
> > index 6cff2f1..37ec2be 100644
> > --- a/lib/odp-util.c
> > +++ b/lib/odp-util.c
> > @@ -2483,7 +2483,8 @@ ovs_to_odp_frag_mask(uint8_t nw_frag_mask)
> >  static void
> >  odp_flow_key_from_flow__(struct ofpbuf *buf, const struct flow *flow,
> >                           const struct flow *mask, odp_port_t
> odp_in_port,
> > -                         size_t max_mpls_depth, bool export_mask)
> > +                         size_t max_mpls_depth, bool export_mask,
> > +                         bool recirc)
> How about keeping bool export_mask as the last parameter?
> max_mpls_depth and recirc logically belong together.


Sure. Would you like me to send a fresh version with this change for
review?
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to