diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index 8e1810df6..e0c260e18 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -2561,6 +2561,8 @@ hostaddr | Optional | string | NVMe-oF host address: ip addr hostsvcid | Optional | string | NVMe-oF host trsvcid: port number prchk_reftag | Optional | bool | Enable checking of PI reference tag for I/O processing prchk_guard | Optional | bool | Enable checking of PI guard for I/O processing +hdgst | Optional | bool | Enable TCP header digest +ddgst | Optional | bool | Enable TCP data digest ### Example diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index e9d730d56..7cc910165 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -2019,7 +2019,8 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid, const char *hostnqn, uint32_t prchk_flags, spdk_bdev_create_nvme_fn cb_fn, - void *cb_ctx) + void *cb_ctx, + struct spdk_nvme_ctrlr_opts *opts) { struct nvme_probe_skip_entry *entry, *tmp; struct nvme_async_probe_ctx *ctx; @@ -2054,7 +2055,12 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid, } } - spdk_nvme_ctrlr_get_default_ctrlr_opts(&ctx->opts, sizeof(ctx->opts)); + if (opts) { + memcpy(&ctx->opts, opts, sizeof(*opts)); + } else { + spdk_nvme_ctrlr_get_default_ctrlr_opts(&ctx->opts, sizeof(ctx->opts)); + } + ctx->opts.transport_retry_count = g_opts.retry_count; ctx->opts.keep_alive_timeout_ms = g_opts.keep_alive_timeout_ms; diff --git a/module/bdev/nvme/bdev_nvme.h b/module/bdev/nvme/bdev_nvme.h index e789371e3..f850edca8 100644 --- a/module/bdev/nvme/bdev_nvme.h +++ b/module/bdev/nvme/bdev_nvme.h @@ -77,7 +77,8 @@ int bdev_nvme_create(struct spdk_nvme_transport_id *trid, const char *hostnqn, uint32_t prchk_flags, spdk_bdev_create_nvme_fn cb_fn, - void *cb_ctx); + void *cb_ctx, + struct spdk_nvme_ctrlr_opts *opts); struct spdk_nvme_ctrlr *bdev_nvme_get_ctrlr(struct spdk_bdev *bdev); /** diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 16b9f4161..84d2a29ff 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -176,6 +176,7 @@ struct rpc_bdev_nvme_attach_controller { char *hostsvcid; bool prchk_reftag; bool prchk_guard; + struct spdk_nvme_ctrlr_opts opts; }; static void @@ -207,7 +208,9 @@ static const struct spdk_json_object_decoder rpc_bdev_nvme_attach_controller_dec {"hostsvcid", offsetof(struct rpc_bdev_nvme_attach_controller, hostsvcid), spdk_json_decode_string, true}, {"prchk_reftag", offsetof(struct rpc_bdev_nvme_attach_controller, prchk_reftag), spdk_json_decode_bool, true}, - {"prchk_guard", offsetof(struct rpc_bdev_nvme_attach_controller, prchk_guard), spdk_json_decode_bool, true} + {"prchk_guard", offsetof(struct rpc_bdev_nvme_attach_controller, prchk_guard), spdk_json_decode_bool, true}, + {"hdgst", offsetof(struct rpc_bdev_nvme_attach_controller, opts.header_digest), spdk_json_decode_bool, true}, + {"ddgst", offsetof(struct rpc_bdev_nvme_attach_controller, opts.data_digest), spdk_json_decode_bool, true} }; #define NVME_MAX_BDEVS_PER_RPC 128 @@ -263,6 +266,8 @@ rpc_bdev_nvme_attach_controller(struct spdk_jsonrpc_request *request, return; } + spdk_nvme_ctrlr_get_default_ctrlr_opts(&ctx->req.opts, sizeof(ctx->req.opts)); + if (spdk_json_decode_object(params, rpc_bdev_nvme_attach_controller_decoders, SPDK_COUNTOF(rpc_bdev_nvme_attach_controller_decoders), &ctx->req)) { @@ -375,7 +380,7 @@ rpc_bdev_nvme_attach_controller(struct spdk_jsonrpc_request *request, ctx->request = request; ctx->count = NVME_MAX_BDEVS_PER_RPC; rc = bdev_nvme_create(&trid, &hostid, ctx->req.name, ctx->names, ctx->count, ctx->req.hostnqn, - prchk_flags, rpc_bdev_nvme_attach_controller_done, ctx); + prchk_flags, rpc_bdev_nvme_attach_controller_done, ctx, &ctx->req.opts); if (rc) { spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc)); goto cleanup; diff --git a/scripts/rpc.py b/scripts/rpc.py index 99c803608..e2104314e 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -510,7 +510,9 @@ if __name__ == "__main__": hostaddr=args.hostaddr, hostsvcid=args.hostsvcid, prchk_reftag=args.prchk_reftag, - prchk_guard=args.prchk_guard)) + prchk_guard=args.prchk_guard, + hdgst=args.hdgst, + ddgst=args.ddgst)) p = subparsers.add_parser('bdev_nvme_attach_controller', aliases=['construct_nvme_bdev'], help='Add bdevs with nvme backend') @@ -535,6 +537,10 @@ if __name__ == "__main__": help='Enable checking of PI reference tag for I/O processing.', action='store_true') p.add_argument('-g', '--prchk-guard', help='Enable checking of PI guard for I/O processing.', action='store_true') + p.add_argument('-e', '--hdgst', + help='Enable TCP header digest.', action='store_true') + p.add_argument('-d', '--ddgst', + help='Enable TCP data digest.', action='store_true') p.set_defaults(func=bdev_nvme_attach_controller) def bdev_nvme_get_controllers(args): diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index fcd0129e2..3f2f7d34c 100644 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -488,7 +488,8 @@ def bdev_nvme_set_hotplug(client, enable, period_us=None): @deprecated_alias('construct_nvme_bdev') def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvcid=None, priority=None, subnqn=None, hostnqn=None, hostaddr=None, - hostsvcid=None, prchk_reftag=None, prchk_guard=None): + hostsvcid=None, prchk_reftag=None, prchk_guard=None, + hdgst=None, ddgst=None): """Construct block device for each NVMe namespace in the attached controller. Args: @@ -504,6 +505,8 @@ def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvc hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional) prchk_reftag: Enable checking of PI reference tag for I/O processing (optional) prchk_guard: Enable checking of PI guard for I/O processing (optional) + hdgst: Enable TCP header digest (optional) + ddgst: Enable TCP data digest (optional) Returns: Names of created block devices. @@ -539,6 +542,12 @@ def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvc if prchk_guard: params['prchk_guard'] = prchk_guard + if hdgst: + params['hdgst'] = hdgst + + if ddgst: + params['ddgst'] = ddgst + return client.call('bdev_nvme_attach_controller', params)