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 <jacek.kalwas@intel.com>
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 <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
This commit is contained in:
Jacek Kalwas 2020-12-17 07:58:26 -05:00 committed by Tomasz Zawadzki
parent e6f73c8045
commit 9a1cf1c594
6 changed files with 27 additions and 12 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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