xref: /spdk/lib/jsonrpc/jsonrpc_internal.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2016 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #ifndef SPDK_JSONRPC_INTERNAL_H_
7 #define SPDK_JSONRPC_INTERNAL_H_
8 
9 #include "spdk/stdinc.h"
10 
11 #include "spdk/jsonrpc.h"
12 
13 #include "spdk/log.h"
14 
15 #define SPDK_JSONRPC_RECV_BUF_SIZE	(32 * 1024)
16 #define SPDK_JSONRPC_SEND_BUF_SIZE_INIT	(32 * 1024)
17 #define SPDK_JSONRPC_SEND_BUF_SIZE_MAX	(32 * 1024 * 1024)
18 #define SPDK_JSONRPC_ID_MAX_LEN		128
19 #define SPDK_JSONRPC_MAX_CONNS		64
20 #define SPDK_JSONRPC_MAX_VALUES		1024
21 #define SPDK_JSONRPC_CLIENT_MAX_VALUES		8192
22 
23 struct spdk_jsonrpc_request {
24 	struct spdk_jsonrpc_server_conn *conn;
25 
26 	/* Copy of request id value */
27 	const struct spdk_json_val *id;
28 
29 	/* Total space allocated for send_buf */
30 	size_t send_buf_size;
31 
32 	/* Number of bytes used in send_buf (<= send_buf_size) */
33 	size_t send_len;
34 
35 	size_t send_offset;
36 
37 	uint8_t *recv_buffer;
38 	struct spdk_json_val *values;
39 	size_t values_cnt;
40 
41 	uint8_t *send_buf;
42 
43 	struct spdk_json_write_ctx *response;
44 
45 	STAILQ_ENTRY(spdk_jsonrpc_request) link;
46 };
47 
48 struct spdk_jsonrpc_server_conn {
49 	struct spdk_jsonrpc_server *server;
50 	int sockfd;
51 	bool closed;
52 	size_t recv_len;
53 	uint8_t recv_buf[SPDK_JSONRPC_RECV_BUF_SIZE];
54 	uint32_t outstanding_requests;
55 
56 	pthread_spinlock_t queue_lock;
57 	STAILQ_HEAD(, spdk_jsonrpc_request) send_queue;
58 
59 	struct spdk_jsonrpc_request *send_request;
60 
61 	spdk_jsonrpc_conn_closed_fn close_cb;
62 	void *close_cb_ctx;
63 
64 	TAILQ_ENTRY(spdk_jsonrpc_server_conn) link;
65 };
66 
67 struct spdk_jsonrpc_server {
68 	int sockfd;
69 	spdk_jsonrpc_handle_request_fn handle_request;
70 
71 	TAILQ_HEAD(, spdk_jsonrpc_server_conn) free_conns;
72 	TAILQ_HEAD(, spdk_jsonrpc_server_conn) conns;
73 
74 	struct spdk_jsonrpc_server_conn conns_array[SPDK_JSONRPC_MAX_CONNS];
75 };
76 
77 struct spdk_jsonrpc_client_request {
78 	/* Total space allocated for send_buf */
79 	size_t send_buf_size;
80 
81 	/* Number of bytes used in send_buf (<= send_buf_size) */
82 	size_t send_len;
83 
84 	size_t send_offset;
85 
86 	uint8_t *send_buf;
87 };
88 
89 struct spdk_jsonrpc_client_response_internal {
90 	struct spdk_jsonrpc_client_response jsonrpc;
91 	bool ready;
92 	uint8_t *buf;
93 	size_t values_cnt;
94 	struct spdk_json_val values[];
95 };
96 
97 struct spdk_jsonrpc_client {
98 	int sockfd;
99 	bool connected;
100 
101 	size_t recv_buf_size;
102 	size_t recv_offset;
103 	char *recv_buf;
104 
105 	/* Parsed response */
106 	struct spdk_jsonrpc_client_response_internal *resp;
107 	struct spdk_jsonrpc_client_request *request;
108 };
109 
110 /* jsonrpc_server_tcp */
111 void jsonrpc_server_handle_request(struct spdk_jsonrpc_request *request,
112 				   const struct spdk_json_val *method,
113 				   const struct spdk_json_val *params);
114 void jsonrpc_server_handle_error(struct spdk_jsonrpc_request *request, int error);
115 
116 /* Might be called from any thread */
117 void jsonrpc_server_send_response(struct spdk_jsonrpc_request *request);
118 
119 /* jsonrpc_server */
120 int jsonrpc_parse_request(struct spdk_jsonrpc_server_conn *conn, const void *json,
121 			  size_t size);
122 
123 /* Must be called only from server poll thread */
124 void jsonrpc_free_request(struct spdk_jsonrpc_request *request);
125 
126 /*
127  * Parse JSON data as RPC command response.
128  *
129  * \param client structure pointer of jsonrpc client
130  *
131  * \return 0 On success. Negative error code in error
132  * -EAGAIN - If the provided data is not a complete JSON value (SPDK_JSON_PARSE_INCOMPLETE)
133  * -EINVAL - If the provided data has invalid JSON syntax and can't be parsed (SPDK_JSON_PARSE_INVALID).
134  * -ENOSPC - No space left to store parsed response.
135  */
136 int jsonrpc_parse_response(struct spdk_jsonrpc_client *client);
137 
138 #endif
139