fib_node->fib_entry = NULL;
 }
 
+static bool mlxsw_sp_fib4_allow_replace(struct mlxsw_sp_fib4_entry *fib4_entry)
+{
+       struct mlxsw_sp_fib_node *fib_node = fib4_entry->common.fib_node;
+       struct mlxsw_sp_fib4_entry *fib4_replaced;
+
+       if (!fib_node->fib_entry)
+               return true;
+
+       fib4_replaced = container_of(fib_node->fib_entry,
+                                    struct mlxsw_sp_fib4_entry, common);
+       if (fib4_entry->tb_id == RT_TABLE_MAIN &&
+           fib4_replaced->tb_id == RT_TABLE_LOCAL)
+               return false;
+
+       return true;
+}
+
 static int
 mlxsw_sp_router_fib4_replace(struct mlxsw_sp *mlxsw_sp,
                             const struct fib_entry_notifier_info *fen_info)
                goto err_fib4_entry_create;
        }
 
+       if (!mlxsw_sp_fib4_allow_replace(fib4_entry)) {
+               mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_entry);
+               mlxsw_sp_fib_node_put(mlxsw_sp, fib_node);
+               return 0;
+       }
+
        replaced = fib_node->fib_entry;
        err = mlxsw_sp_fib_node_entry_link(mlxsw_sp, &fib4_entry->common);
        if (err) {
                return;
 
        fib4_entry = mlxsw_sp_fib4_entry_lookup(mlxsw_sp, fen_info);
-       if (WARN_ON(!fib4_entry))
+       if (!fib4_entry)
                return;
        fib_node = fib4_entry->common.fib_node;
 
        return NULL;
 }
 
+static bool mlxsw_sp_fib6_allow_replace(struct mlxsw_sp_fib6_entry *fib6_entry)
+{
+       struct mlxsw_sp_fib_node *fib_node = fib6_entry->common.fib_node;
+       struct mlxsw_sp_fib6_entry *fib6_replaced;
+       struct fib6_info *rt, *rt_replaced;
+
+       if (!fib_node->fib_entry)
+               return true;
+
+       fib6_replaced = container_of(fib_node->fib_entry,
+                                    struct mlxsw_sp_fib6_entry,
+                                    common);
+       rt = mlxsw_sp_fib6_entry_rt(fib6_entry);
+       rt_replaced = mlxsw_sp_fib6_entry_rt(fib6_replaced);
+       if (rt->fib6_table->tb6_id == RT_TABLE_MAIN &&
+           rt_replaced->fib6_table->tb6_id == RT_TABLE_LOCAL)
+               return false;
+
+       return true;
+}
+
 static int mlxsw_sp_router_fib6_replace(struct mlxsw_sp *mlxsw_sp,
                                        struct fib6_info **rt_arr,
                                        unsigned int nrt6)
                goto err_fib6_entry_create;
        }
 
+       if (!mlxsw_sp_fib6_allow_replace(fib6_entry)) {
+               mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry);
+               mlxsw_sp_fib_node_put(mlxsw_sp, fib_node);
+               return 0;
+       }
+
        replaced = fib_node->fib_entry;
        err = mlxsw_sp_fib_node_entry_link(mlxsw_sp, &fib6_entry->common);
        if (err)