]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/lib/jsonrpc/jsonrpc_internal.h
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / spdk / lib / jsonrpc / jsonrpc_internal.h
CommitLineData
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
50struct 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
70struct 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
87struct 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
97struct 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
109struct 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 121void 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);
124void spdk_jsonrpc_server_handle_error(struct spdk_jsonrpc_request *request, int error);
125
126/* Might be called from any thread */
127void spdk_jsonrpc_server_send_response(struct spdk_jsonrpc_request *request);
7c673cae
FG
128
129/* jsonrpc_server */
130int 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 */
133void 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 */
146int spdk_jsonrpc_parse_response(struct spdk_jsonrpc_client *client, void *json,
147 size_t size);
148
7c673cae 149#endif