Commit 5ca7ef29 authored by Edward Cree's avatar Edward Cree Committed by Jakub Kicinski

sfc: add Layer 3 flag matches to ef100 TC offload

Support matching on ip_frag and ip_firstfrag.
Signed-off-by: default avatarEdward Cree <ecree.xilinx@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c178dff3
...@@ -263,6 +263,18 @@ static int efx_mae_match_check_cap_typ(u8 support, enum mask_type typ) ...@@ -263,6 +263,18 @@ static int efx_mae_match_check_cap_typ(u8 support, enum mask_type typ)
mask_type_name(typ), #_field); \ mask_type_name(typ), #_field); \
rc; \ rc; \
}) })
/* Booleans need special handling */
#define CHECK_BIT(_mcdi, _field) ({ \
enum mask_type typ = mask->_field ? MASK_ONES : MASK_ZEROES; \
\
rc = efx_mae_match_check_cap_typ(supported_fields[MAE_FIELD_ ## _mcdi],\
typ); \
if (rc) \
NL_SET_ERR_MSG_FMT_MOD(extack, \
"No support for %s mask in field %s", \
mask_type_name(typ), #_field); \
rc; \
})
int efx_mae_match_check_caps(struct efx_nic *efx, int efx_mae_match_check_caps(struct efx_nic *efx,
const struct efx_tc_match_fields *mask, const struct efx_tc_match_fields *mask,
...@@ -299,10 +311,13 @@ int efx_mae_match_check_caps(struct efx_nic *efx, ...@@ -299,10 +311,13 @@ int efx_mae_match_check_caps(struct efx_nic *efx,
CHECK(SRC_IP6, src_ip6) || CHECK(SRC_IP6, src_ip6) ||
CHECK(DST_IP6, dst_ip6) || CHECK(DST_IP6, dst_ip6) ||
#endif #endif
CHECK_BIT(IS_IP_FRAG, ip_frag) ||
CHECK_BIT(IP_FIRST_FRAG, ip_firstfrag) ||
CHECK(RECIRC_ID, recirc_id)) CHECK(RECIRC_ID, recirc_id))
return rc; return rc;
return 0; return 0;
} }
#undef CHECK_BIT
#undef CHECK #undef CHECK
static bool efx_mae_asl_id(u32 id) static bool efx_mae_asl_id(u32 id)
...@@ -472,6 +487,16 @@ static int efx_mae_populate_match_criteria(MCDI_DECLARE_STRUCT_PTR(match_crit), ...@@ -472,6 +487,16 @@ static int efx_mae_populate_match_criteria(MCDI_DECLARE_STRUCT_PTR(match_crit),
} }
MCDI_STRUCT_SET_DWORD(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK, MCDI_STRUCT_SET_DWORD(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_INGRESS_MPORT_SELECTOR_MASK,
match->mask.ingress_port); match->mask.ingress_port);
EFX_POPULATE_DWORD_2(*_MCDI_STRUCT_DWORD(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS),
MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_IP_FRAG,
match->value.ip_frag,
MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FIRST_FRAG,
match->value.ip_firstfrag);
EFX_POPULATE_DWORD_2(*_MCDI_STRUCT_DWORD(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_FLAGS_MASK),
MAE_FIELD_MASK_VALUE_PAIRS_V2_IS_IP_FRAG,
match->mask.ip_frag,
MAE_FIELD_MASK_VALUE_PAIRS_V2_IP_FIRST_FRAG,
match->mask.ip_firstfrag);
MCDI_STRUCT_SET_BYTE(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID, MCDI_STRUCT_SET_BYTE(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID,
match->value.recirc_id); match->value.recirc_id);
MCDI_STRUCT_SET_BYTE(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK, MCDI_STRUCT_SET_BYTE(match_crit, MAE_FIELD_MASK_VALUE_PAIRS_V2_RECIRC_ID_MASK,
......
...@@ -168,7 +168,15 @@ static int efx_tc_flower_parse_match(struct efx_nic *efx, ...@@ -168,7 +168,15 @@ static int efx_tc_flower_parse_match(struct efx_nic *efx,
break; break;
} }
if (fm.mask->flags) { if (fm.mask->flags & FLOW_DIS_IS_FRAGMENT) {
match->value.ip_frag = fm.key->flags & FLOW_DIS_IS_FRAGMENT;
match->mask.ip_frag = true;
}
if (fm.mask->flags & FLOW_DIS_FIRST_FRAG) {
match->value.ip_firstfrag = fm.key->flags & FLOW_DIS_FIRST_FRAG;
match->mask.ip_firstfrag = true;
}
if (fm.mask->flags & ~(FLOW_DIS_IS_FRAGMENT | FLOW_DIS_FIRST_FRAG)) {
NL_SET_ERR_MSG_FMT_MOD(extack, "Unsupported match on control.flags %#x", NL_SET_ERR_MSG_FMT_MOD(extack, "Unsupported match on control.flags %#x",
fm.mask->flags); fm.mask->flags);
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -38,6 +38,7 @@ struct efx_tc_match_fields { ...@@ -38,6 +38,7 @@ struct efx_tc_match_fields {
#ifdef CONFIG_IPV6 #ifdef CONFIG_IPV6
struct in6_addr src_ip6, dst_ip6; struct in6_addr src_ip6, dst_ip6;
#endif #endif
bool ip_frag, ip_firstfrag;
}; };
struct efx_tc_match { struct efx_tc_match {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment