mlxsw: spectrum_router: Maintain CRIF for fallback loopback RIF
authorPetr Machata <petrm@nvidia.com>
Thu, 22 Jun 2023 13:33:05 +0000 (15:33 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 24 Jun 2023 02:01:56 +0000 (19:01 -0700)
CRIFs are generally not maintained for loopback RIFs. However, the RIF for
the default VRF is used for offloading of blackhole nexthops. Nexthops
expect to have a valid CRIF. Therefore in this patch, add code to maintain
CRIF for the loopback RIF as well.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Danielle Ratson <danieller@nvidia.com>
Link: https://lore.kernel.org/r/7f2b2fcc98770167ed1254a904c3f7f585ba43f0.1687438411.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h

index d251a92..c4d538e 100644 (file)
@@ -10731,9 +10731,14 @@ static void __mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
 static int mlxsw_sp_lb_rif_init(struct mlxsw_sp *mlxsw_sp,
                                struct netlink_ext_ack *extack)
 {
+       struct mlxsw_sp_router *router = mlxsw_sp->router;
        struct mlxsw_sp_rif *lb_rif;
        int err;
 
+       router->lb_crif = mlxsw_sp_crif_alloc(NULL);
+       if (IS_ERR(router->lb_crif))
+               return PTR_ERR(router->lb_crif);
+
        /* Create a generic loopback RIF associated with the main table
         * (default VRF). Any table can be used, but the main table exists
         * anyway, so we do not waste resources.
@@ -10741,17 +10746,22 @@ static int mlxsw_sp_lb_rif_init(struct mlxsw_sp *mlxsw_sp,
        lb_rif = mlxsw_sp_ul_rif_get(mlxsw_sp, RT_TABLE_MAIN, extack);
        if (IS_ERR(lb_rif)) {
                err = PTR_ERR(lb_rif);
-               return err;
+               goto err_ul_rif_get;
        }
 
        mlxsw_sp->router->lb_rif_index = lb_rif->rif_index;
 
        return 0;
+
+err_ul_rif_get:
+       mlxsw_sp_crif_free(router->lb_crif);
+       return err;
 }
 
 static void mlxsw_sp_lb_rif_fini(struct mlxsw_sp *mlxsw_sp)
 {
        mlxsw_sp_router_ul_rif_put(mlxsw_sp, mlxsw_sp->router->lb_rif_index);
+       mlxsw_sp_crif_free(mlxsw_sp->router->lb_crif);
 }
 
 static int mlxsw_sp1_router_init(struct mlxsw_sp *mlxsw_sp)
index b223e80..0909cf2 100644 (file)
@@ -61,6 +61,7 @@ struct mlxsw_sp_router {
        struct mutex lock; /* Protects shared router resources */
        struct mlxsw_sp_fib_entry_op_ctx *ll_op_ctx;
        u16 lb_rif_index;
+       struct mlxsw_sp_crif *lb_crif;
        const struct mlxsw_sp_adj_grp_size_range *adj_grp_size_ranges;
        size_t adj_grp_size_ranges_count;
        struct delayed_work nh_grp_activity_dw;