blob: bb046bdd706f06cf05a1a53a961e957153df382d [file] [log] [blame] [edit]
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "tipc_service.h"
#include <interface/storage/storage.h>
#include <lib/tipc/tipc.h>
#include "block_device_tipc.h"
#include "client_tipc.h"
#define SS_ERR(args...) fprintf(stderr, "ss: " args)
// TODO: Put this somewhere central?
static const char* port_name(enum storage_filesystem_type fs_type) {
switch (fs_type) {
case STORAGE_TP:
return STORAGE_CLIENT_TP_PORT;
case STORAGE_TDEA:
return STORAGE_CLIENT_TDEA_PORT;
case STORAGE_TDP:
return STORAGE_CLIENT_TDP_PORT;
case STORAGE_TD:
return STORAGE_CLIENT_TD_PORT;
case STORAGE_NSP:
return STORAGE_CLIENT_NSP_PORT;
case STORAGE_FILESYSTEMS_COUNT:
default:
SS_ERR("%s: Tried to get port for unrecognized storage_filesystem_type type: (%d)\n",
__func__, fs_type);
return NULL;
}
}
static int client_port_context_init(struct client_port_context* self,
enum storage_filesystem_type fs_type,
struct block_device_tipc* ctx,
struct tipc_hset* hset) {
if (!block_device_tipc_fs_connected(ctx, fs_type)) {
return 0;
}
self->tr_state = block_device_tipc_get_fs(ctx, fs_type);
return client_create_port(hset, &self->client_ctx, port_name(fs_type));
}
static void client_port_context_destroy(struct client_port_context* self,
enum storage_filesystem_type fs_type,
struct block_device_tipc* ctx) {
if (!block_device_tipc_fs_connected(ctx, fs_type)) {
return;
}
ipc_port_destroy(&self->client_ctx);
}
int storage_tipc_service_init(struct storage_tipc_service* self,
struct block_device_tipc* ctx,
struct tipc_hset* hset) {
int ret = client_port_context_init(&self->fs_rpmb, STORAGE_TP, ctx, hset);
if (ret < 0) {
goto err_fs_rpmb_create_port;
}
ret = client_port_context_init(&self->fs_rpmb_boot, STORAGE_TDEA, ctx,
hset);
if (ret < 0) {
goto err_fs_rpmb_boot_create_port;
}
ret = client_port_context_init(&self->fs_tdp, STORAGE_TDP, ctx, hset);
if (ret < 0) {
goto err_fs_tdp_create_port;
}
ret = client_port_context_init(&self->fs_ns, STORAGE_TD, ctx, hset);
if (ret < 0) {
goto err_fs_ns_create_port;
}
ret = client_port_context_init(&self->fs_nsp, STORAGE_NSP, ctx, hset);
if (ret < 0) {
goto err_fs_nsp_create_port;
}
return 0;
err_fs_nsp_create_port:
client_port_context_destroy(&self->fs_ns, STORAGE_TD, ctx);
err_fs_ns_create_port:
client_port_context_destroy(&self->fs_tdp, STORAGE_TDP, ctx);
err_fs_tdp_create_port:
client_port_context_destroy(&self->fs_rpmb_boot, STORAGE_TDEA, ctx);
err_fs_rpmb_boot_create_port:
client_port_context_destroy(&self->fs_rpmb, STORAGE_TP, ctx);
err_fs_rpmb_create_port:
return ret;
}
void storage_tipc_service_destroy(struct storage_tipc_service* self,
struct block_device_tipc* ctx) {
client_port_context_destroy(&self->fs_nsp, STORAGE_NSP, ctx);
client_port_context_destroy(&self->fs_ns, STORAGE_TD, ctx);
client_port_context_destroy(&self->fs_tdp, STORAGE_TDP, ctx);
client_port_context_destroy(&self->fs_rpmb_boot, STORAGE_TDEA, ctx);
client_port_context_destroy(&self->fs_rpmb, STORAGE_TP, ctx);
}