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