aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorOr Gerlitz <ogerlitz@mellanox.com>2017-01-10 15:33:31 -0500
committerDavid S. Miller <davem@davemloft.net>2017-01-10 21:34:01 -0500
commit2fcd82e9be133e4ec777f66fd67a8fb8e7748b1b (patch)
tree873408cb414c0b3497985370e7e3645ec0495201 /drivers/net
parentcd3776638003b3362d9d7d1f27bcb80c276e2c28 (diff)
net/mlx5e: Warn when rejecting offload attempts of IP tunnels
We silently reject offloading of IPv6 tunnels, non vxlan tunnels, vxlan tunnels where the dst port to match is not provided, etc. Be a bit more verbose and print a warning so the user better realizes what went wrong here and can fix it. Fixes: a54e20b4fcae ('net/mlx5e: Add basic TC tunnel set action for SRIOV offloads') Fixes: bbd00f7e2349 ('net/mlx5e: Add TC tunnel release action for SRIOV offloads') Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Reviewed-by: Hadar Hen Zion <hadarh@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tc.c30
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; 261vxlan_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))) {
810vxlan_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 }