[PATCH v2 net-next 3/3] mlxsw: spectrum_router: Return extack message on abort due to fib rules

2017-10-27 Thread David Ahern
Adding a FIB rule on a spectrum platform silently aborts FIB offload:
$ ip ru add pref 99 from all to 192.168.1.1 table 10
$ dmesg -c
[  623.144736] mlxsw_spectrum :03:00.0: FIB abort triggered. Note that 
FIB entries are no longer being offloaded to this device.

This patch reworks FIB rule handling to return a message to the user:
$ ip ru add pref 99 from all to 8.8.8.8 table 11
Error: spectrum: FIB rules not supported. Aborting offload.

spectrum currently only checks whether the fib rule is a default rule or
an l3mdev rule, both of which it knows how to handle. Any other it aborts
FIB offload. Move the processing to check the rule type inline with the
user request. If the rule is an unsupported one, then a work queue entry
is used to abort the offload. Change the rule delete handling to just
return since it does nothing at the moment.

Signed-off-by: David Ahern 
---
 .../net/ethernet/mellanox/mlxsw/spectrum_router.c  | 108 +
 1 file changed, 66 insertions(+), 42 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 27b632cac991..9fe4cdb23189 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -5234,7 +5234,6 @@ static void mlxsw_sp_router_fib4_event_work(struct 
work_struct *work)
struct mlxsw_sp_fib_event_work *fib_work =
container_of(work, struct mlxsw_sp_fib_event_work, work);
struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp;
-   struct fib_rule *rule;
bool replace, append;
int err;
 
@@ -5256,12 +5255,11 @@ static void mlxsw_sp_router_fib4_event_work(struct 
work_struct *work)
mlxsw_sp_router_fib4_del(mlxsw_sp, &fib_work->fen_info);
fib_info_put(fib_work->fen_info.fi);
break;
-   case FIB_EVENT_RULE_ADD: /* fall through */
-   case FIB_EVENT_RULE_DEL:
-   rule = fib_work->fr_info.rule;
-   if (!fib4_rule_default(rule) && !rule->l3mdev)
-   mlxsw_sp_router_fib_abort(mlxsw_sp);
-   fib_rule_put(rule);
+   case FIB_EVENT_RULE_ADD:
+   /* if we get here, a rule was added that we do not support.
+* just do the fib_abort
+*/
+   mlxsw_sp_router_fib_abort(mlxsw_sp);
break;
case FIB_EVENT_NH_ADD: /* fall through */
case FIB_EVENT_NH_DEL:
@@ -5279,7 +5277,6 @@ static void mlxsw_sp_router_fib6_event_work(struct 
work_struct *work)
struct mlxsw_sp_fib_event_work *fib_work =
container_of(work, struct mlxsw_sp_fib_event_work, work);
struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp;
-   struct fib_rule *rule;
bool replace;
int err;
 
@@ -5298,12 +5295,11 @@ static void mlxsw_sp_router_fib6_event_work(struct 
work_struct *work)
mlxsw_sp_router_fib6_del(mlxsw_sp, fib_work->fen6_info.rt);
mlxsw_sp_rt6_release(fib_work->fen6_info.rt);
break;
-   case FIB_EVENT_RULE_ADD: /* fall through */
-   case FIB_EVENT_RULE_DEL:
-   rule = fib_work->fr_info.rule;
-   if (!fib6_rule_default(rule) && !rule->l3mdev)
-   mlxsw_sp_router_fib_abort(mlxsw_sp);
-   fib_rule_put(rule);
+   case FIB_EVENT_RULE_ADD:
+   /* if we get here, a rule was added that we do not support.
+* just do the fib_abort
+*/
+   mlxsw_sp_router_fib_abort(mlxsw_sp);
break;
}
rtnl_unlock();
@@ -5315,7 +5311,6 @@ static void mlxsw_sp_router_fibmr_event_work(struct 
work_struct *work)
struct mlxsw_sp_fib_event_work *fib_work =
container_of(work, struct mlxsw_sp_fib_event_work, work);
struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp;
-   struct fib_rule *rule;
bool replace;
int err;
 
@@ -5347,12 +5342,11 @@ static void mlxsw_sp_router_fibmr_event_work(struct 
work_struct *work)
  &fib_work->ven_info);
dev_put(fib_work->ven_info.dev);
break;
-   case FIB_EVENT_RULE_ADD: /* fall through */
-   case FIB_EVENT_RULE_DEL:
-   rule = fib_work->fr_info.rule;
-   if (!ipmr_rule_default(rule) && !rule->l3mdev)
-   mlxsw_sp_router_fib_abort(mlxsw_sp);
-   fib_rule_put(rule);
+   case FIB_EVENT_RULE_ADD:
+   /* if we get here, a rule was added that we do not support.
+* just do the fib_abort
+*/
+   mlxsw_sp_router_fib_abort(mlxsw_sp);
break;
}
rtnl_unlock();
@@ -5363,7 +5357,6 @@ static void mlxsw_sp_router_fib4_event(struct 
mlxsw_sp_fib_event_work *fib_work,
   

Re: [PATCH v2 net-next 3/3] mlxsw: spectrum_router: Return extack message on abort due to fib rules

2017-10-28 Thread Ido Schimmel
On Fri, Oct 27, 2017 at 05:37:14PM -0700, David Ahern wrote:
> Adding a FIB rule on a spectrum platform silently aborts FIB offload:
> $ ip ru add pref 99 from all to 192.168.1.1 table 10
> $ dmesg -c
> [  623.144736] mlxsw_spectrum :03:00.0: FIB abort triggered. Note 
> that FIB entries are no longer being offloaded to this device.
> 
> This patch reworks FIB rule handling to return a message to the user:
> $ ip ru add pref 99 from all to 8.8.8.8 table 11
> Error: spectrum: FIB rules not supported. Aborting offload.
> 
> spectrum currently only checks whether the fib rule is a default rule or
> an l3mdev rule, both of which it knows how to handle. Any other it aborts
> FIB offload. Move the processing to check the rule type inline with the
> user request. If the rule is an unsupported one, then a work queue entry
> is used to abort the offload. Change the rule delete handling to just
> return since it does nothing at the moment.
> 
> Signed-off-by: David Ahern 

Reviewed-by: Ido Schimmel 

I'll follow-up with a patch to notify about IPv6 source-specific routes
that also trigger abort.

Another possible use case for this, is something Petr is working on. We
currently assume IP-in-IP tunnel parameters don't change after creation,
but Petr has a patchset that adds support for NETDEV_CHANGE events in
mlxsw.

It's possible that after parameters are changed, we can no longer
offload the tunnel (for example, because user enabled sequence
counters). With this infrastructure, we can let the user know about it.

Thanks!