diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index b60feceab63b..d2fc055f054a 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | |||
@@ -237,13 +237,16 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, | |||
237 | 237 | ||
238 | /* Full udp dst port must be given */ | 238 | /* Full udp dst port must be given */ |
239 | if (memchr_inv(&mask->dst, 0xff, sizeof(mask->dst))) | 239 | if (memchr_inv(&mask->dst, 0xff, sizeof(mask->dst))) |
240 | return -EOPNOTSUPP; | 240 | goto vxlan_match_offload_err; |
241 | 241 | ||
242 | if (mlx5e_vxlan_lookup_port(priv, be16_to_cpu(key->dst)) && | 242 | if (mlx5e_vxlan_lookup_port(priv, be16_to_cpu(key->dst)) && |
243 | MLX5_CAP_ESW(priv->mdev, vxlan_encap_decap)) | 243 | MLX5_CAP_ESW(priv->mdev, vxlan_encap_decap)) |
244 | parse_vxlan_attr(spec, f); | 244 | parse_vxlan_attr(spec, f); |
245 | else | 245 | else { |
246 | netdev_warn(priv->netdev, | ||
247 | "%d isn't an offloaded vxlan udp dport\n", be16_to_cpu(key->dst)); | ||
246 | return -EOPNOTSUPP; | 248 | return -EOPNOTSUPP; |
249 | } | ||
247 | 250 | ||
248 | MLX5_SET(fte_match_set_lyr_2_4, headers_c, | 251 | MLX5_SET(fte_match_set_lyr_2_4, headers_c, |
249 | udp_dport, ntohs(mask->dst)); | 252 | udp_dport, ntohs(mask->dst)); |
@@ -255,7 +258,10 @@ static int parse_tunnel_attr(struct mlx5e_priv *priv, | |||
255 | MLX5_SET(fte_match_set_lyr_2_4, headers_v, | 258 | MLX5_SET(fte_match_set_lyr_2_4, headers_v, |
256 | udp_sport, ntohs(key->src)); | 259 | udp_sport, ntohs(key->src)); |
257 | } else { /* udp dst port must be given */ | 260 | } else { /* udp dst port must be given */ |
258 | return -EOPNOTSUPP; | 261 | vxlan_match_offload_err: |
262 | netdev_warn(priv->netdev, | ||
263 | "IP tunnel decap offload supported only for vxlan, must set UDP dport\n"); | ||
264 | return -EOPNOTSUPP; | ||
259 | } | 265 | } |
260 | 266 | ||
261 | if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { | 267 | if (dissector_uses_key(f->dissector, FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS)) { |
@@ -346,6 +352,9 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, | |||
346 | if (parse_tunnel_attr(priv, spec, f)) | 352 | if (parse_tunnel_attr(priv, spec, f)) |
347 | return -EOPNOTSUPP; | 353 | return -EOPNOTSUPP; |
348 | break; | 354 | break; |
355 | case FLOW_DISSECTOR_KEY_IPV6_ADDRS: | ||
356 | netdev_warn(priv->netdev, | ||
357 | "IPv6 tunnel decap offload isn't supported\n"); | ||
349 | default: | 358 | default: |
350 | return -EOPNOTSUPP; | 359 | return -EOPNOTSUPP; |
351 | } | 360 | } |
@@ -792,13 +801,17 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv, | |||
792 | int tunnel_type; | 801 | int tunnel_type; |
793 | int err; | 802 | int err; |
794 | 803 | ||
795 | /* udp dst port must be given */ | 804 | /* udp dst port must be set */ |
796 | if (!memchr_inv(&key->tp_dst, 0, sizeof(key->tp_dst))) | 805 | if (!memchr_inv(&key->tp_dst, 0, sizeof(key->tp_dst))) |
797 | return -EOPNOTSUPP; | 806 | goto vxlan_encap_offload_err; |
798 | 807 | ||
799 | /* setting udp src port isn't supported */ | 808 | /* setting udp src port isn't supported */ |
800 | if (memchr_inv(&key->tp_src, 0, sizeof(key->tp_src))) | 809 | if (memchr_inv(&key->tp_src, 0, sizeof(key->tp_src))) { |
810 | vxlan_encap_offload_err: | ||
811 | netdev_warn(priv->netdev, | ||
812 | "must set udp dst port and not set udp src port\n"); | ||
801 | return -EOPNOTSUPP; | 813 | return -EOPNOTSUPP; |
814 | } | ||
802 | 815 | ||
803 | if (mlx5e_vxlan_lookup_port(priv, be16_to_cpu(key->tp_dst)) && | 816 | if (mlx5e_vxlan_lookup_port(priv, be16_to_cpu(key->tp_dst)) && |
804 | MLX5_CAP_ESW(priv->mdev, vxlan_encap_decap)) { | 817 | MLX5_CAP_ESW(priv->mdev, vxlan_encap_decap)) { |
@@ -806,6 +819,8 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv, | |||
806 | info.tun_id = tunnel_id_to_key32(key->tun_id); | 819 | info.tun_id = tunnel_id_to_key32(key->tun_id); |
807 | tunnel_type = MLX5_HEADER_TYPE_VXLAN; | 820 | tunnel_type = MLX5_HEADER_TYPE_VXLAN; |
808 | } else { | 821 | } else { |
822 | netdev_warn(priv->netdev, | ||
823 | "%d isn't an offloaded vxlan udp dport\n", be16_to_cpu(key->tp_dst)); | ||
809 | return -EOPNOTSUPP; | 824 | return -EOPNOTSUPP; |
810 | } | 825 | } |
811 | 826 | ||
@@ -813,6 +828,9 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv, | |||
813 | case AF_INET: | 828 | case AF_INET: |
814 | info.daddr = key->u.ipv4.dst; | 829 | info.daddr = key->u.ipv4.dst; |
815 | break; | 830 | break; |
831 | case AF_INET6: | ||
832 | netdev_warn(priv->netdev, | ||
833 | "IPv6 tunnel encap offload isn't supported\n"); | ||
816 | default: | 834 | default: |
817 | return -EOPNOTSUPP; | 835 | return -EOPNOTSUPP; |
818 | } | 836 | } |