From c89b7bac82587c7af1fb9f00d8b2dd37f33b81e5 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 23 Oct 2018 15:07:42 -0700 Subject: [PATCH] nvmf: add rpc for getting transport information Change-Id: I8c3cbc1b08a219844c9b25f8c8494efd09e347f6 Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/430623 Tested-by: SPDK CI Jenkins Chandler-Test-Pool: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Reviewed-by: Jim Harris --- doc/jsonrpc.md | 35 ++++++++++++++++++++ lib/event/subsystems/nvmf/nvmf_rpc.c | 48 ++++++++++++++++++++++++++++ scripts/rpc.py | 8 +++++ scripts/rpc/nvmf.py | 9 ++++++ 4 files changed, 100 insertions(+) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 3a93198db..4e6577623 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -3394,6 +3394,41 @@ Example response: } ~~~ +## get_nvmf_transports method {#rpc_get_nvmf_transports} + +### Parameters + +This method has no parameters. + +### Example + +Example request: +~~~ +{ + "jsonrpc": "2.0", + "id": 1, + "method": "get_nvmf_transports" +} +~~~ + +Example response: +~~~ +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "type": "RDMA". + "max_queue_depth": 128, + "max_qpairs_per_ctrlr": 64, + "in_capsule_data_size": 4096, + "max_io_size": 131072, + "io_unit_size": 131072 + } + ] +} +~~~ + # Vhost Target {#jsonrpc_components_vhost_tgt} The following common preconditions need to be met in all target types. diff --git a/lib/event/subsystems/nvmf/nvmf_rpc.c b/lib/event/subsystems/nvmf/nvmf_rpc.c index e4114afe6..3be213155 100644 --- a/lib/event/subsystems/nvmf/nvmf_rpc.c +++ b/lib/event/subsystems/nvmf/nvmf_rpc.c @@ -1560,3 +1560,51 @@ nvmf_rpc_create_transport(struct spdk_jsonrpc_request *request, } SPDK_RPC_REGISTER("nvmf_create_transport", nvmf_rpc_create_transport, SPDK_RPC_RUNTIME) + +static void +dump_nvmf_transport(struct spdk_json_write_ctx *w, struct spdk_nvmf_transport *transport) +{ + const struct spdk_nvmf_transport_opts *opts = spdk_nvmf_get_transport_opts(transport); + spdk_nvme_transport_type_t type = spdk_nvmf_get_transport_type(transport); + + spdk_json_write_object_begin(w); + + spdk_json_write_named_string(w, "trtype", spdk_nvme_transport_id_trtype_str(type)); + spdk_json_write_named_uint32(w, "max_queue_depth", opts->max_queue_depth); + spdk_json_write_named_uint32(w, "max_qpairs_per_ctrlr", opts->max_qpairs_per_ctrlr); + spdk_json_write_named_uint32(w, "in_capsule_data_size", opts->in_capsule_data_size); + spdk_json_write_named_uint32(w, "max_io_size", opts->max_io_size); + spdk_json_write_named_uint32(w, "io_unit_size", opts->io_unit_size); + spdk_json_write_named_uint32(w, "max_aq_depth", opts->max_aq_depth); + + spdk_json_write_object_end(w); +} + +static void +nvmf_rpc_get_nvmf_transports(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct spdk_json_write_ctx *w; + struct spdk_nvmf_transport *transport; + + if (params != NULL) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "get_nvmf_transports requires no parameters"); + return; + } + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + spdk_json_write_array_begin(w); + transport = spdk_nvmf_transport_get_first(g_spdk_nvmf_tgt); + while (transport) { + dump_nvmf_transport(w, transport); + transport = spdk_nvmf_transport_get_next(transport); + } + spdk_json_write_array_end(w); + spdk_jsonrpc_end_result(request, w); +} +SPDK_RPC_REGISTER("get_nvmf_transports", nvmf_rpc_get_nvmf_transports, SPDK_RPC_RUNTIME) diff --git a/scripts/rpc.py b/scripts/rpc.py index d6ff9d264..eb8f41448 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -1312,6 +1312,14 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.add_argument('-a', '--max-aq-depth', help='Max number of admin cmds per AQ', type=int) p.set_defaults(func=nvmf_create_transport) + @call_cmd + def get_nvmf_transports(args): + print_dict(rpc.nvmf.get_nvmf_transports(args.client)) + + p = subparsers.add_parser('get_nvmf_transports', + help='Display nvmf transports') + p.set_defaults(func=get_nvmf_transports) + @call_cmd def get_nvmf_subsystems(args): print_dict(rpc.nvmf.get_nvmf_subsystems(args.client)) diff --git a/scripts/rpc/nvmf.py b/scripts/rpc/nvmf.py index d805ebca8..9e63c1fe6 100644 --- a/scripts/rpc/nvmf.py +++ b/scripts/rpc/nvmf.py @@ -98,6 +98,15 @@ def nvmf_create_transport(client, return client.call('nvmf_create_transport', params) +def get_nvmf_transports(client): + """Get list of NVMe-oF transports. + + Returns: + List of NVMe-oF transport objects. + """ + return client.call('get_nvmf_transports') + + def get_nvmf_subsystems(client): """Get list of NVMe-oF subsystems.