mlxsw: spectrum_router: Keep nexthops in a linked list
authorArkadi Sharshevsky <arkadis@mellanox.com>
Mon, 25 Sep 2017 08:32:23 +0000 (10:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Sep 2017 03:04:35 +0000 (20:04 -0700)
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>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 0bd93dc..0cd4b2a 100644 (file)
@@ -78,6 +78,7 @@ struct mlxsw_sp_router {
        struct rhashtable neigh_ht;
        struct rhashtable nexthop_group_ht;
        struct rhashtable nexthop_ht;
+       struct list_head nexthop_list;
        struct {
                struct mlxsw_sp_lpm_tree *trees;
                unsigned int tree_count;
@@ -2028,6 +2029,7 @@ struct mlxsw_sp_nexthop_key {
 struct mlxsw_sp_nexthop {
        struct list_head neigh_list_node; /* member of neigh entry list */
        struct list_head rif_list_node;
+       struct list_head router_list_node;
        struct mlxsw_sp_nexthop_group *nh_grp; /* pointer back to the group
                                                * this belongs to
                                                */
@@ -2784,6 +2786,8 @@ static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp,
        if (err)
                return err;
 
+       list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list);
+
        if (!dev)
                return 0;
 
@@ -2807,6 +2811,7 @@ static void mlxsw_sp_nexthop4_fini(struct mlxsw_sp *mlxsw_sp,
                                   struct mlxsw_sp_nexthop *nh)
 {
        mlxsw_sp_nexthop4_type_fini(mlxsw_sp, nh);
+       list_del(&nh->router_list_node);
        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;
        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)
                return 0;
        nh->ifindex = dev->ifindex;
@@ -4056,6 +4063,7 @@ static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp,
                                   struct mlxsw_sp_nexthop *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,
@@ -5990,6 +5998,7 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp)
        if (err)
                goto err_nexthop_group_ht_init;
 
+       INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_list);
        err = mlxsw_sp_lpm_init(mlxsw_sp);
        if (err)
                goto err_lpm_init;