1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2018 Intel Corporation.
3 * All rights reserved.
4 */
5
6
7 #include "spdk/rpc.h"
8 #include "spdk/string.h"
9 #include "spdk/notify.h"
10 #include "spdk/env.h"
11 #include "spdk/util.h"
12
13 #include "spdk/log.h"
14
15 static int
notify_get_types_cb(const struct spdk_notify_type * type,void * ctx)16 notify_get_types_cb(const struct spdk_notify_type *type, void *ctx)
17 {
18 spdk_json_write_string((struct spdk_json_write_ctx *)ctx, spdk_notify_type_get_name(type));
19 return 0;
20 }
21
22 static void
rpc_notify_get_types(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)23 rpc_notify_get_types(struct spdk_jsonrpc_request *request,
24 const struct spdk_json_val *params)
25 {
26 struct spdk_json_write_ctx *w;
27
28 if (params != NULL) {
29 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
30 "No parameters required");
31 return;
32 }
33
34 w = spdk_jsonrpc_begin_result(request);
35 spdk_json_write_array_begin(w);
36 spdk_notify_foreach_type(notify_get_types_cb, w);
37 spdk_json_write_array_end(w);
38
39 spdk_jsonrpc_end_result(request, w);
40 }
41 SPDK_RPC_REGISTER("notify_get_types", rpc_notify_get_types, SPDK_RPC_RUNTIME)
42
43 struct rpc_notify_get_notifications {
44 uint64_t id;
45 uint64_t max;
46
47 struct spdk_json_write_ctx *w;
48 };
49
50 static const struct spdk_json_object_decoder rpc_notify_get_notifications_decoders[] = {
51 {"id", offsetof(struct rpc_notify_get_notifications, id), spdk_json_decode_uint64, true},
52 {"max", offsetof(struct rpc_notify_get_notifications, max), spdk_json_decode_uint64, true},
53 };
54
55
56 static int
notify_get_notifications_cb(uint64_t id,const struct spdk_notify_event * ev,void * ctx)57 notify_get_notifications_cb(uint64_t id, const struct spdk_notify_event *ev, void *ctx)
58 {
59 struct rpc_notify_get_notifications *req = ctx;
60
61 spdk_json_write_object_begin(req->w);
62 spdk_json_write_named_string(req->w, "type", ev->type);
63 spdk_json_write_named_string(req->w, "ctx", ev->ctx);
64 spdk_json_write_named_uint64(req->w, "id", id);
65 spdk_json_write_object_end(req->w);
66 return 0;
67 }
68
69 static void
rpc_notify_get_notifications(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)70 rpc_notify_get_notifications(struct spdk_jsonrpc_request *request,
71 const struct spdk_json_val *params)
72 {
73 struct rpc_notify_get_notifications req = {0, UINT64_MAX};
74
75 if (params &&
76 spdk_json_decode_object(params, rpc_notify_get_notifications_decoders,
77 SPDK_COUNTOF(rpc_notify_get_notifications_decoders), &req)) {
78 SPDK_DEBUGLOG(notify_rpc, "spdk_json_decode_object failed\n");
79
80 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
81 spdk_strerror(EINVAL));
82 return;
83 }
84
85
86 req.w = spdk_jsonrpc_begin_result(request);
87
88 spdk_json_write_array_begin(req.w);
89 spdk_notify_foreach_event(req.id, req.max, notify_get_notifications_cb, &req);
90 spdk_json_write_array_end(req.w);
91
92 spdk_jsonrpc_end_result(request, req.w);
93 }
94 SPDK_RPC_REGISTER("notify_get_notifications", rpc_notify_get_notifications, SPDK_RPC_RUNTIME)
95
96 SPDK_LOG_REGISTER_COMPONENT(notify_rpc)
97