On Tue, Feb 09, 2021 at 02:37:49PM +0800, we...@ucloud.cn wrote: > --- a/net/sched/cls_flower.c > +++ b/net/sched/cls_flower.c > @@ -30,6 +30,11 @@ > > #include <uapi/linux/netfilter/nf_conntrack_common.h> > > +#define TCA_FLOWER_KEY_CT_FLAGS_MAX \ > + ((__TCA_FLOWER_KEY_CT_FLAGS_MAX - 1) << 1) > +#define TCA_FLOWER_KEY_CT_FLAGS_MASK \ > + (TCA_FLOWER_KEY_CT_FLAGS_MAX - 1) > + > struct fl_flow_key { > struct flow_dissector_key_meta meta; > struct flow_dissector_key_control control; > @@ -686,8 +691,10 @@ static void *fl_get(struct tcf_proto *tp, u32 handle) > [TCA_FLOWER_KEY_ENC_IP_TTL_MASK] = { .type = NLA_U8 }, > [TCA_FLOWER_KEY_ENC_OPTS] = { .type = NLA_NESTED }, > [TCA_FLOWER_KEY_ENC_OPTS_MASK] = { .type = NLA_NESTED }, > - [TCA_FLOWER_KEY_CT_STATE] = { .type = NLA_U16 }, > - [TCA_FLOWER_KEY_CT_STATE_MASK] = { .type = NLA_U16 }, > + [TCA_FLOWER_KEY_CT_STATE] = > + NLA_POLICY_MASK(NLA_U16, TCA_FLOWER_KEY_CT_FLAGS_MASK), > + [TCA_FLOWER_KEY_CT_STATE_MASK] = > + NLA_POLICY_MASK(NLA_U16, TCA_FLOWER_KEY_CT_FLAGS_MASK), > [TCA_FLOWER_KEY_CT_ZONE] = { .type = NLA_U16 }, > [TCA_FLOWER_KEY_CT_ZONE_MASK] = { .type = NLA_U16 }, > [TCA_FLOWER_KEY_CT_MARK] = { .type = NLA_U32 }, > @@ -1390,12 +1397,33 @@ static int fl_set_enc_opt(struct nlattr **tb, struct > fl_flow_key *key, > return 0; > } > > +static int fl_validate_ct_state(u16 state, struct nlattr *tb, > + struct netlink_ext_ack *extack) > +{ > + if (state && !(state & TCA_FLOWER_KEY_CT_FLAGS_TRACKED)) { > + NL_SET_ERR_MSG_ATTR(extack, tb, > + "no trk, so no other flag can be set");
I just tested iproute2 and it can't report based on the attr here. Nonetheless, that would be iproute2 job and not the errmsg, I think. Reviewed-by: Marcelo Ricardo Leitner <marcelo.leit...@gmail.com> Thanks! > + return -EINVAL; > + } > + > + if (state & TCA_FLOWER_KEY_CT_FLAGS_NEW && > + state & TCA_FLOWER_KEY_CT_FLAGS_ESTABLISHED) { > + NL_SET_ERR_MSG_ATTR(extack, tb, > + "new and est are mutually exclusive"); > + return -EINVAL; > + } > + > + return 0; > +} > + > static int fl_set_key_ct(struct nlattr **tb, > struct flow_dissector_key_ct *key, > struct flow_dissector_key_ct *mask, > struct netlink_ext_ack *extack) > { > if (tb[TCA_FLOWER_KEY_CT_STATE]) { > + int err; > + > if (!IS_ENABLED(CONFIG_NF_CONNTRACK)) { > NL_SET_ERR_MSG(extack, "Conntrack isn't enabled"); > return -EOPNOTSUPP; > @@ -1403,6 +1431,13 @@ static int fl_set_key_ct(struct nlattr **tb, > fl_set_key_val(tb, &key->ct_state, TCA_FLOWER_KEY_CT_STATE, > &mask->ct_state, TCA_FLOWER_KEY_CT_STATE_MASK, > sizeof(key->ct_state)); > + > + err = fl_validate_ct_state(mask->ct_state, > + tb[TCA_FLOWER_KEY_CT_STATE_MASK], > + extack); > + if (err) > + return err; > + > } > if (tb[TCA_FLOWER_KEY_CT_ZONE]) { > if (!IS_ENABLED(CONFIG_NF_CONNTRACK_ZONES)) { > -- > 1.8.3.1 >