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:
Evgeniy Kochetov 2020-01-28 19:24:46 +00:00 committed by Tomasz Zawadzki
parent 449dee3563
commit b1074c4905
11 changed files with 297 additions and 5 deletions

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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
View 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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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
View 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)