xref: /spdk/module/accel/error/accel_error_rpc.c (revision 760cb0232b8a15d4632a102b81a4473adff9d3d2)
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