mlxsw: spectrum_router: Keep nexthops in a linked list
Keep nexthops in a linked list for easy access. Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
c0859d697c
Коммит
dbe4598c1e
|
@ -78,6 +78,7 @@ struct mlxsw_sp_router {
|
||||||
struct rhashtable neigh_ht;
|
struct rhashtable neigh_ht;
|
||||||
struct rhashtable nexthop_group_ht;
|
struct rhashtable nexthop_group_ht;
|
||||||
struct rhashtable nexthop_ht;
|
struct rhashtable nexthop_ht;
|
||||||
|
struct list_head nexthop_list;
|
||||||
struct {
|
struct {
|
||||||
struct mlxsw_sp_lpm_tree *trees;
|
struct mlxsw_sp_lpm_tree *trees;
|
||||||
unsigned int tree_count;
|
unsigned int tree_count;
|
||||||
|
@ -2028,6 +2029,7 @@ struct mlxsw_sp_nexthop_key {
|
||||||
struct mlxsw_sp_nexthop {
|
struct mlxsw_sp_nexthop {
|
||||||
struct list_head neigh_list_node; /* member of neigh entry list */
|
struct list_head neigh_list_node; /* member of neigh entry list */
|
||||||
struct list_head rif_list_node;
|
struct list_head rif_list_node;
|
||||||
|
struct list_head router_list_node;
|
||||||
struct mlxsw_sp_nexthop_group *nh_grp; /* pointer back to the group
|
struct mlxsw_sp_nexthop_group *nh_grp; /* pointer back to the group
|
||||||
* this belongs to
|
* this belongs to
|
||||||
*/
|
*/
|
||||||
|
@ -2784,6 +2786,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -2807,6 +2811,7 @@ static void mlxsw_sp_nexthop4_fini(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_nexthop *nh)
|
struct mlxsw_sp_nexthop *nh)
|
||||||
{
|
{
|
||||||
mlxsw_sp_nexthop4_type_fini(mlxsw_sp, nh);
|
mlxsw_sp_nexthop4_type_fini(mlxsw_sp, nh);
|
||||||
|
list_del(&nh->router_list_node);
|
||||||
mlxsw_sp_nexthop_remove(mlxsw_sp, nh);
|
mlxsw_sp_nexthop_remove(mlxsw_sp, nh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4045,6 +4050,8 @@ static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp,
|
||||||
nh->nh_grp = nh_grp;
|
nh->nh_grp = nh_grp;
|
||||||
memcpy(&nh->gw_addr, &rt->rt6i_gateway, sizeof(nh->gw_addr));
|
memcpy(&nh->gw_addr, &rt->rt6i_gateway, sizeof(nh->gw_addr));
|
||||||
|
|
||||||
|
list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return 0;
|
return 0;
|
||||||
nh->ifindex = dev->ifindex;
|
nh->ifindex = dev->ifindex;
|
||||||
|
@ -4056,6 +4063,7 @@ static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct mlxsw_sp_nexthop *nh)
|
struct mlxsw_sp_nexthop *nh)
|
||||||
{
|
{
|
||||||
mlxsw_sp_nexthop6_type_fini(mlxsw_sp, nh);
|
mlxsw_sp_nexthop6_type_fini(mlxsw_sp, nh);
|
||||||
|
list_del(&nh->router_list_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool mlxsw_sp_rt6_is_gateway(const struct mlxsw_sp *mlxsw_sp,
|
static bool mlxsw_sp_rt6_is_gateway(const struct mlxsw_sp *mlxsw_sp,
|
||||||
|
@ -5990,6 +5998,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
|
||||||
if (err)
|
if (err)
|
||||||
goto err_nexthop_group_ht_init;
|
goto err_nexthop_group_ht_init;
|
||||||
|
|
||||||
|
INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_list);
|
||||||
err = mlxsw_sp_lpm_init(mlxsw_sp);
|
err = mlxsw_sp_lpm_init(mlxsw_sp);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_lpm_init;
|
goto err_lpm_init;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче