Thomas Bogendoerfer 9e3578
From: Or Gerlitz <ogerlitz@mellanox.com>
Thomas Bogendoerfer 9e3578
Date: Tue, 13 Mar 2018 21:43:43 +0200
Thomas Bogendoerfer 9e3578
Subject: net/mlx5e: Avoid using the ipv6 stub in the TC offload neigh update
Thomas Bogendoerfer 9e3578
 path
Thomas Bogendoerfer 9e3578
Patch-mainline: v4.16
Thomas Bogendoerfer 9e3578
Git-commit: 423c9db29943cfc43e3a408192e9efa4178af6a1
Thomas Bogendoerfer 9e3578
References: bsc#1046303 FATE#322944
Thomas Bogendoerfer 9e3578
Thomas Bogendoerfer 9e3578
Currently we use the global ipv6_stub var to access the ipv6 global
Thomas Bogendoerfer 9e3578
nd table. This practice gets us to troubles when the stub is only partially
Thomas Bogendoerfer 9e3578
set e.g when ipv6 is loaded under the disabled policy. In this case, as of commit
Thomas Bogendoerfer 9e3578
343d60aada5a ("ipv6: change ipv6_stub_impl.ipv6_dst_lookup to take net argument")
Thomas Bogendoerfer 9e3578
the stub is not null, but stub->nd_tbl is and we crash.
Thomas Bogendoerfer 9e3578
Thomas Bogendoerfer 9e3578
As we can access the ipv6 nd_tbl directly, the fix is just to avoid the
Thomas Bogendoerfer 9e3578
reference through the stub. There is one place in the code where we
Thomas Bogendoerfer 9e3578
issue ipv6 route lookup and keep doing it through the stub, but that
Thomas Bogendoerfer 9e3578
mentioned commit makes sure we get -EAFNOSUPPORT from the stack.
Thomas Bogendoerfer 9e3578
Thomas Bogendoerfer 9e3578
Fixes: 232c001398ae ("net/mlx5e: Add support to neighbour update flow")
Thomas Bogendoerfer 9e3578
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Thomas Bogendoerfer 9e3578
Reviewed-by: Aviv Heller <avivh@mellanox.com>
Thomas Bogendoerfer 9e3578
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Thomas Bogendoerfer 9e3578
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 9e3578
---
Thomas Bogendoerfer 9e3578
 drivers/net/ethernet/mellanox/mlx5/core/en_rep.c |    6 +++---
Thomas Bogendoerfer 9e3578
 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c  |    2 +-
Thomas Bogendoerfer 9e3578
 2 files changed, 4 insertions(+), 4 deletions(-)
Thomas Bogendoerfer 9e3578
Thomas Bogendoerfer 9e3578
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
Thomas Bogendoerfer 9e3578
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
Thomas Bogendoerfer 9e3578
@@ -235,7 +235,7 @@ void mlx5e_remove_sqs_fwd_rules(struct m
Thomas Bogendoerfer 9e3578
 static void mlx5e_rep_neigh_update_init_interval(struct mlx5e_rep_priv *rpriv)
Thomas Bogendoerfer 9e3578
 {
Thomas Bogendoerfer 9e3578
 #if IS_ENABLED(CONFIG_IPV6)
Thomas Bogendoerfer 9e3578
-	unsigned long ipv6_interval = NEIGH_VAR(&ipv6_stub->nd_tbl->parms,
Thomas Bogendoerfer 9e3578
+	unsigned long ipv6_interval = NEIGH_VAR(&nd_tbl.parms,
Thomas Bogendoerfer 9e3578
 						DELAY_PROBE_TIME);
Thomas Bogendoerfer 9e3578
 #else
Thomas Bogendoerfer 9e3578
 	unsigned long ipv6_interval = ~0UL;
Thomas Bogendoerfer 9e3578
@@ -371,7 +371,7 @@ static int mlx5e_rep_netevent_event(stru
Thomas Bogendoerfer 9e3578
 	case NETEVENT_NEIGH_UPDATE:
Thomas Bogendoerfer 9e3578
 		n = ptr;
Thomas Bogendoerfer 9e3578
 #if IS_ENABLED(CONFIG_IPV6)
Thomas Bogendoerfer 9e3578
-		if (n->tbl != ipv6_stub->nd_tbl && n->tbl != &arp_tbl)
Thomas Bogendoerfer 9e3578
+		if (n->tbl != &nd_tbl && n->tbl != &arp_tbl)
Thomas Bogendoerfer 9e3578
 #else
Thomas Bogendoerfer 9e3578
 		if (n->tbl != &arp_tbl)
Thomas Bogendoerfer 9e3578
 #endif
Thomas Bogendoerfer 9e3578
@@ -419,7 +419,7 @@ static int mlx5e_rep_netevent_event(stru
Thomas Bogendoerfer 9e3578
 		 * done per device delay prob time parameter.
Thomas Bogendoerfer 9e3578
 		 */
Thomas Bogendoerfer 9e3578
 #if IS_ENABLED(CONFIG_IPV6)
Thomas Bogendoerfer 9e3578
-		if (!p->dev || (p->tbl != ipv6_stub->nd_tbl && p->tbl != &arp_tbl))
Thomas Bogendoerfer 9e3578
+		if (!p->dev || (p->tbl != &nd_tbl && p->tbl != &arp_tbl))
Thomas Bogendoerfer 9e3578
 #else
Thomas Bogendoerfer 9e3578
 		if (!p->dev || p->tbl != &arp_tbl)
Thomas Bogendoerfer 9e3578
 #endif
Thomas Bogendoerfer 9e3578
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
Thomas Bogendoerfer 9e3578
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
Thomas Bogendoerfer 9e3578
@@ -484,7 +484,7 @@ void mlx5e_tc_update_neigh_used_value(st
Thomas Bogendoerfer 9e3578
 		tbl = &arp_tbl;
Thomas Bogendoerfer 9e3578
 #if IS_ENABLED(CONFIG_IPV6)
Thomas Bogendoerfer 9e3578
 	else if (m_neigh->family == AF_INET6)
Thomas Bogendoerfer 9e3578
-		tbl = ipv6_stub->nd_tbl;
Thomas Bogendoerfer 9e3578
+		tbl = &nd_tbl;
Thomas Bogendoerfer 9e3578
 #endif
Thomas Bogendoerfer 9e3578
 	else
Thomas Bogendoerfer 9e3578
 		return;