mirror of
https://github.com/torvalds/linux.git
synced 2024-12-13 06:32:50 +00:00
net/mlx5e: Offload tuple rewrite for non-CT flows
Setting connection tracking OVS flows and then setting non-CT flows that
use tuple rewrite action (e.g. mod_tp_dst), causes the latter flows not
being offloaded.
Fix by using a stricter condition in modify_header_match_supported() to
check tuple rewrite support only for flows with CT action. The check is
factored out into standalone modify_tuple_supported() function to aid
readability.
Fixes: 7e36feeb04
("net/mlx5e: CT: Don't offload tuple rewrites for established tuples")
Signed-off-by: Dima Chumak <dchumak@nvidia.com>
Reviewed-by: Paul Blakey <paulb@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
7d6c86e3cc
commit
96b5b45858
@ -1181,7 +1181,8 @@ int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec)
|
||||
|
||||
mlx5e_tc_match_to_reg_get_match(spec, CTSTATE_TO_REG,
|
||||
&ctstate, &ctstate_mask);
|
||||
if (ctstate_mask)
|
||||
|
||||
if ((ctstate & ctstate_mask) == MLX5_CT_STATE_TRK_BIT)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ctstate_mask |= MLX5_CT_STATE_TRK_BIT;
|
||||
|
@ -2909,6 +2909,37 @@ static int is_action_keys_supported(const struct flow_action_entry *act,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool modify_tuple_supported(bool modify_tuple, bool ct_clear,
|
||||
bool ct_flow, struct netlink_ext_ack *extack,
|
||||
struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_spec *spec)
|
||||
{
|
||||
if (!modify_tuple || ct_clear)
|
||||
return true;
|
||||
|
||||
if (ct_flow) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload tuple modification with non-clear ct()");
|
||||
netdev_info(priv->netdev,
|
||||
"can't offload tuple modification with non-clear ct()");
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Add ct_state=-trk match so it will be offloaded for non ct flows
|
||||
* (or after clear action), as otherwise, since the tuple is changed,
|
||||
* we can't restore ct state
|
||||
*/
|
||||
if (mlx5_tc_ct_add_no_trk_match(spec)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload tuple modification with ct matches and no ct(clear) action");
|
||||
netdev_info(priv->netdev,
|
||||
"can't offload tuple modification with ct matches and no ct(clear) action");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool modify_header_match_supported(struct mlx5e_priv *priv,
|
||||
struct mlx5_flow_spec *spec,
|
||||
struct flow_action *flow_action,
|
||||
@ -2947,18 +2978,9 @@ static bool modify_header_match_supported(struct mlx5e_priv *priv,
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Add ct_state=-trk match so it will be offloaded for non ct flows
|
||||
* (or after clear action), as otherwise, since the tuple is changed,
|
||||
* we can't restore ct state
|
||||
*/
|
||||
if (!ct_clear && modify_tuple &&
|
||||
mlx5_tc_ct_add_no_trk_match(spec)) {
|
||||
NL_SET_ERR_MSG_MOD(extack,
|
||||
"can't offload tuple modify header with ct matches");
|
||||
netdev_info(priv->netdev,
|
||||
"can't offload tuple modify header with ct matches");
|
||||
if (!modify_tuple_supported(modify_tuple, ct_clear, ct_flow, extack,
|
||||
priv, spec))
|
||||
return false;
|
||||
}
|
||||
|
||||
ip_proto = MLX5_GET(fte_match_set_lyr_2_4, headers_v, ip_protocol);
|
||||
if (modify_ip_header && ip_proto != IPPROTO_TCP &&
|
||||
|
Loading…
Reference in New Issue
Block a user