On Sat, Nov 18, 2017 at 02:23:22AM -0200, Flavio Leitner wrote:
> On Thu, 26 Oct 2017 15:30:42 -0400
> Eric Garver <[email protected]> wrote:
>
> > This supports using the ct_clear action in the kernel datapath. To
> > preserve compatibility with current ct_clear behavior on old kernels, we
> > only pass this action down to the datapath if a probe reveals the
> > datapath actually supports it.
> >
> > Signed-off-by: Eric Garver <[email protected]>
> > Acked-by: William Tu <[email protected]>
> > ---
[...]
> > diff --git a/datapath/linux/compat/include/linux/openvswitch.h
> > b/datapath/linux/compat/include/linux/openvswitch.h
> > index bc6c94b8d52d..28f20103af81 100644
> > --- a/datapath/linux/compat/include/linux/openvswitch.h
> > +++ b/datapath/linux/compat/include/linux/openvswitch.h
> > @@ -924,6 +924,7 @@ enum ovs_action_attr {
> > OVS_ACTION_ATTR_TRUNC, /* u32 struct ovs_action_trunc. */
> > OVS_ACTION_ATTR_PUSH_ETH, /* struct ovs_action_push_eth. */
> > OVS_ACTION_ATTR_POP_ETH, /* No argument. */
> > + OVS_ACTION_ATTR_CT_CLEAR, /* No argument. */
>
> Missing to update the comment above the definition.
Right. Thanks.
[...]
> > --- a/lib/odp-util.c
> > +++ b/lib/odp-util.c
> > @@ -126,6 +126,7 @@ odp_action_len(uint16_t type)
> > case OVS_ACTION_ATTR_SET_MASKED: return ATTR_LEN_VARIABLE;
> > case OVS_ACTION_ATTR_SAMPLE: return ATTR_LEN_VARIABLE;
> > case OVS_ACTION_ATTR_CT: return ATTR_LEN_VARIABLE;
> > + case OVS_ACTION_ATTR_CT_CLEAR: return 0;
> > case OVS_ACTION_ATTR_PUSH_ETH: return sizeof(struct
> > ovs_action_push_eth);
> > case OVS_ACTION_ATTR_POP_ETH: return 0;
> > case OVS_ACTION_ATTR_CLONE: return ATTR_LEN_VARIABLE;
> > @@ -1054,6 +1055,9 @@ format_odp_action(struct ds *ds, const struct nlattr
> > *a,
> > case OVS_ACTION_ATTR_CT:
> > format_odp_conntrack_action(ds, a);
> > break;
> > + case OVS_ACTION_ATTR_CT_CLEAR:
> > + ds_put_cstr(ds, "ct_clear");
> > + break;
> > case OVS_ACTION_ATTR_CLONE:
> > format_odp_clone_action(ds, a, portno_names);
> > break;
>
> Aren't we missing parse_odp_action()?
Indeed. Thanks for pointing that out. I also updated the "OVS datapath
actions parsing and formatting - valid forms" test case, which makes
this blatantly obvious. :)
[...]
> > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> > index 43d670a15c3f..88fd9d5c8c8f 100644
> > --- a/ofproto/ofproto-dpif.c
> > +++ b/ofproto/ofproto-dpif.c
> > @@ -1322,6 +1322,37 @@ check_ct_eventmask(struct dpif_backer *backer)
> > return !error;
> > }
> >
> > +static bool
> > +check_ct_clear(struct dpif_backer *backer)
> > +{
> > + struct odputil_keybuf keybuf;
> > + uint8_t actbuf[NL_A_FLAG_SIZE];
> > + struct ofpbuf actions;
> > + struct ofpbuf key;
> > + struct flow flow;
> > + bool supported;
> > +
> > + struct odp_flow_key_parms odp_parms = {
> > + .flow = &flow,
> > + .probe = true,
> > + };
> > +
> > + memset(&flow, 0, sizeof flow);
> > + ofpbuf_use_stack(&key, &keybuf, sizeof keybuf);
> > + odp_flow_key_from_flow(&odp_parms, &key);
> > +
> > + ofpbuf_use_stack(&actions, &actbuf, sizeof actbuf);
> > + nl_msg_put_flag(&actions, OVS_ACTION_ATTR_CT_CLEAR);
> > +
> > + supported = dpif_probe_feature(backer->dpif, "ct_clear", &key,
> > + &actions, NULL);
> > +
> > + VLOG_INFO("%s: Datapath %s ct_clear action",
> > + dpif_name(backer->dpif), (supported) ? "supports"
> > + : "does not support");
> > + return supported;
> > +}
> > +
> > #define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE)
> > \
> > static bool
> > \
> > check_##NAME(struct dpif_backer *backer)
> > \
> > @@ -1386,6 +1417,7 @@ check_support(struct dpif_backer *backer)
> > backer->rt_support.clone = check_clone(backer);
> > backer->rt_support.sample_nesting = check_max_sample_nesting(backer);
> > backer->rt_support.ct_eventmask = check_ct_eventmask(backer);
> > + backer->rt_support.ct_clear = check_ct_clear(backer);
> >
> > /* Flow fields. */
> > backer->rt_support.odp.ct_state = check_ct_state(backer);
> > diff --git a/ofproto/ofproto-dpif.h b/ofproto/ofproto-dpif.h
> > index 0857c070c8ac..8752061d6439 100644
> > --- a/ofproto/ofproto-dpif.h
> > +++ b/ofproto/ofproto-dpif.h
> > @@ -178,7 +178,10 @@ struct group_dpif *group_dpif_lookup(struct
> > ofproto_dpif *,
> > DPIF_SUPPORT_FIELD(size_t, sample_nesting, "Sample nesting")
> > \
> >
> > \
> > /* OVS_CT_ATTR_EVENTMASK supported by OVS_ACTION_ATTR_CT action. */
> > \
> > - DPIF_SUPPORT_FIELD(bool, ct_eventmask, "Conntrack eventmask")
> > + DPIF_SUPPORT_FIELD(bool, ct_eventmask, "Conntrack eventmask")
> > \
> > +
> > \
> > + /* True if the datapath supports OVS_ACTION_ATTR_CT_CLEAR action. */
> > \
> > + DPIF_SUPPORT_FIELD(bool, ct_clear, "Conntrack clear")
> >
> > /* Stores the various features which the corresponding backer supports. */
> > struct dpif_backer_support {
>
> Perhaps mention this change in NEWS just in case?
Good idea. I'll add something.
Thanks for reviewing Flavio!
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev