OSDN Git Service

mlxsw: spectrum_router: Make route creation and destruction symmetric
authorIdo Schimmel <idosch@mellanox.com>
Thu, 26 Dec 2019 16:41:15 +0000 (18:41 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 26 Dec 2019 21:13:22 +0000 (13:13 -0800)
Host routes that perform decapsulation of IP in IP tunnels have a
special adjacency entry linked to them. This entry stores information
such as the expected underlay source IP. When the route is deleted this
entry needs to be freed.

The allocation of the adjacency entry happens in
mlxsw_sp_fib4_entry_type_set(), but it is freed in
mlxsw_sp_fib4_node_entry_unlink().

Create a new function - mlxsw_sp_fib4_entry_type_unset() - and free the
adjacency entry there.

This will allow us to consolidate mlxsw_sp_fib{4,6}_node_entry_unlink()
in the next patch.

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

index 0439b23..9408327 100644 (file)
@@ -4480,6 +4480,19 @@ mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp,
        }
 }
 
+static void
+mlxsw_sp_fib4_entry_type_unset(struct mlxsw_sp *mlxsw_sp,
+                              struct mlxsw_sp_fib_entry *fib_entry)
+{
+       switch (fib_entry->type) {
+       case MLXSW_SP_FIB_ENTRY_TYPE_IPIP_DECAP:
+               mlxsw_sp_fib_entry_decap_fini(mlxsw_sp, fib_entry);
+               break;
+       default:
+               break;
+       }
+}
+
 static struct mlxsw_sp_fib4_entry *
 mlxsw_sp_fib4_entry_create(struct mlxsw_sp *mlxsw_sp,
                           struct mlxsw_sp_fib_node *fib_node,
@@ -4512,6 +4525,7 @@ mlxsw_sp_fib4_entry_create(struct mlxsw_sp *mlxsw_sp,
        return fib4_entry;
 
 err_nexthop4_group_get:
+       mlxsw_sp_fib4_entry_type_unset(mlxsw_sp, fib_entry);
 err_fib4_entry_type_set:
        kfree(fib4_entry);
        return ERR_PTR(err);
@@ -4521,6 +4535,7 @@ static void mlxsw_sp_fib4_entry_destroy(struct mlxsw_sp *mlxsw_sp,
                                        struct mlxsw_sp_fib4_entry *fib4_entry)
 {
        mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common);
+       mlxsw_sp_fib4_entry_type_unset(mlxsw_sp, &fib4_entry->common);
        kfree(fib4_entry);
 }
 
@@ -4823,9 +4838,6 @@ mlxsw_sp_fib4_node_entry_unlink(struct mlxsw_sp *mlxsw_sp,
 {
        mlxsw_sp_fib_node_entry_del(mlxsw_sp, &fib4_entry->common);
        list_del(&fib4_entry->common.list);
-
-       if (fib4_entry->common.type == MLXSW_SP_FIB_ENTRY_TYPE_IPIP_DECAP)
-               mlxsw_sp_fib_entry_decap_fini(mlxsw_sp, &fib4_entry->common);
 }
 
 static void mlxsw_sp_fib4_entry_replace(struct mlxsw_sp *mlxsw_sp,