xref: /spdk/lib/jsonrpc/jsonrpc_internal.h (revision 2fb672af968d9495a388262bd76f63c74b347af1)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2016 Intel Corporation.
3376d117cSDaniel Verkamp  *   All rights reserved.
4376d117cSDaniel Verkamp  */
5376d117cSDaniel Verkamp 
6376d117cSDaniel Verkamp #ifndef SPDK_JSONRPC_INTERNAL_H_
7376d117cSDaniel Verkamp #define SPDK_JSONRPC_INTERNAL_H_
8376d117cSDaniel Verkamp 
9b961d9ccSBen Walker #include "spdk/stdinc.h"
10b961d9ccSBen Walker 
11376d117cSDaniel Verkamp #include "spdk/jsonrpc.h"
12376d117cSDaniel Verkamp 
134e8e97c8STomasz Zawadzki #include "spdk/log.h"
14376d117cSDaniel Verkamp 
15376d117cSDaniel Verkamp #define SPDK_JSONRPC_RECV_BUF_SIZE	(32 * 1024)
16c7852cf9SDaniel Verkamp #define SPDK_JSONRPC_SEND_BUF_SIZE_INIT	(32 * 1024)
17c7852cf9SDaniel Verkamp #define SPDK_JSONRPC_SEND_BUF_SIZE_MAX	(32 * 1024 * 1024)
18977fd230SDaniel Verkamp #define SPDK_JSONRPC_ID_MAX_LEN		128
19376d117cSDaniel Verkamp #define SPDK_JSONRPC_MAX_CONNS		64
20376d117cSDaniel Verkamp #define SPDK_JSONRPC_MAX_VALUES		1024
2192df9955SMichael Haeuptle #define SPDK_JSONRPC_CLIENT_MAX_VALUES		8192
22376d117cSDaniel Verkamp 
232bdec64fSDaniel Verkamp struct spdk_jsonrpc_request {
242bdec64fSDaniel Verkamp 	struct spdk_jsonrpc_server_conn *conn;
25977fd230SDaniel Verkamp 
26977fd230SDaniel Verkamp 	/* Copy of request id value */
2763978010SPawel Wodkowski 	const struct spdk_json_val *id;
284e003b67SDaniel Verkamp 
29c7852cf9SDaniel Verkamp 	/* Total space allocated for send_buf */
30c7852cf9SDaniel Verkamp 	size_t send_buf_size;
31c7852cf9SDaniel Verkamp 
32c7852cf9SDaniel Verkamp 	/* Number of bytes used in send_buf (<= send_buf_size) */
334e003b67SDaniel Verkamp 	size_t send_len;
34c7852cf9SDaniel Verkamp 
354e003b67SDaniel Verkamp 	size_t send_offset;
36c7852cf9SDaniel Verkamp 
3763978010SPawel Wodkowski 	uint8_t *recv_buffer;
3863978010SPawel Wodkowski 	struct spdk_json_val *values;
3963978010SPawel Wodkowski 	size_t values_cnt;
4063978010SPawel Wodkowski 
41c7852cf9SDaniel Verkamp 	uint8_t *send_buf;
42b066126bSPawel Wodkowski 
43a15dcb0bSPawel Kaminski 	struct spdk_json_write_ctx *response;
44a15dcb0bSPawel Kaminski 
45b066126bSPawel Wodkowski 	STAILQ_ENTRY(spdk_jsonrpc_request) link;
462bdec64fSDaniel Verkamp };
472bdec64fSDaniel Verkamp 
48376d117cSDaniel Verkamp struct spdk_jsonrpc_server_conn {
49376d117cSDaniel Verkamp 	struct spdk_jsonrpc_server *server;
50376d117cSDaniel Verkamp 	int sockfd;
514e003b67SDaniel Verkamp 	bool closed;
52376d117cSDaniel Verkamp 	size_t recv_len;
53376d117cSDaniel Verkamp 	uint8_t recv_buf[SPDK_JSONRPC_RECV_BUF_SIZE];
544e003b67SDaniel Verkamp 	uint32_t outstanding_requests;
55b066126bSPawel Wodkowski 
56b066126bSPawel Wodkowski 	pthread_spinlock_t queue_lock;
57b066126bSPawel Wodkowski 	STAILQ_HEAD(, spdk_jsonrpc_request) send_queue;
58*2fb672afSKrzysztof Karas 	/* List of incomplete requests that are not yet ready to be sent.
59*2fb672afSKrzysztof Karas 	 * This is a safety net for cases, where server shutdown is called
60*2fb672afSKrzysztof Karas 	 * before all requests are placed into send_queue. */
61*2fb672afSKrzysztof Karas 	STAILQ_HEAD(, spdk_jsonrpc_request) outstanding_queue;
62b066126bSPawel Wodkowski 
634e003b67SDaniel Verkamp 	struct spdk_jsonrpc_request *send_request;
6401a9118dSPawel Wodkowski 
655b1b3ddfSPawel Wodkowski 	spdk_jsonrpc_conn_closed_fn close_cb;
665b1b3ddfSPawel Wodkowski 	void *close_cb_ctx;
675b1b3ddfSPawel Wodkowski 
6801a9118dSPawel Wodkowski 	TAILQ_ENTRY(spdk_jsonrpc_server_conn) link;
69376d117cSDaniel Verkamp };
70376d117cSDaniel Verkamp 
71376d117cSDaniel Verkamp struct spdk_jsonrpc_server {
72376d117cSDaniel Verkamp 	int sockfd;
73376d117cSDaniel Verkamp 	spdk_jsonrpc_handle_request_fn handle_request;
7401a9118dSPawel Wodkowski 
7501a9118dSPawel Wodkowski 	TAILQ_HEAD(, spdk_jsonrpc_server_conn) free_conns;
7601a9118dSPawel Wodkowski 	TAILQ_HEAD(, spdk_jsonrpc_server_conn) conns;
7701a9118dSPawel Wodkowski 
7801a9118dSPawel Wodkowski 	struct spdk_jsonrpc_server_conn conns_array[SPDK_JSONRPC_MAX_CONNS];
79376d117cSDaniel Verkamp };
80376d117cSDaniel Verkamp 
81c10f8e16SLiu Xiaodong struct spdk_jsonrpc_client_request {
82c10f8e16SLiu Xiaodong 	/* Total space allocated for send_buf */
83c10f8e16SLiu Xiaodong 	size_t send_buf_size;
84c10f8e16SLiu Xiaodong 
85c10f8e16SLiu Xiaodong 	/* Number of bytes used in send_buf (<= send_buf_size) */
86c10f8e16SLiu Xiaodong 	size_t send_len;
87c10f8e16SLiu Xiaodong 
88c10f8e16SLiu Xiaodong 	size_t send_offset;
89c10f8e16SLiu Xiaodong 
90c10f8e16SLiu Xiaodong 	uint8_t *send_buf;
91c10f8e16SLiu Xiaodong };
92c10f8e16SLiu Xiaodong 
935d0f2620SPawel Wodkowski struct spdk_jsonrpc_client_response_internal {
945d0f2620SPawel Wodkowski 	struct spdk_jsonrpc_client_response jsonrpc;
952f557958SPawel Wodkowski 	bool ready;
965d0f2620SPawel Wodkowski 	uint8_t *buf;
975d0f2620SPawel Wodkowski 	size_t values_cnt;
985d0f2620SPawel Wodkowski 	struct spdk_json_val values[];
995d0f2620SPawel Wodkowski };
1005d0f2620SPawel Wodkowski 
101c10f8e16SLiu Xiaodong struct spdk_jsonrpc_client {
102c10f8e16SLiu Xiaodong 	int sockfd;
1037d38f166SPawel Wodkowski 	bool connected;
104c10f8e16SLiu Xiaodong 
1055d0f2620SPawel Wodkowski 	size_t recv_buf_size;
1065d0f2620SPawel Wodkowski 	size_t recv_offset;
1075d0f2620SPawel Wodkowski 	char *recv_buf;
1082f557958SPawel Wodkowski 
1092f557958SPawel Wodkowski 	/* Parsed response */
1102f557958SPawel Wodkowski 	struct spdk_jsonrpc_client_response_internal *resp;
1112f557958SPawel Wodkowski 	struct spdk_jsonrpc_client_request *request;
112c10f8e16SLiu Xiaodong };
113c10f8e16SLiu Xiaodong 
114376d117cSDaniel Verkamp /* jsonrpc_server_tcp */
115134590a2SSeth Howell void jsonrpc_server_handle_request(struct spdk_jsonrpc_request *request,
116376d117cSDaniel Verkamp 				   const struct spdk_json_val *method,
1172bdec64fSDaniel Verkamp 				   const struct spdk_json_val *params);
118134590a2SSeth Howell void jsonrpc_server_handle_error(struct spdk_jsonrpc_request *request, int error);
1190f842e86SPawel Wodkowski 
1200f842e86SPawel Wodkowski /* Might be called from any thread */
121134590a2SSeth Howell void jsonrpc_server_send_response(struct spdk_jsonrpc_request *request);
122376d117cSDaniel Verkamp 
123376d117cSDaniel Verkamp /* jsonrpc_server */
124134590a2SSeth Howell int jsonrpc_parse_request(struct spdk_jsonrpc_server_conn *conn, const void *json,
12563978010SPawel Wodkowski 			  size_t size);
1260f842e86SPawel Wodkowski 
1270f842e86SPawel Wodkowski /* Must be called only from server poll thread */
128134590a2SSeth Howell void jsonrpc_free_request(struct spdk_jsonrpc_request *request);
129376d117cSDaniel Verkamp 
130b3bec079SShuhei Matsumoto /* Must be called only from server poll thread */
131b3bec079SShuhei Matsumoto void jsonrpc_complete_request(struct spdk_jsonrpc_request *request);
132b3bec079SShuhei Matsumoto 
133c10f8e16SLiu Xiaodong /*
134c10f8e16SLiu Xiaodong  * Parse JSON data as RPC command response.
135c10f8e16SLiu Xiaodong  *
136c10f8e16SLiu Xiaodong  * \param client structure pointer of jsonrpc client
137c10f8e16SLiu Xiaodong  *
1385d0f2620SPawel Wodkowski  * \return 0 On success. Negative error code in error
1395d0f2620SPawel Wodkowski  * -EAGAIN - If the provided data is not a complete JSON value (SPDK_JSON_PARSE_INCOMPLETE)
1405d0f2620SPawel Wodkowski  * -EINVAL - If the provided data has invalid JSON syntax and can't be parsed (SPDK_JSON_PARSE_INVALID).
1415d0f2620SPawel Wodkowski  * -ENOSPC - No space left to store parsed response.
142c10f8e16SLiu Xiaodong  */
143134590a2SSeth Howell int jsonrpc_parse_response(struct spdk_jsonrpc_client *client);
144c10f8e16SLiu Xiaodong 
145376d117cSDaniel Verkamp #endif
146