(TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT | \
TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST)
-#define TUNNEL_FLAGS_PRESENT (\
- _BITUL(IP_TUNNEL_CSUM_BIT) | \
- _BITUL(IP_TUNNEL_DONT_FRAGMENT_BIT) | \
- _BITUL(IP_TUNNEL_OAM_BIT) | \
- _BITUL(IP_TUNNEL_CRIT_OPT_BIT))
+#define TCA_FLOWER_KEY_ENC_FLAGS_POLICY_MASK \
+ (TCA_FLOWER_KEY_FLAGS_TUNNEL_CSUM | \
+ TCA_FLOWER_KEY_FLAGS_TUNNEL_DONT_FRAGMENT | \
+ TCA_FLOWER_KEY_FLAGS_TUNNEL_OAM | \
+ TCA_FLOWER_KEY_FLAGS_TUNNEL_CRIT_OPT)
struct fl_flow_key {
struct flow_dissector_key_meta meta;
[TCA_FLOWER_KEY_SPI_MASK] = { .type = NLA_U32 },
[TCA_FLOWER_L2_MISS] = NLA_POLICY_MAX(NLA_U8, 1),
[TCA_FLOWER_KEY_CFM] = { .type = NLA_NESTED },
- [TCA_FLOWER_KEY_ENC_FLAGS] = NLA_POLICY_MASK(NLA_U32,
- TUNNEL_FLAGS_PRESENT),
- [TCA_FLOWER_KEY_ENC_FLAGS_MASK] = NLA_POLICY_MASK(NLA_U32,
- TUNNEL_FLAGS_PRESENT),
+ [TCA_FLOWER_KEY_ENC_FLAGS] = NLA_POLICY_MASK(NLA_BE32,
+ TCA_FLOWER_KEY_ENC_FLAGS_POLICY_MASK),
+ [TCA_FLOWER_KEY_ENC_FLAGS_MASK] = NLA_POLICY_MASK(NLA_BE32,
+ TCA_FLOWER_KEY_ENC_FLAGS_POLICY_MASK),
};
static const struct nla_policy
return 0;
}
-static int fl_set_key_enc_flags(struct nlattr **tb, u32 *flags_key,
- u32 *flags_mask, struct netlink_ext_ack *extack)
-{
- /* mask is mandatory for flags */
- if (NL_REQ_ATTR_CHECK(extack, NULL, tb, TCA_FLOWER_KEY_ENC_FLAGS_MASK)) {
- NL_SET_ERR_MSG(extack, "missing enc_flags mask");
- return -EINVAL;
- }
-
- *flags_key = nla_get_u32(tb[TCA_FLOWER_KEY_ENC_FLAGS]);
- *flags_mask = nla_get_u32(tb[TCA_FLOWER_KEY_ENC_FLAGS_MASK]);
-
- return 0;
-}
-
static int fl_set_key(struct net *net, struct nlattr **tb,
struct fl_flow_key *key, struct fl_flow_key *mask,
struct netlink_ext_ack *extack)
}
if (tb[TCA_FLOWER_KEY_ENC_FLAGS])
- ret = fl_set_key_enc_flags(tb, &key->enc_flags.flags,
- &mask->enc_flags.flags, extack);
+ ret = fl_set_key_flags(tb, true, &key->enc_control.flags,
+ &mask->enc_control.flags, extack);
return ret;
}
return err;
}
-static int fl_dump_key_enc_flags(struct sk_buff *skb,
- struct flow_dissector_key_enc_flags *key,
- struct flow_dissector_key_enc_flags *mask)
-{
- if (!memchr_inv(mask, 0, sizeof(*mask)))
- return 0;
-
- if (nla_put_u32(skb, TCA_FLOWER_KEY_ENC_FLAGS, key->flags))
- return -EMSGSIZE;
-
- if (nla_put_u32(skb, TCA_FLOWER_KEY_ENC_FLAGS_MASK, mask->flags))
- return -EMSGSIZE;
-
- return 0;
-}
-
static int fl_dump_key_options(struct sk_buff *skb, int enc_opt_type,
struct flow_dissector_key_enc_opts *enc_opts)
{
if (fl_dump_key_cfm(skb, &key->cfm, &mask->cfm))
goto nla_put_failure;
- if (fl_dump_key_enc_flags(skb, &key->enc_flags, &mask->enc_flags))
+ if (fl_dump_key_flags(skb, true, key->enc_control.flags,
+ mask->enc_control.flags))
goto nla_put_failure;
return 0;