blob: 8de4e002f6ec73e08f4d4f3dae768c085432f26e [file] [log] [blame]
/*
* Copyright (C) 2023 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 "error_reporting.h"
#include <uapi/err.h>
#ifdef STORAGE_ENABLE_ERROR_REPORTING
#include <lib/tipc/tipc.h>
#include <lib/tipc/tipc_srv.h>
#include <trusty/uuid.h>
#include <trusty_log.h>
#include <storage_consts.h>
#include <interface/metrics/metrics.h>
#include "block_device_tipc.h"
#define TLOG_TAG "ss-err_rep"
struct uuid storage_service_uuid = STORAGE_SERVICE_UUID;
char storage_service_uuid_str[UUID_STR_SIZE];
handle_t metrics_chan;
static void init_uuid_str(void) {
if (storage_service_uuid_str[0] == '\0') {
uuid_to_str(&storage_service_uuid, storage_service_uuid_str);
}
}
static enum trusty_file_system map_fs_name(const char* name) {
if (name == file_system_id_tp) {
return TRUSTY_FS_TP;
}
if (name == file_system_id_tdp) {
return TRUSTY_FS_TDP;
}
if (name == file_system_id_td) {
return TRUSTY_FS_TD;
}
if (name == file_system_id_tdea) {
return TRUSTY_FS_TDEA;
}
if (name == file_system_id_nsp) {
return TRUSTY_FS_NSP;
}
TLOGI("Unknown fs name: %s\n", name);
return TRUSTY_FS_UNKNOWN;
}
void do_error_report(enum trusty_storage_error_type type,
const char* fs_name,
enum trusty_block_type block_type) {
init_uuid_str();
struct metrics_report_storage_error_req atom = {
.error = TRUSTY_STORAGE_ERROR_UNKNOWN,
.app_id = {},
.client_app_id = {},
.write = 0,
.file_system = TRUSTY_FS_UNKNOWN,
.file_path_hash = 0,
.block_type = TRUSTY_BLOCKTYPE_UNKNOWN,
.repair_counter = 0,
};
struct metrics_req req;
req.cmd = METRICS_CMD_REPORT_STORAGE_ERROR;
memcpy(storage_service_uuid_str, atom.app_id, UUID_STR_SIZE);
struct iovec iovs[] = {
{
.iov_base = &req,
.iov_len = sizeof(req),
},
{
.iov_base = &atom,
.iov_len = sizeof(atom),
},
};
struct ipc_msg msg = {
.num_iov = countof(iovs),
.iov = iovs,
};
size_t total_len = sizeof(req) + sizeof(atom);
int rc = send_msg(metrics_chan, &msg);
if (rc != (int)total_len) {
TLOGE("failed (%d) to send storage event\n", rc);
}
}
int connect_metrics_ta(void) {
handle_t chan;
int rc = tipc_connect(&chan, METRICS_CONSUMER_PORT);
if (rc != NO_ERROR) {
TLOGE("failed (%d) to connect to metrics TA\n", rc);
return rc;
}
metrics_chan = chan;
return NO_ERROR;
}
#else /* STORAGE_ENABLE_ERROR_REPORTING */
void do_error_report(enum trusty_storage_error_type type,
const char* fs_name,
enum trusty_block_type block_type) {}
int connect_metrics_ta(void) {
return NO_ERROR;
}
#endif /* STORAGE_ENABLE_ERROR_REPORTING */