]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /*- |
2 | * BSD LICENSE | |
3 | * | |
4 | * Copyright (c) Intel Corporation. | |
5 | * All rights reserved. | |
6 | * | |
7 | * Redistribution and use in source and binary forms, with or without | |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
10 | * | |
11 | * * Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * * Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in | |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * * Neither the name of Intel Corporation nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
24 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
25 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
27 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
31 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
32 | */ | |
33 | ||
34 | #ifndef SPDK_JSONRPC_INTERNAL_H_ | |
35 | #define SPDK_JSONRPC_INTERNAL_H_ | |
36 | ||
11fdf7f2 | 37 | #include "spdk/stdinc.h" |
7c673cae | 38 | |
11fdf7f2 | 39 | #include "spdk/jsonrpc.h" |
7c673cae FG |
40 | |
41 | #include "spdk_internal/log.h" | |
42 | ||
43 | #define SPDK_JSONRPC_RECV_BUF_SIZE (32 * 1024) | |
11fdf7f2 TL |
44 | #define SPDK_JSONRPC_SEND_BUF_SIZE_INIT (32 * 1024) |
45 | #define SPDK_JSONRPC_SEND_BUF_SIZE_MAX (32 * 1024 * 1024) | |
46 | #define SPDK_JSONRPC_ID_MAX_LEN 128 | |
7c673cae FG |
47 | #define SPDK_JSONRPC_MAX_CONNS 64 |
48 | #define SPDK_JSONRPC_MAX_VALUES 1024 | |
49 | ||
11fdf7f2 TL |
50 | struct spdk_jsonrpc_request { |
51 | struct spdk_jsonrpc_server_conn *conn; | |
52 | ||
53 | /* Copy of request id value */ | |
54 | struct spdk_json_val id; | |
55 | uint8_t id_data[SPDK_JSONRPC_ID_MAX_LEN]; | |
56 | ||
57 | /* Total space allocated for send_buf */ | |
58 | size_t send_buf_size; | |
59 | ||
60 | /* Number of bytes used in send_buf (<= send_buf_size) */ | |
61 | size_t send_len; | |
62 | ||
63 | size_t send_offset; | |
64 | ||
65 | uint8_t *send_buf; | |
66 | ||
67 | STAILQ_ENTRY(spdk_jsonrpc_request) link; | |
68 | }; | |
69 | ||
7c673cae FG |
70 | struct spdk_jsonrpc_server_conn { |
71 | struct spdk_jsonrpc_server *server; | |
72 | int sockfd; | |
11fdf7f2 | 73 | bool closed; |
7c673cae FG |
74 | struct spdk_json_val values[SPDK_JSONRPC_MAX_VALUES]; |
75 | size_t recv_len; | |
76 | uint8_t recv_buf[SPDK_JSONRPC_RECV_BUF_SIZE]; | |
11fdf7f2 TL |
77 | uint32_t outstanding_requests; |
78 | ||
79 | pthread_spinlock_t queue_lock; | |
80 | STAILQ_HEAD(, spdk_jsonrpc_request) send_queue; | |
81 | ||
82 | struct spdk_jsonrpc_request *send_request; | |
83 | ||
84 | TAILQ_ENTRY(spdk_jsonrpc_server_conn) link; | |
7c673cae FG |
85 | }; |
86 | ||
87 | struct spdk_jsonrpc_server { | |
88 | int sockfd; | |
89 | spdk_jsonrpc_handle_request_fn handle_request; | |
11fdf7f2 TL |
90 | |
91 | TAILQ_HEAD(, spdk_jsonrpc_server_conn) free_conns; | |
92 | TAILQ_HEAD(, spdk_jsonrpc_server_conn) conns; | |
93 | ||
94 | struct spdk_jsonrpc_server_conn conns_array[SPDK_JSONRPC_MAX_CONNS]; | |
95 | }; | |
96 | ||
97 | struct spdk_jsonrpc_client_request { | |
98 | /* Total space allocated for send_buf */ | |
99 | size_t send_buf_size; | |
100 | ||
101 | /* Number of bytes used in send_buf (<= send_buf_size) */ | |
102 | size_t send_len; | |
103 | ||
104 | size_t send_offset; | |
105 | ||
106 | uint8_t *send_buf; | |
107 | }; | |
108 | ||
109 | struct spdk_jsonrpc_client { | |
110 | int sockfd; | |
111 | ||
112 | struct spdk_json_val values[SPDK_JSONRPC_MAX_VALUES]; | |
113 | size_t recv_buf_size; | |
114 | uint8_t *recv_buf; | |
115 | ||
116 | spdk_jsonrpc_client_response_parser parser_fn; | |
117 | void *parser_ctx; | |
7c673cae FG |
118 | }; |
119 | ||
120 | /* jsonrpc_server_tcp */ | |
11fdf7f2 | 121 | void spdk_jsonrpc_server_handle_request(struct spdk_jsonrpc_request *request, |
7c673cae | 122 | const struct spdk_json_val *method, |
11fdf7f2 TL |
123 | const struct spdk_json_val *params); |
124 | void spdk_jsonrpc_server_handle_error(struct spdk_jsonrpc_request *request, int error); | |
125 | ||
126 | /* Might be called from any thread */ | |
127 | void spdk_jsonrpc_server_send_response(struct spdk_jsonrpc_request *request); | |
7c673cae FG |
128 | |
129 | /* jsonrpc_server */ | |
130 | int spdk_jsonrpc_parse_request(struct spdk_jsonrpc_server_conn *conn, void *json, size_t size); | |
131 | ||
11fdf7f2 TL |
132 | /* Must be called only from server poll thread */ |
133 | void spdk_jsonrpc_free_request(struct spdk_jsonrpc_request *request); | |
134 | ||
135 | /* | |
136 | * Parse JSON data as RPC command response. | |
137 | * | |
138 | * \param client structure pointer of jsonrpc client | |
139 | * \param json Raw JSON data; must be encoded in UTF-8. | |
140 | * \param size Size of data in bytes. | |
141 | * | |
142 | * \return 0 On success | |
143 | * SPDK_JSON_PARSE_INCOMPLETE If the provided data is not a complete JSON value | |
144 | * SPDK_JSON_PARSE_INVALID if the provided data has invalid JSON syntax. | |
145 | */ | |
146 | int spdk_jsonrpc_parse_response(struct spdk_jsonrpc_client *client, void *json, | |
147 | size_t size); | |
148 | ||
7c673cae | 149 | #endif |