mirror of https://gitee.com/openkylin/linux.git
net/mlx5e: Relocate the TC match on ip tos offload code section
The code section for offloading matches on ip tos (L3) should come
before and not after the one that deals with tcp/udp (L4) matches.
Otherwise, we might come up with wrong min-inline requirement, when
one attempts to match on both L3 and L4.
Fixes: fd7da28b28
('net/mlx5e: Offload TC matching on ip tos / traffic-class')
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Paul Blakey <paulb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
accd588332
commit
1f97a5265f
|
@ -888,6 +888,29 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
|||
*min_inline = MLX5_INLINE_MODE_IP;
|
||||
}
|
||||
|
||||
if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_IP)) {
|
||||
struct flow_dissector_key_ip *key =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
FLOW_DISSECTOR_KEY_IP,
|
||||
f->key);
|
||||
struct flow_dissector_key_ip *mask =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
FLOW_DISSECTOR_KEY_IP,
|
||||
f->mask);
|
||||
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_ecn, mask->tos & 0x3);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ecn, key->tos & 0x3);
|
||||
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_dscp, mask->tos >> 2);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_dscp, key->tos >> 2);
|
||||
|
||||
if (mask->tos)
|
||||
*min_inline = MLX5_INLINE_MODE_IP;
|
||||
|
||||
if (mask->ttl) /* currently not supported */
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_PORTS)) {
|
||||
struct flow_dissector_key_ports *key =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
|
@ -931,29 +954,6 @@ static int __parse_cls_flower(struct mlx5e_priv *priv,
|
|||
*min_inline = MLX5_INLINE_MODE_TCP_UDP;
|
||||
}
|
||||
|
||||
if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_IP)) {
|
||||
struct flow_dissector_key_ip *key =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
FLOW_DISSECTOR_KEY_IP,
|
||||
f->key);
|
||||
struct flow_dissector_key_ip *mask =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
FLOW_DISSECTOR_KEY_IP,
|
||||
f->mask);
|
||||
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_ecn, mask->tos & 0x3);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_ecn, key->tos & 0x3);
|
||||
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_dscp, mask->tos >> 2);
|
||||
MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_dscp, key->tos >> 2);
|
||||
|
||||
if (mask->tos)
|
||||
*min_inline = MLX5_INLINE_MODE_IP;
|
||||
|
||||
if (mask->ttl) /* currently not supported */
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_TCP)) {
|
||||
struct flow_dissector_key_tcp *key =
|
||||
skb_flow_dissector_target(f->dissector,
|
||||
|
|
Loading…
Reference in New Issue