> On Nov 11, 2015, at 10:21 AM, Joe Stringer <joestrin...@nicira.com> wrote: > > On 10 November 2015 at 13:56, Joe Stringer <joestrin...@nicira.com> wrote: >> On 9 November 2015 at 17:25, Jarno Rajahalme <ja...@ovn.org> wrote: >>> >>>> On Nov 7, 2015, at 12:05 PM, Joe Stringer <joestrin...@nicira.com> wrote: >>>> >>>> Disallow installing rules that execute ct() if conntrack is unsupported >>>> in the datapath. >>>> >>>> Reported-by: Ravindra Kenchappa <ravindra.kencha...@hpe.com> >>>> Signed-off-by: Joe Stringer <joestrin...@nicira.com> >>>> --- >>>> ofproto/ofproto-dpif.c | 44 +++++++++++++++++++++++++++++++++++++++++++- >>>> 1 file changed, 43 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c >>>> index 2f75b93d9694..e09c28bb15ed 100644 >>>> --- a/ofproto/ofproto-dpif.c >>>> +++ b/ofproto/ofproto-dpif.c >>>> @@ -4048,6 +4048,44 @@ check_flow(const struct ofproto_dpif *ofproto, >>>> const struct miniflow *flow, >>>> } >>>> >>>> static enum ofperr >>>> +check_actions(const struct ofproto_dpif *ofproto, >>>> + const struct rule_actions *const actions) >>>> +{ >>>> + const struct ofpact *ofpact; >>>> + >>>> + OFPACT_FOR_EACH (ofpact, actions->ofpacts, actions->ofpacts_len) { >>>> + const struct odp_support *support; >>>> + const struct ofpact_conntrack *ct; >>>> + const struct ofpact *a; >>>> + >>>> + if (ofpact->type != OFPACT_CT) { >>>> + continue; >>>> + } >>>> + >>>> + ct = CONTAINER_OF(ofpact, struct ofpact_conntrack, ofpact); >>>> + support = &ofproto_dpif_get_support(ofproto)->odp; >>>> + >>>> + if (!support->ct_state) { >>>> + return OFPERR_OFPBAC_BAD_TYPE; >>>> + } >>>> + if ((ct->zone_imm || ct->zone_src.field) && !support->ct_zone) { >>>> + return OFPERR_OFPBAC_BAD_ARGUMENT; >>>> + } >>>> + >>>> + OFPACT_FOR_EACH(a, ct->actions, ofpact_ct_get_action_len(ct)) { >>>> + const struct mf_field *dst = ofpact_get_mf_dst(a); >>>> + >>>> + if (dst && ((dst->id == MFF_CT_MARK && !support->ct_mark) >>>> + || (dst->id == MFF_CT_LABEL && >>>> !support->ct_label))) { >>>> + return OFPERR_OFPBAC_BAD_SET_ARGUMENT; >>>> + } >>>> + } >>>> + } >>>> + >>>> + return 0; >>>> +} >>> >>> >>> We already loop through the actions for a similar purpose in >>> ofproto_check_ofpacts(). Maybe make something like is_action_supported() >>> accessible via the ofproto class and call that for the conntrack action >>> from ofproto_check_ofpacts()? >> >> Makes sense, I'll rework this patch do to it like this. > > Taking another look at this, I'm on the fence about whether it's > better conceptually than what we have currently. For one, it > effectively shifts some of the error checking that is currently part > of the ofproto's ->rule_construct() method into a separate method on > the ofproto class, to avoid an extra iteration on the actions. This > spreads the error checking across more locations, and makes the rule > lifecycle slightly more complex (actions must be checked before rule > construction). >
I would do the check call only for actions we know might not be supported. Jarno > I'll send out the series with this feedback applied anyway, and we can > look at it again. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev