18625cc18SKonrad Sztyber /* SPDX-License-Identifier: BSD-3-Clause
28625cc18SKonrad Sztyber * Copyright (C) 2023 Intel Corporation. All rights reserved.
38625cc18SKonrad Sztyber */
48625cc18SKonrad Sztyber
58625cc18SKonrad Sztyber #include "accel_error.h"
68625cc18SKonrad Sztyber #include "spdk/accel.h"
78625cc18SKonrad Sztyber #include "spdk/rpc.h"
88625cc18SKonrad Sztyber #include "spdk/string.h"
98625cc18SKonrad Sztyber #include "spdk/util.h"
108625cc18SKonrad Sztyber
118625cc18SKonrad Sztyber static int
rpc_accel_error_decode_opcode(const struct spdk_json_val * val,void * out)128625cc18SKonrad Sztyber rpc_accel_error_decode_opcode(const struct spdk_json_val *val, void *out)
138625cc18SKonrad Sztyber {
148625cc18SKonrad Sztyber enum spdk_accel_opcode *opcode = out;
158625cc18SKonrad Sztyber char *opstr = NULL;
168625cc18SKonrad Sztyber int i, rc;
178625cc18SKonrad Sztyber
188625cc18SKonrad Sztyber rc = spdk_json_decode_string(val, &opstr);
198625cc18SKonrad Sztyber if (rc != 0) {
208625cc18SKonrad Sztyber return rc;
218625cc18SKonrad Sztyber }
228625cc18SKonrad Sztyber
238625cc18SKonrad Sztyber rc = -EINVAL;
248625cc18SKonrad Sztyber for (i = 0; i < SPDK_ACCEL_OPC_LAST; ++i) {
258625cc18SKonrad Sztyber if (strcmp(spdk_accel_get_opcode_name((enum spdk_accel_opcode)i), opstr) == 0) {
268625cc18SKonrad Sztyber *opcode = (enum spdk_accel_opcode)i;
278625cc18SKonrad Sztyber rc = 0;
288625cc18SKonrad Sztyber break;
298625cc18SKonrad Sztyber }
308625cc18SKonrad Sztyber }
318625cc18SKonrad Sztyber
328625cc18SKonrad Sztyber free(opstr);
338625cc18SKonrad Sztyber
348625cc18SKonrad Sztyber return rc;
358625cc18SKonrad Sztyber }
368625cc18SKonrad Sztyber
378625cc18SKonrad Sztyber static int
rpc_accel_error_decode_type(const struct spdk_json_val * val,void * out)388625cc18SKonrad Sztyber rpc_accel_error_decode_type(const struct spdk_json_val *val, void *out)
398625cc18SKonrad Sztyber {
408625cc18SKonrad Sztyber enum accel_error_inject_type *type = out;
418625cc18SKonrad Sztyber char *typestr = NULL;
428625cc18SKonrad Sztyber int i, rc;
438625cc18SKonrad Sztyber
448625cc18SKonrad Sztyber rc = spdk_json_decode_string(val, &typestr);
458625cc18SKonrad Sztyber if (rc != 0) {
468625cc18SKonrad Sztyber return rc;
478625cc18SKonrad Sztyber }
488625cc18SKonrad Sztyber
498625cc18SKonrad Sztyber rc = -EINVAL;
508625cc18SKonrad Sztyber for (i = 0; i < ACCEL_ERROR_INJECT_MAX; ++i) {
518625cc18SKonrad Sztyber if (strcmp(accel_error_get_type_name(i), typestr) == 0) {
528625cc18SKonrad Sztyber *type = (enum accel_error_inject_type)i;
538625cc18SKonrad Sztyber rc = 0;
548625cc18SKonrad Sztyber break;
558625cc18SKonrad Sztyber }
568625cc18SKonrad Sztyber }
578625cc18SKonrad Sztyber
588625cc18SKonrad Sztyber free(typestr);
598625cc18SKonrad Sztyber
608625cc18SKonrad Sztyber return rc;
618625cc18SKonrad Sztyber }
628625cc18SKonrad Sztyber
638625cc18SKonrad Sztyber static const struct spdk_json_object_decoder rpc_accel_error_inject_error_decoders[] = {
648625cc18SKonrad Sztyber {"opcode", offsetof(struct accel_error_inject_opts, opcode), rpc_accel_error_decode_opcode},
658625cc18SKonrad Sztyber {"type", offsetof(struct accel_error_inject_opts, type), rpc_accel_error_decode_type},
668625cc18SKonrad Sztyber {"count", offsetof(struct accel_error_inject_opts, count), spdk_json_decode_uint64, true},
67*760cb023SKonrad Sztyber {"interval", offsetof(struct accel_error_inject_opts, interval), spdk_json_decode_uint64, true},
68bb019612SKonrad Sztyber {"errcode", offsetof(struct accel_error_inject_opts, errcode), spdk_json_decode_int32, true},
698625cc18SKonrad Sztyber };
708625cc18SKonrad Sztyber
718625cc18SKonrad Sztyber static void
rpc_accel_error_inject_error(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)728625cc18SKonrad Sztyber rpc_accel_error_inject_error(struct spdk_jsonrpc_request *request,
738625cc18SKonrad Sztyber const struct spdk_json_val *params)
748625cc18SKonrad Sztyber {
758625cc18SKonrad Sztyber struct accel_error_inject_opts opts = {.count = UINT64_MAX};
768625cc18SKonrad Sztyber int rc;
778625cc18SKonrad Sztyber
788625cc18SKonrad Sztyber rc = spdk_json_decode_object(params, rpc_accel_error_inject_error_decoders,
798625cc18SKonrad Sztyber SPDK_COUNTOF(rpc_accel_error_inject_error_decoders), &opts);
808625cc18SKonrad Sztyber if (rc != 0) {
818625cc18SKonrad Sztyber spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
828625cc18SKonrad Sztyber return;
838625cc18SKonrad Sztyber }
848625cc18SKonrad Sztyber
858625cc18SKonrad Sztyber rc = accel_error_inject_error(&opts);
868625cc18SKonrad Sztyber if (rc != 0) {
878625cc18SKonrad Sztyber spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
888625cc18SKonrad Sztyber return;
898625cc18SKonrad Sztyber }
908625cc18SKonrad Sztyber
918625cc18SKonrad Sztyber spdk_jsonrpc_send_bool_response(request, true);
928625cc18SKonrad Sztyber }
938625cc18SKonrad Sztyber
948625cc18SKonrad Sztyber SPDK_RPC_REGISTER("accel_error_inject_error", rpc_accel_error_inject_error, SPDK_RPC_RUNTIME)
95