xref: /spdk/module/bdev/iscsi/bdev_iscsi_rpc.c (revision 6f338d4bf3a8a91b7abe377a605a321ea2b05bf7)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "bdev_iscsi.h"
7 #include "spdk/rpc.h"
8 #include "spdk/util.h"
9 #include "spdk/string.h"
10 
11 #include "spdk/log.h"
12 
13 struct rpc_bdev_iscsi_create {
14 	char *name;
15 	char *initiator_iqn;
16 	char *url;
17 };
18 
19 static const struct spdk_json_object_decoder rpc_bdev_iscsi_create_decoders[] = {
20 	{"name", offsetof(struct rpc_bdev_iscsi_create, name), spdk_json_decode_string},
21 	{"initiator_iqn", offsetof(struct rpc_bdev_iscsi_create, initiator_iqn), spdk_json_decode_string},
22 	{"url", offsetof(struct rpc_bdev_iscsi_create, url), spdk_json_decode_string},
23 };
24 
25 static void
26 free_rpc_bdev_iscsi_create(struct rpc_bdev_iscsi_create *req)
27 {
28 	free(req->name);
29 	free(req->initiator_iqn);
30 	free(req->url);
31 }
32 
33 static void
34 bdev_iscsi_create_cb(void *cb_arg, struct spdk_bdev *bdev, int status)
35 {
36 	struct spdk_jsonrpc_request *request = cb_arg;
37 	struct spdk_json_write_ctx *w;
38 
39 	if (status > 0) {
40 		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
41 						     "iSCSI error (%d).", status);
42 	} else if (status < 0) {
43 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
44 						 spdk_strerror(-status));
45 	} else {
46 		w = spdk_jsonrpc_begin_result(request);
47 		spdk_json_write_string(w, spdk_bdev_get_name(bdev));
48 		spdk_jsonrpc_end_result(request, w);
49 	}
50 }
51 
52 static void
53 rpc_bdev_iscsi_create(struct spdk_jsonrpc_request *request,
54 		      const struct spdk_json_val *params)
55 {
56 	struct rpc_bdev_iscsi_create req = {};
57 	int rc = 0;
58 
59 	if (spdk_json_decode_object(params, rpc_bdev_iscsi_create_decoders,
60 				    SPDK_COUNTOF(rpc_bdev_iscsi_create_decoders),
61 				    &req)) {
62 		SPDK_ERRLOG("spdk_json_decode_object failed\n");
63 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
64 						 "spdk_json_decode_object failed");
65 		goto cleanup;
66 	}
67 
68 	rc = create_iscsi_disk(req.name, req.url, req.initiator_iqn, bdev_iscsi_create_cb, request);
69 	if (rc) {
70 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
71 	}
72 
73 cleanup:
74 	free_rpc_bdev_iscsi_create(&req);
75 }
76 SPDK_RPC_REGISTER("bdev_iscsi_create", rpc_bdev_iscsi_create, SPDK_RPC_RUNTIME)
77 
78 struct rpc_delete_iscsi {
79 	char *name;
80 };
81 
82 static void
83 free_rpc_delete_iscsi(struct rpc_delete_iscsi *r)
84 {
85 	free(r->name);
86 }
87 
88 static const struct spdk_json_object_decoder rpc_delete_iscsi_decoders[] = {
89 	{"name", offsetof(struct rpc_delete_iscsi, name), spdk_json_decode_string},
90 };
91 
92 static void
93 rpc_bdev_iscsi_delete_cb(void *cb_arg, int bdeverrno)
94 {
95 	struct spdk_jsonrpc_request *request = cb_arg;
96 
97 	if (bdeverrno == 0) {
98 		spdk_jsonrpc_send_bool_response(request, true);
99 	} else {
100 		spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno));
101 	}
102 }
103 
104 static void
105 rpc_bdev_iscsi_delete(struct spdk_jsonrpc_request *request,
106 		      const struct spdk_json_val *params)
107 {
108 	struct rpc_delete_iscsi req = {NULL};
109 
110 	if (spdk_json_decode_object(params, rpc_delete_iscsi_decoders,
111 				    SPDK_COUNTOF(rpc_delete_iscsi_decoders),
112 				    &req)) {
113 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
114 						 "spdk_json_decode_object failed");
115 		goto cleanup;
116 	}
117 
118 	delete_iscsi_disk(req.name, rpc_bdev_iscsi_delete_cb, request);
119 
120 cleanup:
121 	free_rpc_delete_iscsi(&req);
122 }
123 SPDK_RPC_REGISTER("bdev_iscsi_delete", rpc_bdev_iscsi_delete, SPDK_RPC_RUNTIME)
124