From 9a1cf1c59409c6df198bc2050744d67007f9b376 Mon Sep 17 00:00:00 2001 From: Jacek Kalwas Date: Thu, 17 Dec 2020 07:58:26 -0500 Subject: [PATCH] nvmf: make transport service id optional There are transport types like vfio-user or fc for which this field is optional so there is no need to explicitly specify it for the add listener rpc. Still validation of this filed is preserved for rdma and tcp transport. Signed-off-by: Jacek Kalwas Change-Id: I6aef55bed45b3653472fd356e5a7cfead22c6f2b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5605 Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Tomasz Zawadzki --- doc/jsonrpc.md | 2 +- lib/nvmf/nvmf_rpc.c | 17 ++++++++++------- lib/nvmf/rdma.c | 5 +++++ lib/nvmf/tcp.c | 5 +++++ scripts/rpc.py | 2 +- scripts/rpc/nvmf.py | 8 +++++--- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 2c044d61d..5dadca1ce 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -5131,7 +5131,7 @@ Name | Optional | Type | Description trtype | Required | string | Transport type ("RDMA") adrfam | Required | string | Address family ("IPv4", "IPv6", "IB", or "FC") traddr | Required | string | Transport address -trsvcid | Required | string | Transport service ID +trsvcid | Optional | string | Transport service ID (required for RDMA or TCP) ### Example diff --git a/lib/nvmf/nvmf_rpc.c b/lib/nvmf/nvmf_rpc.c index de97ef5c2..43a204bfd 100644 --- a/lib/nvmf/nvmf_rpc.c +++ b/lib/nvmf/nvmf_rpc.c @@ -554,7 +554,7 @@ static const struct spdk_json_object_decoder rpc_listen_address_decoders[] = { {"trtype", offsetof(struct rpc_listen_address, transport), spdk_json_decode_string, true}, {"adrfam", offsetof(struct rpc_listen_address, adrfam), spdk_json_decode_string, true}, {"traddr", offsetof(struct rpc_listen_address, traddr), spdk_json_decode_string}, - {"trsvcid", offsetof(struct rpc_listen_address, trsvcid), spdk_json_decode_string}, + {"trsvcid", offsetof(struct rpc_listen_address, trsvcid), spdk_json_decode_string, true}, }; static int @@ -787,13 +787,16 @@ rpc_listen_address_to_trid(const struct rpc_listen_address *address, } memcpy(trid->traddr, address->traddr, len + 1); - len = strlen(address->trsvcid); - if (len > sizeof(trid->trsvcid) - 1) { - SPDK_ERRLOG("Transport service id longer than %zu characters: %s\n", - sizeof(trid->trsvcid) - 1, address->trsvcid); - return -EINVAL; + trid->trsvcid[0] = '\0'; + if (address->trsvcid) { + len = strlen(address->trsvcid); + if (len > sizeof(trid->trsvcid) - 1) { + SPDK_ERRLOG("Transport service id longer than %zu characters: %s\n", + sizeof(trid->trsvcid) - 1, address->trsvcid); + return -EINVAL; + } + memcpy(trid->trsvcid, address->trsvcid, len + 1); } - memcpy(trid->trsvcid, address->trsvcid, len + 1); return 0; } diff --git a/lib/nvmf/rdma.c b/lib/nvmf/rdma.c index 54aa8523f..3ef31610c 100644 --- a/lib/nvmf/rdma.c +++ b/lib/nvmf/rdma.c @@ -2654,6 +2654,11 @@ nvmf_rdma_listen(struct spdk_nvmf_transport *transport, const struct spdk_nvme_t int family; int rc; + if (!strlen(trid->trsvcid)) { + SPDK_ERRLOG("Service id is required\n"); + return -EINVAL; + } + rtransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_rdma_transport, transport); assert(rtransport->event_channel != NULL); diff --git a/lib/nvmf/tcp.c b/lib/nvmf/tcp.c index 15b0e96bd..f92404e5d 100644 --- a/lib/nvmf/tcp.c +++ b/lib/nvmf/tcp.c @@ -666,6 +666,11 @@ nvmf_tcp_listen(struct spdk_nvmf_transport *transport, const struct spdk_nvme_tr uint8_t adrfam; struct spdk_sock_opts opts; + if (!strlen(trid->trsvcid)) { + SPDK_ERRLOG("Service id is required\n"); + return -EINVAL; + } + ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport); trsvcid_int = nvmf_tcp_trsvcid_to_int(trid->trsvcid); diff --git a/scripts/rpc.py b/scripts/rpc.py index 3e100661c..59aa8a604 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -1928,7 +1928,7 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.add_argument('-a', '--traddr', help='NVMe-oF transport address: e.g., an ip address', required=True) p.add_argument('-p', '--tgt_name', help='The name of the parent NVMe-oF target (optional)', type=str) p.add_argument('-f', '--adrfam', help='NVMe-oF transport adrfam: e.g., ipv4, ipv6, ib, fc, intra_host') - p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number') + p.add_argument('-s', '--trsvcid', help='NVMe-oF transport service id: e.g., a port number (required for RDMA or TCP)') p.set_defaults(func=nvmf_subsystem_add_listener) def nvmf_subsystem_remove_listener(args): diff --git a/scripts/rpc/nvmf.py b/scripts/rpc/nvmf.py index 5d5a39733..dbeff94d8 100644 --- a/scripts/rpc/nvmf.py +++ b/scripts/rpc/nvmf.py @@ -277,7 +277,7 @@ def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam, tg nqn: Subsystem NQN. trtype: Transport type ("RDMA"). traddr: Transport address. - trsvcid: Transport service ID. + trsvcid: Transport service ID (required for RDMA or TCP). tgt_name: name of the parent NVMe-oF target (optional). adrfam: Address family ("IPv4", "IPv6", "IB", or "FC"). @@ -285,8 +285,10 @@ def nvmf_subsystem_add_listener(client, nqn, trtype, traddr, trsvcid, adrfam, tg True or False """ listen_address = {'trtype': trtype, - 'traddr': traddr, - 'trsvcid': trsvcid} + 'traddr': traddr} + + if trsvcid: + listen_address['trsvcid'] = trsvcid if adrfam: listen_address['adrfam'] = adrfam