mlxsw: spectrum_router: Extract mlxsw_sp_fi_is_gateway()
authorPetr Machata <petrm@mellanox.com>
Sat, 2 Sep 2017 21:49:20 +0000 (23:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Sep 2017 03:23:25 +0000 (20:23 -0700)
For IPv4 IP-in-IP offload, routes that direct traffic to IP-in-IP
devices need to be considered gateway routes as well. That involves a
bit more logic, so extract the current test to a separate function,
where the logic can be later added.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 72e386b647b98d5ee356bc4fdabfba9216e2b8ee..04e188772109b6149aceb6b319628c7e4d8a7ca0 100644 (file)
@@ -2382,6 +2382,12 @@ static void mlxsw_sp_nexthop_rif_gone_sync(struct mlxsw_sp *mlxsw_sp,
        }
 }
 
+static bool mlxsw_sp_fi_is_gateway(const struct mlxsw_sp *mlxsw_sp,
+                                  const struct fib_info *fi)
+{
+       return fi->fib_nh->nh_scope == RT_SCOPE_LINK;
+}
+
 static struct mlxsw_sp_nexthop_group *
 mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi)
 {
@@ -2401,7 +2407,7 @@ mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi)
        INIT_LIST_HEAD(&nh_grp->fib_list);
        nh_grp->neigh_tbl = &arp_tbl;
 
-       nh_grp->gateway = fi->fib_nh->nh_scope == RT_SCOPE_LINK;
+       nh_grp->gateway = mlxsw_sp_fi_is_gateway(mlxsw_sp, fi);
        nh_grp->count = fi->fib_nhs;
        fib_info_hold(fi);
        for (i = 0; i < nh_grp->count; i++) {
@@ -2801,10 +2807,10 @@ mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp,
                fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
                return 0;
        case RTN_UNICAST:
-               if (fi->fib_nh->nh_scope != RT_SCOPE_LINK)
-                       fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
-               else
+               if (mlxsw_sp_fi_is_gateway(mlxsw_sp, fi))
                        fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_REMOTE;
+               else
+                       fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
                return 0;
        default:
                return -EINVAL;