1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) 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