mirror of
https://github.com/torvalds/linux
synced 2024-10-16 00:10:42 +00:00
Merge branch 'net-sparx5-flower-validate-control-flags'
Asbjørn Sloth Tønnesen says: ==================== net: sparx5: flower: validate control flags This series adds flower control flags validation to the sparx5 driver, and changes it from assuming that it handles all control flags, to instead reject rules if they have masked any unknown/unsupported control flags. Reviewed-by: Daniel Machon <daniel.machon@microchip.com> Tested-by: Daniel Machon <daniel.machon@microchip.com> v1: https://lore.kernel.org/netdev/20240423102728.228765-1-ast@fiberby.net/ ==================== Link: https://lore.kernel.org/r/20240424121632.459022-1-ast@fiberby.net Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
df654941d8
|
@ -159,13 +159,14 @@ sparx5_tc_flower_handler_basic_usage(struct vcap_tc_flower_parse_usage *st)
|
|||
static int
|
||||
sparx5_tc_flower_handler_control_usage(struct vcap_tc_flower_parse_usage *st)
|
||||
{
|
||||
struct netlink_ext_ack *extack = st->fco->common.extack;
|
||||
struct flow_match_control mt;
|
||||
u32 value, mask;
|
||||
int err = 0;
|
||||
|
||||
flow_rule_match_control(st->frule, &mt);
|
||||
|
||||
if (mt.mask->flags) {
|
||||
if (mt.mask->flags & (FLOW_DIS_IS_FRAGMENT | FLOW_DIS_FIRST_FRAG)) {
|
||||
u8 is_frag_key = !!(mt.key->flags & FLOW_DIS_IS_FRAGMENT);
|
||||
u8 is_frag_mask = !!(mt.mask->flags & FLOW_DIS_IS_FRAGMENT);
|
||||
u8 is_frag_idx = (is_frag_key << 1) | is_frag_mask;
|
||||
|
@ -178,7 +179,7 @@ sparx5_tc_flower_handler_control_usage(struct vcap_tc_flower_parse_usage *st)
|
|||
u8 vdt = sparx5_vcap_frag_map[is_frag_idx][first_frag_idx];
|
||||
|
||||
if (vdt == FRAG_INVAL) {
|
||||
NL_SET_ERR_MSG_MOD(st->fco->common.extack,
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"Match on invalid fragment flag combination");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -190,17 +191,20 @@ sparx5_tc_flower_handler_control_usage(struct vcap_tc_flower_parse_usage *st)
|
|||
err = vcap_rule_add_key_u32(st->vrule,
|
||||
VCAP_KF_L3_FRAGMENT_TYPE,
|
||||
value, mask);
|
||||
if (err)
|
||||
goto out;
|
||||
if (err) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "ip_frag parse error");
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!flow_rule_is_supp_control_flags(FLOW_DIS_IS_FRAGMENT |
|
||||
FLOW_DIS_FIRST_FRAG,
|
||||
mt.mask->flags, extack))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
st->used_keys |= BIT_ULL(FLOW_DISSECTOR_KEY_CONTROL);
|
||||
|
||||
return err;
|
||||
|
||||
out:
|
||||
NL_SET_ERR_MSG_MOD(st->fco->common.extack, "ip_frag parse error");
|
||||
return err;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Loading…
Reference in a new issue