sock/rpc: Add sock_impl_get/set_options RPC methods
Signed-off-by: Evgeniy Kochetov <evgeniik@mellanox.com> Change-Id: If1193ef647c85b045d7f14a03a9942783583f553 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/612 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
449dee3563
commit
b1074c4905
@ -66,6 +66,8 @@ rpc.py script is deprecated, new parameter `-m` or `--max-io-qpairs-per-ctrlr` i
|
||||
Parameter `max_qpairs_per_ctrlr` of `nvmf_create_transport` RPC command accepted by the NVMF target
|
||||
is deprecated, new parameter `max_io_qpairs_per_ctrlr` is added.
|
||||
|
||||
Added `sock_impl_get_options` and `sock_impl_set_options` RPC methods.
|
||||
|
||||
### sock
|
||||
|
||||
Added `spdk_sock_impl_get_opts` and `spdk_sock_impl_set_opts` functions to set/get socket layer configuration
|
||||
|
@ -6543,6 +6543,93 @@ Example response:
|
||||
}
|
||||
~~~
|
||||
|
||||
# Socket layer {#jsonrpc_components_sock}
|
||||
|
||||
## sock_impl_get_options {#rpc_sock_impl_get_options}
|
||||
|
||||
Get parameters for the socket layer implementation.
|
||||
|
||||
### Parameters
|
||||
|
||||
Name | Optional | Type | Description
|
||||
----------------------- | -------- | ----------- | -----------
|
||||
impl_name | Required | string | Name of socket implementation, e.g. posix
|
||||
|
||||
### Response
|
||||
|
||||
Response is an object with current socket layer options for requested implementation.
|
||||
|
||||
### Example
|
||||
|
||||
Example request:
|
||||
|
||||
~~~
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "sock_impl_get_options",
|
||||
"id": 1,
|
||||
"params": {
|
||||
"impl_name": "posix"
|
||||
}
|
||||
}
|
||||
~~~
|
||||
|
||||
Example response:
|
||||
|
||||
~~~
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"result": {
|
||||
"recv_buf_size": 2097152,
|
||||
"send_buf_size": 2097152
|
||||
}
|
||||
}
|
||||
~~~
|
||||
|
||||
## sock_impl_set_options {#rpc_sock_impl_set_options}
|
||||
|
||||
Set parameters for the socket layer implementation.
|
||||
|
||||
### Parameters
|
||||
|
||||
Name | Optional | Type | Description
|
||||
----------------------- | -------- | ----------- | -----------
|
||||
impl_name | Required | string | Name of socket implementation, e.g. posix
|
||||
recv_buf_size | Optional | number | Size of socket receive buffer in bytes
|
||||
send_buf_size | Optional | number | Size of socket send buffer in bytes
|
||||
|
||||
### Response
|
||||
|
||||
True if socket layer options were set successfully.
|
||||
|
||||
### Example
|
||||
|
||||
Example request:
|
||||
|
||||
~~~
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "sock_impl_set_options",
|
||||
"id": 1,
|
||||
"params": {
|
||||
"impl_name": "posix",
|
||||
"recv_buf_size": 2097152,
|
||||
"send_buf_size": 2097152
|
||||
}
|
||||
}
|
||||
~~~
|
||||
|
||||
Example response:
|
||||
|
||||
~~~
|
||||
{
|
||||
"jsonrpc": "2.0",
|
||||
"id": 1,
|
||||
"result": true
|
||||
}
|
||||
~~~
|
||||
|
||||
# Miscellaneous RPC commands
|
||||
|
||||
## bdev_nvme_send_cmd {#rpc_bdev_nvme_send_cmd}
|
||||
|
@ -42,7 +42,7 @@ C_SRCS = fio_plugin.c
|
||||
|
||||
# Unable to combine the FIO plugin and the VPP socket abstraction (license incompatibility)
|
||||
SPDK_LIB_LIST = $(filter-out sock_vpp,$(SOCK_MODULES_LIST))
|
||||
SPDK_LIB_LIST += nvme thread util log sock vmd
|
||||
SPDK_LIB_LIST += nvme thread util log sock vmd jsonrpc json rpc
|
||||
|
||||
ifeq ($(CONFIG_RDMA),y)
|
||||
SPDK_LIB_LIST += rdma
|
||||
|
@ -37,7 +37,7 @@ include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
|
||||
SO_VER := 3
|
||||
SO_MINOR := 1
|
||||
|
||||
C_SRCS = sock.c net_framework.c
|
||||
C_SRCS = sock.c net_framework.c sock_rpc.c
|
||||
|
||||
LIBNAME = sock
|
||||
|
||||
|
151
lib/sock/sock_rpc.c
Normal file
151
lib/sock/sock_rpc.c
Normal file
@ -0,0 +1,151 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright (c) 2020 Mellanox Technologies LTD. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "spdk/sock.h"
|
||||
|
||||
#include "spdk/rpc.h"
|
||||
#include "spdk/util.h"
|
||||
#include "spdk/string.h"
|
||||
|
||||
#include "spdk_internal/log.h"
|
||||
|
||||
|
||||
static const struct spdk_json_object_decoder rpc_sock_impl_get_opts_decoders[] = {
|
||||
{ "impl_name", 0, spdk_json_decode_string, false },
|
||||
};
|
||||
|
||||
static void
|
||||
rpc_sock_impl_get_options(struct spdk_jsonrpc_request *request,
|
||||
const struct spdk_json_val *params)
|
||||
{
|
||||
char *impl_name = NULL;
|
||||
struct spdk_sock_impl_opts sock_opts = {};
|
||||
struct spdk_json_write_ctx *w;
|
||||
size_t len;
|
||||
int rc;
|
||||
|
||||
if (spdk_json_decode_object(params, rpc_sock_impl_get_opts_decoders,
|
||||
SPDK_COUNTOF(rpc_sock_impl_get_opts_decoders), &impl_name)) {
|
||||
SPDK_ERRLOG("spdk_json_decode_object() failed\n");
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
len = sizeof(sock_opts);
|
||||
rc = spdk_sock_impl_get_opts(impl_name, &sock_opts, &len);
|
||||
if (rc) {
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
w = spdk_jsonrpc_begin_result(request);
|
||||
spdk_json_write_object_begin(w);
|
||||
spdk_json_write_named_uint32(w, "recv_buf_size", sock_opts.recv_buf_size);
|
||||
spdk_json_write_named_uint32(w, "send_buf_size", sock_opts.send_buf_size);
|
||||
spdk_json_write_object_end(w);
|
||||
spdk_jsonrpc_end_result(request, w);
|
||||
free(impl_name);
|
||||
}
|
||||
SPDK_RPC_REGISTER("sock_impl_get_options", rpc_sock_impl_get_options,
|
||||
SPDK_RPC_STARTUP | SPDK_RPC_RUNTIME)
|
||||
|
||||
struct spdk_rpc_sock_impl_set_opts {
|
||||
char *impl_name;
|
||||
struct spdk_sock_impl_opts sock_opts;
|
||||
};
|
||||
|
||||
static const struct spdk_json_object_decoder rpc_sock_impl_set_opts_decoders[] = {
|
||||
{
|
||||
"impl_name", offsetof(struct spdk_rpc_sock_impl_set_opts, impl_name),
|
||||
spdk_json_decode_string, false
|
||||
},
|
||||
{
|
||||
"recv_buf_size", offsetof(struct spdk_rpc_sock_impl_set_opts, sock_opts.recv_buf_size),
|
||||
spdk_json_decode_uint32, true
|
||||
},
|
||||
{
|
||||
"send_buf_size", offsetof(struct spdk_rpc_sock_impl_set_opts, sock_opts.send_buf_size),
|
||||
spdk_json_decode_uint32, true
|
||||
},
|
||||
};
|
||||
|
||||
static void
|
||||
rpc_sock_impl_set_options(struct spdk_jsonrpc_request *request,
|
||||
const struct spdk_json_val *params)
|
||||
{
|
||||
struct spdk_rpc_sock_impl_set_opts opts = {};
|
||||
struct spdk_json_write_ctx *w;
|
||||
size_t len;
|
||||
int rc;
|
||||
|
||||
/* Get type */
|
||||
if (spdk_json_decode_object(params, rpc_sock_impl_set_opts_decoders,
|
||||
SPDK_COUNTOF(rpc_sock_impl_set_opts_decoders), &opts)) {
|
||||
SPDK_ERRLOG("spdk_json_decode_object() failed\n");
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Retrieve default opts for requested socket implementation */
|
||||
len = sizeof(opts.sock_opts);
|
||||
rc = spdk_sock_impl_get_opts(opts.impl_name, &opts.sock_opts, &len);
|
||||
if (rc) {
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Decode opts */
|
||||
if (spdk_json_decode_object(params, rpc_sock_impl_set_opts_decoders,
|
||||
SPDK_COUNTOF(rpc_sock_impl_set_opts_decoders), &opts)) {
|
||||
SPDK_ERRLOG("spdk_json_decode_object() failed\n");
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
rc = spdk_sock_impl_set_opts(opts.impl_name, &opts.sock_opts, sizeof(opts.sock_opts));
|
||||
if (rc != 0) {
|
||||
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
|
||||
"Invalid parameters");
|
||||
return;
|
||||
}
|
||||
|
||||
w = spdk_jsonrpc_begin_result(request);
|
||||
spdk_json_write_bool(w, true);
|
||||
spdk_jsonrpc_end_result(request, w);
|
||||
free(opts.impl_name);
|
||||
}
|
||||
SPDK_RPC_REGISTER("sock_impl_set_options", rpc_sock_impl_set_options, SPDK_RPC_STARTUP)
|
@ -40,7 +40,7 @@ C_SRCS := $(APP:%=%.c)
|
||||
|
||||
# Unable to combine the FIO plugin and the VPP socket abstraction (license incompatibility)
|
||||
SPDK_LIB_LIST = $(filter-out sock_vpp,$(SOCK_MODULES_LIST))
|
||||
SPDK_LIB_LIST += nvme thread util log sock vmd
|
||||
SPDK_LIB_LIST += nvme thread util log sock vmd jsonrpc json rpc
|
||||
|
||||
ifeq ($(CONFIG_RDMA),y)
|
||||
SPDK_LIB_LIST += rdma
|
||||
|
@ -46,7 +46,7 @@ DEPDIRS-rte_vhost :=
|
||||
|
||||
DEPDIRS-ioat := log
|
||||
DEPDIRS-idxd := log util
|
||||
DEPDIRS-sock := log
|
||||
DEPDIRS-sock := log $(JSON_LIBS)
|
||||
DEPDIRS-util := log
|
||||
DEPDIRS-vmd := log
|
||||
|
||||
|
@ -47,7 +47,7 @@ ifneq (, $(wildcard $(DPDK_LIB_DIR)/librte_power.*))
|
||||
DPDK_LIB_LIST += -lrte_power
|
||||
endif
|
||||
|
||||
NVMECLI_SPDK_LIBS = -lspdk_log -lspdk_sock -lspdk_nvme -lspdk_env_dpdk -lspdk_util
|
||||
NVMECLI_SPDK_LIBS = -lspdk_log -lspdk_sock -lspdk_nvme -lspdk_env_dpdk -lspdk_util -lspdk_jsonrpc -lspdk_json -lspdk_rpc
|
||||
|
||||
ifeq ($(CONFIG_RDMA),y)
|
||||
NVMECLI_SPDK_LIBS += -lspdk_rdma
|
||||
|
@ -2380,6 +2380,27 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse
|
||||
p.add_argument('size_in_mb', help='Cache size for blobfs in megabytes.', type=int)
|
||||
p.set_defaults(func=blobfs_set_cache_size)
|
||||
|
||||
# sock
|
||||
def sock_impl_get_options(args):
|
||||
print_json(rpc.sock.sock_impl_get_options(args.client,
|
||||
impl_name=args.impl))
|
||||
|
||||
p = subparsers.add_parser('sock_impl_get_options', help="""Get options of socket layer implementation""")
|
||||
p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True)
|
||||
p.set_defaults(func=sock_impl_get_options)
|
||||
|
||||
def sock_impl_set_options(args):
|
||||
rpc.sock.sock_impl_set_options(args.client,
|
||||
impl_name=args.impl,
|
||||
recv_buf_size=args.recv_buf_size,
|
||||
send_buf_size=args.send_buf_size)
|
||||
|
||||
p = subparsers.add_parser('sock_impl_set_options', help="""Set options of socket layer implementation""")
|
||||
p.add_argument('-i', '--impl', help='Socket implementation name, e.g. posix', required=True)
|
||||
p.add_argument('-r', '--recv-buf-size', help='Size of receive buffer on socket in bytes', type=int)
|
||||
p.add_argument('-s', '--send-buf-size', help='Size of send buffer on socket in bytes', type=int)
|
||||
p.set_defaults(func=sock_impl_set_options)
|
||||
|
||||
def check_called_name(name):
|
||||
if name in deprecated_aliases:
|
||||
print("{} is deprecated, use {} instead.".format(name, deprecated_aliases[name]), file=sys.stderr)
|
||||
|
@ -23,6 +23,7 @@ from . import subsystem
|
||||
from . import trace
|
||||
from . import vhost
|
||||
from . import vmd
|
||||
from . import sock
|
||||
from . import client as rpc_client
|
||||
from .helpers import deprecated_alias
|
||||
|
||||
|
30
scripts/rpc/sock.py
Normal file
30
scripts/rpc/sock.py
Normal file
@ -0,0 +1,30 @@
|
||||
def sock_impl_get_options(client, impl_name=None):
|
||||
"""Get parameters for the socket layer implementation.
|
||||
|
||||
Args:
|
||||
impl_name: name of socket implementation, e.g. posix
|
||||
"""
|
||||
params = {}
|
||||
|
||||
params['impl_name'] = impl_name
|
||||
|
||||
return client.call('sock_impl_get_options', params)
|
||||
|
||||
|
||||
def sock_impl_set_options(client, impl_name=None, recv_buf_size=None, send_buf_size=None):
|
||||
"""Set parameters for the socket layer implementation.
|
||||
|
||||
Args:
|
||||
impl_name: name of socket implementation, e.g. posix
|
||||
recv_buf_size: size of socket receive buffer in bytes (optional)
|
||||
send_buf_size: size of socket send buffer in bytes (optional)
|
||||
"""
|
||||
params = {}
|
||||
|
||||
params['impl_name'] = impl_name
|
||||
if recv_buf_size is not None:
|
||||
params['recv_buf_size'] = recv_buf_size
|
||||
if send_buf_size is not None:
|
||||
params['send_buf_size'] = send_buf_size
|
||||
|
||||
return client.call('sock_impl_set_options', params)
|
Loading…
Reference in New Issue
Block a user