mlxsw: spectrum_router: Create loopback RIF during initialization
Up until now RIFs (router interfaces) were created on demand (e.g., when an IP address was added to a netdev). However, sometimes the device needs to be provided with a RIF when one might not be available. For example, adjacency entries that drop packets need to be programmed with an egress RIF despite the RIF not being used to forward packets. Create such a RIF during initialization so that it could be used later on to support blackhole nexthops. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
23c01ed3b0
commit
07c78536ef
@@ -8918,6 +8918,30 @@ static void mlxsw_sp_router_ll_op_ctx_fini(struct mlxsw_sp_router *router)
|
|||||||
kfree(router->ll_op_ctx);
|
kfree(router->ll_op_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp_lb_rif_init(struct mlxsw_sp *mlxsw_sp)
|
||||||
|
{
|
||||||
|
u16 lb_rif_index;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
err = mlxsw_sp_router_ul_rif_get(mlxsw_sp, RT_TABLE_MAIN,
|
||||||
|
&lb_rif_index);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
mlxsw_sp->router->lb_rif_index = lb_rif_index;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
@@ -8974,6 +8998,10 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
|||||||
if (err)
|
if (err)
|
||||||
goto err_vrs_init;
|
goto err_vrs_init;
|
||||||
|
|
||||||
|
err = mlxsw_sp_lb_rif_init(mlxsw_sp);
|
||||||
|
if (err)
|
||||||
|
goto err_lb_rif_init;
|
||||||
|
|
||||||
err = mlxsw_sp_neigh_init(mlxsw_sp);
|
err = mlxsw_sp_neigh_init(mlxsw_sp);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_neigh_init;
|
goto err_neigh_init;
|
||||||
@@ -9039,6 +9067,8 @@ err_dscp_init:
|
|||||||
err_mp_hash_init:
|
err_mp_hash_init:
|
||||||
mlxsw_sp_neigh_fini(mlxsw_sp);
|
mlxsw_sp_neigh_fini(mlxsw_sp);
|
||||||
err_neigh_init:
|
err_neigh_init:
|
||||||
|
mlxsw_sp_lb_rif_fini(mlxsw_sp);
|
||||||
|
err_lb_rif_init:
|
||||||
mlxsw_sp_vrs_fini(mlxsw_sp);
|
mlxsw_sp_vrs_fini(mlxsw_sp);
|
||||||
err_vrs_init:
|
err_vrs_init:
|
||||||
mlxsw_sp_mr_fini(mlxsw_sp);
|
mlxsw_sp_mr_fini(mlxsw_sp);
|
||||||
@@ -9074,6 +9104,7 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
|
|||||||
mlxsw_core_flush_owq();
|
mlxsw_core_flush_owq();
|
||||||
WARN_ON(!list_empty(&mlxsw_sp->router->fib_event_queue));
|
WARN_ON(!list_empty(&mlxsw_sp->router->fib_event_queue));
|
||||||
mlxsw_sp_neigh_fini(mlxsw_sp);
|
mlxsw_sp_neigh_fini(mlxsw_sp);
|
||||||
|
mlxsw_sp_lb_rif_fini(mlxsw_sp);
|
||||||
mlxsw_sp_vrs_fini(mlxsw_sp);
|
mlxsw_sp_vrs_fini(mlxsw_sp);
|
||||||
mlxsw_sp_mr_fini(mlxsw_sp);
|
mlxsw_sp_mr_fini(mlxsw_sp);
|
||||||
mlxsw_sp_lpm_fini(mlxsw_sp);
|
mlxsw_sp_lpm_fini(mlxsw_sp);
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ struct mlxsw_sp_router {
|
|||||||
/* One set of ops for each protocol: IPv4 and IPv6 */
|
/* One set of ops for each protocol: IPv4 and IPv6 */
|
||||||
const struct mlxsw_sp_router_ll_ops *proto_ll_ops[MLXSW_SP_L3_PROTO_MAX];
|
const struct mlxsw_sp_router_ll_ops *proto_ll_ops[MLXSW_SP_L3_PROTO_MAX];
|
||||||
struct mlxsw_sp_fib_entry_op_ctx *ll_op_ctx;
|
struct mlxsw_sp_fib_entry_op_ctx *ll_op_ctx;
|
||||||
|
u16 lb_rif_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlxsw_sp_fib_entry_priv {
|
struct mlxsw_sp_fib_entry_priv {
|
||||||
|
|||||||
Reference in New Issue
Block a user