xref: /spdk/doc/jsonrpc.md (revision b3bec07939ebe2ea2e0c43931705d32aa9e06719)
1# JSON-RPC {#jsonrpc}
2
3## Overview {#jsonrpc_overview}
4
5SPDK implements a [JSON-RPC 2.0](http://www.jsonrpc.org/specification) server
6to allow external management tools to dynamically configure SPDK components.
7
8## Parameters
9
10Most of the commands can take parameters. If present, parameter is validated against its domain. If this check fail
11whole command will fail with response error message [Invalid params](@ref jsonrpc_error_message).
12
13### Required parameters
14
15These parameters are mandatory. If any required parameter is missing RPC command will fail with proper error response.
16
17### Optional parameters
18
19Those parameters might be omitted. If an optional parameter is present it must be valid otherwise command will fail
20proper error response.
21
22## Error response message {#jsonrpc_error_message}
23
24Each error response will contain proper message. As much as possible the message should indicate what went wrong during
25command processing.
26
27There is ongoing effort to customize this messages but some RPC methods just return "Invalid parameters" as message body
28for any kind of error.
29
30Code   | Description
31------ | -----------
32-1     | Invalid state - given method exists but it is not callable in [current runtime state](@ref rpc_framework_start_init)
33-32600 | Invalid request - not compliant with JSON-RPC 2.0 Specification
34-32601 | Method not found
35-32602 | @ref jsonrpc_invalid_params
36-32603 | Internal error for e.g.: errors like out of memory
37-32700 | @ref jsonrpc_parser_error
38
39### Parser error {#jsonrpc_parser_error}
40
41Encountered some error during parsing request like:
42
43- the JSON object is malformed
44- parameter is too long
45- request is too long
46
47### Invalid params {#jsonrpc_invalid_params}
48
49This type of error is most common one. It mean that there is an error while processing the request like:
50
51- Parameters decoding in RPC method handler failed because required parameter is missing.
52- Unknown parameter present encountered.
53- Parameter type doesn't match expected type e.g.: given number when expected a string.
54- Parameter domain check failed.
55- Request is valid but some other error occurred during processing request. If possible message explains the error reason nature.
56
57## rpc.py {#rpc_py}
58
59SPDK provides a set of Python scripts which can invoke the JSON-RPC methods described in this document.  'rpc.py' in the scripts
60directory is the main script that users will invoke to execute a JSON-RPC method. The scripts/rpc directory contains modules
61that 'rpc.py' imports for definitions of each SPDK library's or module's methods.
62
63Example:
64
65~~~bash
66scripts/rpc.py bdev_nvme_attach_controller -b nvme0 -a 00:02.0 -t pcie
67~~~
68
69A brief description of each of the RPC methods and optional 'rpc.py' arguments can be viewed with:
70
71~~~bash
72scripts/rpc.py --help
73~~~
74
75A detailed description of each RPC method and its parameters is also available.  For example:
76
77~~~bash
78scripts/rpc.py bdev_nvme_attach_controller --help
79~~~
80
81### Generate JSON-RPC methods for current configuration {#jsonrpc_generate}
82
83An initial configuration can be specified for an SPDK application via the '-c' command line parameter.
84The configuration file is a JSON file containing all of the JSON-RPC method invocations necessary
85for the desired configuration. Writing these files by hand is extremely tedious however, so 'rpc.py'
86provides a mechanism to generate a JSON-RPC file based on the current configuration.
87
88~~~bash
89scripts/rpc.py save_config > config.json
90~~~
91
92'config.json' can then be passed to a new SPDK application using the '-c' command line parameter
93to reproduce the same configuration.
94
95### JSON-RPC batching
96
97'rpc.py' also supports batching of multiple JSON-RPC methods with one invocation.  So instead of
98calling 'rpc.py' once for each JSON-RPC method, such as:
99
100~~~bash
101scripts/rpc.py bdev_malloc_create -b malloc0 64 512
102scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a
103scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 malloc0
104scripts/rpc.py nvmf_create_transport -t tcp
105scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t tcp -a 127.0.0.1 -s 4420
106~~~
107
108you can put the following into a text file:
109
110~~~bash
111bdev_malloc_create -b malloc0 64 512
112nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a
113nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 malloc0
114nvmf_create_transport -t tcp
115nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t tcp -a 127.0.0.1 -s 4420
116~~~
117
118and then just do:
119
120~~~bash
121scripts/rpc.py < rpc.txt
122~~~
123
124### Adding external RPC methods
125
126SPDK includes both in-tree modules as well as the ability to use external modules.  The in-tree modules include some python
127scripts to ease the process of sending RPCs to in-tree modules.  External modules can utilize this same framework to add new RPC
128methods as follows:
129
130If PYTHONPATH doesn't include the location of the external RPC python script, it should be updated:
131
132~~~bash
133export PYTHONPATH=/home/user/plugin_example/
134~~~
135
136In provided location, create python module file (e.g. rpc_plugin.py) with new RPC methods.  The file should contain
137spdk_rpc_plugin_initialize() method that will be called when the plugin is loaded to define new parsers for provided subparsers
138argument that adds new RPC calls (subparsers.add_parser()).  The new parsers should use the client.call() method to call RPC
139functions registered within the external module using the SPDK_RPC_REGISTER() macro.  Example:
140
141~~~python
142from spdk.rpc.client import print_json
143
144
145def example_create(client, num_blocks, block_size, name=None, uuid=None):
146    """Construct an example block device.
147
148    Args:
149        num_blocks: size of block device in blocks
150        block_size: block size of device; must be a power of 2 and at least 512
151        name: name of block device (optional)
152        uuid: UUID of block device (optional)
153
154    Returns:
155        Name of created block device.
156    """
157    params = {'num_blocks': num_blocks, 'block_size': block_size}
158    if name:
159        params['name'] = name
160    if uuid:
161        params['uuid'] = uuid
162    return client.call('bdev_example_create', params)
163
164
165def example_delete(client, name):
166    """Delete example block device.
167
168    Args:
169        bdev_name: name of bdev to delete
170    """
171    params = {'name': name}
172    return client.call('bdev_example_delete', params)
173
174
175def spdk_rpc_plugin_initialize(subparsers):
176    def bdev_example_create(args):
177        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
178        print_json(example_create(args.client,
179                                  num_blocks=int(num_blocks),
180                                  block_size=args.block_size,
181                                  name=args.name,
182                                  uuid=args.uuid))
183
184    p = subparsers.add_parser('bdev_example_create',
185                              help='Create an example bdev')
186    p.add_argument('-b', '--name', help="Name of the bdev")
187    p.add_argument('-u', '--uuid', help="UUID of the bdev")
188    p.add_argument(
189        'total_size', help='Size of bdev in MB (float > 0)', type=float)
190    p.add_argument('block_size', help='Block size for this bdev', type=int)
191    p.set_defaults(func=bdev_example_create)
192
193    def bdev_example_delete(args):
194        example_delete(args.client,
195                      name=args.name)
196
197    p = subparsers.add_parser('bdev_example_delete',
198                              help='Delete an example disk')
199    p.add_argument('name', help='example bdev name')
200    p.set_defaults(func=bdev_example_delete)
201~~~
202
203Finally, call the rpc.py script with '--plugin' parameter to provide above python module name:
204
205~~~bash
206./scripts/rpc.py --plugin rpc_plugin bdev_example_create 10 4096
207~~~
208
209### Converting from legacy configuration {#jsonrpc_convert}
210
211Starting with SPDK 20.10, legacy configuration file support has been removed.
212Users with extensive configuration files already running in SPDK application,
213can [generate JSON-RPC for current configuration](@ref jsonrpc_generate).
214
215If binary for deploying the application is unavailable, the legacy configuration
216file can be converted to JSON-RPC using python tool:
217
218~~~bash
219./scripts/config_converter.py < config.ini > config.json
220~~~
221
222## App Framework {#jsonrpc_components_app}
223
224### spdk_kill_instance {#rpc_spdk_kill_instance}
225
226Send a signal to the application.
227
228#### Parameters
229
230Name                    | Optional | Type        | Description
231----------------------- | -------- | ----------- | -----------
232sig_name                | Required | string      | Signal to send (SIGINT, SIGTERM, SIGQUIT, SIGHUP, or SIGKILL)
233
234#### Example
235
236Example request:
237
238~~~json
239{
240  "jsonrpc": "2.0",
241  "id": 1,
242  "method": "spdk_kill_instance",
243  "params": {
244    "sig_name": "SIGINT"
245  }
246}
247~~~
248
249Example response:
250
251~~~json
252{
253  "jsonrpc": "2.0",
254  "id": 1,
255  "result": true
256}
257~~~
258
259### framework_monitor_context_switch {#rpc_framework_monitor_context_switch}
260
261Query, enable, or disable the context switch monitoring functionality.
262
263#### Parameters
264
265Name                    | Optional | Type        | Description
266----------------------- | -------- | ----------- | -----------
267enabled                 | Optional | boolean     | Enable (`true`) or disable (`false`) monitoring (omit this parameter to query the current state)
268
269#### Response
270
271Name                    | Type        | Description
272----------------------- | ----------- | -----------
273enabled                 | boolean     | The current state of context switch monitoring
274
275#### Example
276
277Example request:
278
279~~~json
280{
281  "jsonrpc": "2.0",
282  "id": 1,
283  "method": "framework_monitor_context_switch",
284  "params": {
285    "enabled": false
286  }
287}
288~~~
289
290Example response:
291
292~~~json
293{
294  "jsonrpc": "2.0",
295  "id": 1,
296  "result": {
297    "enabled": false
298  }
299}
300~~~
301
302### framework_start_init {#rpc_framework_start_init}
303
304Start initialization of SPDK subsystems when it is deferred by starting SPDK application with option -w.
305During its deferral some RPCs can be used to set global parameters for SPDK subsystems.
306This RPC can be called only once.
307
308#### Parameters
309
310This method has no parameters.
311
312#### Response
313
314Completion status of SPDK subsystem initialization is returned as a boolean.
315
316#### Example
317
318Example request:
319
320~~~json
321{
322  "jsonrpc": "2.0",
323  "id": 1,
324  "method": "framework_start_init"
325}
326~~~
327
328Example response:
329
330~~~json
331{
332  "jsonrpc": "2.0",
333  "id": 1,
334  "result": true
335}
336~~~
337
338### framework_wait_init {#rpc_framework_wait_init}
339
340Do not return until all subsystems have been initialized and the RPC system state is running.
341If the application is already running, this call will return immediately. This RPC can be called at any time.
342
343#### Parameters
344
345This method has no parameters.
346
347#### Response
348
349Returns True when subsystems have been initialized.
350
351#### Example
352
353Example request:
354
355~~~json
356{
357  "jsonrpc": "2.0",
358  "id": 1,
359  "method": "framework_wait_init"
360}
361~~~
362
363Example response:
364
365~~~json
366{
367  "jsonrpc": "2.0",
368  "id": 1,
369  "result": true
370}
371~~~
372
373### rpc_get_methods {#rpc_rpc_get_methods}
374
375Get an array of supported RPC methods.
376
377#### Parameters
378
379Name                    | Optional | Type        | Description
380----------------------- | -------- | ----------- | -----------
381current                 | Optional | boolean     | Get an array of RPC methods only callable in the current state.
382
383#### Response
384
385The response is an array of supported RPC methods.
386
387#### Example
388
389Example request:
390
391~~~json
392{
393  "jsonrpc": "2.0",
394  "id": 1,
395  "method": "rpc_get_methods"
396}
397~~~
398
399Example response:
400
401~~~json
402{
403  "jsonrpc": "2.0",
404  "id": 1,
405  "result": [
406    "framework_start_init",
407    "rpc_get_methods",
408    "scsi_get_devices",
409    "nbd_get_disks",
410    "nbd_stop_disk",
411    "nbd_start_disk",
412    "log_get_flags",
413    "log_clear_flag",
414    "log_set_flag",
415    "log_get_level",
416    "log_set_level",
417    "log_get_print_level",
418    "log_set_print_level",
419    "iscsi_get_options",
420    "iscsi_target_node_add_lun",
421    "iscsi_get_connections",
422    "iscsi_delete_portal_group",
423    "iscsi_create_portal_group",
424    "iscsi_get_portal_groups",
425    "iscsi_delete_target_node",
426    "iscsi_target_node_remove_pg_ig_maps",
427    "iscsi_target_node_add_pg_ig_maps",
428    "iscsi_create_target_node",
429    "iscsi_get_target_nodes",
430    "iscsi_delete_initiator_group",
431    "iscsi_initiator_group_remove_initiators",
432    "iscsi_initiator_group_add_initiators",
433    "iscsi_create_initiator_group",
434    "iscsi_get_initiator_groups",
435    "iscsi_set_options",
436    "bdev_set_options",
437    "bdev_set_qos_limit",
438    "bdev_get_bdevs",
439    "bdev_get_iostat",
440    "framework_get_config",
441    "framework_get_subsystems",
442    "framework_monitor_context_switch",
443    "spdk_kill_instance",
444    "accel_set_options",
445    "accel_set_driver",
446    "accel_crypto_key_create",
447    "accel_crypto_key_destroy",
448    "accel_crypto_keys_get",
449    "accel_assign_opc",
450    "accel_get_module_info",
451    "accel_get_opc_assignments",
452    "ioat_scan_accel_module",
453    "dsa_scan_accel_module",
454    "dpdk_cryptodev_scan_accel_module",
455    "dpdk_cryptodev_set_driver",
456    "dpdk_cryptodev_get_driver",
457    "mlx5_scan_accel_module",
458    "bdev_virtio_attach_controller",
459    "bdev_virtio_scsi_get_devices",
460    "bdev_virtio_detach_controller",
461    "bdev_virtio_blk_set_hotplug",
462    "bdev_aio_delete",
463    "bdev_aio_create",
464    "bdev_split_delete",
465    "bdev_split_create",
466    "bdev_error_inject_error",
467    "bdev_error_delete",
468    "bdev_error_create",
469    "bdev_passthru_create",
470    "bdev_passthru_delete"
471    "bdev_nvme_apply_firmware",
472    "bdev_nvme_get_transport_statistics",
473    "bdev_nvme_get_controller_health_info",
474    "bdev_nvme_detach_controller",
475    "bdev_nvme_attach_controller",
476    "bdev_null_create",
477    "bdev_malloc_delete",
478    "bdev_malloc_create",
479    "bdev_ftl_delete",
480    "bdev_ftl_unload",
481    "bdev_ftl_create",
482    "bdev_ftl_load",
483    "bdev_ftl_unmap",
484    "bdev_ftl_get_stats",
485    "bdev_lvol_get_lvstores",
486    "bdev_lvol_delete",
487    "bdev_lvol_resize",
488    "bdev_lvol_set_read_only",
489    "bdev_lvol_decouple_parent",
490    "bdev_lvol_inflate",
491    "bdev_lvol_rename",
492    "bdev_lvol_clone",
493    "bdev_lvol_snapshot",
494    "bdev_lvol_create",
495    "bdev_lvol_delete_lvstore",
496    "bdev_lvol_rename_lvstore",
497    "bdev_lvol_create_lvstore",
498    "bdev_daos_delete",
499    "bdev_daos_create",
500    "bdev_daos_resize"
501  ]
502}
503~~~
504
505### framework_get_subsystems {#rpc_framework_get_subsystems}
506
507Get an array of name and dependency relationship of SPDK subsystems in initialization order.
508
509#### Parameters
510
511None
512
513#### Response
514
515The response is an array of name and dependency relationship of SPDK subsystems in initialization order.
516
517#### Example
518
519Example request:
520
521~~~json
522{
523  "jsonrpc": "2.0",
524  "id": 1,
525  "method": "framework_get_subsystems"
526}
527~~~
528
529Example response:
530
531~~~json
532{
533  "jsonrpc": "2.0",
534  "id": 1,
535  "result": [
536    {
537      "subsystem": "accel",
538      "depends_on": []
539    },
540    {
541      "subsystem": "interface",
542      "depends_on": []
543    },
544    {
545      "subsystem": "net_framework",
546      "depends_on": [
547        "interface"
548      ]
549    },
550    {
551      "subsystem": "bdev",
552      "depends_on": [
553        "accel"
554      ]
555    },
556    {
557      "subsystem": "nbd",
558      "depends_on": [
559        "bdev"
560      ]
561    },
562    {
563      "subsystem": "nvmf",
564      "depends_on": [
565        "bdev"
566      ]
567    },
568    {
569      "subsystem": "scsi",
570      "depends_on": [
571        "bdev"
572      ]
573    },
574    {
575      "subsystem": "vhost",
576      "depends_on": [
577        "scsi"
578      ]
579    },
580    {
581      "subsystem": "iscsi",
582      "depends_on": [
583        "scsi"
584      ]
585    }
586  ]
587}
588~~~
589
590### framework_get_config {#rpc_framework_get_config}
591
592Get current configuration of the specified SPDK framework
593
594#### Parameters
595
596Name                    | Optional | Type        | Description
597----------------------- | -------- | ----------- | -----------
598name                    | Required | string      | SPDK subsystem name
599
600#### Response
601
602The response is current configuration of the specified SPDK subsystem.
603Null is returned if it is not retrievable by the framework_get_config method and empty array is returned if it is empty.
604
605#### Example
606
607Example request:
608
609~~~json
610{
611  "jsonrpc": "2.0",
612  "id": 1,
613  "method": "framework_get_config",
614  "params": {
615    "name": "bdev"
616  }
617}
618~~~
619
620Example response:
621
622~~~json
623{
624  "jsonrpc": "2.0",
625  "id": 1,
626  "result": [
627    {
628      "params": {
629        "base_bdev": "Malloc2",
630        "split_size_mb": 0,
631        "split_count": 2
632      },
633      "method": "bdev_split_create"
634    },
635    {
636      "params": {
637        "trtype": "PCIe",
638        "name": "Nvme1",
639        "traddr": "0000:01:00.0"
640      },
641      "method": "bdev_nvme_attach_controller"
642    },
643    {
644      "params": {
645        "trtype": "PCIe",
646        "name": "Nvme2",
647        "traddr": "0000:03:00.0"
648      },
649      "method": "bdev_nvme_attach_controller"
650    },
651    {
652      "params": {
653        "block_size": 512,
654        "num_blocks": 131072,
655        "name": "Malloc0",
656        "uuid": "913fc008-79a7-447f-b2c4-c73543638c31"
657      },
658      "method": "bdev_malloc_create"
659    },
660    {
661      "params": {
662        "block_size": 512,
663        "num_blocks": 131072,
664        "name": "Malloc1",
665        "uuid": "dd5b8f6e-b67a-4506-b606-7fff5a859920"
666      },
667      "method": "bdev_malloc_create"
668    }
669  ]
670}
671~~~
672
673### framework_get_reactors {#rpc_framework_get_reactors}
674
675Retrieve an array of all reactors.
676
677#### Parameters
678
679This method has no parameters.
680
681#### Response
682
683The response is an array of all reactors.
684
685#### Example
686
687Example request:
688
689~~~json
690{
691  "jsonrpc": "2.0",
692  "method": "framework_get_reactors",
693  "id": 1
694}
695~~~
696
697Example response:
698
699~~~json
700{
701  "jsonrpc": "2.0",
702  "id": 1,
703  "result": {
704    "tick_rate": 2400000000,
705    "reactors": [
706      {
707        "lcore": 0,
708        "busy": 41289723495,
709        "idle": 3624832946,
710        "lw_threads": [
711          {
712            "name": "app_thread",
713            "id", 1,
714            "cpumask": "1",
715            "elapsed": 44910853363
716          }
717        ]
718      }
719    ]
720  }
721}
722~~~
723
724### framework_set_scheduler {#rpc_framework_set_scheduler}
725
726Select thread scheduler that will be activated.
727This feature is considered as experimental.
728
729#### Parameters
730
731Name                    | Optional | Type        | Description
732----------------------- | -------- | ----------- | -----------
733name                    | Required | string      | Name of a scheduler
734period                  | Optional | number      | Scheduler period
735load_limit              | Optional | number      | Thread load limit in % (dynamic only)
736core_limit              | Optional | number      | Load limit on the core to be considered full (dynamic only)
737core_busy               | Optional | number      | Indicates at what load on core scheduler should move threads to a different core (dynamic only)
738
739#### Response
740
741Completion status of the operation is returned as a boolean.
742
743#### Example
744
745Example request:
746
747~~~json
748{
749  "jsonrpc": "2.0",
750  "method": "framework_set_scheduler",
751  "id": 1,
752  "params": {
753    "name": "static",
754    "period": "1000000"
755  }
756}
757~~~
758
759Example response:
760
761~~~json
762{
763  "jsonrpc": "2.0",
764  "id": 1,
765  "result": true
766}
767~~~
768
769### framework_get_scheduler {#rpc_framework_get_scheduler}
770
771Retrieve currently set scheduler name and period, along with current governor name.
772
773#### Parameters
774
775This method has no parameters.
776
777#### Response
778
779Name                    | Description
780------------------------| -----------
781scheduler_name          | Current scheduler name
782scheduler_period        | Currently set scheduler period in microseconds
783governor_name           | Governor name
784
785#### Example
786
787Example request:
788
789~~~json
790{
791  "jsonrpc": "2.0",
792  "method": "framework_set_scheduler",
793  "id": 1,
794}
795~~~
796
797Example response:
798
799~~~json
800{
801  "jsonrpc": "2.0",
802  "id": 1,
803  "result": {
804    "scheduler_name": "static",
805    "scheduler_period": 2800000000,
806    "governor_name": "default"
807  }
808}
809~~~
810
811### framework_enable_cpumask_locks
812
813Enable CPU core lock files to block multiple SPDK applications from running on the same cpumask.
814The CPU core locks are enabled by default, unless user specified `--disable-cpumask-locks` command
815line option when launching SPDK.
816
817This RPC may be called after locks have already been enabled, with no effect and no error response.
818
819#### Parameters
820
821This method has no parameters.
822
823#### Response
824
825true on success
826
827#### Example
828
829Example request:
830
831~~~json
832{
833  "jsonrpc": "2.0",
834  "id": 1,
835  "method": "framework_enable_cpumask_locks"
836}
837~~~
838
839Example response:
840
841~~~json
842{
843  "jsonrpc": "2.0",
844  "id": 1,
845  "result": true
846}
847~~~
848
849### framework_disable_cpumask_locks
850
851Disable CPU core lock files. The locks can also be disabled during startup, when
852user specifies `--disable-cpumask-locks` command line option during SPDK launch.
853
854This RPC may be called after locks have already been disabled, with no effect and no error
855response.
856
857#### Parameters
858
859This method has no parameters.
860
861#### Response
862
863true on success
864
865#### Example
866
867Example request:
868
869~~~json
870{
871  "jsonrpc": "2.0",
872  "id": 1,
873  "method": "framework_disable_cpumask_locks"
874}
875~~~
876
877Example response:
878
879~~~json
880{
881  "jsonrpc": "2.0",
882  "id": 1,
883  "result": true
884}
885~~~
886
887### thread_get_stats {#rpc_thread_get_stats}
888
889Retrieve current statistics of all the threads.
890
891#### Parameters
892
893This method has no parameters.
894
895#### Response
896
897The response is an array of objects containing threads statistics.
898
899#### Example
900
901Example request:
902
903~~~json
904{
905  "jsonrpc": "2.0",
906  "method": "thread_get_stats",
907  "id": 1
908}
909~~~
910
911Example response:
912
913~~~json
914{
915  "jsonrpc": "2.0",
916  "id": 1,
917  "result": {
918    "tick_rate": 2400000000,
919    "threads": [
920      {
921        "name": "app_thread",
922        "id": 1,
923	"cpumask": "1",
924        "busy": 139223208,
925        "idle": 8641080608,
926        "in_interrupt": false,
927        "active_pollers_count": 1,
928        "timed_pollers_count": 2,
929        "paused_pollers_count": 0
930      }
931    ]
932  }
933}
934~~~
935
936### thread_set_cpumask {#rpc_thread_set_cpumask}
937
938Set the cpumask of the thread to the specified value. The thread may be migrated
939to one of the specified CPUs.
940
941#### Parameters
942
943Name                    | Optional | Type        | Description
944----------------------- | -------- | ----------- | -----------
945id                      | Required | string      | Thread ID
946cpumask                 | Required | string      | Cpumask for this thread
947
948#### Response
949
950Completion status of the operation is returned as a boolean.
951
952#### Example
953
954Example request:
955
956~~~json
957{
958  "jsonrpc": "2.0",
959  "method": "thread_set_cpumask",
960  "id": 1,
961  "params": {
962    "id": "1",
963    "cpumask": "1"
964  }
965}
966~~~
967
968Example response:
969
970~~~json
971{
972  "jsonrpc": "2.0",
973  "id": 1,
974  "result": true
975}
976~~~
977
978### trace_enable_tpoint_group {#rpc_trace_enable_tpoint_group}
979
980Enable trace on a specific tpoint group. For example "bdev" for bdev trace group,
981"all" for all trace groups.
982
983#### Parameters
984
985Name                    | Optional | Type        | Description
986----------------------- | -------- | ----------- | -----------
987name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl, all
988
989#### Example
990
991Example request:
992
993~~~json
994{
995  "jsonrpc": "2.0",
996  "method": "trace_enable_tpoint_group",
997  "id": 1,
998  "params": {
999    "name": "bdev"
1000  }
1001}
1002~~~
1003
1004Example response:
1005
1006~~~json
1007{
1008  "jsonrpc": "2.0",
1009  "id": 1,
1010  "result": true
1011}
1012~~~
1013
1014### trace_disable_tpoint_group {#rpc_trace_disable_tpoint_group}
1015
1016Disable trace on a specific tpoint group. For example "bdev" for bdev trace group,
1017"all" for all trace groups.
1018
1019#### Parameters
1020
1021Name                    | Optional | Type        | Description
1022----------------------- | -------- | ----------- | -----------
1023name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, all
1024
1025#### Example
1026
1027Example request:
1028
1029~~~json
1030{
1031  "jsonrpc": "2.0",
1032  "method": "trace_disable_tpoint_group",
1033  "id": 1,
1034  "params": {
1035    "name": "bdev"
1036  }
1037}
1038~~~
1039
1040Example response:
1041
1042~~~json
1043{
1044  "jsonrpc": "2.0",
1045  "id": 1,
1046  "result": true
1047}
1048~~~
1049
1050### trace_set_tpoint_mask {#rpc_trace_set_tpoint_mask}
1051
1052Enable tracepoint mask on a specific tpoint group. For example "bdev" for bdev trace group,
1053and 0x1 to enable the first tracepoint inside the group (BDEV_IO_START). This command will not
1054disable already active tracepoints or those not specified in the mask. For a full description
1055of all available trace groups, see
1056[tracepoint documentation](https://spdk.io/doc/nvmf_tgt_tracepoints.html).
1057
1058#### Parameters
1059
1060Name                    | Optional | Type        | Description
1061----------------------- | -------- | ----------- | -----------
1062name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl
1063tpoint_mask             | Required | number      | mask to enable tracepoints inside a group
1064
1065#### Example
1066
1067Example request:
1068
1069~~~json
1070{
1071  "jsonrpc": "2.0",
1072  "method": "trace_set_tpoint_mask",
1073  "id": 1,
1074  "params": {
1075    "name": "bdev",
1076    "tpoint_mask": 0x1
1077  }
1078}
1079~~~
1080
1081Example response:
1082
1083~~~json
1084{
1085  "jsonrpc": "2.0",
1086  "id": 1,
1087  "result": true
1088}
1089~~~
1090
1091### trace_clear_tpoint_mask {#rpc_trace_clear_tpoint_mask}
1092
1093Disable tracepoint mask on a specific tpoint group. For example "bdev" for bdev trace group,
1094and 0x1 to disable the first tracepoint inside the group (BDEV_IO_START). For a full description
1095of all available trace groups, see
1096[tracepoint documentation](https://spdk.io/doc/nvmf_tgt_tracepoints.html).
1097
1098#### Parameters
1099
1100Name                    | Optional | Type        | Description
1101----------------------- | -------- | ----------- | -----------
1102name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl
1103tpoint_mask             | Required | number      | mask to diesable tracepoints inside a group
1104
1105#### Example
1106
1107Example request:
1108
1109~~~json
1110{
1111  "jsonrpc": "2.0",
1112  "method": "trace_clear_tpoint_mask",
1113  "id": 1,
1114  "params": {
1115    "name": "bdev",
1116    "tpoint_mask": 0x1
1117  }
1118}
1119~~~
1120
1121Example response:
1122
1123~~~json
1124{
1125  "jsonrpc": "2.0",
1126  "id": 1,
1127  "result": true
1128}
1129~~~
1130
1131### trace_get_tpoint_group_mask {#rpc_trace_get_tpoint_group_mask}
1132
1133Display mask info for every group.
1134
1135#### Parameters
1136
1137No parameters required
1138
1139#### Example
1140
1141Example request:
1142
1143~~~json
1144{
1145  "jsonrpc": "2.0",
1146  "method": "trace_get_tpoint_group_mask",
1147  "id": 1
1148}
1149~~~
1150
1151Example response:
1152
1153~~~json
1154{
1155  "jsonrpc": "2.0",
1156  "id": 1,
1157  "result": {
1158    "tpoint_group_mask": "0x0",
1159  "iscsi_conn": {
1160    "enabled": false,
1161    "mask": "0x2"
1162  },
1163  "scsi": {
1164    "enabled": false,
1165    "mask": "0x4"
1166  },
1167  "bdev": {
1168    "enabled": false,
1169    "mask": "0x8"
1170  },
1171  "nvmf_tcp": {
1172    "enabled": false,
1173    "mask": "0x20"
1174  },
1175  "ftl": {
1176    "enabled": false,
1177    "mask": "0x40"
1178  },
1179  "blobfs": {
1180    "enabled": false,
1181    "mask": "0x80"
1182    }
1183  }
1184}
1185~~~
1186
1187### trace_get_info {#rpc_trace_get_info}
1188
1189Get name of shared memory file, list of the available trace point groups
1190and mask of the available trace points for each group
1191
1192#### Parameters
1193
1194No parameters required
1195
1196#### Example
1197
1198Example request:
1199
1200~~~json
1201{
1202  "jsonrpc": "2.0",
1203  "method": "trace_get_info",
1204  "id": 1
1205}
1206~~~
1207
1208Example response:
1209
1210~~~json
1211{
1212  "jsonrpc": "2.0",
1213  "id": 1,
1214  "result": {
1215    "tpoint_shm_path": "/dev/shm/spdk_tgt_trace.pid3071944",
1216    "tpoint_group_mask": "0x8",
1217    "iscsi_conn": {
1218      "mask": "0x2",
1219      "tpoint_mask": "0x0"
1220    },
1221    "scsi": {
1222      "mask": "0x4",
1223      "tpoint_mask": "0x0"
1224    },
1225    "bdev": {
1226      "mask": "0x8",
1227      "tpoint_mask": "0xffffffffffffffff"
1228    },
1229    "nvmf_tcp": {
1230      "mask": "0x20",
1231      "tpoint_mask": "0x0"
1232    },
1233    "blobfs": {
1234      "mask": "0x80",
1235      "tpoint_mask": "0x0"
1236    },
1237    "thread": {
1238      "mask": "0x400",
1239      "tpoint_mask": "0x0"
1240    },
1241    "nvme_pcie": {
1242      "mask": "0x800",
1243      "tpoint_mask": "0x0"
1244    },
1245    "nvme_tcp": {
1246      "mask": "0x2000",
1247      "tpoint_mask": "0x0"
1248    },
1249    "bdev_nvme": {
1250      "mask": "0x4000",
1251      "tpoint_mask": "0x0"
1252    }
1253  }
1254}
1255~~~
1256
1257### log_set_print_level {#rpc_log_set_print_level}
1258
1259Set the current level at which output will additionally be
1260sent to the current console.
1261
1262#### Parameters
1263
1264Name                    | Optional | Type        | Description
1265----------------------- | -------- | ----------- | -----------
1266level                   | Required | string      | ERROR, WARNING, NOTICE, INFO, DEBUG
1267
1268#### Example
1269
1270Example request:
1271
1272~~~json
1273{
1274  "jsonrpc": "2.0",
1275  "method": "log_set_print_level",
1276  "id": 1,
1277  "params": {
1278    "level": "ERROR"
1279  }
1280}
1281~~~
1282
1283Example response:
1284
1285~~~json
1286{
1287  "jsonrpc": "2.0",
1288  "id": 1,
1289  "result": true
1290}
1291~~~
1292
1293### log_get_print_level {#rpc_log_get_print_level}
1294
1295Get the current level at which output will additionally be
1296sent to the current console.
1297
1298#### Example
1299
1300Example request:
1301
1302~~~json
1303{
1304  "jsonrpc": "2.0",
1305  "method": "log_get_print_level",
1306  "id": 1,
1307}
1308~~~
1309
1310Example response:
1311
1312~~~json
1313{
1314  "jsonrpc": "2.0",
1315  "id": 1,
1316  "result": "NOTICE"
1317}
1318~~~
1319
1320### log_set_level {#rpc_log_set_level}
1321
1322Set the current logging level output by the `log` module.
1323
1324#### Parameters
1325
1326Name                    | Optional | Type        | Description
1327----------------------- | -------- | ----------- | -----------
1328level                   | Required | string      | ERROR, WARNING, NOTICE, INFO, DEBUG
1329
1330#### Example
1331
1332Example request:
1333
1334~~~json
1335{
1336  "jsonrpc": "2.0",
1337  "method": "log_set_level",
1338  "id": 1,
1339  "params": {
1340    "level": "ERROR"
1341  }
1342}
1343~~~
1344
1345Example response:
1346
1347~~~json
1348{
1349  "jsonrpc": "2.0",
1350  "id": 1,
1351  "result": true
1352}
1353~~~
1354
1355### log_get_level {#rpc_log_get_level}
1356
1357Get the current logging level output by the `log` module.
1358
1359#### Example
1360
1361Example request:
1362
1363~~~json
1364{
1365  "jsonrpc": "2.0",
1366  "method": "log_get_level",
1367  "id": 1,
1368}
1369~~~
1370
1371Example response:
1372
1373~~~json
1374{
1375  "jsonrpc": "2.0",
1376  "id": 1,
1377  "result": "NOTICE"
1378}
1379~~~
1380
1381### log_set_flag {#rpc_log_set_flag}
1382
1383Enable logging for specific portions of the application. The list of possible
1384log flags can be obtained using the `log_get_flags` RPC and may be different
1385for each application.
1386
1387#### Parameters
1388
1389Name                    | Optional | Type        | Description
1390----------------------- | -------- | ----------- | -----------
1391flag                    | Required | string      | A log flag, or 'all'
1392
1393#### Example
1394
1395Example request:
1396
1397~~~json
1398{
1399  "jsonrpc": "2.0",
1400  "method": "log_set_flag",
1401  "id": 1,
1402  "params": {
1403    "flag": "all"
1404  }
1405}
1406~~~
1407
1408Example response:
1409
1410~~~json
1411{
1412  "jsonrpc": "2.0",
1413  "id": 1,
1414  "result": true
1415}
1416~~~
1417
1418### log_clear_flag {#rpc_log_clear_flag}
1419
1420Disable logging for specific portions of the application. The list of possible
1421log flags can be obtained using the `log_get_flags` RPC and may be different
1422for each application.
1423
1424#### Parameters
1425
1426Name                    | Optional | Type        | Description
1427----------------------- | -------- | ----------- | -----------
1428flag                    | Required | string      | A log flag, or 'all'
1429
1430#### Example
1431
1432Example request:
1433
1434~~~json
1435{
1436  "jsonrpc": "2.0",
1437  "method": "log_clear_flag",
1438  "id": 1,
1439  "params": {
1440    "flag": "all"
1441  }
1442}
1443~~~
1444
1445Example response:
1446
1447~~~json
1448{
1449  "jsonrpc": "2.0",
1450  "id": 1,
1451  "result": true
1452}
1453~~~
1454
1455### log_get_flags {#rpc_log_get_flags}
1456
1457Get the list of valid flags for this application and whether
1458they are currently enabled.
1459
1460#### Example
1461
1462Example request:
1463
1464~~~json
1465{
1466  "jsonrpc": "2.0",
1467  "method": "log_get_flags",
1468  "id": 1,
1469}
1470~~~
1471
1472Example response:
1473
1474~~~json
1475{
1476  "jsonrpc": "2.0",
1477  "id": 1,
1478  "result": {
1479    "nvmf": true,
1480    "nvme": true,
1481    "aio": false,
1482    "bdev" false
1483  }
1484}
1485~~~
1486
1487### log_enable_timestamps {#rpc_log_enable_timestamps}
1488
1489Enable or disable timestamps.
1490
1491#### Parameters
1492
1493Name                    | Optional | Type        | Description
1494----------------------- | -------- | ----------- | -----------
1495enabled                 | Required | boolean     | on or off
1496
1497#### Example
1498
1499Example request:
1500
1501~~~json
1502{
1503  "jsonrpc": "2.0",
1504  "method": "log_enable_timestamps",
1505  "id": 1,
1506  "params": {
1507    "enabled": true
1508  }
1509}
1510~~~
1511
1512Example response:
1513
1514~~~json
1515{
1516  "jsonrpc": "2.0",
1517  "id": 1,
1518  "result": true
1519}
1520~~~
1521
1522### thread_get_pollers {#rpc_thread_get_pollers}
1523
1524Retrieve current pollers of all the threads.
1525
1526#### Parameters
1527
1528This method has no parameters.
1529
1530### Response
1531
1532The response is an array of objects containing pollers of all the threads.
1533
1534#### Example
1535
1536Example request:
1537
1538~~~json
1539{
1540  "jsonrpc": "2.0",
1541  "method": "thread_get_pollers",
1542  "id": 1
1543}
1544~~~
1545
1546Example response:
1547
1548~~~json
1549{
1550  "jsonrpc": "2.0",
1551  "id": 1,
1552  "result": {
1553    "tick_rate": 2500000000,
1554    "threads": [
1555      {
1556        "name": "app_thread",
1557        "id": 1,
1558        "active_pollers": [],
1559        "timed_pollers": [
1560          {
1561            "name": "spdk_rpc_subsystem_poll",
1562            "id": 1,
1563            "state": "waiting",
1564            "run_count": 12345,
1565            "busy_count": 10000,
1566            "period_ticks": 10000000
1567          }
1568        ],
1569        "paused_pollers": []
1570      }
1571    ]
1572  }
1573}
1574~~~
1575
1576### thread_get_io_channels {#rpc_thread_get_io_channels}
1577
1578Retrieve current IO channels of all the threads.
1579
1580#### Parameters
1581
1582This method has no parameters.
1583
1584#### Response
1585
1586The response is an array of objects containing IO channels of all the threads.
1587
1588#### Example
1589
1590Example request:
1591
1592~~~json
1593{
1594  "jsonrpc": "2.0",
1595  "method": "thread_get_io_channels",
1596  "id": 1
1597}
1598~~~
1599
1600Example response:
1601
1602~~~json
1603{
1604  "jsonrpc": "2.0",
1605  "id": 1,
1606  "result": {
1607    "tick_rate": 2500000000,
1608    "threads": [
1609      {
1610        "name": "app_thread",
1611        "io_channels": [
1612          {
1613            "name": "nvmf_tgt",
1614            "ref": 1
1615          }
1616        ]
1617      }
1618    ]
1619  }
1620}
1621~~~
1622
1623### env_dpdk_get_mem_stats {#rpc_env_dpdk_get_mem_stats}
1624
1625Write the dpdk memory stats to a file.
1626
1627#### Parameters
1628
1629This method has no parameters.
1630
1631#### Response
1632
1633The response is a pathname to a text file containing the memory stats.
1634
1635#### Example
1636
1637Example request:
1638
1639~~~json
1640{
1641  "jsonrpc": "2.0",
1642  "method": "env_dpdk_get_mem_stats",
1643  "id": 1
1644}
1645~~~
1646
1647Example response:
1648
1649~~~json
1650{
1651  "jsonrpc": "2.0",
1652  "id": 1,
1653  "result": {
1654    "filename": "/tmp/spdk_mem_dump.txt"
1655  }
1656}
1657~~~
1658
1659## Acceleration Framework Layer {#jsonrpc_components_accel_fw}
1660
1661### accel_get_module_info {#accel_get_module_info}
1662
1663Get a list of valid module names and their supported operations.
1664
1665#### Parameters
1666
1667None
1668
1669#### Example
1670
1671Example request:
1672
1673~~~json
1674{
1675  "jsonrpc": "2.0",
1676  "method": "accel_get_module_info",
1677  "id": 1
1678}
1679~~~
1680
1681Example response:
1682
1683~~~json
1684[
1685  {
1686    "module": "software",
1687    "supported ops": [
1688      "copy",
1689      "fill",
1690      "dualcast",
1691      "compare",
1692      "crc32c",
1693      "copy_crc32c",
1694      "compress",
1695      "decompress"
1696    ]
1697  },
1698  {
1699    "module": "dsa",
1700    "supported ops": [
1701      "copy",
1702      "fill",
1703      "dualcast",
1704      "compare",
1705      "crc32c",
1706      "copy_crc32c"
1707    ]
1708  }
1709]
1710~~~
1711
1712### accel_get_opc_assignments {#rpc_accel_get_opc_assignments}
1713
1714Get a list of opcode names and their assigned accel_fw modules.
1715
1716#### Parameters
1717
1718None
1719
1720#### Example
1721
1722Example request:
1723
1724~~~json
1725{
1726  "jsonrpc": "2.0",
1727  "method": "accel_get_opc_assignments",
1728  "id": 1
1729}
1730~~~
1731
1732Example response:
1733
1734~~~json
1735{
1736  "jsonrpc": "2.0",
1737  "id": 1,
1738  "result": [
1739    {
1740      "copy": "software",
1741      "fill": "software",
1742      "dualcast": "software",
1743      "compare": "software",
1744      "crc32c": "software",
1745      "copy_crc32c": "software",
1746      "compress": "software",
1747      "decompress": "software"
1748    }
1749  ]
1750}
1751~~~
1752
1753### accel_assign_opc {#rpc_accel_assign_opc}
1754
1755Manually assign an operation to a module.
1756
1757#### Parameters
1758
1759Name                    | Optional | Type        | Description
1760----------------------- | -------- | ----------- | -----------------
1761opname                  | Required | string      | name of operation
1762module                  | Required | string      | name of module
1763
1764#### Example
1765
1766Example request:
1767
1768~~~json
1769{
1770  "jsonrpc": "2.0",
1771  "method": "accel_assign_opc",
1772  "id": 1,
1773  "params": {
1774    "opname": "copy",
1775    "module": "software"
1776  }
1777}
1778~~~
1779
1780Example response:
1781
1782~~~json
1783{
1784  "jsonrpc": "2.0",
1785  "id": 1,
1786  "result": true
1787}
1788~~~
1789
1790### accel_crypto_key_create {#rpc_accel_crypto_key_create}
1791
1792Create a crypto key which will be used in accel framework
1793
1794#### Parameters
1795
1796Name       | Optional | Type        | Description
1797-----------|----------| ----------- | -----------------
1798cipher     | Required | string      | crypto cipher to use
1799key        | Required | string      | Key in **hex** form
1800key2       | Optional | string      | Optional 2nd part of the key or a tweak in **hex** form
1801name       | Required | string      | The key name
1802
1803#### Example
1804
1805Example request:
1806
1807~~~json
1808{
1809  "jsonrpc": "2.0",
1810  "method": "accel_crypto_key_create",
1811  "id": 1,
1812  "params": {
1813    "cipher": "AES_XTS",
1814    "key": "00112233445566778899001122334455",
1815    "key2": "00112233445566778899001122334455",
1816    "name": "super_key"
1817  }
1818}
1819~~~
1820
1821Example response:
1822
1823~~~json
1824{
1825  "jsonrpc": "2.0",
1826  "id": 1,
1827  "result": true
1828}
1829~~~
1830
1831### accel_crypto_key_destroy {#rpc_accel_crypto_key_destroy}
1832
1833Destroy a crypto key. The user is responsible for ensuring that the deleted key is not used by acceleration modules.
1834
1835#### Parameters
1836
1837Name       | Optional | Type        | Description
1838-----------|----------| ----------- | -----------------
1839name       | Required | string      | The key name
1840
1841#### Example
1842
1843Example request:
1844
1845~~~json
1846{
1847  "jsonrpc": "2.0",
1848  "method": "accel_crypto_key_destroy",
1849  "id": 1,
1850  "params": {
1851    "name": "super_key"
1852  }
1853}
1854~~~
1855
1856Example response:
1857
1858~~~json
1859{
1860  "jsonrpc": "2.0",
1861  "id": 1,
1862  "result": true
1863}
1864~~~
1865
1866### accel_crypto_keys_get {#rpc_accel_crypto_keys_get}
1867
1868Get information about existing crypto keys
1869
1870#### Parameters
1871
1872Name                    | Optional | Type        | Description
1873----------------------- |----------| ----------- | -----------------
1874key_name                | Optional | string      | If specified, return info about a specific key
1875
1876#### Example
1877
1878Example request:
1879
1880~~~json
1881{
1882  "jsonrpc": "2.0",
1883  "method": "accel_crypto_keys_get",
1884  "id": 1
1885}
1886~~~
1887
1888Example response:
1889
1890~~~json
1891{
1892  "jsonrpc": "2.0",
1893  "id": 1,
1894  "result": [
1895    {
1896      "name": "test_dek",
1897      "cipher": "AES_XTS",
1898      "key": "00112233445566778899001122334455",
1899      "key2": "11223344556677889900112233445500"
1900    },
1901    {
1902      "name": "test_dek2",
1903      "cipher": "AES_XTS",
1904      "key": "11223344556677889900112233445500",
1905      "key2": "22334455667788990011223344550011"
1906    }
1907  ]
1908}
1909~~~
1910
1911### accel_set_driver {#rpc_accel_set_driver}
1912
1913Select platform driver to execute operation chains.  Until a driver is selected, all operations are
1914executed through accel modules.
1915
1916#### Parameters
1917
1918Name                    | Optional | Type        | Description
1919----------------------- |----------| ----------- | -----------------
1920name                    | Required | string      | Name of the platform driver
1921
1922#### Example
1923
1924Example request:
1925
1926~~~json
1927{
1928  "jsonrpc": "2.0",
1929  "method": "accel_set_driver",
1930  "id": 1
1931  "params": {
1932    "name": "xeon"
1933  }
1934}
1935~~~
1936
1937Example response:
1938
1939~~~json
1940{
1941  "jsonrpc": "2.0",
1942  "id": 1,
1943  "result": true
1944}
1945~~~
1946
1947### accel_set_options {#rpc_accel_set_options}
1948
1949Set accel framework's options.
1950
1951#### Parameters
1952
1953Name                    | Optional | Type        | Description
1954----------------------- |----------| ----------- | -----------------
1955small_cache_size        | Optional | number      | Size of the small iobuf cache
1956large_cache_size        | Optional | number      | Size of the large iobuf cache
1957task_count              | Optional | number      | Maximum number of tasks per IO channel
1958sequence_count          | Optional | number      | Maximum number of sequences per IO channel
1959buf_count               | Optional | number      | Maximum number of accel buffers per IO channel
1960
1961#### Example
1962
1963Example request:
1964
1965~~~json
1966{
1967  "jsonrpc": "2.0",
1968  "method": "accel_set_options",
1969  "id": 1,
1970  "params": {
1971    "small_cache_size": 128,
1972    "large_cache_size": 32
1973  }
1974}
1975~~~
1976
1977Example response:
1978
1979~~~json
1980{
1981  "jsonrpc": "2.0",
1982  "id": 1,
1983  "result": true
1984}
1985~~~
1986
1987### accel_get_stats {#rpc_accel_get_stats}
1988
1989Retrieve accel framework's statistics.  Statistics for opcodes that have never been executed (i.e.
1990all their stats are at 0) aren't included in the `operations` array.
1991
1992#### Parameters
1993
1994None.
1995
1996#### Example
1997
1998Example request:
1999
2000~~~json
2001{
2002  "jsonrpc": "2.0",
2003  "method": "accel_get_stats",
2004  "id": 1
2005}
2006~~~
2007
2008Example response:
2009
2010~~~json
2011{
2012  "jsonrpc": "2.0",
2013  "id": 1,
2014  "result": {
2015    "sequence_executed": 256,
2016    "sequence_failed": 0,
2017    "operations": [
2018      {
2019        "opcode": "copy",
2020        "executed": 256,
2021        "failed": 0
2022      },
2023      {
2024        "opcode": "encrypt",
2025        "executed": 128,
2026        "failed": 0
2027      },
2028      {
2029        "opcode": "decrypt",
2030        "executed": 128,
2031        "failed": 0
2032      }
2033    ]
2034  }
2035}
2036~~~
2037
2038### compressdev_scan_accel_module {#rpc_compressdev_scan_accel_module}
2039
2040Set config and enable compressdev accel module offload.
2041Select the DPDK polled mode driver (pmd) for the accel compress module,
20420 = auto-select, 1= QAT only, 2 = mlx5_pci only.
2043
2044#### Parameters
2045
2046Name                    | Optional | Type        | Description
2047----------------------- | -------- | ----------- | -----------
2048pmd                     | Required | int         | pmd selection
2049
2050#### Example
2051
2052Example request:
2053
2054~~~json
2055{
2056  "params": {
2057    "pmd": 1
2058  },
2059  "jsonrpc": "2.0",
2060  "method": "compressdev_scan_accel_module",
2061  "id": 1
2062}
2063~~~
2064
2065Example response:
2066
2067~~~json
2068{
2069  "jsonrpc": "2.0",
2070  "id": 1,
2071  "result": true
2072}
2073~~~
2074
2075### dsa_scan_accel_module {#rpc_dsa_scan_accel_module}
2076
2077Set config and enable dsa accel module offload.
2078This feature is considered as experimental.
2079
2080#### Parameters
2081
2082Name                    | Optional | Type        | Description
2083----------------------- | -------- | ----------- | -----------
2084config_kernel_mode      | Optional | Boolean     | If set, will use kernel idxd driver.
2085
2086#### Example
2087
2088Example request:
2089
2090~~~json
2091{
2092  "params": {
2093    "config_kernel_mode": false
2094  },
2095  "jsonrpc": "2.0",
2096  "method": "dsa_scan_accel_module",
2097  "id": 1
2098}
2099~~~
2100
2101Example response:
2102
2103~~~json
2104{
2105  "jsonrpc": "2.0",
2106  "id": 1,
2107  "result": true
2108}
2109~~~
2110
2111### iaa_scan_accel_module {#rpc_iaa_scan_accel_module}
2112
2113Enable IAA accel module offload.
2114This feature is considered as experimental.
2115
2116#### Parameters
2117
2118None
2119
2120#### Example
2121
2122Example request:
2123
2124~~~json
2125{
2126  "jsonrpc": "2.0",
2127  "method": "iaa_scan_accel_module",
2128  "id": 1
2129}
2130~~~
2131
2132Example response:
2133
2134~~~json
2135{
2136  "jsonrpc": "2.0",
2137  "id": 1,
2138  "result": true
2139}
2140~~~
2141
2142### ioat_scan_accel_module {#rpc_ioat_scan_accel_module}
2143
2144Enable ioat accel module offload.
2145
2146#### Parameters
2147
2148None
2149
2150#### Example
2151
2152Example request:
2153
2154~~~json
2155{
2156  "jsonrpc": "2.0",
2157  "method": "ioat_scan_accel_module",
2158  "id": 1
2159}
2160~~~
2161
2162Example response:
2163
2164~~~json
2165{
2166  "jsonrpc": "2.0",
2167  "id": 1,
2168  "result": true
2169}
2170~~~
2171
2172### dpdk_cryptodev_scan_accel_module {#rpc_dpdk_cryptodev_scan_accel_module}
2173
2174Enable dpdk_cryptodev accel offload
2175
2176#### Parameters
2177
2178None
2179
2180#### Example
2181
2182Example request:
2183
2184~~~json
2185{
2186  "jsonrpc": "2.0",
2187  "method": "dpdk_cryptodev_scan_accel_module",
2188  "id": 1
2189}
2190~~~
2191
2192Example response:
2193
2194~~~json
2195{
2196  "jsonrpc": "2.0",
2197  "id": 1,
2198  "result": true
2199}
2200~~~
2201
2202### dpdk_cryptodev_set_driver {#rpc_dpdk_cryptodev_set_driver}
2203
2204Set the DPDK cryptodev driver
2205
2206#### Parameters
2207
2208Name                    | Optional | Type   | Description
2209----------------------- |----------|--------| -----------
2210crypto_pmd              | Required | string | The driver, can be one of crypto_aesni_mb, crypto_qat or mlx5_pci
2211
2212#### Example
2213
2214Example request:
2215
2216~~~json
2217{
2218  "jsonrpc": "2.0",
2219  "method": "dpdk_cryptodev_set_driver",
2220  "id": 1,
2221  "params": {
2222    "crypto_pmd": "crypto_aesni_mb"
2223  }
2224}
2225~~~
2226
2227Example response:
2228
2229~~~json
2230{
2231  "jsonrpc": "2.0",
2232  "id": 1,
2233  "result": true
2234}
2235~~~
2236
2237### dpdk_cryptodev_get_driver {#rpc_dpdk_cryptodev_get_driver}
2238
2239Get the DPDK cryptodev driver
2240
2241#### Parameters
2242
2243None
2244
2245#### Example
2246
2247Example request:
2248
2249~~~json
2250{
2251  "jsonrpc": "2.0",
2252  "method": "dpdk_cryptodev_get_driver",
2253  "id": 1
2254}
2255~~~
2256
2257Example response:
2258
2259~~~json
2260{
2261  "jsonrpc": "2.0",
2262  "id": 1,
2263  "result": "crypto_aesni_mb"
2264}
2265~~~
2266
2267### mlx5_scan_accel_module {#rpc_mlx5_scan_accel_module}
2268
2269Enable mlx5 accel offload
2270
2271#### Parameters
2272
2273Name                    | Optional | Type   | Description
2274----------------------- | -------- |--------| -----------
2275qp_size                 | Optional | number | qpair size
2276num_requests            | Optional | number | Size of the shared requests pool
2277
2278#### Example
2279
2280Example request:
2281
2282~~~json
2283{
2284  "jsonrpc": "2.0",
2285  "method": "mlx5_scan_accel_module",
2286  "id": 1,
2287  "params": {
2288    "qp_size": 256,
2289    "num_requests": 2047
2290  }
2291}
2292~~~
2293
2294Example response:
2295
2296~~~json
2297{
2298  "jsonrpc": "2.0",
2299  "id": 1,
2300  "result": true
2301}
2302~~~
2303
2304## Block Device Abstraction Layer {#jsonrpc_components_bdev}
2305
2306### bdev_set_options {#rpc_bdev_set_options}
2307
2308Set global parameters for the block device (bdev) subsystem.  This RPC may only be called
2309before SPDK subsystems have been initialized.
2310
2311#### Parameters
2312
2313Name                    | Optional | Type        | Description
2314----------------------- | -------- | ----------- | -----------
2315bdev_io_pool_size       | Optional | number      | Number of spdk_bdev_io structures in shared buffer pool
2316bdev_io_cache_size      | Optional | number      | Maximum number of spdk_bdev_io structures cached per thread
2317bdev_auto_examine       | Optional | boolean     | If set to false, the bdev layer will not examine every disks automatically
2318
2319#### Example
2320
2321Example request:
2322
2323~~~json
2324{
2325  "jsonrpc": "2.0",
2326  "id": 1,
2327  "method": "bdev_set_options",
2328  "params": {
2329    "bdev_io_pool_size": 65536,
2330    "bdev_io_cache_size": 256
2331  }
2332}
2333~~~
2334
2335Example response:
2336
2337~~~json
2338{
2339  "jsonrpc": "2.0",
2340  "id": 1,
2341  "result": true
2342}
2343~~~
2344
2345### bdev_get_bdevs {#rpc_bdev_get_bdevs}
2346
2347Get information about block devices (bdevs).
2348
2349#### Parameters
2350
2351The user may specify no parameters in order to list all block devices, or a block device may be
2352specified by name.  If a timeout is specified, the method will block until a bdev with a specified
2353name appears or the timeout expires.  By default, the timeout is zero, meaning the method returns
2354immediately whether the bdev exists or not.
2355
2356Name                    | Optional | Type        | Description
2357----------------------- | -------- | ----------- | -----------
2358name                    | Optional | string      | Block device name
2359timeout                 | Optional | number      | Time (ms) to wait for a bdev with specified name to appear
2360
2361#### Response
2362
2363The response is an array of objects containing information about the requested block devices.
2364
2365#### Example
2366
2367Example request:
2368
2369~~~json
2370{
2371  "jsonrpc": "2.0",
2372  "id": 1,
2373  "method": "bdev_get_bdevs",
2374  "params": {
2375    "name": "Malloc0"
2376  }
2377}
2378~~~
2379
2380Example response:
2381
2382~~~json
2383{
2384  "jsonrpc": "2.0",
2385  "id": 1,
2386  "result": [
2387    {
2388      "name": "Malloc0",
2389      "product_name": "Malloc disk",
2390      "block_size": 512,
2391      "num_blocks": 20480,
2392      "claimed": false,
2393      "zoned": false,
2394      "supported_io_types": {
2395        "read": true,
2396        "write": true,
2397        "unmap": true,
2398        "write_zeroes": true,
2399        "flush": true,
2400        "reset": true,
2401        "nvme_admin": false,
2402        "nvme_io": false
2403      },
2404      "driver_specific": {}
2405    }
2406  ]
2407}
2408~~~
2409
2410### bdev_examine {#rpc_bdev_examine}
2411
2412Request that the bdev layer examines the given bdev for metadata and creates
2413new bdevs if metadata is found. This is only necessary if `auto_examine` has
2414been set to false using `bdev_set_options`. By default, `auto_examine` is true
2415and bdev examination is automatic.
2416
2417#### Parameters
2418
2419Name                    | Optional | Type        | Description
2420----------------------- | -------- | ----------- | -----------
2421name                    | Required | string      | Block device name
2422
2423#### Response
2424
2425The response is an array of objects containing I/O statistics of the requested block devices.
2426
2427#### Example
2428
2429Example request:
2430
2431~~~json
2432{
2433  "jsonrpc": "2.0",
2434  "id": 1,
2435  "method": "bdev_examine",
2436  "params": {
2437    "name": "Nvme0n1"
2438  }
2439}
2440~~~
2441
2442Example response:
2443
2444~~~json
2445{
2446  "jsonrpc": "2.0",
2447  "id": 1,
2448  "result": true
2449}
2450~~~
2451
2452### bdev_wait_for_examine {#rpc_bdev_wait_for_examine}
2453
2454Report when all bdevs have been examined by every bdev module.
2455
2456#### Parameters
2457
2458None
2459
2460#### Response
2461
2462The response is sent when all bdev modules had a chance to examine every bdev.
2463
2464#### Example
2465
2466Example request:
2467
2468~~~json
2469{
2470  "jsonrpc": "2.0",
2471  "method": "bdev_wait_for_examine",
2472  "id": 1
2473}
2474~~~
2475
2476Example response:
2477
2478~~~json
2479{
2480  "jsonrpc": "2.0",
2481  "id": 1,
2482  "result": true
2483}
2484~~~
2485
2486### bdev_get_iostat {#rpc_bdev_get_iostat}
2487
2488Get I/O statistics of block devices (bdevs).
2489
2490#### Parameters
2491
2492The user may specify no parameters in order to list all block devices, or a block device may be
2493specified by name.
2494
2495Name                    | Optional | Type        | Description
2496----------------------- | -------- | ----------- | -----------
2497name                    | Optional | string      | Block device name
2498per_channel             | Optional | bool        | Display per channel data for specified block device.
2499
2500#### Response
2501
2502The response is an array of objects containing I/O statistics of the requested block devices.
2503
2504#### Example
2505
2506Example request:
2507
2508~~~json
2509{
2510  "jsonrpc": "2.0",
2511  "id": 1,
2512  "method": "bdev_get_iostat",
2513  "params": {
2514    "name": "Nvme0n1",
2515    "per_channel": false
2516  }
2517}
2518~~~
2519
2520Example response:
2521
2522~~~json
2523{
2524  "jsonrpc": "2.0",
2525  "id": 1,
2526  "result": {
2527    "tick_rate": 2200000000,
2528    "bdevs" : [
2529      {
2530        "name": "Nvme0n1",
2531        "bytes_read": 36864,
2532        "num_read_ops": 2,
2533        "bytes_written": 0,
2534        "num_write_ops": 0,
2535        "bytes_unmapped": 0,
2536        "num_unmap_ops": 0,
2537        "read_latency_ticks": 178904,
2538        "write_latency_ticks": 0,
2539        "unmap_latency_ticks": 0,
2540        "queue_depth_polling_period": 2,
2541        "queue_depth": 0,
2542        "io_time": 0,
2543        "weighted_io_time": 0
2544      }
2545    ]
2546  }
2547}
2548~~~
2549
2550### bdev_reset_iostat {#rpc_bdev_reset_iostat}
2551
2552Reset I/O statistics of block devices (bdevs). Note that if one consumer resets I/O statistics,
2553it affects all other consumers.
2554
2555#### Parameters
2556
2557The user may specify no parameters in order to reset I/O statistics for all block devices, or
2558a block device may be specified by name.
2559
2560Name                    | Optional | Type        | Description
2561----------------------- | -------- | ----------- | -----------
2562name                    | Optional | string      | Block device name
2563mode                    | Optional | string      | Mode to reset I/O statistics: all, maxmin (default: all)
2564
2565#### Example
2566
2567Example request:
2568
2569~~~json
2570{
2571  "jsonrpc": "2.0",
2572  "id": 1,
2573  "method": "bdev_reset_iostat",
2574  "params": {
2575    "name": "Nvme0n1"
2576  }
2577}
2578~~~
2579
2580Example response:
2581
2582~~~json
2583{
2584  "jsonrpc": "2.0",
2585  "id": 1,
2586  "result": true
2587}
2588~~~
2589
2590### bdev_enable_histogram {#rpc_bdev_enable_histogram}
2591
2592Control whether collecting data for histogram is enabled for specified bdev.
2593
2594#### Parameters
2595
2596Name                    | Optional | Type        | Description
2597----------------------- | -------- | ----------- | -----------
2598name                    | Required | string      | Block device name
2599enable                  | Required | boolean     | Enable or disable histogram on specified device
2600
2601#### Example
2602
2603Example request:
2604
2605~~~json
2606{
2607  "jsonrpc": "2.0",
2608  "id": 1,
2609  "method": "bdev_enable_histogram",
2610  "params": {
2611    "name": "Nvme0n1"
2612    "enable": true
2613  }
2614}
2615~~~
2616
2617Example response:
2618
2619~~~json
2620{
2621  "jsonrpc": "2.0",
2622  "id": 1,
2623  "result": true
2624}
2625~~~
2626
2627### bdev_get_histogram {#rpc_bdev_get_histogram}
2628
2629Get latency histogram for specified bdev.
2630
2631#### Parameters
2632
2633Name                    | Optional | Type        | Description
2634----------------------- | -------- | ----------- | -----------
2635name                    | Required | string      | Block device name
2636
2637#### Result
2638
2639Name                    | Description
2640------------------------| -----------
2641histogram               | Base64 encoded histogram
2642bucket_shift            | Granularity of the histogram buckets
2643tsc_rate                | Ticks per second
2644
2645#### Example
2646
2647Example request:
2648
2649~~~json
2650{
2651  "jsonrpc": "2.0",
2652  "id": 1,
2653  "method": "bdev_get_histogram",
2654  "params": {
2655    "name": "Nvme0n1"
2656  }
2657}
2658~~~
2659
2660Example response:
2661Note that histogram field is trimmed, actual encoded histogram length is ~80kb.
2662
2663~~~json
2664{
2665  "jsonrpc": "2.0",
2666  "id": 1,
2667  "result": {
2668    "histogram": "AAAAAAAAAAAAAA...AAAAAAAAA==",
2669    "tsc_rate": 2300000000,
2670    "bucket_shift": 7
2671  }
2672}
2673~~~
2674
2675### bdev_set_qos_limit {#rpc_bdev_set_qos_limit}
2676
2677Set the quality of service rate limit on a bdev.
2678
2679#### Parameters
2680
2681Name                    | Optional | Type        | Description
2682----------------------- | -------- | ----------- | -----------
2683name                    | Required | string      | Block device name
2684rw_ios_per_sec          | Optional | number      | Number of R/W I/Os per second to allow. 0 means unlimited.
2685rw_mbytes_per_sec       | Optional | number      | Number of R/W megabytes per second to allow. 0 means unlimited.
2686r_mbytes_per_sec        | Optional | number      | Number of Read megabytes per second to allow. 0 means unlimited.
2687w_mbytes_per_sec        | Optional | number      | Number of Write megabytes per second to allow. 0 means unlimited.
2688
2689#### Example
2690
2691Example request:
2692
2693~~~json
2694{
2695  "jsonrpc": "2.0",
2696  "id": 1,
2697  "method": "bdev_set_qos_limit",
2698  "params": {
2699    "name": "Malloc0"
2700    "rw_ios_per_sec": 20000
2701    "rw_mbytes_per_sec": 100
2702    "r_mbytes_per_sec": 50
2703    "w_mbytes_per_sec": 50
2704  }
2705}
2706~~~
2707
2708Example response:
2709
2710~~~json
2711{
2712  "jsonrpc": "2.0",
2713  "id": 1,
2714  "result": true
2715}
2716~~~
2717
2718### bdev_set_qd_sampling_period {#rpc_bdev_set_qd_sampling_period}
2719
2720Enable queue depth tracking on a specified bdev.
2721
2722#### Parameters
2723
2724Name                    | Optional | Type        | Description
2725----------------------- | -------- | ----------- | -----------
2726name                    | Required | string      | Block device name
2727period                  | Required | int         | period (in microseconds).If set to 0, polling will be disabled.
2728
2729#### Example
2730
2731Example request:
2732
2733~~~json
2734{
2735  "jsonrpc": "2.0",
2736  "method": "bdev_set_qd_sampling_period",
2737  "id": 1,
2738  "params": {
2739    "name": "Malloc0",
2740    "period": 20
2741  }
2742}
2743~~~
2744
2745Example response:
2746
2747~~~json
2748{
2749  "jsonrpc": "2.0",
2750  "id": 1,
2751  "result": true
2752}
2753~~~
2754
2755### bdev_compress_create {#rpc_bdev_compress_create}
2756
2757Create a new compress bdev on a given base bdev.
2758
2759#### Parameters
2760
2761Name                    | Optional | Type        | Description
2762----------------------- | -------- | ----------- | -----------
2763base_bdev_name          | Required | string      | Name of the base bdev
2764pm_path                 | Required | string      | Path to persistent memory
2765lb_size                 | Optional | int         | Compressed vol logical block size (512 or 4096)
2766
2767#### Result
2768
2769Name of newly created bdev.
2770
2771#### Example
2772
2773Example request:
2774
2775~~~json
2776{
2777  "params": {
2778    "base_bdev_name": "Nvme0n1",
2779    "pm_path": "/pm_files",
2780    "lb_size": 4096
2781  },
2782  "jsonrpc": "2.0",
2783  "method": "bdev_compress_create",
2784  "id": 1
2785}
2786~~~
2787
2788### bdev_compress_delete {#rpc_bdev_compress_delete}
2789
2790Delete a compressed bdev.
2791
2792#### Parameters
2793
2794Name                    | Optional | Type        | Description
2795----------------------- | -------- | ----------- | -----------
2796name                    | Required | string      | Name of the compress bdev
2797
2798#### Example
2799
2800Example request:
2801
2802~~~json
2803{
2804  "params": {
2805    "name": "COMP_Nvme0n1"
2806  },
2807  "jsonrpc": "2.0",
2808  "method": "bdev_compress_delete",
2809  "id": 1
2810}
2811~~~
2812
2813Example response:
2814
2815~~~json
2816{
2817  "jsonrpc": "2.0",
2818  "id": 1,
2819  "result": true
2820}
2821~~~
2822
2823### bdev_compress_get_orphans {#rpc_bdev_compress_get_orphans}
2824
2825Get a list of compressed volumes that are missing their pmem metadata.
2826
2827#### Parameters
2828
2829Name                    | Optional | Type        | Description
2830----------------------- | -------- | ----------- | -----------
2831name                    | Required | string      | Name of the compress bdev
2832
2833#### Example
2834
2835Example request:
2836
2837~~~json
2838{
2839  "params": {
2840    "name": "COMP_Nvme0n1"
2841  },
2842  "jsonrpc": "2.0",
2843  "method": "bdev_compress_get_orphans",
2844  "id": 1
2845}
2846~~~
2847
2848Example response:
2849
2850~~~json
2851{
2852  "jsonrpc": "2.0",
2853  "id": 1,
2854  "name": "COMP_Nvme0n1"
2855}
2856~~~
2857
2858### bdev_crypto_create {#rpc_bdev_crypto_create}
2859
2860Create a new crypto bdev on a given base bdev.
2861
2862#### Parameters
2863
2864Name                    | Optional | Type        | Description
2865----------------------- |----------| ----------- | -----------
2866base_bdev_name          | Required | string      | Name of the base bdev
2867name                    | Required | string      | Name of the crypto vbdev to create
2868crypto_pmd              | Optional | string      | Name of the crypto device driver. Obsolete, see accel_crypto_key_create
2869key                     | Optional | string      | Key in hex form. Obsolete, see accel_crypto_key_create
2870cipher                  | Optional | string      | Cipher to use, AES_CBC or AES_XTS (QAT and MLX5). Obsolete, see accel_crypto_key_create
2871key2                    | Optional | string      | 2nd key in hex form only required for cipher AET_XTS. Obsolete, see accel_crypto_key_create
2872key_name                | Optional | string      | Name of the key created with accel_crypto_key_create
2873module                  | Optional | string      | Name of the accel module which is used to create a key (if no key_name specified)
2874
2875Both key and key2 must be passed in the hexlified form. For example, 256bit AES key may look like this:
2876afd9477abf50254219ccb75965fbe39f23ebead5676e292582a0a67f66b88215
2877
2878#### Result
2879
2880Name of newly created bdev.
2881
2882#### Example
2883
2884Example request:
2885
2886~~~json
2887{
2888  "params": {
2889    "base_bdev_name": "Nvme0n1",
2890    "name": "my_crypto_bdev",
2891    "crypto_pmd": "crypto_aesni_mb",
2892    "key": "12345678901234561234567890123456",
2893    "cipher": "AES_CBC"
2894  },
2895  "jsonrpc": "2.0",
2896  "method": "bdev_crypto_create",
2897  "id": 1
2898}
2899~~~
2900
2901Example response:
2902
2903~~~json
2904{
2905
2906  "jsonrpc": "2.0",
2907  "id": 1,
2908  "result": "my_crypto_bdev"
2909}
2910~~~
2911
2912### bdev_crypto_delete {#rpc_bdev_crypto_delete}
2913
2914Delete a crypto bdev.
2915
2916#### Parameters
2917
2918Name                    | Optional | Type        | Description
2919----------------------- | -------- | ----------- | -----------
2920name                    | Required | string      | Name of the crypto bdev
2921
2922#### Example
2923
2924Example request:
2925
2926~~~json
2927{
2928  "params": {
2929    "name": "my_crypto_bdev"
2930  },
2931  "jsonrpc": "2.0",
2932  "method": "bdev_crypto_delete",
2933  "id": 1
2934}
2935~~~
2936
2937Example response:
2938
2939~~~json
2940{
2941  "jsonrpc": "2.0",
2942  "id": 1,
2943  "result": true
2944}
2945~~~
2946
2947### bdev_ocf_create {#rpc_bdev_ocf_create}
2948
2949Construct new OCF bdev.
2950Command accepts cache mode that is going to be used.
2951You can find more details about supported cache modes in the [OCF documentation](https://open-cas.github.io/cache_configuration.html#cache-mode)
2952
2953#### Parameters
2954
2955Name                    | Optional | Type        | Description
2956----------------------- | -------- | ----------- | -----------
2957name                    | Required | string      | Bdev name to use
2958mode                    | Required | string      | OCF cache mode: wb, wt, pt, wa, wi, wo
2959cache_line_size         | Optional | int         | OCF cache line size in KiB: 4, 8, 16, 32, 64
2960cache_bdev_name         | Required | string      | Name of underlying cache bdev
2961core_bdev_name          | Required | string      | Name of underlying core bdev
2962
2963#### Result
2964
2965Name of newly created bdev.
2966
2967#### Example
2968
2969Example request:
2970
2971~~~json
2972{
2973  "params": {
2974    "name": "ocf0",
2975    "mode": "wt",
2976    "cache_line_size": 64,
2977    "cache_bdev_name": "Nvme0n1",
2978    "core_bdev_name": "aio0"
2979  },
2980  "jsonrpc": "2.0",
2981  "method": "bdev_ocf_create",
2982  "id": 1
2983}
2984~~~
2985
2986Example response:
2987
2988~~~json
2989{
2990  "jsonrpc": "2.0",
2991  "id": 1,
2992  "result": "ocf0"
2993}
2994~~~
2995
2996### bdev_ocf_delete {#rpc_bdev_ocf_delete}
2997
2998Delete the OCF bdev
2999
3000#### Parameters
3001
3002Name                    | Optional | Type        | Description
3003----------------------- | -------- | ----------- | -----------
3004name                    | Required | string      | Bdev name
3005
3006#### Example
3007
3008Example request:
3009
3010~~~json
3011{
3012  "params": {
3013    "name": "ocf0"
3014  },
3015  "jsonrpc": "2.0",
3016  "method": "bdev_ocf_delete",
3017  "id": 1
3018}
3019~~~
3020
3021Example response:
3022
3023~~~json
3024{
3025  "jsonrpc": "2.0",
3026  "id": 1,
3027  "result": true
3028}
3029~~~
3030
3031### bdev_ocf_get_stats {#rpc_bdev_ocf_get_stats}
3032
3033Get statistics of chosen OCF block device.
3034
3035#### Parameters
3036
3037Name                    | Optional | Type        | Description
3038----------------------- | -------- | ----------- | -----------
3039name                    | Required | string      | Block device name
3040
3041#### Response
3042
3043Statistics as json object.
3044
3045#### Example
3046
3047Example request:
3048
3049~~~json
3050{
3051  "params": {
3052    "name": "ocf0"
3053  },
3054  "jsonrpc": "2.0",
3055  "method": "bdev_ocf_get_stats",
3056  "id": 1
3057}
3058~~~
3059
3060Example response:
3061
3062~~~json
3063{
3064  "jsonrpc": "2.0",
3065  "id": 1,
3066  "result": [
3067  "usage": {
3068    "clean": {
3069      "count": 76033,
3070      "units": "4KiB blocks",
3071      "percentage": "100.0"
3072    },
3073    "free": {
3074      "count": 767,
3075      "units": "4KiB blocks",
3076      "percentage": "0.9"
3077    },
3078    "occupancy": {
3079      "count": 76033,
3080      "units": "4KiB blocks",
3081      "percentage": "99.0"
3082    },
3083    "dirty": {
3084      "count": 0,
3085      "units": "4KiB blocks",
3086      "percentage": "0.0"
3087    }
3088  },
3089  "requests": {
3090    "rd_total": {
3091      "count": 2,
3092      "units": "Requests",
3093      "percentage": "0.0"
3094    },
3095    "wr_full_misses": {
3096      "count": 76280,
3097      "units": "Requests",
3098      "percentage": "35.6"
3099    },
3100    "rd_full_misses": {
3101      "count": 1,
3102      "units": "Requests",
3103      "percentage": "0.0"
3104    },
3105    "rd_partial_misses": {
3106      "count": 0,
3107      "units": "Requests",
3108      "percentage": "0.0"
3109    },
3110    "wr_total": {
3111      "count": 212416,
3112      "units": "Requests",
3113      "percentage": "99.2"
3114    },
3115    "wr_pt": {
3116      "count": 1535,
3117      "units": "Requests",
3118      "percentage": "0.7"
3119    },
3120    "wr_partial_misses": {
3121      "count": 0,
3122      "units": "Requests",
3123      "percentage": "0.0"
3124    },
3125    "serviced": {
3126      "count": 212418,
3127      "units": "Requests",
3128      "percentage": "99.2"
3129    },
3130    "rd_pt": {
3131      "count": 0,
3132      "units": "Requests",
3133      "percentage": "0.0"
3134    },
3135    "total": {
3136      "count": 213953,
3137      "units": "Requests",
3138      "percentage": "100.0"
3139    },
3140    "rd_hits": {
3141      "count": 1,
3142      "units": "Requests",
3143      "percentage": "0.0"
3144    },
3145    "wr_hits": {
3146      "count": 136136,
3147      "units": "Requests",
3148      "percentage": "63.6"
3149    }
3150  },
3151  "errors": {
3152    "total": {
3153      "count": 0,
3154      "units": "Requests",
3155      "percentage": "0.0"
3156    },
3157    "cache_obj_total": {
3158      "count": 0,
3159      "units": "Requests",
3160      "percentage": "0.0"
3161    },
3162    "core_obj_total": {
3163      "count": 0,
3164      "units": "Requests",
3165      "percentage": "0.0"
3166    },
3167    "cache_obj_rd": {
3168      "count": 0,
3169      "units": "Requests",
3170      "percentage": "0.0"
3171    },
3172    "core_obj_wr": {
3173      "count": 0,
3174      "units": "Requests",
3175      "percentage": "0.0"
3176    },
3177    "core_obj_rd": {
3178      "count": 0,
3179      "units": "Requests",
3180      "percentage": "0.0"
3181    },
3182    "cache_obj_wr": {
3183      "count": 0,
3184      "units": "Requests",
3185      "percentage": "0.0"
3186    }
3187  },
3188  "blocks": {
3189    "volume_rd": {
3190      "count": 9,
3191      "units": "4KiB blocks",
3192      "percentage": "0.0"
3193    },
3194    "volume_wr": {
3195      "count": 213951,
3196      "units": "4KiB blocks",
3197      "percentage": "99.9"
3198    },
3199    "cache_obj_total": {
3200      "count": 212425,
3201      "units": "4KiB blocks",
3202      "percentage": "100.0"
3203    },
3204    "core_obj_total": {
3205      "count": 213959,
3206      "units": "4KiB blocks",
3207      "percentage": "100.0"
3208    },
3209    "cache_obj_rd": {
3210      "count": 1,
3211      "units": "4KiB blocks",
3212      "percentage": "0.0"
3213    },
3214    "core_obj_wr": {
3215      "count": 213951,
3216      "units": "4KiB blocks",
3217      "percentage": "99.9"
3218    },
3219    "volume_total": {
3220      "count": 213960,
3221      "units": "4KiB blocks",
3222      "percentage": "100.0"
3223    },
3224    "core_obj_rd": {
3225      "count": 8,
3226      "units": "4KiB blocks",
3227      "percentage": "0.0"
3228    },
3229    "cache_obj_wr": {
3230      "count": 212424,
3231      "units": "4KiB blocks",
3232      "percentage": "99.9"
3233    }
3234  ]
3235}
3236~~~
3237
3238### bdev_ocf_reset_stats {#rpc_bdev_ocf_reset_stats}
3239
3240Reset statistics of chosen OCF block device.
3241
3242#### Parameters
3243
3244Name                    | Optional | Type        | Description
3245----------------------- | -------- | ----------- | -----------
3246name                    | Required | string      | Block device name
3247
3248#### Response
3249
3250Completion status of reset statistics operation returned as a boolean.
3251
3252#### Example
3253
3254Example request:
3255
3256~~~json
3257{
3258  "params": {
3259    "name": "ocf0"
3260  },
3261  "jsonrpc": "2.0",
3262  "method": "bdev_ocf_reset_stats",
3263  "id": 1
3264}
3265~~~
3266
3267Example response:
3268
3269~~~json
3270{
3271  "jsonrpc": "2.0",
3272  "id": 1,
3273  "result": true
3274}
3275~~~
3276
3277### bdev_ocf_get_bdevs {#rpc_bdev_ocf_get_bdevs}
3278
3279Get list of OCF devices including unregistered ones.
3280
3281#### Parameters
3282
3283Name                    | Optional | Type        | Description
3284----------------------- | -------- | ----------- | -----------
3285name                    | Optional | string      | Name of OCF vbdev or name of cache device or name of core device
3286
3287#### Response
3288
3289Array of OCF devices with their current status, along with core and cache bdevs.
3290
3291#### Example
3292
3293Example request:
3294
3295~~~json
3296{
3297  "jsonrpc": "2.0",
3298  "method": "bdev_ocf_get_bdevs",
3299  "id": 1
3300}
3301~~~
3302
3303Example response:
3304
3305~~~json
3306{
3307  "jsonrpc": "2.0",
3308  "id": 1,
3309  "result": [
3310    {
3311      "name": "PartCache",
3312      "started": false,
3313      "cache": {
3314        "name": "Malloc0",
3315        "attached": true
3316      },
3317      "core": {
3318        "name": "Malloc1",
3319        "attached": false
3320      }
3321    }
3322  ]
3323}
3324~~~
3325
3326### bdev_ocf_set_cache_mode {#rpc_bdev_ocf_set_cache_mode}
3327
3328Set new cache mode on OCF bdev.
3329
3330#### Parameters
3331
3332Name                    | Optional | Type        | Description
3333----------------------- | -------- | ----------- | -----------
3334name                    | Required | string      | Bdev name
3335mode                    | Required | string      | OCF cache mode: wb, wt, pt, wa, wi, wo
3336
3337#### Response
3338
3339New cache mode name.
3340
3341#### Example
3342
3343Example request:
3344
3345~~~json
3346{
3347  "params": {
3348    "name": "ocf0",
3349    "mode": "pt",
3350  },
3351  "jsonrpc": "2.0",
3352  "method": "bdev_ocf_set_cache_mode",
3353  "id": 1
3354}
3355~~~
3356
3357Example response:
3358
3359~~~json
3360{
3361  "jsonrpc": "2.0",
3362  "id": 1,
3363  "result": "pt"
3364}
3365~~~
3366
3367### bdev_ocf_set_seqcutoff {#rpc_bdev_ocf_set_seqcutoff}
3368
3369Set sequential cutoff parameters on all cores for the given OCF cache device.
3370A brief description of this functionality can be found in [OpenCAS documentation](https://open-cas.github.io/guide_tool_details.html#seq-cutoff).
3371
3372#### Parameters
3373
3374Name                    | Optional | Type        | Description
3375----------------------- | -------- | ----------- | -----------
3376name                    | Required | string      | Bdev name
3377policy                  | Required | string      | Sequential cutoff policy: always, full, never
3378threshold               | Optional | int         | Activation threshold in KiB
3379promotion_count         | Optional | int         | Promotion request count
3380
3381#### Example
3382
3383Example request:
3384
3385~~~json
3386{
3387  "params": {
3388    "name": "ocf0",
3389    "policy": "full",
3390    "threshold": 4,
3391    "promotion_count": 2
3392  },
3393  "jsonrpc": "2.0",
3394  "method": "bdev_ocf_set_seqcutoff",
3395  "id": 1
3396}
3397~~~
3398
3399Example response:
3400
3401~~~json
3402{
3403  "jsonrpc": "2.0",
3404  "id": 1,
3405  "result": true
3406}
3407~~~
3408
3409### bdev_ocf_flush_start {#rpc_bdev_ocf_flush_start}
3410
3411Start flushing OCF cache device.
3412
3413Automatic flushes of dirty data are managed by OCF cleaning policy settings.
3414In addition to that, all dirty data is flushed to core device when there is
3415an attempt to stop caching.
3416On the other hand, this RPC call gives a possibility to flush dirty data manually
3417when there is a need for it, e.g. to speed up the shutdown process when data
3418hasn't been flushed for a long time.
3419This RPC returns immediately, and flush is then being performed in the
3420background. To see the status of flushing operation use bdev_ocf_flush_status.
3421
3422#### Parameters
3423
3424Name                    | Optional | Type        | Description
3425----------------------- | -------- | ----------- | -----------
3426name                    | Required | string      | Bdev name
3427
3428#### Example
3429
3430Example request:
3431
3432~~~json
3433{
3434  "params": {
3435    "name": "ocf0"
3436  },
3437  "jsonrpc": "2.0",
3438  "method": "bdev_ocf_flush_start",
3439  "id": 1
3440}
3441~~~
3442
3443Example response:
3444
3445~~~json
3446{
3447  "jsonrpc": "2.0",
3448  "id": 1,
3449  "result": true
3450}
3451~~~
3452
3453### bdev_ocf_flush_status {#rpc_bdev_ocf_flush_status}
3454
3455Get flush status of OCF cache device.
3456
3457Automatic flushes of dirty data are managed by OCF cleaning policy settings.
3458In addition to that, all dirty data is flushed to core device when there is
3459an attempt to stop caching.
3460On the other hand, there is a possibility to flush dirty data manually
3461when there is a need for it, e.g. to speed up the shutdown process when data
3462hasn't been flushed for a long time.
3463This RPC reports if such manual flush is still in progress and if the operation
3464was successful. To start manual flush use bdev_ocf_flush_start.
3465
3466#### Parameters
3467
3468Name                    | Optional | Type        | Description
3469----------------------- | -------- | ----------- | -----------
3470name                    | Required | string      | Bdev name
3471
3472#### Response
3473
3474Status of OCF cache device flush.
3475
3476#### Example
3477
3478Example request:
3479
3480~~~json
3481{
3482  "params": {
3483    "name": "ocf0"
3484  },
3485  "jsonrpc": "2.0",
3486  "method": "bdev_ocf_flush_status",
3487  "id": 1
3488}
3489~~~
3490
3491Example response:
3492
3493~~~json
3494{
3495  "jsonrpc": "2.0",
3496  "id": 1,
3497  "result": {
3498    "in_progress": false,
3499    "status": 0
3500  }
3501}
3502~~~
3503
3504### bdev_malloc_create {#rpc_bdev_malloc_create}
3505
3506Construct @ref bdev_config_malloc
3507
3508The `dif_type` parameter can have 0, 1, 2, or 3, and controls the check of the guard tag and the reference tag.
3509If the `dif_type` is 1, 2, or 3, the malloc bdev compares the guard tag to the CRC-16 computed over the block data.
3510If the `dif_type` is 1 or 2, the malloc bdev compares the reference tag to the computed reference tag.
3511The computed reference tag for the first block of the I/O is the `init_ref_tag` of the DIF context, and
3512the computed reference tag is incremented for each subsequent block.
3513If the `dif_type` is 3, the malloc bdev does not check the reference tag.
3514The application tag is not checked by the malloc bdev because the current block device API does not expose
3515it to the upper layer yet.
3516
3517#### Parameters
3518
3519Name                    | Optional | Type        | Description
3520----------------------- | -------- | ----------- | -----------
3521name                    | Optional | string      | Bdev name to use
3522block_size              | Required | number      | Data block size in bytes -must be multiple of 512
3523num_blocks              | Required | number      | Number of blocks
3524uuid                    | Optional | string      | UUID of new bdev
3525optimal_io_boundary     | Optional | number      | Split on optimal IO boundary, in number of blocks, default 0
3526md_size                 | Optional | number      | Metadata size for this bdev (0, 8, 16, 32, 64, or 128). Default is 0.
3527md_interleave           | Optional | boolean     | Metadata location, interleaved if true, and separated if false. Default is false.
3528dif_type                | Optional | number      | Protection information type. Parameter --md-size needs to be set along --dif-type. Default=0 - no protection.
3529dif_is_head_of_md       | Optional | boolean     | Protection information is in the first 8 bytes of metadata. Default=false.
3530
3531#### Result
3532
3533Name of newly created bdev.
3534
3535#### Example
3536
3537Example request:
3538
3539~~~json
3540{
3541  "params": {
3542    "block_size": 4096,
3543    "num_blocks": 16384,
3544    "name": "Malloc0",
3545    "uuid": "2b6601ba-eada-44fb-9a83-a20eb9eb9e90",
3546    "optimal_io_boundary": 16
3547  },
3548  "jsonrpc": "2.0",
3549  "method": "bdev_malloc_create",
3550  "id": 1
3551}
3552~~~
3553
3554Example response:
3555
3556~~~json
3557{
3558  "jsonrpc": "2.0",
3559  "id": 1,
3560  "result": "Malloc0"
3561}
3562~~~
3563
3564### bdev_malloc_delete {#rpc_bdev_malloc_delete}
3565
3566Delete @ref bdev_config_malloc
3567
3568#### Parameters
3569
3570Name                    | Optional | Type        | Description
3571----------------------- | -------- | ----------- | -----------
3572name                    | Required | string      | Bdev name
3573
3574#### Example
3575
3576Example request:
3577
3578~~~json
3579{
3580  "params": {
3581    "name": "Malloc0"
3582  },
3583  "jsonrpc": "2.0",
3584  "method": "bdev_malloc_delete",
3585  "id": 1
3586}
3587~~~
3588
3589Example response:
3590
3591~~~json
3592{
3593  "jsonrpc": "2.0",
3594  "id": 1,
3595  "result": true
3596}
3597~~~
3598
3599### bdev_null_create {#rpc_bdev_null_create}
3600
3601Construct @ref bdev_config_null
3602
3603#### Parameters
3604
3605Name                    | Optional | Type        | Description
3606----------------------- | -------- | ----------- | -----------
3607name                    | Optional | string      | Bdev name to use
3608block_size              | Required | number      | Block size in bytes
3609num_blocks              | Required | number      | Number of blocks
3610uuid                    | Optional | string      | UUID of new bdev
3611md_size                 | Optional | number      | Metadata size for this bdev. Default=0.
3612dif_type                | Optional | number      | Protection information type. Parameter --md-size needs to be set along --dif-type. Default=0 - no protection.
3613dif_is_head_of_md       | Optional | boolean     | Protection information is in the first 8 bytes of metadata. Default=false.
3614
3615#### Result
3616
3617Name of newly created bdev.
3618
3619#### Example
3620
3621Example request:
3622
3623~~~json
3624{
3625  "params": {
3626    "block_size": 4104,
3627    "num_blocks": 16384,
3628    "name": "Null0",
3629    "uuid": "2b6601ba-eada-44fb-9a83-a20eb9eb9e90",
3630    "md_size": 8,
3631    "dif_type": 1,
3632    "dif_is_head_of_md": true
3633  },
3634  "jsonrpc": "2.0",
3635  "method": "bdev_null_create",
3636  "id": 1
3637}
3638~~~
3639
3640Example response:
3641
3642~~~json
3643{
3644  "jsonrpc": "2.0",
3645  "id": 1,
3646  "result": "Null0"
3647}
3648~~~
3649
3650### bdev_null_delete {#rpc_bdev_null_delete}
3651
3652Delete @ref bdev_config_null.
3653
3654#### Parameters
3655
3656Name                    | Optional | Type        | Description
3657----------------------- | -------- | ----------- | -----------
3658name                    | Required | string      | Bdev name
3659
3660#### Example
3661
3662Example request:
3663
3664~~~json
3665{
3666  "params": {
3667    "name": "Null0"
3668  },
3669  "jsonrpc": "2.0",
3670  "method": "bdev_null_delete",
3671  "id": 1
3672}
3673~~~
3674
3675Example response:
3676
3677~~~json
3678{
3679  "jsonrpc": "2.0",
3680  "id": 1,
3681  "result": true
3682}
3683~~~
3684
3685### bdev_null_resize {#rpc_bdev_null_resize}
3686
3687Resize @ref bdev_config_null.
3688
3689#### Parameters
3690
3691Name                    | Optional | Type        | Description
3692----------------------- | -------- | ----------- | -----------
3693name                    | Required | string      | Bdev name
3694new_size                | Required | number      | Bdev new capacity in MiB
3695
3696#### Example
3697
3698Example request:
3699
3700~~~json
3701{
3702  "params": {
3703    "name": "Null0",
3704    "new_size": 4096
3705  },
3706  "jsonrpc": "2.0",
3707  "method": "bdev_null_resize",
3708  "id": 1
3709}
3710~~~
3711
3712Example response:
3713
3714~~~json
3715{
3716  "jsonrpc": "2.0",
3717  "id": 1,
3718  "result": true
3719}
3720~~~
3721
3722### bdev_aio_create {#rpc_bdev_aio_create}
3723
3724Construct @ref bdev_config_aio.
3725
3726#### Parameters
3727
3728Name                    | Optional | Type        | Description
3729----------------------- | -------- | ----------- | -----------
3730name                    | Required | string      | Bdev name to use
3731filename                | Required | number      | Path to device or file
3732block_size              | Optional | number      | Block size in bytes
3733
3734#### Result
3735
3736Name of newly created bdev.
3737
3738#### Example
3739
3740Example request:
3741
3742~~~json
3743{
3744  "params": {
3745    "block_size": 4096,
3746    "name": "Aio0",
3747    "filename": "/tmp/aio_bdev_file"
3748  },
3749  "jsonrpc": "2.0",
3750  "method": "bdev_aio_create",
3751  "id": 1
3752}
3753~~~
3754
3755Example response:
3756
3757~~~json
3758{
3759  "jsonrpc": "2.0",
3760  "id": 1,
3761  "result": "Aio0"
3762}
3763~~~
3764
3765### bdev_aio_rescan {#rpc_bdev_aio_rescan}
3766
3767Rescan the size of @ref bdev_config_aio.
3768
3769#### Parameters
3770
3771Name                    | Optional | Type        | Description
3772----------------------- | -------- | ----------- | -----------
3773name                    | Required | string      | Bdev name
3774
3775#### Example
3776
3777Example request:
3778
3779~~~json
3780{
3781  "params": {
3782    "name": "Aio0"
3783  },
3784  "jsonrpc": "2.0",
3785  "method": "bdev_aio_rescan",
3786  "id": 1
3787}
3788~~~
3789
3790Example response:
3791
3792~~~json
3793{
3794  "jsonrpc": "2.0",
3795  "id": 1,
3796  "result": true
3797}
3798~~~
3799
3800### bdev_aio_delete {#rpc_bdev_aio_delete}
3801
3802Delete @ref bdev_config_aio.
3803
3804#### Parameters
3805
3806Name                    | Optional | Type        | Description
3807----------------------- | -------- | ----------- | -----------
3808name                    | Required | string      | Bdev name
3809
3810#### Example
3811
3812Example request:
3813
3814~~~json
3815{
3816  "params": {
3817    "name": "Aio0"
3818  },
3819  "jsonrpc": "2.0",
3820  "method": "bdev_aio_delete",
3821  "id": 1
3822}
3823~~~
3824
3825Example response:
3826
3827~~~json
3828{
3829  "jsonrpc": "2.0",
3830  "id": 1,
3831  "result": true
3832}
3833~~~
3834
3835### bdev_nvme_set_options {#rpc_bdev_nvme_set_options}
3836
3837Set global parameters for all bdev NVMe. This RPC may only be called before SPDK subsystems have been initialized
3838or any bdev NVMe has been created.
3839
3840Parameters, ctrlr_loss_timeout_sec, reconnect_delay_sec, and fast_io_fail_timeout_sec, are for I/O error resiliency.
3841They can be overridden if they are given by the RPC bdev_nvme_attach_controller.
3842
3843#### Parameters
3844
3845Name                       | Optional | Type        | Description
3846-------------------------- | -------- | ----------- | -----------
3847action_on_timeout          | Optional | string      | Action to take on command time out: none, reset or abort
3848timeout_us                 | Optional | number      | Timeout for each command, in microseconds. If 0, don't track timeouts
3849timeout_admin_us           | Optional | number      | Timeout for each admin command, in microseconds. If 0, treat same as io timeouts ('timeout_us')
3850keep_alive_timeout_ms      | Optional | number      | Keep alive timeout period in milliseconds, default is 10s
3851retry_count                | Optional | number      | The number of attempts per I/O before an I/O fails. (Deprecated. Please use transport_retry_count instead.)
3852arbitration_burst          | Optional | number      | The value is expressed as a power of two, a value of 111b indicates no limit
3853low_priority_weight        | Optional | number      | The maximum number of commands that the controller may launch at one time from a low priority queue
3854medium_priority_weight     | Optional | number      | The maximum number of commands that the controller may launch at one time from a medium priority queue
3855high_priority_weight       | Optional | number      | The maximum number of commands that the controller may launch at one time from a high priority queue
3856nvme_adminq_poll_period_us | Optional | number      | How often the admin queue is polled for asynchronous events in microseconds
3857nvme_ioq_poll_period_us    | Optional | number      | How often I/O queues are polled for completions, in microseconds. Default: 0 (as fast as possible).
3858io_queue_requests          | Optional | number      | The number of requests allocated for each NVMe I/O queue. Default: 512.
3859delay_cmd_submit           | Optional | boolean     | Enable delaying NVMe command submission to allow batching of multiple commands. Default: `true`.
3860transport_retry_count      | Optional | number      | The number of attempts per I/O in the transport layer before an I/O fails.
3861bdev_retry_count           | Optional | number      | The number of attempts per I/O in the bdev layer before an I/O fails. -1 means infinite retries.
3862transport_ack_timeout      | Optional | number      | Time to wait ack until retransmission for RDMA or connection close for TCP. Range 0-31 where 0 means use default.
3863ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
3864reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
3865fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
3866disable_auto_failback      | Optional | boolean     | Disable automatic failback. The RPC bdev_nvme_set_preferred_path can be used to do manual failback.
3867generate_uuids             | Optional | boolean     | Enable generation of UUIDs for NVMe bdevs that do not provide this value themselves.
3868transport_tos              | Optional | number      | IPv4 Type of Service value. Only applicable for RDMA transport. Default: 0 (no TOS is applied).
3869nvme_error_stat            | Optional | boolean     | Enable collecting NVMe error counts.
3870rdma_srq_size              | Optional | number      | Set the size of a shared rdma receive queue. Default: 0 (disabled).
3871io_path_stat               | Optional | boolean     | Enable collecting I/O stat of each nvme bdev io path. Default: `false`.
3872
3873#### Example
3874
3875Example request:
3876
3877~~~json
3878request:
3879{
3880  "params": {
3881    "transport_retry_count": 5,
3882    "arbitration_burst": 3,
3883    "low_priority_weight": 8,
3884    "medium_priority_weight":8,
3885    "high_priority_weight": 8,
3886    "nvme_adminq_poll_period_us": 2000,
3887    "timeout_us": 10000000,
3888    "timeout_admin_us": 20000000,
3889    "keep_alive_timeout_ms": 600000,
3890    "action_on_timeout": "reset",
3891    "io_queue_requests" : 2048,
3892    "delay_cmd_submit": true
3893  },
3894  "jsonrpc": "2.0",
3895  "method": "bdev_nvme_set_options",
3896  "id": 1
3897}
3898~~~
3899
3900Example response:
3901
3902~~~json
3903{
3904  "jsonrpc": "2.0",
3905  "id": 1,
3906  "result": true
3907}
3908~~~
3909
3910### bdev_nvme_set_hotplug {#rpc_bdev_nvme_set_hotplug}
3911
3912Change settings of the NVMe hotplug feature. If enabled, PCIe NVMe bdevs will be automatically discovered on insertion
3913and deleted on removal.
3914
3915#### Parameters
3916
3917Name                    | Optional | Type        | Description
3918----------------------- | -------- | ----------- | -----------
3919enabled                 | Required | string      | True to enable, false to disable
3920period_us               | Optional | number      | How often to poll for hot-insert and hot-remove events. Values: 0 - reset/use default or 1 to 10000000.
3921
3922#### Example
3923
3924Example request:
3925
3926~~~json
3927request:
3928{
3929  "params": {
3930    "enabled": true,
3931    "period_us": 2000
3932  },
3933  "jsonrpc": "2.0",
3934  "method": "bdev_nvme_set_hotplug",
3935  "id": 1
3936}
3937~~~
3938
3939Example response:
3940
3941~~~json
3942{
3943  "jsonrpc": "2.0",
3944  "id": 1,
3945  "result": true
3946}
3947~~~
3948
3949### bdev_nvme_attach_controller {#rpc_bdev_nvme_attach_controller}
3950
3951Construct @ref bdev_config_nvme. This RPC can also be used to add additional paths to an existing controller to enable
3952multipathing. This is done by specifying the `name` parameter as an existing controller. When adding an additional
3953path, the hostnqn, hostsvcid, hostaddr, prchk_reftag, and prchk_guard_arguments must not be specified and are assumed
3954to have the same value as the existing path.
3955
3956The parameters, `ctrlr_loss_timeout_sec`, `reconnect_delay_sec`, and `fast_io_fail_timeout_sec`, are mutually dependent.
3957If `reconnect_delay_sec` is non-zero, `ctrlr_loss_timeout_sec` has to be -1 or not less than `reconnect_delay_sec`.
3958If `reconnect_delay_sec` is zero, `ctrlr_loss_timeout_sec` has to be zero.
3959If `fast_io_fail_timeout_sec` is not zero, it has to be not less than `reconnect_delay_sec` and less than `ctrlr_loss_timeout_sec` if `ctrlr_loss_timeout_sec` is not -1.
3960
3961#### Result
3962
3963Array of names of newly created bdevs.
3964
3965#### Parameters
3966
3967Name                       | Optional | Type        | Description
3968-------------------------- | -------- | ----------- | -----------
3969name                       | Required | string      | Name of the NVMe controller, prefix for each bdev name
3970trtype                     | Required | string      | NVMe-oF target trtype: rdma or pcie
3971traddr                     | Required | string      | NVMe-oF target address: ip or BDF
3972adrfam                     | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6, ib, fc, intra_host
3973trsvcid                    | Optional | string      | NVMe-oF target trsvcid: port number
3974subnqn                     | Optional | string      | NVMe-oF target subnqn
3975hostnqn                    | Optional | string      | NVMe-oF target hostnqn
3976hostaddr                   | Optional | string      | NVMe-oF host address: ip address
3977hostsvcid                  | Optional | string      | NVMe-oF host trsvcid: port number
3978prchk_reftag               | Optional | bool        | Enable checking of PI reference tag for I/O processing
3979prchk_guard                | Optional | bool        | Enable checking of PI guard for I/O processing
3980hdgst                      | Optional | bool        | Enable TCP header digest
3981ddgst                      | Optional | bool        | Enable TCP data digest
3982fabrics_connect_timeout_us | Optional | bool        | Timeout for fabrics connect (in microseconds)
3983multipath                  | Optional | string      | Multipathing behavior: disable, failover, multipath. Default is failover.
3984num_io_queues              | Optional | number      | The number of IO queues to request during initialization. Range: (0, UINT16_MAX + 1], Default is 1024.
3985ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
3986reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
3987fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
3988psk                        | Optional | string      | Path to a file contatining PSK for TLS (Enables SSL socket implementation for TCP)
3989max_bdevs                  | Optional | number      | The size of the name array for newly created bdevs. Default is 128.
3990
3991#### Example
3992
3993Example request:
3994
3995~~~json
3996{
3997  "params": {
3998    "trtype": "pcie",
3999    "name": "Nvme0",
4000    "traddr": "0000:0a:00.0"
4001  },
4002  "jsonrpc": "2.0",
4003  "method": "bdev_nvme_attach_controller",
4004  "id": 1
4005}
4006~~~
4007
4008Example response:
4009
4010~~~json
4011{
4012  "jsonrpc": "2.0",
4013  "id": 1,
4014  "result": [
4015    "Nvme0n1"
4016  ]
4017}
4018~~~
4019
4020### bdev_nvme_get_controllers {#rpc_bdev_nvme_get_controllers}
4021
4022Get information about NVMe controllers.
4023
4024#### Parameters
4025
4026The user may specify no parameters in order to list all NVMe controllers, or one NVMe controller may be
4027specified by name.
4028
4029Name                    | Optional | Type        | Description
4030----------------------- | -------- | ----------- | -----------
4031name                    | Optional | string      | NVMe controller name
4032
4033#### Response
4034
4035The response is an array of objects containing information about the requested NVMe controllers.
4036
4037#### Example
4038
4039Example request:
4040
4041~~~json
4042{
4043  "jsonrpc": "2.0",
4044  "id": 1,
4045  "method": "bdev_nvme_get_controllers",
4046  "params": {
4047    "name": "Nvme0"
4048  }
4049}
4050~~~
4051
4052Example response:
4053
4054~~~json
4055{
4056  "jsonrpc": "2.0",
4057  "id": 1,
4058  "result": [
4059    {
4060      "name": "Nvme0",
4061      "trid": {
4062        "trtype": "PCIe",
4063        "traddr": "0000:05:00.0"
4064      },
4065      "cntlid": 0
4066    }
4067  ]
4068}
4069~~~
4070
4071### bdev_nvme_detach_controller {#rpc_bdev_nvme_detach_controller}
4072
4073Detach NVMe controller and delete any associated bdevs. Optionally,
4074If all of the transport ID options are specified, only remove that
4075transport path from the specified controller. If that is the only
4076available path for the controller, this will also result in the
4077controller being detached and the associated bdevs being deleted.
4078
4079returns true if the controller and bdevs were successfully destroyed
4080or the address was properly removed, false otherwise.
4081
4082#### Parameters
4083
4084Name                    | Optional | Type        | Description
4085----------------------- | -------- | ----------- | -----------
4086name                    | Required | string      | Controller name
4087trtype                  | Optional | string      | NVMe-oF target trtype: rdma or tcp
4088traddr                  | Optional | string      | NVMe-oF target address: ip or BDF
4089adrfam                  | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6, ib, fc, intra_host
4090trsvcid                 | Optional | string      | NVMe-oF target trsvcid: port number
4091subnqn                  | Optional | string      | NVMe-oF target subnqn
4092hostaddr                | Optional | string      | NVMe-oF host address: ip
4093hostsvcid               | Optional | string      | NVMe-oF host svcid: port number
4094
4095#### Example
4096
4097Example requests:
4098
4099~~~json
4100{
4101  "params": {
4102    "name": "Nvme0"
4103  },
4104  "jsonrpc": "2.0",
4105  "method": "bdev_nvme_detach_controller",
4106  "id": 1
4107}
4108~~~
4109
4110Example response:
4111
4112~~~json
4113{
4114  "jsonrpc": "2.0",
4115  "id": 1,
4116  "result": true
4117}
4118~~~
4119
4120### bdev_nvme_reset_controller {#rpc_bdev_nvme_reset_controller}
4121
4122For non NVMe multipath, reset an NVMe controller whose name is given by the `name` parameter.
4123
4124For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4125The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4126an NVMe controller in the NVMe bdev controller. Reset only one NVMe-oF controller if the `cntlid`
4127parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4128
4129Returns true if the controller reset was successful, false otherwise.
4130
4131#### Parameters
4132
4133Name                    | Optional | Type        | Description
4134----------------------- | -------- | ----------- | -----------
4135name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4136cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4137
4138#### Example
4139
4140Example request:
4141
4142~~~json
4143{
4144  "jsonrpc": "2.0",
4145  "id": 1,
4146  "method": "bdev_nvme_reset_controller",
4147  "params": {
4148    "name": "Nvme0"
4149  }
4150}
4151~~~
4152
4153Example response:
4154
4155~~~json
4156{
4157  "jsonrpc": "2.0",
4158  "id": 1,
4159  "result": true
4160}
4161~~~
4162
4163### bdev_nvme_enable_controller {#rpc_bdev_nvme_enable_controller}
4164
4165For non NVMe multipath, enable an NVMe controller whose name is given by the `name` parameter.
4166
4167For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4168The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4169an NVMe controller in the NVMe bdev controller. Enable only one NVMe-oF controller if the `cntlid`
4170parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4171
4172Returns true if the controller enablement was successful or a controller was already enabled, false otherwise.
4173
4174#### Parameters
4175
4176Name                    | Optional | Type        | Description
4177----------------------- | -------- | ----------- | -----------
4178name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4179cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4180
4181#### Example
4182
4183Example request:
4184
4185~~~json
4186{
4187  "jsonrpc": "2.0",
4188  "id": 1,
4189  "method": "bdev_nvme_enable_controller",
4190  "params": {
4191    "name": "Nvme0"
4192  }
4193}
4194~~~
4195
4196Example response:
4197
4198~~~json
4199{
4200  "jsonrpc": "2.0",
4201  "id": 1,
4202  "result": true
4203}
4204~~~
4205
4206### bdev_nvme_disable_controller {#rpc_bdev_nvme_disable_controller}
4207
4208For non NVMe multipath, disable an NVMe controller whose name is given by the `name` parameter.
4209
4210For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4211The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4212an NVMe controller in the NVMe bdev controller. Disable only one NVMe-oF controller if the `cntlid`
4213parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4214
4215Returns true if the controller disablement was successful or a controller was already disabled, false otherwise.
4216
4217#### Parameters
4218
4219Name                    | Optional | Type        | Description
4220----------------------- | -------- | ----------- | -----------
4221name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4222cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4223
4224#### Example
4225
4226Example request:
4227
4228~~~json
4229{
4230  "jsonrpc": "2.0",
4231  "id": 1,
4232  "method": "bdev_nvme_disable_controller",
4233  "params": {
4234    "name": "Nvme0"
4235  }
4236}
4237~~~
4238
4239Example response:
4240
4241~~~json
4242{
4243  "jsonrpc": "2.0",
4244  "id": 1,
4245  "result": true
4246}
4247~~~
4248
4249### bdev_nvme_start_discovery {#rpc_bdev_nvme_start_discovery}
4250
4251Start a discovery service for the discovery subsystem of the specified transport ID.
4252
4253The discovery service will read the discovery log page for the specified
4254discovery subsystem, and automatically attach to any subsystems found in the
4255log page. When determining a controller name to use when attaching, it will use
4256the 'name' parameter as a prefix, followed by a unique integer for that discovery
4257service. If the discovery service identifies a subsystem that has been previously
4258attached but is listed with a different path, it will use the same controller name
4259as the previous entry, and connect as a multipath.
4260
4261When the discovery service sees that a subsystem entry has been removed
4262from the log page, it will automatically detach from that controller as well.
4263
4264The 'name' is also used to later stop the discovery service.
4265
4266#### Parameters
4267
4268Name                       | Optional | Type        | Description
4269-------------------------- | -------- | ----------- | -----------
4270name                       | Required | string      | Prefix for NVMe controllers
4271trtype                     | Required | string      | NVMe-oF target trtype: rdma or tcp
4272traddr                     | Required | string      | NVMe-oF target address: ip
4273adrfam                     | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6
4274trsvcid                    | Optional | string      | NVMe-oF target trsvcid: port number
4275hostnqn                    | Optional | string      | NVMe-oF target hostnqn
4276wait_for_attach            | Optional | bool        | Wait to complete until all discovered NVM subsystems are attached
4277attach_timeout_ms          | Optional | number      | Time to wait until the discovery and all discovered NVM subsystems are attached
4278ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
4279reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
4280fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
4281
4282#### Example
4283
4284Example request:
4285
4286~~~json
4287{
4288  "jsonrpc": "2.0",
4289  "method": "bdev_nvme_start_discovery",
4290  "id": 1,
4291  "params": {
4292    "name": "nvme_auto",
4293    "trtype": "tcp",
4294    "traddr": "127.0.0.1",
4295    "hostnqn": "nqn.2021-12.io.spdk:host1",
4296    "adrfam": "ipv4",
4297    "trsvcid": "4420"
4298  }
4299}
4300~~~
4301
4302Example response:
4303
4304~~~json
4305{
4306  "jsonrpc": "2.0",
4307  "id": 1,
4308  "result": true
4309}
4310~~~
4311
4312### bdev_nvme_stop_discovery {#rpc_bdev_nvme_stop_discovery}
4313
4314Stop a discovery service. This includes detaching any controllers that were
4315discovered via the service that is being stopped.
4316
4317#### Parameters
4318
4319Name                       | Optional | Type        | Description
4320-------------------------- | -------- | ----------- | -----------
4321name                       | Required | string      | Name of service to stop
4322
4323#### Example
4324
4325Example request:
4326
4327~~~json
4328{
4329  "jsonrpc": "2.0",
4330  "method": "bdev_nvme_stop_discovery",
4331  "id": 1,
4332  "params": {
4333    "name": "nvme_auto"
4334  }
4335}
4336~~~
4337
4338Example response:
4339
4340~~~json
4341{
4342  "jsonrpc": "2.0",
4343  "id": 1,
4344  "result": true
4345}
4346~~~
4347
4348### bdev_nvme_get_discovery_info {#rpc_bdev_nvme_get_discovery_info}
4349
4350Get information about the discovery service.
4351
4352#### Example
4353
4354Example request:
4355~~~json
4356{
4357  "jsonrpc": "2.0",
4358  "method": "bdev_nvme_get_discovery_info",
4359  "id": 1
4360}
4361~~~
4362
4363Example response:
4364
4365~~~json
4366{
4367  "jsonrpc": "2.0",
4368  "id": 1,
4369  "result": [
4370    {
4371      "name": "nvme-disc",
4372      "trid": {
4373        "trtype": "TCP",
4374        "adrfam": "IPv4",
4375        "traddr": "127.0.0.1",
4376        "trsvcid": "8009",
4377        "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
4378      },
4379      "referrals": []
4380    }
4381  ]
4382}
4383~~~
4384
4385### bdev_nvme_get_io_paths {#rpc_bdev_nvme_get_io_paths}
4386
4387Display all or the specified NVMe bdev's active I/O paths.
4388
4389#### Parameters
4390
4391Name                    | Optional | Type        | Description
4392----------------------- | -------- | ----------- | -----------
4393name                    | Optional | string      | Name of the NVMe bdev
4394
4395#### Example
4396
4397Example request:
4398
4399~~~json
4400{
4401  "jsonrpc": "2.0",
4402  "method": "bdev_nvme_get_io_paths",
4403  "id": 1,
4404  "params": {
4405    "name": "Nvme0n1"
4406  }
4407}
4408~~~
4409
4410Example response:
4411
4412~~~json
4413{
4414  "jsonrpc": "2.0",
4415  "id": 1,
4416  "result": {
4417    "poll_groups": [
4418      {
4419        "thread": "app_thread",
4420        "io_paths": [
4421          {
4422            "bdev_name": "Nvme0n1",
4423            "cntlid": 0,
4424            "current": true,
4425            "connected": true,
4426            "accessible": true,
4427            "transport": {
4428              "trtype": "RDMA",
4429              "traddr": "1.2.3.4",
4430              "trsvcid": "4420",
4431              "adrfam": "IPv4"
4432            }
4433          }
4434        ]
4435      }
4436    ]
4437  }
4438}
4439~~~
4440
4441### bdev_nvme_set_preferred_path {#rpc_bdev_nvme_set_preferred_path}
4442
4443Set the preferred I/O path for an NVMe bdev in multipath mode.
4444
4445NOTE: This RPC does not support NVMe bdevs in failover mode.
4446
4447#### Parameters
4448
4449Name                    | Optional | Type        | Description
4450----------------------- | -------- | ----------- | -----------
4451name                    | Required | string      | Name of the NVMe bdev
4452cntlid                  | Required | number      | NVMe-oF controller ID
4453
4454#### Example
4455
4456Example request:
4457
4458~~~json
4459{
4460  "jsonrpc": "2.0",
4461  "method": "bdev_nvme_set_preferred_path",
4462  "id": 1,
4463  "params": {
4464    "name": "Nvme0n1",
4465    "cntlid": 0
4466  }
4467}
4468~~~
4469
4470Example response:
4471
4472~~~json
4473{
4474  "jsonrpc": "2.0",
4475  "id": 1,
4476  "result": true
4477}
4478~~~
4479
4480### bdev_nvme_set_multipath_policy {#rpc_bdev_nvme_set_multipath_policy}
4481
4482Set multipath policy of the NVMe bdev in multipath mode or set multipath
4483selector for active-active multipath policy.
4484
4485#### Parameters
4486
4487Name                    | Optional | Type        | Description
4488----------------------- | -------- | ----------- | -----------
4489name                    | Required | string      | Name of the NVMe bdev
4490policy                  | Required | string      | Multipath policy: active_active or active_passive
4491selector                | Optional | string      | Multipath selector: round_robin or queue_depth, used in active-active mode. Default is round_robin
4492rr_min_io               | Optional | number      | Number of I/Os routed to current io path before switching to another for round-robin selector. The min value is 1.
4493
4494#### Example
4495
4496Example request:
4497
4498~~~json
4499{
4500  "jsonrpc": "2.0",
4501  "method": "bdev_nvme_set_multipath_policy",
4502  "id": 1,
4503  "params": {
4504    "name": "Nvme0n1",
4505    "policy": "active_passive"
4506  }
4507}
4508~~~
4509
4510Example response:
4511
4512~~~json
4513{
4514  "jsonrpc": "2.0",
4515  "id": 1,
4516  "result": true
4517}
4518~~~
4519
4520### bdev_nvme_get_path_iostat {#rpc_bdev_nvme_get_path_iostat}
4521
4522Get I/O statistics for IO paths of the block device. Call RPC bdev_nvme_set_options to set enable_io_path_stat
4523true before using this RPC.
4524
4525#### Parameters
4526
4527Name                    | Optional | Type        | Description
4528----------------------- | -------- | ----------- | -----------
4529name                    | Required | string      | Name of the NVMe bdev
4530
4531#### Example
4532
4533Example request:
4534
4535~~~json
4536{
4537  "jsonrpc": "2.0",
4538  "method": "bdev_nvme_get_path_iostat",
4539  "id": 1,
4540  "params": {
4541    "name": "NVMe0n1"
4542  }
4543}
4544~~~
4545
4546Example response:
4547
4548~~~json
4549{
4550  "jsonrpc": "2.0",
4551  "id": 1,
4552  "result": {
4553    "name": "NVMe0n1",
4554    "stats": [
4555      {
4556        "trid": {
4557          "trtype": "TCP",
4558          "adrfam": "IPv4",
4559          "traddr": "10.169.204.201",
4560          "trsvcid": "4420",
4561          "subnqn": "nqn.2016-06.io.spdk:cnode1"
4562        },
4563        "stat": {
4564          "bytes_read": 676691968,
4565          "num_read_ops": 165201,
4566          "bytes_written": 0,
4567          "num_write_ops": 0,
4568          "bytes_unmapped": 0,
4569          "num_unmap_ops": 0,
4570          "max_read_latency_ticks": 521487,
4571          "min_read_latency_ticks": 0,
4572          "write_latency_ticks": 0,
4573          "max_write_latency_ticks": 0,
4574          "min_write_latency_ticks": 0,
4575          "unmap_latency_ticks": 0,
4576          "max_unmap_latency_ticks": 0,
4577          "min_unmap_latency_ticks": 0,
4578          "copy_latency_ticks": 0,
4579          "max_copy_latency_ticks": 0,
4580          "min_copy_latency_ticks": 0
4581        }
4582      },
4583      {
4584        "trid": {
4585          "trtype": "TCP",
4586          "adrfam": "IPv4",
4587          "traddr": "8.8.8.6",
4588          "trsvcid": "4420",
4589          "subnqn": "nqn.2016-06.io.spdk:cnode1"
4590        },
4591        "stat": {
4592          "bytes_read": 677138432,
4593          "num_read_ops": 165317,
4594          "bytes_written": 0,
4595          "num_write_ops": 0,
4596          "bytes_unmapped": 0,
4597          "num_unmap_ops": 0,
4598          "max_read_latency_ticks": 108525,
4599          "min_read_latency_ticks": 0,
4600          "write_latency_ticks": 0,
4601          "max_write_latency_ticks": 0,
4602          "min_write_latency_ticks": 0,
4603          "unmap_latency_ticks": 0,
4604          "max_unmap_latency_ticks": 0,
4605          "min_unmap_latency_ticks": 0,
4606          "copy_latency_ticks": 0,
4607          "max_copy_latency_ticks": 0,
4608          "min_copy_latency_ticks": 0
4609        }
4610      }
4611    ]
4612  }
4613}
4614~~~
4615
4616### bdev_nvme_cuse_register {#rpc_bdev_nvme_cuse_register}
4617
4618Register CUSE device on NVMe controller.
4619This feature is considered as experimental.
4620
4621#### Parameters
4622
4623Name                    | Optional | Type        | Description
4624----------------------- | -------- | ----------- | -----------
4625name                    | Required | string      | Name of the NVMe controller
4626dev_path                | Required | string      | Path to the CUSE controller device, e.g. spdk/nvme0
4627
4628#### Example
4629
4630Example request:
4631
4632~~~json
4633{
4634  "params": {
4635    "dev_path": "spdk/nvme0",
4636    "name": "Nvme0"
4637  },
4638  "jsonrpc": "2.0",
4639  "method": "bdev_nvme_cuse_register",
4640  "id": 1
4641}
4642~~~
4643
4644Example response:
4645
4646~~~json
4647{
4648  "jsonrpc": "2.0",
4649  "id": 1,
4650  "result": true
4651}
4652~~~
4653
4654### bdev_nvme_cuse_unregister {#rpc_bdev_nvme_cuse_unregister}
4655
4656Unregister CUSE device on NVMe controller.
4657This feature is considered as experimental.
4658
4659#### Parameters
4660
4661Name                    | Optional | Type        | Description
4662----------------------- | -------- | ----------- | -----------
4663name                    | Required | string      | Name of the NVMe controller
4664
4665#### Example
4666
4667Example request:
4668
4669~~~json
4670{
4671  "params": {
4672    "name": "Nvme0"
4673  },
4674  "jsonrpc": "2.0",
4675  "method": "bdev_nvme_cuse_unregister",
4676  "id": 1
4677}
4678~~~
4679
4680Example response:
4681
4682~~~json
4683{
4684  "jsonrpc": "2.0",
4685  "id": 1,
4686  "result": true
4687}
4688~~~
4689
4690### bdev_zone_block_create {#rpc_bdev_zone_block_create}
4691
4692Creates a virtual zone device on top of existing non-zoned bdev.
4693
4694#### Parameters
4695
4696Name                    | Optional | Type        | Description
4697----------------------- | -------- | ----------- | -----------
4698name                    | Required | string      | Name of the Zone device
4699base_bdev               | Required | string      | Name of the Base bdev
4700zone_capacity           | Required | number      | Zone capacity in blocks
4701optimal_open_zones      | Required | number      | Number of zones required to reach optimal write speed
4702
4703#### Example
4704
4705Example request:
4706
4707~~~json
4708{
4709  "jsonrpc": "2.0",
4710  "method": "bdev_zone_block_create",
4711  "id": 1,
4712  "params": {
4713    "name": "zone1",
4714    "base_bdev": "NVMe0n1",
4715    "zone_capacity": 4096,
4716    "optimal_open_zones": 32
4717  }
4718}
4719~~~
4720
4721Example response:
4722
4723~~~json
4724{
4725  "jsonrpc": "2.0",
4726  "id": 1,
4727  "result": "zone1"
4728}
4729~~~
4730
4731### bdev_zone_block_delete {#rpc_bdev_zone_block_delete}
4732
4733Deletes a virtual zone device.
4734
4735#### Parameters
4736
4737Name                    | Optional | Type        | Description
4738----------------------- | -------- | ----------- | -----------
4739name                    | Required | string      | Name of the Zone device
4740
4741#### Example
4742
4743Example request:
4744
4745~~~json
4746{
4747  "jsonrpc": "2.0",
4748  "method": "bdev_zone_block_delete",
4749  "id": 1,
4750  "params": {
4751    "name": "zone1"
4752  }
4753}
4754~~~
4755
4756Example response:
4757
4758~~~json
4759{
4760  "jsonrpc": "2.0",
4761  "id": 1,
4762  "result": true
4763}
4764~~~
4765
4766### bdev_nvme_apply_firmware {#rpc_bdev_nvme_apply_firmware}
4767
4768Download and commit firmware to NVMe device.
4769
4770#### Parameters
4771
4772Name                    | Optional | Type        | Description
4773----------------------- | -------- | ----------- | -----------
4774filename                | Required | string      | filename of the firmware to download
4775bdev_name               | Required | string      | Name of the NVMe block device
4776
4777#### Example
4778
4779Example request:
4780
4781~~~json
4782{
4783  "jsonrpc": "2.0",
4784  "method": "bdev_nvme_apply_firmware",
4785  "id": 1,
4786  "params": {
4787    "filename": "firmware_file",
4788    "bdev_name": "NVMe0n1"
4789  }
4790}
4791~~~
4792
4793### bdev_nvme_get_transport_statistics {#rpc_bdev_nvme_get_transport_statistics}
4794
4795Get bdev_nvme poll group transport statistics.
4796
4797#### Parameters
4798
4799This RPC method accepts no parameters
4800
4801#### Response
4802
4803The response is an array of objects containing information about transport statistics per NVME poll group.
4804
4805#### Example
4806
4807Example request:
4808
4809~~~json
4810{
4811  "jsonrpc": "2.0",
4812  "id": 1,
4813  "method": "bdev_nvme_get_transport_statistics",
4814}
4815~~~
4816
4817Example response:
4818
4819~~~json
4820{
4821  "jsonrpc": "2.0",
4822  "id": 1,
4823	"result": {
4824	  "poll_groups": [
4825		{
4826		  "thread": "nvmf_tgt_poll_group_0",
4827		  "transports": [
4828			{
4829			  "trname": "RDMA",
4830			  "devices": [
4831				{
4832				  "dev_name": "mlx5_1",
4833				  "polls": 137492169,
4834				  "idle_polls": 137492169,
4835				  "completions": 0,
4836				  "queued_requests": 0,
4837				  "total_send_wrs": 0,
4838				  "send_sq_doorbell_updates": 0,
4839				  "total_recv_wrs": 0,
4840				  "recv_sq_doorbell_updates": 0
4841				},
4842				{
4843				  "dev_name": "mlx5_0",
4844				  "polls": 137985185,
4845				  "idle_polls": 137492169,
4846				  "completions": 1474593,
4847				  "queued_requests": 0,
4848				  "total_send_wrs": 1474593,
4849				  "send_sq_doorbell_updates": 426147,
4850				  "total_recv_wrs": 1474721,
4851				  "recv_sq_doorbell_updates": 348445
4852				}
4853			  ]
4854			},
4855			{
4856			  "trname": "PCIE",
4857			  "polls": 435419831,
4858			  "idle_polls": 434901004,
4859			  "completions": 1485543,
4860			  "cq_doorbell_updates": 518827,
4861			  "queued_requests": 0,
4862			  "submitted_requests": 1485543,
4863			  "sq_doorbell_updates": 516081
4864			}
4865		  ]
4866		},
4867		{
4868		  "thread": "nvmf_tgt_poll_group_1",
4869		  "transports": [
4870			{
4871			  "trname": "RDMA",
4872			  "devices": [
4873				{
4874				  "dev_name": "mlx5_1",
4875				  "polls": 140245630,
4876				  "idle_polls": 140245630,
4877				  "completions": 0,
4878				  "queued_requests": 0,
4879				  "total_send_wrs": 0,
4880				  "send_sq_doorbell_updates": 0,
4881				  "total_recv_wrs": 0,
4882				  "recv_sq_doorbell_updates": 0
4883				},
4884				{
4885				  "dev_name": "mlx5_0",
4886				  "polls": 140751844,
4887				  "idle_polls": 140245630,
4888				  "completions": 1489298,
4889				  "queued_requests": 0,
4890				  "total_send_wrs": 1489298,
4891				  "send_sq_doorbell_updates": 433510,
4892				  "total_recv_wrs": 1489426,
4893				  "recv_sq_doorbell_updates": 357956
4894				}
4895			  ]
4896			},
4897			{
4898			  "trname": "PCIE",
4899			  "polls": 429044294,
4900			  "idle_polls": 428525658,
4901			  "completions": 1478730,
4902			  "cq_doorbell_updates": 518636,
4903			  "queued_requests": 0,
4904			  "submitted_requests": 1478730,
4905			  "sq_doorbell_updates": 511658
4906			}
4907		  ]
4908		}
4909	  ]
4910	}
4911}
4912~~~
4913
4914### bdev_nvme_get_controller_health_info {#rpc_bdev_nvme_get_controller_health_info}
4915
4916Display health log of the required NVMe bdev device.
4917
4918#### Parameters
4919
4920Name                    | Optional | Type        | Description
4921----------------------- | -------- | ----------- | -----------
4922name                    | Required | string      | Name of the NVMe bdev controller
4923
4924#### Response
4925
4926The response is the object containing information about health log of the NVMe controller.
4927
4928#### Example
4929
4930Example request:
4931
4932~~~json
4933{
4934  "jsonrpc": "2.0",
4935  "method": "bdev_nvme_get_controller_health_info",
4936  "id": 1,
4937  "params": {
4938    "name": "Nvme0"
4939  }
4940}
4941~~~
4942
4943Example response:
4944
4945~~~json
4946{
4947  "model_number": "INTEL SSDPE2KX020T8",
4948  "serial_number": "BTLJ72430ARH2P0BGN",
4949  "firmware_revision": "VDV10110",
4950  "traddr": "0000:08:00.0",
4951  "temperature_celsius": 32,
4952  "available_spare_percentage": 99,
4953  "available_spare_threshold_percentage": 10,
4954  "percentage_used": 2,
4955  "data_units_read": 1013408619,
4956  "data_units_written": 346792685,
4957  "host_read_commands": 30457773282,
4958  "host_write_commands": 18949677715,
4959  "controller_busy_time": 4979,
4960  "power_cycles": 49,
4961  "power_on_hours": 31118,
4962  "unsafe_shutdowns": 18,
4963  "media_errors": 17,
4964  "num_err_log_entries": 19,
4965  "warning_temperature_time_minutes": 0,
4966  "critical_composite_temperature_time_minutes": 0
4967}
4968~~~
4969
4970### bdev_rbd_register_cluster {#rpc_bdev_rbd_register_cluster}
4971
4972This method is available only if SPDK was build with Ceph RBD support.
4973
4974#### Parameters
4975
4976Name                    | Optional | Type        | Description
4977----------------------- | -------- | ----------- | -----------
4978name                    | Required | string      | Registered Rados cluster object name
4979user_id                 | Optional | string      | Ceph ID (i.e. admin, not client.admin)
4980config_param            | Optional | string map  | Explicit librados configuration
4981config_file             | Optional | string      | File path of libraodos configuration file
4982key_file                | Optional | string      | File path of libraodos key file
4983
4984This RPC registers a Rados Cluster object handle which is only known
4985to rbd module, it uses user_id + config_param or user_id + config_file +
4986key_file or user_id + config_param + config_file + key_file to identify
4987a Rados cluster object.
4988
4989When accessing the Ceph cluster as some user other than "admin" (the
4990default), the "user_id" has to be set.
4991
4992The configuration items and secret key can be specified by setting config_param,
4993config_file and key_file, all of them, or none of them. If only config_param is
4994passed, all key/value pairs are passed to rados_conf_set to configure cluster access.
4995In practice, "mon_host" (= list of monitor address+port) and "key" (= the secret key
4996stored in Ceph keyrings) are enough. If config_file and key_file are specified, they must
4997exist with all relevant settings for accessing the Ceph cluster. If config_param, config_file
4998and key_file are specified, get the key/value pairs from config_file first and set to
4999rados_conf_set function, then set pairs in config_param and keyring in key_file. If nothing
5000is specified, it will get configuration file and key file from the default location
5001/etc/ceph/ceph.conf and /etc/ceph/ceph.client.user_id.keyring.
5002
5003#### Result
5004
5005Name of newly created Rados cluster object.
5006
5007#### Example
5008
5009Example request:
5010
5011~~
5012{
5013  "params": {
5014    "name": "rbd_cluster",
5015    "user_id": cinder,
5016    "config_file": "/root/ceph_conf/ceph.conf",
5017    "key_file": "/root/ceph_conf/ceph.client.cinder.keyring"
5018  },
5019  "jsonrpc": "2.0",
5020  "method": "bdev_rbd_register_cluster",
5021  "id": 1
5022}
5023~~
5024
5025Example response:
5026
5027~~
5028response:
5029{
5030  "jsonrpc": "2.0",
5031  "id": 1,
5032  "result": "rbd_cluster"
5033}
5034~~
5035
5036### bdev_rbd_unregister_cluster {#rpc_bdev_rbd_unregister_cluster}
5037
5038This method is available only if SPDK was build with Ceph RBD support.
5039If there is still rbd bdev using this cluster, the unregisteration operation
5040will fail.
5041
5042#### Result
5043
5044`true` if Rados cluster object with provided name was deleted or `false` otherwise.
5045
5046#### Parameters
5047
5048Name                    | Optional | Type        | Description
5049----------------------- | -------- | ----------- | -------------------------
5050name                    | Required | string      | Rados cluster object name
5051
5052#### Example
5053
5054Example request:
5055
5056~~
5057{
5058  "params": {
5059    "name": "rbd_cluster"
5060  },
5061  "jsonrpc": "2.0",
5062  "method": "bdev_rbd_unregister_cluster",
5063  "id": 1
5064}
5065~~
5066
5067Example response:
5068
5069~~
5070{
5071  "jsonrpc": "2.0",
5072  "id": 1,
5073  "result": true
5074}
5075~~
5076
5077### bdev_rbd_get_clusters_info {#rpc_bdev_rbd_get_clusters_info}
5078
5079This method is available only if SPDK was build with Ceph RBD support.
5080
5081#### Result
5082
5083Returns the cluster info of the Rados Cluster name if provided. Otherwise, it
5084returns the cluster info of every registered Raods Cluster name.
5085
5086#### Parameters
5087
5088Name                    | Optional | Type        | Description
5089----------------------- | -------- | ----------- | -------------------------
5090name                    | Optional | string      | Rados cluster object name
5091
5092#### Example
5093
5094Example request:
5095
5096~~
5097{
5098  "params": {
5099    "name": "rbd_cluster"
5100  },
5101  "jsonrpc": "2.0",
5102  "method": "bdev_rbd_get_clusters_info",
5103  "id": 1
5104}
5105~~
5106
5107Example response:
5108
5109~~
5110{
5111  "jsonrpc": "2.0",
5112  "cluster_name": "rbd_cluster"
5113}
5114~~
5115
5116### bdev_rbd_create {#rpc_bdev_rbd_create}
5117
5118Create @ref bdev_config_rbd bdev
5119
5120This method is available only if SPDK was build with Ceph RBD support.
5121
5122#### Parameters
5123
5124Name                    | Optional | Type        | Description
5125----------------------- | -------- | ----------- | -----------
5126name                    | Optional | string      | Bdev name
5127user_id                 | Optional | string      | Ceph ID (i.e. admin, not client.admin)
5128pool_name               | Required | string      | Pool name
5129rbd_name                | Required | string      | Image name
5130block_size              | Required | number      | Block size
5131config                  | Optional | string map  | Explicit librados configuration
5132cluster_name            | Optional | string      | Rados cluster object name created in this module.
5133uuid                    | Optional | string      | UUID of new bdev
5134
5135If no config is specified, Ceph configuration files must exist with
5136all relevant settings for accessing the pool. If a config map is
5137passed, the configuration files are ignored and instead all key/value
5138pairs are passed to rados_conf_set to configure cluster access. In
5139practice, "mon_host" (= list of monitor address+port) and "key" (= the
5140secret key stored in Ceph keyrings) are enough.
5141
5142When accessing the image as some user other than "admin" (the
5143default), the "user_id" has to be set.
5144
5145If provided with cluster_name option, it will use the Rados cluster object
5146referenced by the name (created by bdev_rbd_register_cluster RPC) and ignores
5147"user_id + config" combination to create its own Rados cluster. In this scenario,
5148all the bdevs will share the same cluster with one connection of Ceph in librbd module.
5149Performance tuning on the I/O workload could be done by estimating how many io_contxt
5150threads and messager threads in Ceph side and how many cores would be reasonable to provide
5151for SPDK to get up to your projections.
5152
5153#### Result
5154
5155Name of newly created bdev.
5156
5157#### Example
5158
5159Example request with `key` from `/etc/ceph/ceph.client.admin.keyring`:
5160
5161~~~json
5162{
5163  "params": {
5164    "pool_name": "rbd",
5165    "rbd_name": "foo",
5166    "config": {
5167      "mon_host": "192.168.7.1:6789,192.168.7.2:6789",
5168      "key": "AQDwf8db7zR1GRAA5k7NKXjS5S5V4mntwUDnGQ==",
5169    }
5170    "block_size": 4096,
5171    "uuid": "76210ea4-7920-40a0-a07b-8992a7443c76"
5172  },
5173  "jsonrpc": "2.0",
5174  "method": "bdev_rbd_create",
5175  "id": 1
5176}
5177~~~
5178
5179Example response:
5180
5181~~~json
5182response:
5183{
5184  "jsonrpc": "2.0",
5185  "id": 1,
5186  "result": "Ceph0"
5187}
5188~~~
5189
5190Example request with `cluster_name`:
5191
5192~~
5193{
5194  "params": {
5195    "pool_name": "rbd",
5196    "rbd_name": "foo",
5197    "block_size": 4096,
5198    "cluster_name": "rbd_cluster"
5199  },
5200  "jsonrpc": "2.0",
5201  "method": "bdev_rbd_create",
5202  "id": 1
5203}
5204~~
5205
5206Example response:
5207
5208~~
5209response:
5210{
5211  "jsonrpc": "2.0",
5212  "id": 1,
5213  "result": "Ceph0"
5214}
5215~~
5216
5217### bdev_rbd_delete {#rpc_bdev_rbd_delete}
5218
5219Delete @ref bdev_config_rbd bdev
5220
5221This method is available only if SPDK was build with Ceph RBD support.
5222
5223#### Result
5224
5225`true` if bdev with provided name was deleted or `false` otherwise.
5226
5227#### Parameters
5228
5229Name                    | Optional | Type        | Description
5230----------------------- | -------- | ----------- | -----------
5231name                    | Required | string      | Bdev name
5232
5233#### Example
5234
5235Example request:
5236
5237~~~json
5238{
5239  "params": {
5240    "name": "Rbd0"
5241  },
5242  "jsonrpc": "2.0",
5243  "method": "bdev_rbd_delete",
5244  "id": 1
5245}
5246~~~
5247
5248Example response:
5249
5250~~~json
5251{
5252  "jsonrpc": "2.0",
5253  "id": 1,
5254  "result": true
5255}
5256~~~
5257
5258### bdev_rbd_resize {#rpc_bdev_rbd_resize}
5259
5260Resize @ref bdev_config_rbd bdev
5261
5262This method is available only if SPDK was build with Ceph RBD support.
5263
5264#### Result
5265
5266`true` if bdev with provided name was resized or `false` otherwise.
5267
5268#### Parameters
5269
5270Name                    | Optional | Type        | Description
5271----------------------- | -------- | ----------- | -----------
5272name                    | Required | string      | Bdev name
5273new_size                | Required | int         | New bdev size for resize operation in MiB
5274
5275#### Example
5276
5277Example request:
5278
5279~~~json
5280{
5281  "params": {
5282    "name": "Rbd0"
5283    "new_size": "4096"
5284  },
5285  "jsonrpc": "2.0",
5286  "method": "bdev_rbd_resize",
5287  "id": 1
5288}
5289~~~
5290
5291Example response:
5292
5293~~~json
5294{
5295  "jsonrpc": "2.0",
5296  "id": 1,
5297  "result": true
5298}
5299~~~
5300
5301### bdev_delay_create {#rpc_bdev_delay_create}
5302
5303Create delay bdev. This bdev type redirects all IO to it's base bdev and inserts a delay on the completion
5304path to create an artificial drive latency. All latency values supplied to this bdev should be in microseconds.
5305
5306#### Parameters
5307
5308Name                    | Optional | Type        | Description
5309----------------------- | -------- | ----------- | -----------
5310name                    | Required | string      | Bdev name
5311base_bdev_name          | Required | string      | Base bdev name
5312avg_read_latency        | Required | number      | average read latency (us)
5313p99_read_latency        | Required | number      | p99 read latency (us)
5314avg_write_latency       | Required | number      | average write latency (us)
5315p99_write_latency       | Required | number      | p99 write latency (us)
5316
5317#### Result
5318
5319Name of newly created bdev.
5320
5321#### Example
5322
5323Example request:
5324
5325~~~json
5326{
5327  "params": {
5328    "base_bdev_name": "Null0",
5329    "name": "Delay0",
5330    "avg_read_latency": "15",
5331    "p99_read_latency": "50",
5332    "avg_write_latency": "40",
5333    "p99_write_latency": "110",
5334  },
5335  "jsonrpc": "2.0",
5336  "method": "bdev_delay_create",
5337  "id": 1
5338}
5339~~~
5340
5341Example response:
5342
5343~~~json
5344{
5345  "jsonrpc": "2.0",
5346  "id": 1,
5347  "result": "Delay0"
5348}
5349~~~
5350
5351### bdev_delay_delete {#rpc_bdev_delay_delete}
5352
5353Delete delay bdev.
5354
5355#### Parameters
5356
5357Name                    | Optional | Type        | Description
5358----------------------- | -------- | ----------- | -----------
5359name                    | Required | string      | Bdev name
5360
5361#### Example
5362
5363Example request:
5364
5365~~~json
5366{
5367  "params": {
5368    "name": "Delay0"
5369  },
5370  "jsonrpc": "2.0",
5371  "method": "bdev_delay_delete",
5372  "id": 1
5373}
5374
5375~~~
5376
5377Example response:
5378
5379~~~json
5380{
5381  "jsonrpc": "2.0",
5382  "id": 1,
5383  "result": true
5384}
5385~~~
5386
5387### bdev_delay_update_latency {#rpc_bdev_delay_update_latency}
5388
5389Update a target latency value associated with a given delay bdev. Any currently
5390outstanding I/O will be completed with the old latency.
5391
5392#### Parameters
5393
5394Name                    | Optional | Type        | Description
5395----------------------- | -------- | ----------- | -----------
5396delay_bdev_name         | Required | string      | Name of the delay bdev
5397latency_type            | Required | string      | One of: avg_read, avg_write, p99_read, p99_write
5398latency_us              | Required | number      | The new latency value in microseconds
5399
5400#### Result
5401
5402Name of newly created bdev.
5403
5404#### Example
5405
5406Example request:
5407
5408~~~json
5409{
5410  "params": {
5411    "delay_bdev_name": "Delay0",
5412    "latency_type": "avg_read",
5413    "latency_us": "100",
5414  },
5415  "jsonrpc": "2.0",
5416  "method": "bdev_delay_update_latency",
5417  "id": 1
5418}
5419~~~
5420
5421Example response:
5422
5423~~~json
5424{
5425  "result": "true"
5426}
5427~~~
5428
5429### bdev_error_create {#rpc_bdev_error_create}
5430
5431Construct error bdev.
5432
5433#### Parameters
5434
5435Name                    | Optional | Type        | Description
5436----------------------- | -------- | ----------- | -----------
5437base_name               | Required | string      | Base bdev name
5438uuid                    | Optional | string      | UUID for this bdev
5439
5440#### Example
5441
5442Example request:
5443
5444~~~json
5445{
5446  "params": {
5447    "base_name": "Malloc0"
5448  },
5449  "jsonrpc": "2.0",
5450  "method": "bdev_error_create",
5451  "id": 1
5452}
5453~~~
5454
5455Example response:
5456
5457~~~json
5458{
5459  "jsonrpc": "2.0",
5460  "id": 1,
5461  "result": true
5462}
5463~~~
5464
5465### bdev_error_delete {#rpc_bdev_error_delete}
5466
5467Delete error bdev
5468
5469#### Result
5470
5471`true` if bdev with provided name was deleted or `false` otherwise.
5472
5473#### Parameters
5474
5475Name                    | Optional | Type        | Description
5476----------------------- | -------- | ----------- | -----------
5477name                    | Required | string      | Error bdev name
5478
5479#### Example
5480
5481Example request:
5482
5483~~~json
5484{
5485  "params": {
5486    "name": "EE_Malloc0"
5487  },
5488  "jsonrpc": "2.0",
5489  "method": "bdev_error_delete",
5490  "id": 1
5491}
5492~~~
5493
5494Example response:
5495
5496~~~json
5497{
5498  "jsonrpc": "2.0",
5499  "id": 1,
5500  "result": true
5501}
5502~~~
5503
5504### bdev_error_inject_error {#rpc_bdev_error_inject_error}
5505
5506Inject an error via an error bdev. Create an error bdev on base bdev first. Default 'num'
5507value is 1 and if 'num' is set to zero, the specified injection is disabled.
5508
5509#### Parameters
5510
5511Name                    | Optional | Type        | Description
5512----------------------- | -------- | ----------- | -----------
5513name                    | Required | string      | Name of the error injection bdev
5514io_type                 | Required | string      | io type 'clear' 'read' 'write' 'unmap' 'flush' 'all'
5515error_type              | Required | string      | error type 'failure' 'pending' 'corrupt_data' 'nomem'
5516num                     | Optional | int         | the number of commands you want to fail.(default:1)
5517queue_depth             | Optional | int         | the queue depth at which to trigger the error
5518corrupt_offset          | Optional | int         | the offset in bytes to xor with corrupt_value
5519corrupt_value           | Optional | int         | the value for xor (1-255, 0 is invalid)
5520
5521#### Example
5522
5523Example request:
5524
5525~~~json
5526{
5527  "jsonrpc": "2.0",
5528  "method": "bdev_error_inject_error",
5529  "id": 1,
5530  "params": {
5531    "name": "EE_Malloc0",
5532    "io_type": "write",
5533    "error_type": "pending",
5534    "num": 1
5535  }
5536}
5537~~~
5538
5539Example response:
5540
5541~~~json
5542{
5543  "jsonrpc": "2.0",
5544  "id": 1,
5545  "result": true
5546}
5547~~~
5548
5549### bdev_iscsi_set_options {#rpc_bdev_iscsi_set_options}
5550
5551This RPC can be called at any time, but the new value will only take effect for new iSCSI bdevs.
5552
5553#### Parameters
5554
5555Name                       | Optional | Type        | Description
5556-------------------------- | -------- | ----------- | -----------
5557timeout_sec                | Optional | number      | Timeout for command, in seconds, if 0, don't track timeout
5558
5559#### Example
5560
5561Example request:
5562
5563~~~json
5564request:
5565{
5566  "params": {
5567    "timeout_sec": 30
5568  },
5569  "jsonrpc": "2.0",
5570  "method": "bdev_iscsi_set_options",
5571  "id": 1
5572}
5573~~~
5574
5575Example response:
5576
5577~~~json
5578{
5579  "jsonrpc": "2.0",
5580  "id": 1,
5581  "result": true
5582}
5583~~~
5584
5585### bdev_iscsi_create {#rpc_bdev_iscsi_create}
5586
5587Connect to iSCSI target and create bdev backed by this connection.
5588
5589This method is available only if SPDK was build with iSCSI initiator support.
5590
5591#### Parameters
5592
5593Name                    | Optional | Type        | Description
5594----------------------- | -------- | ----------- | -----------
5595name                    | Required | string      | Bdev name
5596initiator_iqn           | Required | string      | IQN name used during connection
5597url                     | Required | string      | iSCSI resource URI
5598
5599#### Result
5600
5601Name of newly created bdev.
5602
5603#### Example
5604
5605Example request:
5606
5607~~~json
5608{
5609  "params": {
5610    "url": "iscsi://127.0.0.1/iqn.2016-06.io.spdk:disk1/0",
5611    "initiator_iqn": "iqn.2016-06.io.spdk:init",
5612    "name": "iSCSI0"
5613  },
5614  "jsonrpc": "2.0",
5615  "method": "bdev_iscsi_create",
5616  "id": 1
5617}
5618~~~
5619
5620Example response:
5621
5622~~~json
5623{
5624  "jsonrpc": "2.0",
5625  "id": 1,
5626  "result": "iSCSI0"
5627}
5628~~~
5629
5630### bdev_iscsi_delete {#rpc_bdev_iscsi_delete}
5631
5632Delete iSCSI bdev and terminate connection to target.
5633
5634This method is available only if SPDK was built with iSCSI initiator support.
5635
5636#### Parameters
5637
5638Name                    | Optional | Type        | Description
5639----------------------- | -------- | ----------- | -----------
5640name                    | Required | string      | Bdev name
5641
5642#### Example
5643
5644Example request:
5645
5646~~~json
5647{
5648  "params": {
5649    "name": "iSCSI0"
5650  },
5651  "jsonrpc": "2.0",
5652  "method": "bdev_iscsi_delete",
5653  "id": 1
5654}
5655~~~
5656
5657Example response:
5658
5659~~~json
5660{
5661  "jsonrpc": "2.0",
5662  "id": 1,
5663  "result": true
5664}
5665~~~
5666
5667### bdev_ftl_create {#rpc_bdev_ftl_create}
5668
5669Create FTL bdev.
5670
5671This RPC is subject to change.
5672
5673#### Parameters
5674
5675Name                    | Optional | Type        | Description
5676----------------------- | -------- | ----------- | -----------
5677name                    | Required | string      | Bdev name
5678base_bdev               | Required | string      | Name of the base device
5679cache                   | Required | string      | Name of the cache device
5680uuid                    | Optional | string      | UUID of restored bdev (not applicable when creating new instance)
5681core_mask               | Optional | string      | CPU core(s) possible for placement of the ftl core thread, application main thread by default
5682overprovisioning        | Optional | int         | Percentage of base device used for relocation, 20% by default
5683fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data on target application shutdown and rely on shared memory during next load
5684
5685#### Result
5686
5687Name of newly created bdev.
5688
5689#### Example
5690
5691Example request:
5692
5693~~~json
5694{
5695  "params": {
5696    "name": "ftl0",
5697    "base_bdev": "nvme0n1",
5698    "cache": "nvme1n1",
5699    "uuid": "4a7481ce-786f-41a0-9b86-8f7465c8f4d3",
5700    "core_mask": "[0]",
5701    "overprovisioning": 10
5702  },
5703  "jsonrpc": "2.0",
5704  "method": "bdev_ftl_create",
5705  "id": 1
5706}
5707~~~
5708
5709Example response:
5710
5711~~~json
5712{
5713  "jsonrpc": "2.0",
5714  "id": 1,
5715  "result": {
5716      "name" : "ftl0"
5717      "uuid" : "4a7481ce-786f-41a0-9b86-8f7465c8f4d3"
5718  }
5719}
5720~~~
5721
5722### bdev_ftl_load {#rpc_bdev_ftl_load}
5723
5724Loads FTL bdev.
5725
5726This RPC is subject to change.
5727
5728#### Parameters
5729
5730Name                    | Optional | Type        | Description
5731----------------------- | -------- | ----------- | -----------
5732name                    | Required | string      | Bdev name
5733base_bdev               | Required | string      | Name of the base device
5734cache                   | Required | string      | Name of the cache device
5735uuid                    | Required | string      | UUID of restored bdev
5736core_mask               | Optional | string      | CPU core(s) possible for placement of the ftl core thread, application main thread by default
5737overprovisioning        | Optional | int         | Percentage of base device used for relocation, 20% by default
5738fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data on target application shutdown and rely on shared memory during next load
5739
5740#### Result
5741
5742Name of loaded bdev.
5743
5744#### Example
5745
5746Example request:
5747
5748~~~json
5749{
5750  "params": {
5751    "name": "ftl0",
5752    "base_bdev": "nvme0n1",
5753    "cache": "nvme1n1",
5754    "uuid": "4a7481ce-786f-41a0-9b86-8f7465c8f4d3",
5755    "core_mask": "[0]",
5756    "overprovisioning": 10
5757  },
5758  "jsonrpc": "2.0",
5759  "method": "bdev_ftl_load",
5760  "id": 1
5761}
5762~~~
5763
5764Example response:
5765
5766~~~json
5767{
5768  "jsonrpc": "2.0",
5769  "id": 1,
5770  "result": {
5771      "name" : "ftl0"
5772      "uuid" : "4a7481ce-786f-41a0-9b86-8f7465c8f4d3"
5773  }
5774}
5775~~~
5776
5777### bdev_ftl_delete {#rpc_bdev_ftl_delete}
5778
5779Delete FTL bdev.
5780
5781This RPC is subject to change.
5782
5783#### Parameters
5784
5785Name                    | Optional | Type        | Description
5786----------------------- | -------- | ----------- | -----------
5787name                    | Required | string      | Bdev name
5788fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data during deletion and rely on shared memory during next load
5789
5790#### Example
5791
5792Example request:
5793
5794~~~json
5795{
5796  "params": {
5797    "name": "ftl0"
5798  },
5799  "jsonrpc": "2.0",
5800  "method": "bdev_ftl_delete",
5801  "id": 1
5802}
5803~~~
5804
5805Example response:
5806
5807~~~json
5808{
5809  "jsonrpc": "2.0",
5810  "id": 1,
5811  "result": true
5812}
5813~~~
5814
5815### bdev_ftl_unload {#rpc_bdev_ftl_unload}
5816
5817Unloads FTL bdev.
5818
5819This RPC is subject to change.
5820
5821#### Parameters
5822
5823Name                    | Optional | Type        | Description
5824----------------------- | -------- | ----------- | -----------
5825name                    | Required | string      | Bdev name
5826fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data during deletion and rely on shared memory during next load
5827
5828#### Example
5829
5830Example request:
5831
5832~~~json
5833{
5834  "params": {
5835    "name": "ftl0"
5836  },
5837  "jsonrpc": "2.0",
5838  "method": "bdev_ftl_unload",
5839  "id": 1
5840}
5841~~~
5842
5843Example response:
5844
5845~~~json
5846{
5847  "jsonrpc": "2.0",
5848  "id": 1,
5849  "result": true
5850}
5851~~~
5852
5853### bdev_ftl_unmap {#rpc_bdev_ftl_unmap}
5854
5855Unmap range of LBAs.
5856
5857This RPC is subject to change.
5858
5859#### Parameters
5860
5861Name                    | Optional | Type        | Description
5862----------------------- | -------- | ----------- | -----------
5863name                    | Required | string      | Bdev name
5864lba                     | Required | number      | start lba, aligned to 1024
5865num_blocks              | Required | number      | number of blocks, aligned to 1024
5866
5867#### Example
5868
5869Example request:
5870
5871~~~json
5872{
5873  "params": {
5874    "name": "ftl0"
5875    "lba": "0"
5876    "num_blocks": "1024"
5877  },
5878  "jsonrpc": "2.0",
5879  "method": "bdev_ftl_unmap",
5880  "id": 1
5881}
5882~~~
5883
5884Example response:
5885
5886~~~json
5887{
5888  "jsonrpc": "2.0",
5889  "id": 1,
5890  "result": true
5891}
5892~~~
5893
5894### bdev_ftl_get_stats {#rpc_bdev_ftl_get_stats}
5895
5896Get IO statistics for FTL bdev
5897
5898This RPC is subject to change.
5899
5900#### Parameters
5901
5902Name                    | Optional | Type        | Description
5903----------------------- | -------- | ----------- | -----------
5904name                    | Required | string      | Bdev name
5905
5906#### Response
5907
5908The response is an object containing IO statistics for an FTL instance, split into multiple subobjects:
5909
5910- `user` - contains information about number of IOs, and errors for any incoming requests,
5911- `cmp` - information about IO for the compaction process,
5912- `gc` - information about IO for the garbage collection process,
5913- `md_base` - internal metadata requests to the base FTL device,
5914- `md_nv_cache` - internal metadata requests to the cache device,
5915- `l2p` - requests done on the L2P cache region.
5916
5917Each subobject contains the following information:
5918
5919- `ios` - describes the total number of IOs requested,
5920- `blocks` - the total number of requested blocks,
5921- `errors` - describes the number of detected errors for a given operation, with the following distinctions:
5922  - `media` - media errors,
5923  - `crc` - mismatch in calculated CRC versus saved checksum in the metadata,
5924  - `other` - any other errors.
5925
5926#### Example
5927
5928Example request:
5929
5930~~~json
5931{
5932  "params": {
5933    "name": "ftl0"
5934  },
5935  "jsonrpc": "2.0",
5936  "method": "bdev_ftl_get_stats",
5937  "id": 1
5938}
5939~~~
5940
5941Example response:
5942
5943~~~json
5944{
5945  "jsonrpc": "2.0",
5946  "id": 1,
5947  "result": {
5948      "name": "ftl0",
5949      "user": {
5950        "read": {
5951          "ios": 0,
5952          "blocks": 0,
5953          "errors": {
5954            "media": 0,
5955            "crc": 0,
5956            "other": 0
5957          }
5958        },
5959        "write": {
5960          "ios": 318707,
5961          "blocks": 318707,
5962          "errors": {
5963            "media": 0,
5964            "other": 0
5965          }
5966        }
5967      },
5968      "cmp": {
5969        "read": {
5970          "ios": 0,
5971          "blocks": 0,
5972          "errors": {
5973            "media": 0,
5974            "crc": 0,
5975            "other": 0
5976          }
5977        },
5978        "write": {
5979          "ios": 0,
5980          "blocks": 0,
5981          "errors": {
5982            "media": 0,
5983            "other": 0
5984          }
5985        }
5986      },
5987      "gc": {
5988        "read": {
5989          "ios": 0,
5990          "blocks": 0,
5991          "errors": {
5992            "media": 0,
5993            "crc": 0,
5994            "other": 0
5995          }
5996        },
5997        "write": {
5998          "ios": 0,
5999          "blocks": 0,
6000          "errors": {
6001            "media": 0,
6002            "other": 0
6003          }
6004        }
6005      },
6006      "md_base": {
6007        "read": {
6008          "ios": 0,
6009          "blocks": 0,
6010          "errors": {
6011            "media": 0,
6012            "crc": 0,
6013            "other": 0
6014          }
6015        },
6016        "write": {
6017          "ios": 1,
6018          "blocks": 32,
6019          "errors": {
6020            "media": 0,
6021            "other": 0
6022          }
6023        }
6024      },
6025      "md_nv_cache": {
6026        "read": {
6027          "ios": 0,
6028          "blocks": 0,
6029          "errors": {
6030            "media": 0,
6031            "crc": 0,
6032            "other": 0
6033          }
6034        },
6035        "write": {
6036          "ios": 1064,
6037          "blocks": 1073896,
6038          "errors": {
6039            "media": 0,
6040            "other": 0
6041          }
6042        }
6043      },
6044      "l2p": {
6045        "read": {
6046          "ios": 240659,
6047          "blocks": 240659,
6048          "errors": {
6049            "media": 0,
6050            "crc": 0,
6051            "other": 0
6052          }
6053        },
6054        "write": {
6055          "ios": 235745,
6056          "blocks": 235745,
6057          "errors": {
6058            "media": 0,
6059            "other": 0
6060          }
6061        }
6062      }
6063    }
6064}
6065~~~
6066
6067### bdev_passthru_create {#rpc_bdev_passthru_create}
6068
6069Create passthru bdev. This bdev type redirects all IO to it's base bdev. It has no other purpose than being an example
6070and a starting point in development of new bdev type.
6071
6072#### Parameters
6073
6074Name                    | Optional | Type        | Description
6075----------------------- | -------- | ----------- | -----------
6076name                    | Required | string      | Bdev name
6077base_bdev_name          | Required | string      | Base bdev name
6078
6079#### Result
6080
6081Name of newly created bdev.
6082
6083#### Example
6084
6085Example request:
6086
6087~~~json
6088{
6089  "params": {
6090    "base_bdev_name": "Malloc0",
6091    "name": "Passsthru0"
6092  },
6093  "jsonrpc": "2.0",
6094  "method": "bdev_passthru_create",
6095  "id": 1
6096}
6097~~~
6098
6099Example response:
6100
6101~~~json
6102{
6103  "jsonrpc": "2.0",
6104  "id": 1,
6105  "result": "Passsthru0"
6106}
6107~~~
6108
6109### bdev_passthru_delete {#rpc_bdev_passthru_delete}
6110
6111Delete passthru bdev.
6112
6113#### Parameters
6114
6115Name                    | Optional | Type        | Description
6116----------------------- | -------- | ----------- | -----------
6117name                    | Required | string      | Bdev name
6118
6119#### Example
6120
6121Example request:
6122
6123~~~json
6124{
6125  "params": {
6126    "name": "Passsthru0"
6127  },
6128  "jsonrpc": "2.0",
6129  "method": "bdev_passthru_delete",
6130  "id": 1
6131}
6132
6133~~~
6134
6135Example response:
6136
6137~~~json
6138{
6139  "jsonrpc": "2.0",
6140  "id": 1,
6141  "result": true
6142}
6143~~~
6144
6145### bdev_xnvme_create {#rpc_bdev_xnvme_create}
6146
6147Create xnvme bdev. This bdev type redirects all IO to its underlying backend.
6148
6149#### Parameters
6150
6151Name                    | Optional | Type        | Description
6152----------------------- | -------- | ----------- | -----------
6153name                    | Required | string      | name of xNVMe bdev to create
6154filename                | Required | string      | path to device or file (ex: /dev/nvme0n1)
6155io_mechanism            | Required | string      | IO mechanism to use (ex: libaio, io_uring, io_uring_cmd, etc.)
6156conserve_cpu            | Optional | boolean     | Whether or not to conserve CPU when polling (default: false)
6157
6158#### Result
6159
6160Name of newly created bdev.
6161
6162#### Example
6163
6164Example request:
6165
6166~~~json
6167{
6168  "jsonrpc": "2.0",
6169  "method": "bdev_xnvme_create",
6170  "id": 1,
6171  "params": {
6172    "name": "bdev_ng0n1",
6173    "filename": "/dev/ng0n1",
6174    "io_mechanism": "io_uring_cmd",
6175    "conserve_cpu": false,
6176  }
6177}
6178~~~
6179
6180Example response:
6181
6182~~~json
6183{
6184  "jsonrpc": "2.0",
6185  "id": 1,
6186  "result": "bdev_ng0n1"
6187}
6188~~~
6189
6190### bdev_xnvme_delete {#rpc_bdev_xnvme_delete}
6191
6192Delete xnvme bdev.
6193
6194#### Parameters
6195
6196Name                    | Optional | Type        | Description
6197----------------------- | -------- | ----------- | -----------
6198name                    | Required | string      | name of xnvme bdev to delete
6199
6200#### Example
6201
6202Example request:
6203
6204~~~json
6205{
6206  "params": {
6207    "name": "bdev_ng0n1"
6208  },
6209  "jsonrpc": "2.0",
6210  "method": "bdev_xnvme_delete",
6211  "id": 1
6212}
6213
6214~~~
6215
6216Example response:
6217
6218~~~json
6219{
6220  "jsonrpc": "2.0",
6221  "id": 1,
6222  "result": true
6223}
6224~~~
6225
6226### bdev_virtio_attach_controller {#rpc_bdev_virtio_attach_controller}
6227
6228Create new initiator @ref bdev_config_virtio_scsi or @ref bdev_config_virtio_blk and expose all found bdevs.
6229
6230#### Parameters
6231
6232Name                    | Optional | Type        | Description
6233----------------------- | -------- | ----------- | -----------
6234name                    | Required | string      | Virtio SCSI base bdev name or Virtio Blk bdev name
6235trtype                  | Required | string      | Virtio target trtype: pci or user
6236traddr                  | Required | string      | target address: BDF or UNIX socket file path
6237dev_type                | Required | string      | Virtio device type: blk or scsi
6238vq_count                | Optional | number      | Number of queues this controller will utilize (default: 1)
6239vq_size                 | Optional | number      | Size of each queue. Must be power of 2. (default: 512)
6240
6241In case of Virtio SCSI the `name` parameter will be base name for new created bdevs. For Virtio Blk `name` will be the
6242name of created bdev.
6243
6244`vq_count` and `vq_size` parameters are valid only if `trtype` is `user`.
6245
6246#### Result
6247
6248Array of names of newly created bdevs.
6249
6250#### Example
6251
6252Example request:
6253
6254~~~json
6255{
6256  "params": {
6257    "name": "VirtioScsi0",
6258    "trtype": "user",
6259    "vq_size": 128,
6260    "dev_type": "scsi",
6261    "traddr": "/tmp/VhostScsi0",
6262    "vq_count": 4
6263  },
6264  "jsonrpc": "2.0",
6265  "method": "bdev_virtio_attach_controller",
6266  "id": 1
6267}
6268~~~
6269
6270Example response:
6271
6272~~~json
6273{
6274  "jsonrpc": "2.0",
6275  "id": 1,
6276  "result": ["VirtioScsi0t2", "VirtioScsi0t4"]
6277}
6278~~~
6279
6280### bdev_virtio_scsi_get_devices {#rpc_bdev_virtio_scsi_get_devices}
6281
6282Show information about all available Virtio SCSI devices.
6283
6284#### Parameters
6285
6286This method has no parameters.
6287
6288#### Result
6289
6290Array of Virtio SCSI information objects.
6291
6292#### Example
6293
6294Example request:
6295
6296~~~json
6297{
6298  "jsonrpc": "2.0",
6299  "method": "bdev_virtio_scsi_get_devices",
6300  "id": 1
6301}
6302~~~
6303
6304Example response:
6305
6306~~~json
6307{
6308  "jsonrpc": "2.0",
6309  "id": 1,
6310  "result": [
6311    {
6312      "name": "VirtioScsi0",
6313      "virtio": {
6314          "vq_size": 128,
6315          "vq_count": 4,
6316          "type": "user",
6317          "socket": "/tmp/VhostScsi0"
6318      }
6319    }
6320  ]
6321}
6322~~~
6323
6324### bdev_virtio_detach_controller {#rpc_bdev_virtio_detach_controller}
6325
6326Remove a Virtio device. This command can be used to remove any type of virtio device.
6327
6328#### Parameters
6329
6330Name                    | Optional | Type        | Description
6331----------------------- | -------- | ----------- | -----------
6332name                    | Required | string      | Virtio name
6333
6334#### Example
6335
6336Example request:
6337
6338~~~json
6339{
6340  "params": {
6341    "name": "VirtioUser0"
6342  },
6343  "jsonrpc": "2.0",
6344  "method": "bdev_virtio_detach_controller",
6345  "id": 1
6346}
6347
6348~~~
6349
6350Example response:
6351
6352~~~json
6353{
6354  "jsonrpc": "2.0",
6355  "id": 1,
6356  "result": true
6357}
6358~~~
6359
6360### bdev_virtio_blk_set_hotplug {#rpc_bdev_virtio_blk_set_hotplug}
6361
6362Enable/Disable the virtio blk hotplug monitor or change the monitor period time
6363
6364#### Parameters
6365
6366Name                    | Optional | Type        | Description
6367----------------------- | -------- | ----------- | -----------
6368enable                  | Required | bool        | Enable or disable the virtio blk hotplug monitor
6369period-us               | Optional | number      | The period time of the monitor
6370
6371When the enable is true then the period-us is optional. If user don't set the period time then use the default
6372value. When the enable is false then the period-us is not required.
6373
6374#### Result
6375
6376True the rpc is successful otherwise false
6377
6378#### Example
6379
6380Example request:
6381
6382~~~json
6383{
6384  "params": {
6385    "enable": "true",
6386    "period-us": "1000000"
6387  },
6388  "jsonrpc": "2.0",
6389  "method": "bdev_virtio_blk_set_hotplug",
6390  "id": 1
6391}
6392~~~
6393
6394Example response:
6395
6396~~~json
6397{
6398  "jsonrpc": "2.0",
6399  "id": 1,
6400  "result": true
6401}
6402~~~
6403
6404## iSCSI Target {#jsonrpc_components_iscsi_tgt}
6405
6406### iscsi_set_options method {#rpc_iscsi_set_options}
6407
6408Set global parameters for iSCSI targets.
6409
6410This RPC may only be called before SPDK subsystems have been initialized. This RPC can be called only once.
6411
6412#### Parameters
6413
6414Name                            | Optional | Type    | Description
6415------------------------------- | -------- | ------- | -----------
6416auth_file                       | Optional | string  | Path to CHAP shared secret file (default: "")
6417node_base                       | Optional | string  | Prefix of the name of iSCSI target node (default: "iqn.2016-06.io.spdk")
6418nop_timeout                     | Optional | number  | Timeout in seconds to nop-in request to the initiator (default: 60)
6419nop_in_interval                 | Optional | number  | Time interval in secs between nop-in requests by the target (default: 30)
6420disable_chap                    | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
6421require_chap                    | Optional | boolean | CHAP for discovery session should be required (default: `false`)
6422mutual_chap                     | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
6423chap_group                      | Optional | number  | CHAP group ID for discovery session (default: 0)
6424max_sessions                    | Optional | number  | Maximum number of sessions in the host (default: 128)
6425max_queue_depth                 | Optional | number  | Maximum number of outstanding I/Os per queue (default: 64)
6426max_connections_per_session     | Optional | number  | Session specific parameter, MaxConnections (default: 2)
6427default_time2wait               | Optional | number  | Session specific parameter, DefaultTime2Wait (default: 2)
6428default_time2retain             | Optional | number  | Session specific parameter, DefaultTime2Retain (default: 20)
6429first_burst_length              | Optional | number  | Session specific parameter, FirstBurstLength (default: 8192)
6430immediate_data                  | Optional | boolean | Session specific parameter, ImmediateData (default: `true`)
6431error_recovery_level            | Optional | number  | Session specific parameter, ErrorRecoveryLevel (default: 0)
6432allow_duplicated_isid           | Optional | boolean | Allow duplicated initiator session ID (default: `false`)
6433max_large_datain_per_connection | Optional | number  | Max number of outstanding split read I/Os per connection (default: 64)
6434max_r2t_per_connection          | Optional | number  | Max number of outstanding R2Ts per connection (default: 4)
6435pdu_pool_size                   | Optional | number  | Number of PDUs in the pool (default: approximately 2 * max_sessions * (max_queue_depth + max_connections_per_session))
6436immediate_data_pool_size        | Optional | number  | Number of immediate data buffers in the pool (default: 128 * max_sessions)
6437data_out_pool_size              | Optional | number  | Number of data out buffers in the pool (default: 16 * max_sessions)
6438
6439To load CHAP shared secret file, its path is required to specify explicitly in the parameter `auth_file`.
6440
6441Parameters `disable_chap` and `require_chap` are mutually exclusive. Parameters `no_discovery_auth`, `req_discovery_auth`,
6442`req_discovery_auth_mutual`, and `discovery_auth_group` are still available instead of `disable_chap`, `require_chap`,
6443`mutual_chap`, and `chap_group`, respectivey but will be removed in future releases.
6444
6445#### Example
6446
6447Example request:
6448
6449~~~json
6450{
6451  "params": {
6452    "allow_duplicated_isid": true,
6453    "default_time2retain": 60,
6454    "first_burst_length": 8192,
6455    "immediate_data": true,
6456    "node_base": "iqn.2016-06.io.spdk",
6457    "max_sessions": 128,
6458    "nop_timeout": 30,
6459    "nop_in_interval": 30,
6460    "auth_file": "/usr/local/etc/spdk/auth.conf",
6461    "disable_chap": true,
6462    "default_time2wait": 2
6463  },
6464  "jsonrpc": "2.0",
6465  "method": "iscsi_set_options",
6466  "id": 1
6467}
6468~~~
6469
6470Example response:
6471
6472~~~json
6473{
6474  "jsonrpc": "2.0",
6475  "id": 1,
6476  "result": true
6477}
6478~~~
6479
6480### iscsi_get_options method {#rpc_iscsi_get_options}
6481
6482Show global parameters of iSCSI targets.
6483
6484#### Parameters
6485
6486This method has no parameters.
6487
6488#### Example
6489
6490Example request:
6491
6492~~~json
6493request:
6494{
6495  "jsonrpc": "2.0",
6496  "method": "iscsi_get_options",
6497  "id": 1
6498}
6499~~~
6500
6501Example response:
6502
6503~~~json
6504{
6505  "jsonrpc": "2.0",
6506  "id": 1,
6507  "result": {
6508    "allow_duplicated_isid": true,
6509    "default_time2retain": 60,
6510    "first_burst_length": 8192,
6511    "immediate_data": true,
6512    "node_base": "iqn.2016-06.io.spdk",
6513    "mutual_chap": false,
6514    "nop_in_interval": 30,
6515    "chap_group": 0,
6516    "max_connections_per_session": 2,
6517    "max_queue_depth": 64,
6518    "nop_timeout": 30,
6519    "max_sessions": 128,
6520    "error_recovery_level": 0,
6521    "auth_file": "/usr/local/etc/spdk/auth.conf",
6522    "disable_chap": true,
6523    "default_time2wait": 2,
6524    "require_chap": false,
6525    "max_large_datain_per_connection": 64,
6526    "max_r2t_per_connection": 4
6527  }
6528}
6529~~~
6530
6531### scsi_get_devices {#rpc_scsi_get_devices}
6532
6533Display SCSI devices
6534
6535#### Parameters
6536
6537This method has no parameters.
6538
6539#### Example
6540
6541Example request:
6542
6543~~~json
6544{
6545  "jsonrpc": "2.0",
6546  "method": "scsi_get_devices",
6547  "id": 1
6548}
6549~~~
6550
6551Example response:
6552
6553~~~json
6554{
6555  "jsonrpc": "2.0",
6556  "id": 1,
6557  "result": [
6558    {
6559      "id": 0,
6560      "device_name": "iqn.2016-06.io.spdk:Target3"
6561    }
6562  ]
6563}
6564~~~
6565
6566### iscsi_set_discovery_auth method {#rpc_iscsi_set_discovery_auth}
6567
6568Set CHAP authentication for sessions dynamically.
6569
6570#### Parameters
6571
6572Name                        | Optional | Type    | Description
6573--------------------------- | -------- | --------| -----------
6574disable_chap                | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
6575require_chap                | Optional | boolean | CHAP for discovery session should be required (default: `false`)
6576mutual_chap                 | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
6577chap_group                  | Optional | number  | CHAP group ID for discovery session (default: 0)
6578
6579Parameters `disable_chap` and `require_chap` are mutually exclusive.
6580
6581#### Example
6582
6583Example request:
6584
6585~~~json
6586request:
6587{
6588  "params": {
6589    "chap_group": 1,
6590    "require_chap": true,
6591    "mutual_chap": true
6592  },
6593  "jsonrpc": "2.0",
6594  "method": "iscsi_set_discovery_auth",
6595  "id": 1
6596}
6597~~~
6598
6599Example response:
6600
6601~~~json
6602{
6603  "jsonrpc": "2.0",
6604  "id": 1,
6605  "result": true
6606}
6607~~~
6608
6609### iscsi_create_auth_group method {#rpc_iscsi_create_auth_group}
6610
6611Create an authentication group for CHAP authentication.
6612
6613#### Parameters
6614
6615Name                        | Optional | Type    | Description
6616--------------------------- | -------- | --------| -----------
6617tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6618secrets                     | Optional | array   | Array of @ref rpc_iscsi_create_auth_group_secret objects
6619
6620#### secret {#rpc_iscsi_create_auth_group_secret}
6621
6622Name                        | Optional | Type    | Description
6623--------------------------- | ---------| --------| -----------
6624user                        | Required | string  | Unidirectional CHAP name
6625secret                      | Required | string  | Unidirectional CHAP secret
6626muser                       | Optional | string  | Bidirectional CHAP name
6627msecret                     | Optional | string  | Bidirectional CHAP secret
6628
6629#### Example
6630
6631Example request:
6632
6633~~~json
6634{
6635  "params": {
6636    "secrets": [
6637      {
6638        "muser": "mu1",
6639        "secret": "s1",
6640        "user": "u1",
6641        "msecret": "ms1"
6642      }
6643    ],
6644    "tag": 2
6645  },
6646  "jsonrpc": "2.0",
6647  "method": "iscsi_create_auth_group",
6648  "id": 1
6649}
6650~~~
6651
6652Example response:
6653
6654~~~json
6655{
6656  "jsonrpc": "2.0",
6657  "id": 1,
6658  "result": true
6659}
6660~~~
6661
6662### iscsi_delete_auth_group method {#rpc_iscsi_delete_auth_group}
6663
6664Delete an existing authentication group for CHAP authentication.
6665
6666#### Parameters
6667
6668Name                        | Optional | Type    | Description
6669--------------------------- | -------- | --------| -----------
6670tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6671
6672#### Example
6673
6674Example request:
6675
6676~~~json
6677{
6678  "params": {
6679    "tag": 2
6680  },
6681  "jsonrpc": "2.0",
6682  "method": "iscsi_delete_auth_group",
6683  "id": 1
6684}
6685~~~
6686
6687Example response:
6688
6689~~~json
6690{
6691  "jsonrpc": "2.0",
6692  "id": 1,
6693  "result": true
6694}
6695~~~
6696
6697### iscsi_get_auth_groups {#rpc_iscsi_get_auth_groups}
6698
6699Show information about all existing authentication group for CHAP authentication.
6700
6701#### Parameters
6702
6703This method has no parameters.
6704
6705#### Result
6706
6707Array of objects describing authentication group.
6708
6709Name                        | Type    | Description
6710--------------------------- | --------| -----------
6711tag                         | number  | Authentication group tag
6712secrets                     | array   | Array of @ref rpc_iscsi_create_auth_group_secret objects
6713
6714#### Example
6715
6716Example request:
6717
6718~~~json
6719{
6720  "jsonrpc": "2.0",
6721  "method": "iscsi_get_auth_groups",
6722  "id": 1
6723}
6724~~~
6725
6726Example response:
6727
6728~~~json
6729{
6730  "jsonrpc": "2.0",
6731  "id": 1,
6732  "result": [
6733    {
6734      "secrets": [
6735        {
6736          "muser": "mu1",
6737          "secret": "s1",
6738          "user": "u1",
6739          "msecret": "ms1"
6740        }
6741      ],
6742      "tag": 1
6743    },
6744    {
6745      "secrets": [
6746        {
6747          "secret": "s2",
6748          "user": "u2"
6749        }
6750      ],
6751      "tag": 2
6752    }
6753  ]
6754}
6755~~~
6756
6757### iscsi_auth_group_add_secret {#rpc_iscsi_auth_group_add_secret}
6758
6759Add a secret to an existing authentication group for CHAP authentication.
6760
6761#### Parameters
6762
6763Name                        | Optional | Type    | Description
6764--------------------------- | -------- | --------| -----------
6765tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6766user                        | Required | string  | Unidirectional CHAP name
6767secret                      | Required | string  | Unidirectional CHAP secret
6768muser                       | Optional | string  | Bidirectional CHAP name
6769msecret                     | Optional | string  | Bidirectional CHAP secret
6770
6771#### Example
6772
6773Example request:
6774
6775~~~json
6776{
6777  "params": {
6778    "muser": "mu3",
6779    "secret": "s3",
6780    "tag": 2,
6781    "user": "u3",
6782    "msecret": "ms3"
6783  },
6784  "jsonrpc": "2.0",
6785  "method": "iscsi_auth_group_add_secret",
6786  "id": 1
6787}
6788~~~json
6789
6790Example response:
6791
6792~~~json
6793{
6794  "jsonrpc": "2.0",
6795  "id": 1,
6796  "result": true
6797}
6798~~~
6799
6800### iscsi_auth_group_remove_secret {#rpc_iscsi_auth_group_remove_secret}
6801
6802Remove a secret from an existing authentication group for CHAP authentication.
6803
6804#### Parameters
6805
6806Name                        | Optional | Type    | Description
6807--------------------------- | -------- | --------| -----------
6808tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6809user                        | Required | string  | Unidirectional CHAP name
6810
6811#### Example
6812
6813Example request:
6814
6815~~~json
6816{
6817  "params": {
6818    "tag": 2,
6819    "user": "u3"
6820  },
6821  "jsonrpc": "2.0",
6822  "method": "iscsi_auth_group_remove_secret",
6823  "id": 1
6824}
6825~~~
6826
6827Example response:
6828
6829~~~json
6830{
6831  "jsonrpc": "2.0",
6832  "id": 1,
6833  "result": true
6834}
6835~~~
6836
6837### iscsi_get_initiator_groups method {#rpc_iscsi_get_initiator_groups}
6838
6839Show information about all available initiator groups.
6840
6841#### Parameters
6842
6843This method has no parameters.
6844
6845#### Result
6846
6847Array of objects describing initiator groups.
6848
6849Name                        | Type    | Description
6850--------------------------- | --------| -----------
6851tag                         | number  | Initiator group tag
6852initiators                  | array   | Array of initiator hostnames or IP addresses
6853netmasks                    | array   | Array of initiator netmasks
6854
6855#### Example
6856
6857Example request:
6858
6859~~~json
6860{
6861  "jsonrpc": "2.0",
6862  "method": "iscsi_get_initiator_groups",
6863  "id": 1
6864}
6865~~~
6866
6867Example response:
6868
6869~~~json
6870{
6871  "jsonrpc": "2.0",
6872  "id": 1,
6873  "result": [
6874    {
6875      "initiators": [
6876        "iqn.2016-06.io.spdk:host1",
6877        "iqn.2016-06.io.spdk:host2"
6878      ],
6879      "tag": 1,
6880      "netmasks": [
6881        "192.168.1.0/24"
6882      ]
6883    }
6884  ]
6885}
6886~~~
6887
6888### iscsi_create_initiator_group method {#rpc_iscsi_create_initiator_group}
6889
6890Add an initiator group.
6891
6892#### Parameters
6893
6894Name                        | Optional | Type    | Description
6895--------------------------- | -------- | --------| -----------
6896tag                         | Required | number  | Initiator group tag (unique, integer > 0)
6897initiators                  | Required | array   | Not empty array of initiator hostnames or IP addresses
6898netmasks                    | Required | array   | Not empty array of initiator netmasks
6899
6900#### Example
6901
6902Example request:
6903
6904~~~json
6905{
6906  "params": {
6907    "initiators": [
6908      "iqn.2016-06.io.spdk:host1",
6909      "iqn.2016-06.io.spdk:host2"
6910    ],
6911    "tag": 1,
6912    "netmasks": [
6913      "192.168.1.0/24"
6914    ]
6915  },
6916  "jsonrpc": "2.0",
6917  "method": "iscsi_create_initiator_group",
6918  "id": 1
6919}
6920~~~
6921
6922Example response:
6923
6924~~~json
6925response:
6926{
6927  "jsonrpc": "2.0",
6928  "id": 1,
6929  "result": true
6930}
6931~~~
6932
6933### iscsi_delete_initiator_group method {#rpc_iscsi_delete_initiator_group}
6934
6935Delete an existing initiator group.
6936
6937#### Parameters
6938
6939Name                        | Optional | Type    | Description
6940--------------------------- | -------- | --------| -----------
6941tag                         | Required | number  | Initiator group tag (unique, integer > 0)
6942
6943#### Example
6944
6945Example request:
6946
6947~~~json
6948{
6949  "params": {
6950    "tag": 1
6951  },
6952  "jsonrpc": "2.0",
6953  "method": "iscsi_delete_initiator_group",
6954  "id": 1
6955}
6956~~~
6957
6958Example response:
6959
6960~~~json
6961{
6962  "jsonrpc": "2.0",
6963  "id": 1,
6964  "result": true
6965}
6966~~~
6967
6968### iscsi_initiator_group_add_initiators method {#rpc_iscsi_initiator_group_add_initiators}
6969
6970Add initiators to an existing initiator group.
6971
6972#### Parameters
6973
6974Name                        | Optional | Type    | Description
6975--------------------------- | -------- | --------| -----------
6976tag                         | Required | number  | Existing initiator group tag.
6977initiators                  | Optional | array   | Array of initiator hostnames or IP addresses
6978netmasks                    | Optional | array   | Array of initiator netmasks
6979
6980#### Example
6981
6982Example request:
6983
6984~~~json
6985request:
6986{
6987  "params": {
6988    "initiators": [
6989      "iqn.2016-06.io.spdk:host3"
6990    ],
6991    "tag": 1,
6992    "netmasks": [
6993      "255.255.255.1"
6994    ]
6995  },
6996  "jsonrpc": "2.0",
6997  "method": "iscsi_initiator_group_add_initiators",
6998  "id": 1
6999}
7000~~~
7001
7002Example response:
7003
7004~~~json
7005response:
7006{
7007  "jsonrpc": "2.0",
7008  "id": 1,
7009  "result": true
7010}
7011~~~
7012
7013### iscsi_initiator_group_remove_initiators method {#rpc_iscsi_initiator_group_remove_initiators}
7014
7015Remove initiators from an initiator group.
7016
7017#### Parameters
7018
7019Name                        | Optional | Type    | Description
7020--------------------------- | -------- | --------| -----------
7021tag                         | Required | number  | Existing initiator group tag.
7022initiators                  | Optional | array   | Array of initiator hostnames or IP addresses
7023netmasks                    | Optional | array   | Array of initiator netmasks
7024
7025#### Example
7026
7027Example request:
7028
7029~~~json
7030request:
7031{
7032  "params": {
7033    "initiators": [
7034      "iqn.2016-06.io.spdk:host3"
7035    ],
7036    "tag": 1,
7037    "netmasks": [
7038      "255.255.255.1"
7039    ]
7040  },
7041  "jsonrpc": "2.0",
7042  "method": "iscsi_initiator_group_remove_initiators",
7043  "id": 1
7044}
7045~~~
7046
7047Example response:
7048
7049~~~json
7050response:
7051{
7052  "jsonrpc": "2.0",
7053  "id": 1,
7054  "result": true
7055}
7056~~~
7057
7058### iscsi_get_target_nodes method {#rpc_iscsi_get_target_nodes}
7059
7060Show information about all available iSCSI target nodes.
7061
7062#### Parameters
7063
7064This method has no parameters.
7065
7066#### Result
7067
7068Array of objects describing target node.
7069
7070Name                        | Type    | Description
7071--------------------------- | --------| -----------
7072name                        | string  | Target node name (ASCII)
7073alias_name                  | string  | Target node alias name (ASCII)
7074pg_ig_maps                  | array   | Array of Portal_Group_Tag:Initiator_Group_Tag mappings
7075luns                        | array   | Array of Bdev names to LUN ID mappings
7076queue_depth                 | number  | Target queue depth
7077disable_chap                | boolean | CHAP authentication should be disabled for this target
7078require_chap                | boolean | CHAP authentication should be required for this target
7079mutual_chap                 | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7080chap_group                  | number  | Authentication group ID for this target node
7081header_digest               | boolean | Header Digest should be required for this target node
7082data_digest                 | boolean | Data Digest should be required for this target node
7083
7084#### Example
7085
7086Example request:
7087
7088~~~json
7089{
7090  "jsonrpc": "2.0",
7091  "method": "iscsi_get_target_nodes",
7092  "id": 1
7093}
7094~~~
7095
7096Example response:
7097
7098~~~json
7099{
7100  "jsonrpc": "2.0",
7101  "id": 1,
7102  "result": [
7103    {
7104      "luns": [
7105        {
7106          "lun_id": 0,
7107          "bdev_name": "Nvme0n1"
7108        }
7109      ],
7110      "mutual_chap": false,
7111      "name": "iqn.2016-06.io.spdk:target1",
7112      "alias_name": "iscsi-target1-alias",
7113      "require_chap": false,
7114      "chap_group": 0,
7115      "pg_ig_maps": [
7116        {
7117          "ig_tag": 1,
7118          "pg_tag": 1
7119        }
7120      ],
7121      "data_digest": false,
7122      "disable_chap": false,
7123      "header_digest": false,
7124      "queue_depth": 64
7125    }
7126  ]
7127}
7128~~~
7129
7130### iscsi_create_target_node method {#rpc_iscsi_create_target_node}
7131
7132Add an iSCSI target node.
7133
7134#### Parameters
7135
7136Name                        | Optional | Type    | Description
7137--------------------------- | -------- | --------| -----------
7138name                        | Required | string  | Target node name (ASCII)
7139alias_name                  | Required | string  | Target node alias name (ASCII)
7140pg_ig_maps                  | Required | array   | Array of (Portal_Group_Tag:Initiator_Group_Tag) mappings
7141luns                        | Required | array   | Array of Bdev names to LUN ID mappings
7142queue_depth                 | Required | number  | Target queue depth
7143disable_chap                | Optional | boolean | CHAP authentication should be disabled for this target
7144require_chap                | Optional | boolean | CHAP authentication should be required for this target
7145mutual_chap                 | Optional | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7146chap_group                  | Optional | number  | Authentication group ID for this target node
7147header_digest               | Optional | boolean | Header Digest should be required for this target node
7148data_digest                 | Optional | boolean | Data Digest should be required for this target node
7149
7150Parameters `disable_chap` and `require_chap` are mutually exclusive.
7151
7152#### Example
7153
7154Example request:
7155
7156~~~json
7157{
7158  "params": {
7159    "luns": [
7160      {
7161        "lun_id": 0,
7162        "bdev_name": "Nvme0n1"
7163      }
7164    ],
7165    "mutual_chap": true,
7166    "name": "target2",
7167    "alias_name": "iscsi-target2-alias",
7168    "pg_ig_maps": [
7169      {
7170        "ig_tag": 1,
7171        "pg_tag": 1
7172      },
7173      {
7174        "ig_tag": 2,
7175        "pg_tag": 2
7176      }
7177    ],
7178    "data_digest": true,
7179    "disable_chap": true,
7180    "header_digest": true,
7181    "queue_depth": 24
7182  },
7183  "jsonrpc": "2.0",
7184  "method": "iscsi_create_target_node",
7185  "id": 1
7186}
7187~~~
7188
7189Example response:
7190
7191~~~json
7192{
7193  "jsonrpc": "2.0",
7194  "id": 1,
7195  "result": true
7196}
7197~~~
7198
7199### iscsi_target_node_set_auth method {#rpc_iscsi_target_node_set_auth}
7200
7201Set CHAP authentication to an existing iSCSI target node.
7202
7203#### Parameters
7204
7205Name                        | Optional | Type    | Description
7206--------------------------- | -------- | --------| -----------
7207name                        | Required | string  | Target node name (ASCII)
7208disable_chap                | Optional | boolean | CHAP authentication should be disabled for this target
7209require_chap                | Optional | boolean | CHAP authentication should be required for this target
7210mutual_chap                 | Optional | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7211chap_group                  | Optional | number  | Authentication group ID for this target node
7212
7213Parameters `disable_chap` and `require_chap` are mutually exclusive.
7214
7215#### Example
7216
7217Example request:
7218
7219~~~json
7220{
7221  "params": {
7222    "chap_group": 1,
7223    "require_chap": true,
7224    "name": "iqn.2016-06.io.spdk:target1",
7225    "mutual_chap": true
7226  },
7227  "jsonrpc": "2.0",
7228  "method": "iscsi_target_node_set_auth",
7229  "id": 1
7230}
7231~~~
7232
7233Example response:
7234
7235~~~json
7236{
7237  "jsonrpc": "2.0",
7238  "id": 1,
7239  "result": true
7240}
7241~~~
7242
7243### iscsi_target_node_add_pg_ig_maps method {#rpc_iscsi_target_node_add_pg_ig_maps}
7244
7245Add initiator group to portal group mappings to an existing iSCSI target node.
7246
7247#### Parameters
7248
7249Name                        | Optional | Type    | Description
7250--------------------------- | -------- | --------| -----------
7251name                        | Required | string  | Target node name (ASCII)
7252pg_ig_maps                  | Required | array   | Not empty array of initiator to portal group mappings objects
7253
7254Portal to Initiator group mappings object:
7255
7256Name                        | Optional | Type    | Description
7257--------------------------- | -------- | --------| -----------
7258ig_tag                      | Required | number  | Existing initiator group tag
7259pg_tag                      | Required | number  | Existing portal group tag
7260
7261#### Example
7262
7263Example request:
7264
7265~~~json
7266{
7267  "params": {
7268    "pg_ig_maps": [
7269      {
7270        "ig_tag": 1,
7271        "pg_tag": 1
7272      },
7273      {
7274        "ig_tag": 2,
7275        "pg_tag": 2
7276      },
7277      {
7278        "ig_tag": 3,
7279        "pg_tag": 3
7280      }
7281    ],
7282    "name": "iqn.2016-06.io.spdk:target3"
7283  },
7284  "jsonrpc": "2.0",
7285  "method": "iscsi_target_node_add_pg_ig_maps",
7286  "id": 1
7287}
7288~~~
7289
7290Example response:
7291
7292~~~json
7293{
7294  "jsonrpc": "2.0",
7295  "id": 1,
7296  "result": true
7297}
7298~~~
7299
7300### iscsi_target_node_remove_pg_ig_maps method {#rpc_iscsi_target_node_remove_pg_ig_maps}
7301
7302Delete initiator group to portal group mappings from an existing iSCSI target node.
7303
7304#### Parameters
7305
7306Name                        | Optional | Type    | Description
7307--------------------------- | -------- | --------| -----------
7308name                        | Required | string  | Target node name (ASCII)
7309pg_ig_maps                  | Required | array   | Not empty array of Portal to Initiator group mappings objects
7310
7311Portal to Initiator group mappings object:
7312
7313Name                        | Optional | Type    | Description
7314--------------------------- | -------- | --------| -----------
7315ig_tag                      | Required | number  | Existing initiator group tag
7316pg_tag                      | Required | number  | Existing portal group tag
7317
7318#### Example
7319
7320Example request:
7321
7322~~~json
7323{
7324  "params": {
7325    "pg_ig_maps": [
7326      {
7327        "ig_tag": 1,
7328        "pg_tag": 1
7329      },
7330      {
7331        "ig_tag": 2,
7332        "pg_tag": 2
7333      },
7334      {
7335        "ig_tag": 3,
7336        "pg_tag": 3
7337      }
7338    ],
7339    "name": "iqn.2016-06.io.spdk:target3"
7340  },
7341  "jsonrpc": "2.0",
7342  "method": "iscsi_target_node_remove_pg_ig_maps",
7343  "id": 1
7344}
7345~~~
7346
7347Example response:
7348
7349~~~json
7350{
7351  "jsonrpc": "2.0",
7352  "id": 1,
7353  "result": true
7354}
7355~~~
7356
7357### iscsi_delete_target_node method {#rpc_iscsi_delete_target_node}
7358
7359Delete an iSCSI target node.
7360
7361#### Parameters
7362
7363Name                        | Optional | Type    | Description
7364--------------------------- | -------- | --------| -----------
7365name                        | Required | string  | Target node name (ASCII)
7366
7367#### Example
7368
7369Example request:
7370
7371~~~json
7372{
7373  "params": {
7374    "name": "iqn.2016-06.io.spdk:target1"
7375  },
7376  "jsonrpc": "2.0",
7377  "method": "iscsi_delete_target_node",
7378  "id": 1
7379}
7380~~~
7381
7382Example response:
7383
7384~~~json
7385{
7386  "jsonrpc": "2.0",
7387  "id": 1,
7388  "result": true
7389}
7390~~~
7391
7392### iscsi_get_portal_groups method {#rpc_iscsi_get_portal_groups}
7393
7394Show information about all available portal groups.
7395
7396#### Parameters
7397
7398This method has no parameters.
7399
7400#### Example
7401
7402Example request:
7403
7404~~~json
7405request:
7406{
7407  "jsonrpc": "2.0",
7408  "method": "iscsi_get_portal_groups",
7409  "id": 1
7410}
7411~~~
7412
7413Example response:
7414
7415~~~json
7416{
7417  "jsonrpc": "2.0",
7418  "id": 1,
7419  "result": [
7420    {
7421      "portals": [
7422        {
7423          "host": "127.0.0.1",
7424          "port": "3260"
7425        }
7426      ],
7427      "tag": 1,
7428      "private": false
7429    }
7430  ]
7431}
7432~~~
7433
7434### iscsi_create_portal_group method {#rpc_iscsi_create_portal_group}
7435
7436Add a portal group.
7437
7438#### Parameters
7439
7440Name                        | Optional | Type    | Description
7441--------------------------- | -------- | --------| -----------
7442tag                         | Required | number  | Portal group tag
7443portals                     | Required | array   | Not empty array of portals
7444private                     | Optional | boolean | When true, portals in this group are not returned by a discovery session. Used for login redirection. (default: `false`)
7445wait                        | Optional | boolean | When true, do not listen on portals until it is started explicitly. (default: `false`)
7446
7447Portal object
7448
7449Name                        | Optional | Type    | Description
7450--------------------------- | -------- | --------| -----------
7451host                        | Required | string  | Hostname or IP address
7452port                        | Required | string  | Port number
7453
7454#### Example
7455
7456Example request:
7457
7458~~~json
7459{
7460  "params": {
7461    "portals": [
7462      {
7463        "host": "127.0.0.1",
7464        "port": "3260"
7465      }
7466    ],
7467    "tag": 1
7468  },
7469  "jsonrpc": "2.0",
7470  "method": "iscsi_create_portal_group",
7471  "id": 1
7472}
7473~~~
7474
7475Example response:
7476
7477~~~json
7478{
7479  "jsonrpc": "2.0",
7480  "id": 1,
7481  "result": true
7482}
7483~~~
7484
7485### iscsi_start_portal_group method {#rpc_iscsi_start_portal_group}
7486
7487Start listening on portals if the portal group is not started yet, or do nothing
7488if the portal group already started. Return a success response for both cases.
7489
7490#### Parameters
7491
7492Name                        | Optional | Type    | Description
7493--------------------------- | -------- | --------| -----------
7494tag                         | Required | number  | Existing portal group tag
7495
7496#### Example
7497
7498Example request:
7499
7500~~~json
7501{
7502  "params": {
7503    "tag": 1
7504  },
7505  "jsonrpc": "2.0",
7506  "method": "iscsi_start_portal_group",
7507  "id": 1
7508}
7509~~~
7510
7511Example response:
7512
7513~~~json
7514{
7515  "jsonrpc": "2.0",
7516  "id": 1,
7517  "result": true
7518}
7519~~~
7520
7521### iscsi_delete_portal_group method {#rpc_iscsi_delete_portal_group}
7522
7523Delete an existing portal group.
7524
7525#### Parameters
7526
7527Name                        | Optional | Type    | Description
7528--------------------------- | -------- | --------| -----------
7529tag                         | Required | number  | Existing portal group tag
7530
7531#### Example
7532
7533Example request:
7534
7535~~~json
7536{
7537  "params": {
7538    "tag": 1
7539  },
7540  "jsonrpc": "2.0",
7541  "method": "iscsi_delete_portal_group",
7542  "id": 1
7543}
7544~~~
7545
7546Example response:
7547
7548~~~json
7549{
7550  "jsonrpc": "2.0",
7551  "id": 1,
7552  "result": true
7553}
7554~~~
7555
7556### iscsi_portal_group_set_auth method {#rpc_iscsi_portal_group_set_auth}
7557
7558Set CHAP authentication for discovery sessions specific for the existing iSCSI portal group.
7559This RPC overwrites the setting by the global parameters for the iSCSI portal group.
7560
7561#### Parameters
7562
7563Name                        | Optional | Type    | Description
7564--------------------------- | -------- | --------| -----------
7565disable_chap                | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
7566require_chap                | Optional | boolean | CHAP for discovery session should be required (default: `false`)
7567mutual_chap                 | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
7568chap_group                  | Optional | number  | CHAP group ID for discovery session (default: 0)
7569
7570Parameters `disable_chap` and `require_chap` are mutually exclusive.
7571
7572#### Example
7573
7574Example request:
7575
7576~~~json
7577request:
7578{
7579  "params": {
7580    "tag": 1,
7581    "chap_group": 1,
7582    "require_chap": true,
7583    "mutual_chap": true
7584  },
7585  "jsonrpc": "2.0",
7586  "method": "iscsi_portal_group_set_auth",
7587  "id": 1
7588}
7589~~~
7590
7591Example response:
7592
7593~~~json
7594{
7595  "jsonrpc": "2.0",
7596  "id": 1,
7597  "result": true
7598}
7599~~~
7600
7601### iscsi_get_connections method {#rpc_iscsi_get_connections}
7602
7603Show information about all active connections.
7604
7605#### Parameters
7606
7607This method has no parameters.
7608
7609#### Results
7610
7611Array of objects describing iSCSI connection.
7612
7613Name                        | Type    | Description
7614--------------------------- | --------| -----------
7615id                          | number  | Index (used for TTT - Target Transfer Tag)
7616cid                         | number  | CID (Connection ID)
7617tsih                        | number  | TSIH (Target Session Identifying Handle)
7618lcore_id                    | number  | Core number on which the iSCSI connection runs
7619initiator_addr              | string  | Initiator address
7620target_addr                 | string  | Target address
7621target_node_name            | string  | Target node name (ASCII) without prefix
7622
7623#### Example
7624
7625Example request:
7626
7627~~~json
7628{
7629  "jsonrpc": "2.0",
7630  "method": "iscsi_get_connections",
7631  "id": 1
7632}
7633~~~
7634
7635Example response:
7636
7637~~~json
7638{
7639  "jsonrpc": "2.0",
7640  "id": 1,
7641  "result": [
7642    {
7643      "tsih": 4,
7644      "cid": 0,
7645      "target_node_name": "target1",
7646      "lcore_id": 0,
7647      "initiator_addr": "10.0.0.2",
7648      "target_addr": "10.0.0.1",
7649      "id": 0
7650    }
7651  ]
7652}
7653~~~
7654
7655### iscsi_target_node_add_lun method {#rpc_iscsi_target_node_add_lun}
7656
7657Add an LUN to an existing iSCSI target node.
7658
7659#### Parameters
7660
7661Name                        | Optional | Type    | Description
7662--------------------------- | -------- | --------| -----------
7663name                        | Required | string  | Target node name (ASCII)
7664bdev_name                   | Required | string  | bdev name to be added as a LUN
7665lun_id                      | Optional | number  | LUN ID (default: first free ID)
7666
7667#### Example
7668
7669Example request:
7670
7671~~~json
7672{
7673  "params": {
7674    "lun_id": 2,
7675    "name": "iqn.2016-06.io.spdk:target1",
7676    "bdev_name": "Malloc0"
7677  },
7678  "jsonrpc": "2.0",
7679  "method": "iscsi_target_node_add_lun",
7680  "id": 1
7681}
7682~~~
7683
7684Example response:
7685
7686~~~json
7687{
7688  "jsonrpc": "2.0",
7689  "id": 1,
7690  "result": true
7691}
7692~~~
7693
7694### iscsi_target_node_set_redirect method {#rpc_iscsi_target_node_set_redirect}
7695
7696Update redirect portal of the primary portal group for the target node,
7697
7698#### Parameters
7699
7700Name                        | Optional | Type    | Description
7701--------------------------- | -------- | --------| -----------
7702name                        | Required | string  | Target node name (ASCII)
7703pg_tag                      | Required | number  | Existing portal group tag
7704redirect_host               | Optional | string  | Numeric IP address to which the target node is redirected
7705redirect_port               | Optional | string  | Numeric TCP port to which the target node is redirected
7706
7707If both redirect_host and redirect_port are omitted, clear the redirect portal.
7708
7709#### Example
7710
7711Example request:
7712
7713~~~json
7714{
7715  "params": {
7716    "name": "iqn.2016-06.io.spdk:target1",
7717    "pg_tag": 1,
7718    "redirect_host": "10.0.0.3",
7719    "redirect_port": "3260"
7720  },
7721  "jsonrpc": "2.0",
7722  "method": "iscsi_target_node_set_redirect",
7723  "id": 1
7724}
7725~~~
7726
7727Example response:
7728
7729~~~json
7730{
7731  "jsonrpc": "2.0",
7732  "id": 1,
7733  "result": true
7734}
7735~~~
7736
7737### iscsi_target_node_request_logout method {#rpc_iscsi_target_node_request_logout}
7738
7739For the target node, request connections whose portal group tag match to logout,
7740or request all connections to logout if portal group tag is omitted.
7741
7742#### Parameters
7743
7744Name                        | Optional | Type    | Description
7745--------------------------- | -------- | --------| -----------
7746name                        | Required | string  | Target node name (ASCII)
7747pg_tag                      | Optional | number  | Existing portal group tag
7748
7749#### Example
7750
7751Example request:
7752
7753~~~json
7754{
7755  "params": {
7756    "name": "iqn.2016-06.io.spdk:target1",
7757    "pg_tag": 1
7758  },
7759  "jsonrpc": "2.0",
7760  "method": "iscsi_target_node_request_logout",
7761  "id": 1
7762}
7763~~~
7764
7765Example response:
7766
7767~~~json
7768{
7769  "jsonrpc": "2.0",
7770  "id": 1,
7771  "result": true
7772}
7773~~~
7774
7775## NVMe-oF Target {#jsonrpc_components_nvmf_tgt}
7776
7777### nvmf_create_transport method {#rpc_nvmf_create_transport}
7778
7779Initialize an NVMe-oF transport with the given options.
7780
7781#### Parameters
7782
7783Name                        | Optional | Type    | Description
7784--------------------------- | -------- | --------| -----------
7785trtype                      | Required | string  | Transport type (ex. RDMA)
7786tgt_name                    | Optional | string  | Parent NVMe-oF target name.
7787max_queue_depth             | Optional | number  | Max number of outstanding I/O per queue
7788max_io_qpairs_per_ctrlr     | Optional | number  | Max number of IO qpairs per controller
7789in_capsule_data_size        | Optional | number  | Max number of in-capsule data size
7790max_io_size                 | Optional | number  | Max I/O size (bytes)
7791io_unit_size                | Optional | number  | I/O unit size (bytes)
7792max_aq_depth                | Optional | number  | Max number of admin cmds per AQ
7793num_shared_buffers          | Optional | number  | The number of pooled data buffers available to the transport
7794buf_cache_size              | Optional | number  | The number of shared buffers to reserve for each poll group
7795num_cqe                     | Optional | number  | The number of CQ entries. Only used when no_srq=true (RDMA only)
7796max_srq_depth               | Optional | number  | The number of elements in a per-thread shared receive queue (RDMA only)
7797no_srq                      | Optional | boolean | Disable shared receive queue even for devices that support it. (RDMA only)
7798c2h_success                 | Optional | boolean | Disable C2H success optimization (TCP only)
7799dif_insert_or_strip         | Optional | boolean | Enable DIF insert for write I/O and DIF strip for read I/O DIF
7800sock_priority               | Optional | number  | The socket priority of the connection owned by this transport (TCP only)
7801acceptor_backlog            | Optional | number  | The number of pending connections allowed in backlog before failing new connection attempts (RDMA only)
7802abort_timeout_sec           | Optional | number  | Abort execution timeout value, in seconds
7803no_wr_batching              | Optional | boolean | Disable work requests batching (RDMA only)
7804control_msg_num             | Optional | number  | The number of control messages per poll group (TCP only)
7805disable_mappable_bar0       | Optional | boolean | disable client mmap() of BAR0 (VFIO-USER only)
7806disable_adaptive_irq        | Optional | boolean | Disable adaptive interrupt feature (VFIO-USER only)
7807disable_shadow_doorbells    | Optional | boolean | disable shadow doorbell support (VFIO-USER only)
7808zcopy                       | Optional | boolean | Use zero-copy operations if the underlying bdev supports them
7809
7810#### Example
7811
7812Example request:
7813
7814~~~json
7815{
7816  "jsonrpc": "2.0",
7817  "method": "nvmf_create_transport",
7818  "id": 1,
7819  "params": {
7820    "trtype": "RDMA",
7821    "max_queue_depth": 32
7822  }
7823}
7824~~~
7825
7826Example response:
7827
7828~~~json
7829{
7830  "jsonrpc": "2.0",
7831  "id": 1,
7832  "result": true
7833}
7834~~~
7835
7836### nvmf_get_subsystems method {#rpc_nvmf_get_subsystems}
7837
7838#### Parameters
7839
7840Name                        | Optional | Type        | Description
7841--------------------------- | -------- | ------------| -----------
7842tgt_name                    | Optional | string      | Parent NVMe-oF target name.
7843
7844#### Example
7845
7846Example request:
7847
7848~~~json
7849{
7850  "jsonrpc": "2.0",
7851  "id": 1,
7852  "method": "nvmf_get_subsystems"
7853}
7854~~~
7855
7856Example response:
7857
7858~~~json
7859{
7860  "jsonrpc": "2.0",
7861  "id": 1,
7862  "result": [
7863    {
7864      "nqn": "nqn.2014-08.org.nvmexpress.discovery",
7865      "subtype": "Discovery"
7866      "listen_addresses": [],
7867      "hosts": [],
7868      "allow_any_host": true
7869    },
7870    {
7871      "nqn": "nqn.2016-06.io.spdk:cnode1",
7872      "subtype": "NVMe",
7873      "listen_addresses": [
7874        {
7875          "trtype": "RDMA",
7876          "adrfam": "IPv4",
7877          "traddr": "192.168.0.123",
7878          "trsvcid": "4420"
7879        }
7880      ],
7881      "hosts": [
7882        {"nqn": "nqn.2016-06.io.spdk:host1"}
7883      ],
7884      "allow_any_host": false,
7885      "serial_number": "abcdef",
7886      "model_number": "ghijklmnop",
7887      "namespaces": [
7888        {"nsid": 1, "name": "Malloc2"},
7889        {"nsid": 2, "name": "Nvme0n1"}
7890      ]
7891    }
7892  ]
7893}
7894~~~
7895
7896### nvmf_create_subsystem method {#rpc_nvmf_create_subsystem}
7897
7898Construct an NVMe over Fabrics target subsystem.
7899
7900#### Parameters
7901
7902Name                    | Optional | Type        | Description
7903----------------------- | -------- | ----------- | -----------
7904nqn                     | Required | string      | Subsystem NQN
7905tgt_name                | Optional | string      | Parent NVMe-oF target name.
7906serial_number           | Optional | string      | Serial number of virtual controller
7907model_number            | Optional | string      | Model number of virtual controller
7908max_namespaces          | Optional | number      | Maximum number of namespaces that can be attached to the subsystem. Default: 0 (Unlimited)
7909allow_any_host          | Optional | boolean     | Allow any host (`true`) or enforce allowed host list (`false`). Default: `false`.
7910ana_reporting           | Optional | boolean     | Enable ANA reporting feature (default: `false`).
7911min_cntlid              | Optional | number      | Minimum controller ID. Default: 1
7912max_cntlid              | Optional | number      | Maximum controller ID. Default: 0xffef
7913
7914#### Example
7915
7916Example request:
7917
7918~~~json
7919{
7920  "jsonrpc": "2.0",
7921  "id": 1,
7922  "method": "nvmf_create_subsystem",
7923  "params": {
7924    "nqn": "nqn.2016-06.io.spdk:cnode1",
7925    "allow_any_host": false,
7926    "serial_number": "abcdef",
7927    "model_number": "ghijklmnop"
7928  }
7929}
7930~~~
7931
7932Example response:
7933
7934~~~json
7935{
7936  "jsonrpc": "2.0",
7937  "id": 1,
7938  "result": true
7939}
7940~~~
7941
7942### nvmf_delete_subsystem method {#rpc_nvmf_delete_subsystem}
7943
7944Delete an existing NVMe-oF subsystem.
7945
7946#### Parameters
7947
7948Parameter              | Optional | Type        | Description
7949---------------------- | -------- | ----------- | -----------
7950nqn                    | Required | string      | Subsystem NQN to delete.
7951tgt_name               | Optional | string      | Parent NVMe-oF target name.
7952
7953#### Example
7954
7955Example request:
7956
7957~~~json
7958{
7959  "jsonrpc": "2.0",
7960  "id": 1,
7961  "method": "nvmf_delete_subsystem",
7962  "params": {
7963    "nqn": "nqn.2016-06.io.spdk:cnode1"
7964  }
7965}
7966~~~
7967
7968Example response:
7969
7970~~~json
7971{
7972  "jsonrpc": "2.0",
7973  "id": 1,
7974  "result": true
7975}
7976~~~
7977
7978### nvmf_subsystem_add_listener  method {#rpc_nvmf_subsystem_add_listener}
7979
7980Add a new listen address to an NVMe-oF subsystem.
7981
7982#### Parameters
7983
7984Name                    | Optional | Type        | Description
7985----------------------- | -------- | ----------- | -----------
7986nqn                     | Required | string      | Subsystem NQN
7987tgt_name                | Optional | string      | Parent NVMe-oF target name.
7988listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
7989secure_channel          | Optional | bool        | Whether all connections immediately attempt to establish a secure channel
7990
7991#### listen_address {#rpc_nvmf_listen_address}
7992
7993Name                    | Optional | Type        | Description
7994----------------------- | -------- | ----------- | -----------
7995trtype                  | Required | string      | Transport type ("RDMA")
7996adrfam                  | Required | string      | Address family ("IPv4", "IPv6", "IB", or "FC")
7997traddr                  | Required | string      | Transport address
7998trsvcid                 | Optional | string      | Transport service ID (required for RDMA or TCP)
7999
8000#### Example
8001
8002Example request:
8003
8004~~~json
8005{
8006  "jsonrpc": "2.0",
8007  "id": 1,
8008  "method": "nvmf_subsystem_add_listener",
8009  "params": {
8010    "nqn": "nqn.2016-06.io.spdk:cnode1",
8011    "listen_address": {
8012      "trtype": "RDMA",
8013      "adrfam": "IPv4",
8014      "traddr": "192.168.0.123",
8015      "trsvcid": "4420"
8016    }
8017  }
8018}
8019~~~
8020
8021Example response:
8022
8023~~~json
8024{
8025  "jsonrpc": "2.0",
8026  "id": 1,
8027  "result": true
8028}
8029~~~
8030
8031### nvmf_subsystem_remove_listener  method {#rpc_nvmf_subsystem_remove_listener}
8032
8033Remove a listen address from an NVMe-oF subsystem.
8034
8035#### Parameters
8036
8037Name                    | Optional | Type        | Description
8038----------------------- | -------- | ----------- | -----------
8039nqn                     | Required | string      | Subsystem NQN
8040tgt_name                | Optional | string      | Parent NVMe-oF target name.
8041listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
8042
8043#### Example
8044
8045Example request:
8046
8047~~~json
8048{
8049  "jsonrpc": "2.0",
8050  "id": 1,
8051  "method": "nvmf_subsystem_remove_listener",
8052  "params": {
8053    "nqn": "nqn.2016-06.io.spdk:cnode1",
8054    "listen_address": {
8055      "trtype": "RDMA",
8056      "adrfam": "IPv4",
8057      "traddr": "192.168.0.123",
8058      "trsvcid": "4420"
8059    }
8060  }
8061}
8062~~~
8063
8064Example response:
8065
8066~~~json
8067{
8068  "jsonrpc": "2.0",
8069  "id": 1,
8070  "result": true
8071}
8072~~~
8073
8074### nvmf_subsystem_listener_set_ana_state  method {#rpc_nvmf_subsystem_listener_set_ana_state}
8075
8076Set ANA state of a listener for an NVMe-oF subsystem. Only the ANA state of the specified ANA
8077group is updated, or ANA states of all ANA groups if ANA group is not specified.
8078
8079#### Parameters
8080
8081Name                    | Optional | Type        | Description
8082----------------------- | -------- | ----------- | -----------
8083nqn                     | Required | string      | Subsystem NQN
8084tgt_name                | Optional | string      | Parent NVMe-oF target name.
8085listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
8086ana_state               | Required | string      | ANA state to set ("optimized", "non_optimized", or "inaccessible")
8087anagrpid                | Optional | number      | ANA group ID
8088
8089#### Example
8090
8091Example request:
8092
8093~~~json
8094{
8095  "jsonrpc": "2.0",
8096  "id": 1,
8097  "method": "nvmf_subsystem_listener_set_ana_state",
8098  "params": {
8099    "nqn": "nqn.2016-06.io.spdk:cnode1",
8100    "listen_address": {
8101      "trtype": "RDMA",
8102      "adrfam": "IPv4",
8103      "traddr": "192.168.0.123",
8104      "trsvcid": "4420"
8105    },
8106    "ana_state", "inaccessible"
8107  }
8108}
8109~~~
8110
8111Example response:
8112
8113~~~json
8114{
8115  "jsonrpc": "2.0",
8116  "id": 1,
8117  "result": true
8118}
8119~~~
8120
8121### nvmf_subsystem_add_ns method {#rpc_nvmf_subsystem_add_ns}
8122
8123Add a namespace to a subsystem. The namespace ID is returned as the result.
8124
8125### Parameters
8126
8127Name                    | Optional | Type        | Description
8128----------------------- | -------- | ----------- | -----------
8129nqn                     | Required | string      | Subsystem NQN
8130namespace               | Required | object      | @ref rpc_nvmf_namespace object
8131tgt_name                | Optional | string      | Parent NVMe-oF target name.
8132
8133#### namespace {#rpc_nvmf_namespace}
8134
8135Name                    | Optional | Type        | Description
8136----------------------- | -------- | ----------- | -----------
8137nsid                    | Optional | number      | Namespace ID between 1 and 4294967294, inclusive. Default: Automatically assign NSID.
8138bdev_name               | Required | string      | Name of bdev to expose as a namespace.
8139nguid                   | Optional | string      | 16-byte namespace globally unique identifier in hexadecimal (e.g. "ABCDEF0123456789ABCDEF0123456789")
8140eui64                   | Optional | string      | 8-byte namespace EUI-64 in hexadecimal (e.g. "ABCDEF0123456789")
8141uuid                    | Optional | string      | RFC 4122 UUID (e.g. "ceccf520-691e-4b46-9546-34af789907c5")
8142ptpl_file               | Optional | string      | File path to save/restore persistent reservation information
8143anagrpid                | Optional | number      | ANA group ID. Default: Namespace ID.
8144
8145#### Example
8146
8147Example request:
8148
8149~~~json
8150{
8151  "jsonrpc": "2.0",
8152  "id": 1,
8153  "method": "nvmf_subsystem_add_ns",
8154  "params": {
8155    "nqn": "nqn.2016-06.io.spdk:cnode1",
8156    "namespace": {
8157      "nsid": 3,
8158      "bdev_name": "Nvme0n1",
8159      "ptpl_file": "/opt/Nvme0n1PR.json"
8160    }
8161  }
8162}
8163~~~
8164
8165Example response:
8166
8167~~~json
8168{
8169  "jsonrpc": "2.0",
8170  "id": 1,
8171  "result": 3
8172}
8173~~~
8174
8175### nvmf_subsystem_remove_ns method {#rpc_nvmf_subsystem_remove_ns}
8176
8177Remove a namespace from a subsystem.
8178
8179#### Parameters
8180
8181Name                    | Optional | Type        | Description
8182----------------------- | -------- | ----------- | -----------
8183nqn                     | Required | string      | Subsystem NQN
8184nsid                    | Required | number      | Namespace ID
8185tgt_name                | Optional | string      | Parent NVMe-oF target name.
8186
8187#### Example
8188
8189Example request:
8190
8191~~~json
8192{
8193  "jsonrpc": "2.0",
8194  "id": 1,
8195  "method": "nvmf_subsystem_remove_ns",
8196  "params": {
8197    "nqn": "nqn.2016-06.io.spdk:cnode1",
8198    "nsid": 1
8199  }
8200}
8201~~~
8202
8203Example response:
8204
8205~~~json
8206{
8207  "jsonrpc": "2.0",
8208  "id": 1,
8209  "result": true
8210}
8211~~~
8212
8213### nvmf_subsystem_add_host method {#rpc_nvmf_subsystem_add_host}
8214
8215Add a host NQN to the list of allowed hosts.
8216
8217#### Parameters
8218
8219Name                    | Optional | Type        | Description
8220----------------------- | -------- | ----------- | -----------
8221nqn                     | Required | string      | Subsystem NQN
8222host                    | Required | string      | Host NQN to add to the list of allowed host NQNs
8223tgt_name                | Optional | string      | Parent NVMe-oF target name.
8224psk                     | Optional | string      | Path to a file containing PSK for TLS connection
8225
8226#### Example
8227
8228Example request:
8229
8230~~~json
8231{
8232  "jsonrpc": "2.0",
8233  "id": 1,
8234  "method": "nvmf_subsystem_add_host",
8235  "params": {
8236    "nqn": "nqn.2016-06.io.spdk:cnode1",
8237    "host": "nqn.2016-06.io.spdk:host1"
8238  }
8239}
8240~~~
8241
8242Example response:
8243
8244~~~json
8245{
8246  "jsonrpc": "2.0",
8247  "id": 1,
8248  "result": true
8249}
8250~~~
8251
8252### nvmf_subsystem_remove_host method {#rpc_nvmf_subsystem_remove_host}
8253
8254Remove a host NQN from the list of allowed hosts.
8255
8256#### Parameters
8257
8258Name                    | Optional | Type        | Description
8259----------------------- | -------- | ----------- | -----------
8260nqn                     | Required | string      | Subsystem NQN
8261host                    | Required | string      | Host NQN to remove from the list of allowed host NQNs
8262tgt_name                | Optional | string      | Parent NVMe-oF target name.
8263
8264#### Example
8265
8266Example request:
8267
8268~~~json
8269{
8270  "jsonrpc": "2.0",
8271  "id": 1,
8272  "method": "nvmf_subsystem_remove_host",
8273  "params": {
8274    "nqn": "nqn.2016-06.io.spdk:cnode1",
8275    "host": "nqn.2016-06.io.spdk:host1"
8276  }
8277}
8278~~~
8279
8280Example response:
8281
8282~~~json
8283{
8284  "jsonrpc": "2.0",
8285  "id": 1,
8286  "result": true
8287}
8288~~~
8289
8290### nvmf_subsystem_allow_any_host method {#rpc_nvmf_subsystem_allow_any_host}
8291
8292Configure a subsystem to allow any host to connect or to enforce the host NQN list.
8293
8294#### Parameters
8295
8296Name                    | Optional | Type        | Description
8297----------------------- | -------- | ----------- | -----------
8298nqn                     | Required | string      | Subsystem NQN
8299allow_any_host          | Required | boolean     | Allow any host (`true`) or enforce allowed host list (`false`).
8300tgt_name                | Optional | string      | Parent NVMe-oF target name.
8301
8302#### Example
8303
8304Example request:
8305
8306~~~json
8307{
8308  "jsonrpc": "2.0",
8309  "id": 1,
8310  "method": "nvmf_subsystem_allow_any_host",
8311  "params": {
8312    "nqn": "nqn.2016-06.io.spdk:cnode1",
8313    "allow_any_host": true
8314  }
8315}
8316~~~
8317
8318Example response:
8319
8320~~~json
8321{
8322  "jsonrpc": "2.0",
8323  "id": 1,
8324  "result": true
8325}
8326~~~
8327
8328### nvmf_subsystem_get_controllers {#rpc_nvmf_subsystem_get_controllers}
8329
8330#### Parameters
8331
8332Name                    | Optional | Type        | Description
8333----------------------- | -------- | ----------- | -----------
8334nqn                     | Required | string      | Subsystem NQN
8335tgt_name                | Optional | string      | Parent NVMe-oF target name.
8336
8337#### Example
8338
8339Example request:
8340
8341~~~json
8342{
8343  "jsonrpc": "2.0",
8344  "id": 1,
8345  "method": "nvmf_subsystem_get_controllers",
8346  "params": {
8347    "nqn": "nqn.2016-06.io.spdk:cnode1"
8348  }
8349}
8350~~~
8351
8352Example response:
8353
8354~~~json
8355{
8356  "jsonrpc": "2.0",
8357  "id": 1,
8358  "result": [
8359    {
8360      "cntlid": 1,
8361      "hostnqn": "nqn.2016-06.io.spdk:host1",
8362      "hostid": "27dad528-6368-41c3-82d3-0b956b49025d",
8363      "num_io_qpairs": 5
8364    }
8365  ]
8366}
8367~~~
8368
8369### nvmf_subsystem_get_qpairs {#rpc_nvmf_subsystem_get_qpairs}
8370
8371#### Parameters
8372
8373Name                    | Optional | Type        | Description
8374----------------------- | -------- | ----------- | -----------
8375nqn                     | Required | string      | Subsystem NQN
8376tgt_name                | Optional | string      | Parent NVMe-oF target name.
8377
8378#### Example
8379
8380Example request:
8381
8382~~~json
8383{
8384  "jsonrpc": "2.0",
8385  "id": 1,
8386  "method": "nvmf_subsystem_get_qpairs",
8387  "params": {
8388    "nqn": "nqn.2016-06.io.spdk:cnode1"
8389  }
8390}
8391~~~
8392
8393Example response:
8394
8395~~~json
8396{
8397  "jsonrpc": "2.0",
8398  "id": 1,
8399  "result": [
8400    {
8401      "cntlid": 1,
8402      "qid": 0,
8403      "state": "active",
8404      "listen_address": {
8405        "trtype": "RDMA",
8406        "adrfam": "IPv4",
8407        "traddr": "192.168.0.123",
8408        "trsvcid": "4420"
8409      }
8410    },
8411    {
8412      "cntlid": 1,
8413      "qid": 1,
8414      "state": "active",
8415      "listen_address": {
8416        "trtype": "RDMA",
8417        "adrfam": "IPv4",
8418        "traddr": "192.168.0.123",
8419        "trsvcid": "4420"
8420      }
8421    }
8422  ]
8423}
8424~~~
8425
8426### nvmf_subsystem_get_listeners {#rpc_nvmf_subsystem_get_listeners}
8427
8428#### Parameters
8429
8430Name                    | Optional | Type        | Description
8431----------------------- | -------- | ----------- | -----------
8432nqn                     | Required | string      | Subsystem NQN
8433tgt_name                | Optional | string      | Parent NVMe-oF target name.
8434
8435#### Example
8436
8437Example request:
8438
8439~~~json
8440{
8441  "jsonrpc": "2.0",
8442  "id": 1,
8443  "method": "nvmf_subsystem_get_listeners",
8444  "params": {
8445    "nqn": "nqn.2016-06.io.spdk:cnode1"
8446  }
8447}
8448~~~
8449
8450Example response:
8451
8452~~~json
8453{
8454  "jsonrpc": "2.0",
8455  "id": 1,
8456  "result": [
8457    {
8458      "address": {
8459        "trtype": "RDMA",
8460        "adrfam": "IPv4",
8461        "traddr": "192.168.0.123",
8462        "trsvcid": "4420"
8463      },
8464      "ana_state": "optimized"
8465    }
8466  ]
8467}
8468~~~
8469
8470### nvmf_set_max_subsystems {#rpc_nvmf_set_max_subsystems}
8471
8472Set the maximum allowed subsystems for the NVMe-oF target.  This RPC may only be called
8473before SPDK subsystems have been initialized.
8474
8475#### Parameters
8476
8477Name                    | Optional | Type        | Description
8478----------------------- | -------- | ----------- | -----------
8479max_subsystems          | Required | number      | Maximum number of NVMe-oF subsystems
8480
8481#### Example
8482
8483Example request:
8484
8485~~~json
8486{
8487  "jsonrpc": "2.0",
8488  "id": 1,
8489  "method": "nvmf_set_max_subsystems",
8490  "params": {
8491    "max_subsystems": 1024
8492  }
8493}
8494~~~
8495
8496Example response:
8497
8498~~~json
8499{
8500  "jsonrpc": "2.0",
8501  "id": 1,
8502  "result": true
8503}
8504~~~
8505
8506### nvmf_set_config {#rpc_nvmf_set_config}
8507
8508Set global configuration of NVMe-oF target.  This RPC may only be called before SPDK subsystems
8509have been initialized.
8510
8511#### Parameters
8512
8513Name                    | Optional | Type        | Description
8514----------------------- | -------- | ----------- | -----------
8515acceptor_poll_rate      | Optional | number      | Polling interval of the acceptor for incoming connections (microseconds)
8516admin_cmd_passthru      | Optional | object      | Admin command passthru configuration
8517poll_groups_mask        | Optional | string      | Set cpumask for NVMf poll groups
8518discovery_filter        | Optional | string      | Set discovery filter, possible values are: `match_any` (default) or comma separated values: `transport`, `address`, `svcid`
8519
8520#### admin_cmd_passthru {#spdk_nvmf_admin_passthru_conf}
8521
8522Name                    | Optional | Type        | Description
8523----------------------- | -------- | ----------- | -----------
8524identify_ctrlr          | Required | bool        | If true, enables custom identify handler that reports some identify attributes from the underlying NVMe drive
8525
8526#### Example
8527
8528Example request:
8529
8530~~~json
8531{
8532  "jsonrpc": "2.0",
8533  "id": 1,
8534  "method": "nvmf_set_config",
8535  "params": {
8536    "acceptor_poll_rate": 10000
8537  }
8538}
8539~~~
8540
8541Example response:
8542
8543~~~json
8544{
8545  "jsonrpc": "2.0",
8546  "id": 1,
8547  "result": true
8548}
8549~~~
8550
8551### nvmf_get_transports method {#rpc_nvmf_get_transports}
8552
8553#### Parameters
8554
8555The user may specify no parameters in order to list all transports, or a transport may be
8556specified by type.
8557
8558Name                        | Optional | Type        | Description
8559--------------------------- | -------- | ------------| -----------
8560tgt_name                    | Optional | string      | Parent NVMe-oF target name.
8561trtype                      | Optional | string      | Transport type.
8562
8563#### Example
8564
8565Example request:
8566
8567~~~json
8568{
8569  "jsonrpc": "2.0",
8570  "id": 1,
8571  "method": "nvmf_get_transports"
8572}
8573~~~
8574
8575Example response:
8576
8577~~~json
8578{
8579  "jsonrpc": "2.0",
8580  "id": 1,
8581  "result": [
8582    {
8583      "type": "RDMA".
8584      "max_queue_depth": 128,
8585      "max_io_qpairs_per_ctrlr": 64,
8586      "in_capsule_data_size": 4096,
8587      "max_io_size": 131072,
8588      "io_unit_size": 131072,
8589      "abort_timeout_sec": 1
8590    }
8591  ]
8592}
8593~~~
8594
8595### nvmf_get_stats method {#rpc_nvmf_get_stats}
8596
8597Retrieve current statistics of the NVMf subsystem.
8598
8599#### Parameters
8600
8601Name                        | Optional | Type        | Description
8602--------------------------- | -------- | ------------| -----------
8603tgt_name                    | Optional | string      | Parent NVMe-oF target name.
8604
8605#### Response
8606
8607The response is an object containing NVMf subsystem statistics.
8608In the response, `admin_qpairs` and `io_qpairs` are reflecting cumulative queue pair counts while
8609`current_admin_qpairs` and `current_io_qpairs` are showing the current number.
8610
8611#### Example
8612
8613Example request:
8614
8615~~~json
8616{
8617  "jsonrpc": "2.0",
8618  "method": "nvmf_get_stats",
8619  "id": 1
8620}
8621~~~
8622
8623Example response:
8624
8625~~~json
8626{
8627  "jsonrpc": "2.0",
8628  "id": 1,
8629  "result": {
8630    "tick_rate": 2400000000,
8631    "poll_groups": [
8632      {
8633        "name": "app_thread",
8634        "admin_qpairs": 1,
8635        "io_qpairs": 4,
8636        "current_admin_qpairs": 1,
8637        "current_io_qpairs": 2,
8638        "pending_bdev_io": 1721,
8639        "transports": [
8640          {
8641            "trtype": "RDMA",
8642            "pending_data_buffer": 12131888,
8643            "devices": [
8644              {
8645                "name": "mlx5_1",
8646                "polls": 72284105,
8647                "completions": 0,
8648                "requests": 0,
8649                "request_latency": 0,
8650                "pending_free_request": 0,
8651                "pending_rdma_read": 0,
8652                "pending_rdma_write": 0,
8653                "total_send_wrs": 0,
8654                "send_doorbell_updates": 0,
8655                "total_recv_wrs": 0,
8656                "recv_doorbell_updates": 1
8657              },
8658              {
8659                "name": "mlx5_0",
8660                "polls": 72284105,
8661                "completions": 15165875,
8662                "requests": 7582935,
8663                "request_latency": 1249323766184,
8664                "pending_free_request": 0,
8665                "pending_rdma_read": 337602,
8666                "pending_rdma_write": 0,
8667                "total_send_wrs": 15165875,
8668                "send_doorbell_updates": 1516587,
8669                "total_recv_wrs": 15165875,
8670                "recv_doorbell_updates": 1516587
8671              }
8672            ]
8673          }
8674        ]
8675      }
8676    ]
8677  }
8678}
8679~~~
8680
8681### nvmf_set_crdt {#rpc_nvmf_set_crdt}
8682
8683Set the 3 CRDT (Command Retry Delay Time) values. For details about
8684CRDT, please refer to the NVMe specification. Currently all the
8685SPDK nvmf subsystems share the same CRDT values. The default values
8686are 0. This rpc can only be invoked in STARTUP stage. All values are
8687in units of 100 milliseconds (same as the NVMe specification).
8688
8689#### Parameters
8690
8691Name                    | Optional | Type        | Description
8692----------------------- | -------- | ----------- | -----------
8693crdt1                   | Optional | number      | Command Retry Delay Time 1
8694crdt2                   | Optional | number      | Command Retry Delay Time 2
8695crdt3                   | Optional | number      | Command Retry Delay Time 3
8696
8697## Vfio-user Target
8698
8699### vfu_tgt_set_base_path {#rpc_vfu_tgt_set_base_path}
8700
8701Set base path of Unix Domain socket file.
8702
8703#### Parameters
8704
8705Name                    | Optional | Type        | Description
8706----------------------- | -------- | ----------- | -----------
8707path                    | Required | string      | Base path
8708
8709#### Example
8710
8711Example request:
8712
8713~~~json
8714{
8715  "params": {
8716    "path": "/var/run/vfu_tgt"
8717  },
8718  "jsonrpc": "2.0",
8719  "method": "vfu_tgt_set_base_path",
8720  "id": 1
8721}
8722~~~
8723
8724Example response:
8725
8726~~~json
8727{
8728  "jsonrpc": "2.0",
8729  "id": 1,
8730  "result": true
8731}
8732~~~
8733
8734### vfu_virtio_delete_endpoint {#rpc_vfu_virtio_delete_endpoint}
8735
8736Delete PCI device via endpoint name.
8737
8738#### Parameters
8739
8740Name                    | Optional | Type        | Description
8741----------------------- | -------- | ----------- | -----------
8742name                    | Required | string      | Endpoint name
8743
8744#### Example
8745
8746Example request:
8747
8748~~~json
8749{
8750  "params": {
8751    "name": "vfu.0"
8752  },
8753  "jsonrpc": "2.0",
8754  "method": "vfu_virtio_delete_endpoint",
8755  "id": 1
8756}
8757~~~
8758
8759Example response:
8760
8761~~~json
8762{
8763  "jsonrpc": "2.0",
8764  "id": 1,
8765  "result": true
8766}
8767~~~
8768
8769### vfu_virtio_create_blk_endpoint {#rpc_vfu_virtio_create_blk_endpoint}
8770
8771Create vfio-user virtio-blk PCI endpoint.
8772
8773#### Parameters
8774
8775Name                    | Optional | Type        | Description
8776----------------------- | -------- | ----------- | -----------
8777name                    | Required | string      | Endpoint name
8778bdev_name               | Required | string      | Block device name
8779cpumask                 | Optional | string      | CPU masks
8780num_queues              | Optional | number      | Number of queues
8781qsize                   | Optional | number      | Queue size
8782packed_ring             | Optional | boolean     | Enable packed ring
8783
8784#### Example
8785
8786Example request:
8787
8788~~~json
8789{
8790  "params": {
8791    "name": "vfu.0",
8792    "bdev_name": "Malloc0",
8793    "cpumask": "0x2",
8794    "num_queues": 4,
8795    "qsize": 256
8796  },
8797  "jsonrpc": "2.0",
8798  "method": "vfu_virtio_create_blk_endpoint",
8799  "id": 1
8800}
8801~~~
8802
8803Example response:
8804
8805~~~json
8806{
8807  "jsonrpc": "2.0",
8808  "id": 1,
8809  "result": true
8810}
8811~~~
8812
8813### vfu_virtio_scsi_add_target {#rpc_vfu_virtio_scsi_add_target}
8814
8815Add block device to specified SCSI target of vfio-user virtio-scsi PCI endpoint.
8816
8817#### Parameters
8818
8819Name                    | Optional | Type        | Description
8820----------------------- | -------- | ----------- | -----------
8821name                    | Required | string      | Endpoint name
8822scsi_target_num         | Required | number      | SCSI target number
8823bdev_name               | Required | string      | Block device name
8824
8825#### Example
8826
8827Example request:
8828
8829~~~json
8830{
8831  "params": {
8832    "name": "vfu.0",
8833    "scsi_target_num": 0,
8834    "bdev_name": "Malloc0"
8835  },
8836  "jsonrpc": "2.0",
8837  "method": "vfu_virtio_scsi_add_target",
8838  "id": 1
8839}
8840~~~
8841
8842Example response:
8843
8844~~~json
8845{
8846  "jsonrpc": "2.0",
8847  "id": 1,
8848  "result": true
8849}
8850~~~
8851
8852### vfu_virtio_scsi_remove_target {#rpc_vfu_virtio_scsi_remove_target}
8853
8854Remove a SCSI target of vfio-user virtio-scsi PCI endpoint.
8855
8856#### Parameters
8857
8858Name                    | Optional | Type        | Description
8859----------------------- | -------- | ----------- | -----------
8860name                    | Required | string      | Endpoint name
8861scsi_target_num         | Required | number      | SCSI target number
8862
8863#### Example
8864
8865Example request:
8866
8867~~~json
8868{
8869  "params": {
8870    "name": "vfu.0",
8871    "scsi_target_num": 0
8872  },
8873  "jsonrpc": "2.0",
8874  "method": "vfu_virtio_scsi_remove_target",
8875  "id": 1
8876}
8877~~~
8878
8879Example response:
8880
8881~~~json
8882{
8883  "jsonrpc": "2.0",
8884  "id": 1,
8885  "result": true
8886}
8887~~~
8888
8889### vfu_virtio_create_scsi_endpoint {#rpc_vfu_virtio_create_scsi_endpoint}
8890
8891Create vfio-user virtio-scsi PCI endpoint.
8892
8893#### Parameters
8894
8895Name                    | Optional | Type        | Description
8896----------------------- | -------- | ----------- | -----------
8897name                    | Required | string      | Endpoint name
8898cpumask                 | Optional | string      | CPU masks
8899num_io_queues           | Optional | number      | Number of IO queues
8900qsize                   | Optional | number      | Queue size
8901packed_ring             | Optional | boolean     | Enable packed ring
8902
8903#### Example
8904
8905Example request:
8906
8907~~~json
8908{
8909  "params": {
8910    "name": "vfu.0",
8911    "cpumask": "0x2",
8912    "num_io_queues": 4,
8913    "qsize": 256
8914  },
8915  "jsonrpc": "2.0",
8916  "method": "vfu_virtio_create_scsi_endpoint",
8917  "id": 1
8918}
8919~~~
8920
8921Example response:
8922
8923~~~json
8924{
8925  "jsonrpc": "2.0",
8926  "id": 1,
8927  "result": true
8928}
8929~~~
8930
8931## Vhost Target {#jsonrpc_components_vhost_tgt}
8932
8933The following common preconditions need to be met in all target types.
8934
8935Controller name will be used to create UNIX domain socket. This implies that name concatenated with vhost socket
8936directory path needs to be valid UNIX socket name.
8937
8938@ref cpu_mask parameter is used to choose CPU on which pollers will be launched when new initiator is connecting.
8939It must be a subset of application CPU mask. Default value is CPU mask of the application.
8940
8941### vhost_controller_set_coalescing {#rpc_vhost_controller_set_coalescing}
8942
8943Controls interrupt coalescing for specific target. Because `delay_base_us` is used to calculate delay in CPU ticks
8944there is no hardcoded limit for this parameter. Only limitation is that final delay in CPU ticks might not overflow
894532 bit unsigned integer (which is more than 1s @ 4GHz CPU). In real scenarios `delay_base_us` should be much lower
8946than 150us. To disable coalescing set `delay_base_us` to 0.
8947
8948#### Parameters
8949
8950Name                    | Optional | Type        | Description
8951----------------------- | -------- | ----------- | -----------
8952ctrlr                   | Required | string      | Controller name
8953delay_base_us           | Required | number      | Base (minimum) coalescing time in microseconds
8954iops_threshold          | Required | number      | Coalescing activation level greater than 0 in IO per second
8955
8956#### Example
8957
8958Example request:
8959
8960~~~json
8961{
8962  "params": {
8963    "iops_threshold": 100000,
8964    "ctrlr": "VhostScsi0",
8965    "delay_base_us": 80
8966  },
8967  "jsonrpc": "2.0",
8968  "method": "vhost_controller_set_coalescing",
8969  "id": 1
8970}
8971~~~
8972
8973Example response:
8974
8975~~~json
8976{
8977  "jsonrpc": "2.0",
8978  "id": 1,
8979  "result": true
8980}
8981~~~
8982
8983### vhost_create_scsi_controller {#rpc_vhost_create_scsi_controller}
8984
8985Construct vhost SCSI target.
8986
8987#### Parameters
8988
8989Name                    | Optional | Type        | Description
8990----------------------- | -------- | ----------- | -----------
8991ctrlr                   | Required | string      | Controller name
8992cpumask                 | Optional | string      | @ref cpu_mask for this controller
8993
8994#### Example
8995
8996Example request:
8997
8998~~~json
8999{
9000  "params": {
9001    "cpumask": "0x2",
9002    "ctrlr": "VhostScsi0"
9003  },
9004  "jsonrpc": "2.0",
9005  "method": "vhost_create_scsi_controller",
9006  "id": 1
9007}
9008~~~
9009
9010Example response:
9011
9012~~~json
9013{
9014  "jsonrpc": "2.0",
9015  "id": 1,
9016  "result": true
9017}
9018~~~
9019
9020### vhost_scsi_controller_add_target {#rpc_vhost_scsi_controller_add_target}
9021
9022In vhost target `ctrlr` create SCSI target with ID `scsi_target_num` and add `bdev_name` as LUN 0.
9023
9024#### Parameters
9025
9026Name                    | Optional | Type        | Description
9027----------------------- | -------- | ----------- | -----------
9028ctrlr                   | Required | string      | Controller name
9029scsi_target_num         | Required | number      | SCSI target ID between 0 and 7 or -1 to use first free ID.
9030bdev_name               | Required | string      | Name of bdev to expose as a LUN 0
9031
9032#### Response
9033
9034SCSI target ID.
9035
9036#### Example
9037
9038Example request:
9039
9040~~~json
9041{
9042  "params": {
9043    "scsi_target_num": 1,
9044    "bdev_name": "Malloc0",
9045    "ctrlr": "VhostScsi0"
9046  },
9047  "jsonrpc": "2.0",
9048  "method": "vhost_scsi_controller_add_target",
9049  "id": 1
9050}
9051~~~
9052
9053Example response:
9054
9055~~~json
9056response:
9057{
9058  "jsonrpc": "2.0",
9059  "id": 1,
9060  "result": 1
9061}
9062~~~
9063
9064### vhost_scsi_controller_remove_target {#rpc_vhost_scsi_controller_remove_target}
9065
9066Remove SCSI target ID `scsi_target_num` from vhost target `scsi_target_num`.
9067
9068This method will fail if initiator is connected, but doesn't support hot-remove (the `VIRTIO_SCSI_F_HOTPLUG` is not negotiated).
9069
9070#### Parameters
9071
9072Name                    | Optional | Type        | Description
9073----------------------- | -------- | ----------- | -----------
9074ctrlr                   | Required | string      | Controller name
9075scsi_target_num         | Required | number      | SCSI target ID between 0 and 7
9076
9077#### Example
9078
9079Example request:
9080
9081~~~json
9082request:
9083{
9084  "params": {
9085    "scsi_target_num": 1,
9086    "ctrlr": "VhostScsi0"
9087  },
9088  "jsonrpc": "2.0",
9089  "method": "vhost_scsi_controller_remove_target",
9090  "id": 1
9091}
9092~~~
9093
9094Example response:
9095
9096~~~json
9097{
9098  "jsonrpc": "2.0",
9099  "id": 1,
9100  "result": true
9101}
9102~~~
9103
9104### virtio_blk_create_transport {#rpc_virtio_blk_create_transport}
9105
9106Create virtio blk transport.
9107
9108#### Parameters
9109
9110Name                    | Optional | Type        | Description
9111----------------------- | -------- | ----------- | -----------
9112name                    | Required | string      | Transport name
9113
9114#### Example
9115
9116Example request:
9117
9118~~~json
9119{
9120  "params": {
9121    "name": "vhost_user_blk"
9122  },
9123  "jsonrpc": "2.0",
9124  "method": "virtio_blk_create_transport",
9125  "id": 1
9126}
9127~~~
9128
9129Example response:
9130
9131~~~json
9132{
9133  "jsonrpc": "2.0",
9134  "id": 1,
9135  "result": true
9136}
9137~~~
9138
9139### virtio_blk_get_transports {#rpc_virtio_blk_get_transports}
9140
9141#### Parameters
9142
9143The user may specify no parameters in order to list all transports,
9144or a transport name may be specified.
9145
9146Name                        | Optional | Type        | Description
9147--------------------------- | -------- | ------------| -----------
9148name                        | Optional | string      | Transport name.
9149
9150#### Example
9151
9152Example request:
9153
9154~~~json
9155{
9156  "jsonrpc": "2.0",
9157  "method": "virtio_blk_get_transports",
9158  "id": 1
9159}
9160~~~
9161
9162Example response:
9163
9164~~~json
9165{
9166  "jsonrpc": "2.0",
9167  "id": 1,
9168  "result": [
9169    {
9170      "name": "vhost_user_blk"
9171    }
9172  ]
9173}
9174~~~
9175
9176### vhost_create_blk_controller {#rpc_vhost_create_blk_controller}
9177
9178Create vhost block controller
9179
9180If `readonly` is `true` then vhost block target will be created as read only and fail any write requests.
9181The `VIRTIO_BLK_F_RO` feature flag will be offered to the initiator.
9182
9183#### Parameters
9184
9185Name                    | Optional | Type        | Description
9186----------------------- | -------- | ----------- | -----------
9187ctrlr                   | Required | string      | Controller name
9188bdev_name               | Required | string      | Name of bdev to expose block device
9189readonly                | Optional | boolean     | If true, this target will be read only (default: false)
9190cpumask                 | Optional | string      | @ref cpu_mask for this controller
9191transport               | Optional | string      | virtio blk transport name (default: vhost_user_blk)
9192
9193#### Example
9194
9195Example request:
9196
9197~~~json
9198{
9199  "params": {
9200    "dev_name": "Malloc0",
9201    "ctrlr": "VhostBlk0"
9202  },
9203  "jsonrpc": "2.0",
9204  "method": "vhost_create_blk_controller",
9205  "id": 1
9206}
9207~~~
9208
9209Example response:
9210
9211~~~json
9212{
9213  "jsonrpc": "2.0",
9214  "id": 1,
9215  "result": true
9216}
9217~~~
9218
9219### vhost_get_controllers {#rpc_vhost_get_controllers}
9220
9221Display information about all or specific vhost controller(s).
9222
9223#### Parameters
9224
9225The user may specify no parameters in order to list all controllers, or a controller may be
9226specified by name.
9227
9228Name                    | Optional | Type        | Description
9229----------------------- | -------- | ----------- | -----------
9230name                    | Optional | string      | Vhost controller name
9231
9232#### Response {#rpc_vhost_get_controllers_response}
9233
9234Response is an array of objects describing requested controller(s). Common fields are:
9235
9236Name                    | Type        | Description
9237----------------------- | ----------- | -----------
9238ctrlr                   | string      | Controller name
9239cpumask                 | string      | @ref cpu_mask of this controller
9240delay_base_us           | number      | Base (minimum) coalescing time in microseconds (0 if disabled)
9241iops_threshold          | number      | Coalescing activation level
9242backend_specific        | object      | Backend specific information
9243
9244### Vhost block {#rpc_vhost_get_controllers_blk}
9245
9246`backend_specific` contains one `block` object  of type:
9247
9248Name                    | Type        | Description
9249----------------------- | ----------- | -----------
9250bdev                    | string      | Backing bdev name or Null if bdev is hot-removed
9251readonly                | boolean     | True if controllers is readonly, false otherwise
9252
9253### Vhost SCSI {#rpc_vhost_get_controllers_scsi}
9254
9255`backend_specific` contains `scsi` array of following objects:
9256
9257Name                    | Type        | Description
9258----------------------- | ----------- | -----------
9259target_name             | string      | Name of this SCSI target
9260id                      | number      | Unique SPDK global SCSI target ID
9261scsi_dev_num            | number      | SCSI target ID initiator will see when scanning this controller
9262luns                    | array       | array of objects describing @ref rpc_vhost_get_controllers_scsi_luns
9263
9264### Vhost SCSI LUN {#rpc_vhost_get_controllers_scsi_luns}
9265
9266Object of type:
9267
9268Name                    | Type        | Description
9269----------------------- | ----------- | -----------
9270id                      | number      | SCSI LUN ID
9271bdev_name               | string      | Backing bdev name
9272
9273### Vhost NVMe {#rpc_vhost_get_controllers_nvme}
9274
9275`backend_specific` contains `namespaces` array of following objects:
9276
9277Name                    | Type        | Description
9278----------------------- | ----------- | -----------
9279nsid                    | number      | Namespace ID
9280bdev                    | string      | Backing bdev name
9281
9282#### Example
9283
9284Example request:
9285
9286~~~json
9287{
9288  "jsonrpc": "2.0",
9289  "method": "vhost_get_controllers",
9290  "id": 1
9291}
9292~~~
9293
9294Example response:
9295
9296~~~json
9297{
9298  "jsonrpc": "2.0",
9299  "id": 1,
9300  "result": [
9301    {
9302      "cpumask": "0x2",
9303      "backend_specific": {
9304        "block": {
9305          "readonly": false,
9306          "bdev": "Malloc0"
9307        }
9308      },
9309      "iops_threshold": 60000,
9310      "ctrlr": "VhostBlk0",
9311      "delay_base_us": 100
9312    },
9313    {
9314      "cpumask": "0x2",
9315      "backend_specific": {
9316        "scsi": [
9317          {
9318            "target_name": "Target 2",
9319            "luns": [
9320              {
9321                "id": 0,
9322                "bdev_name": "Malloc1"
9323              }
9324            ],
9325            "id": 0,
9326            "scsi_dev_num": 2
9327          },
9328          {
9329            "target_name": "Target 5",
9330            "luns": [
9331              {
9332                "id": 0,
9333                "bdev_name": "Malloc2"
9334              }
9335            ],
9336            "id": 1,
9337            "scsi_dev_num": 5
9338          }
9339        ]
9340      },
9341      "iops_threshold": 60000,
9342      "ctrlr": "VhostScsi0",
9343      "delay_base_us": 0
9344    },
9345    {
9346      "cpumask": "0x2",
9347      "backend_specific": {
9348        "namespaces": [
9349          {
9350            "bdev": "Malloc3",
9351            "nsid": 1
9352          },
9353          {
9354            "bdev": "Malloc4",
9355            "nsid": 2
9356          }
9357        ]
9358      },
9359      "iops_threshold": 60000,
9360      "ctrlr": "VhostNvme0",
9361      "delay_base_us": 0
9362    }
9363  ]
9364}
9365~~~
9366
9367### vhost_delete_controller {#rpc_vhost_delete_controller}
9368
9369Remove vhost target.
9370
9371This call will fail if there is an initiator connected or there is at least one SCSI target configured in case of
9372vhost SCSI target. In the later case please remove all SCSI targets first using @ref rpc_vhost_scsi_controller_remove_target.
9373
9374#### Parameters
9375
9376Name                    | Optional | Type        | Description
9377----------------------- | -------- | ----------- | -----------
9378ctrlr                   | Required | string      | Controller name
9379
9380#### Example
9381
9382Example request:
9383
9384~~~json
9385{
9386  "params": {
9387    "ctrlr": "VhostNvme0"
9388  },
9389  "jsonrpc": "2.0",
9390  "method": "vhost_delete_controller",
9391  "id": 1
9392}
9393~~~
9394
9395Example response:
9396
9397~~~json
9398{
9399  "jsonrpc": "2.0",
9400  "id": 1,
9401  "result": true
9402}
9403~~~
9404
9405## Logical Volume {#jsonrpc_components_lvol}
9406
9407Identification of logical volume store and logical volume is explained first.
9408
9409A logical volume store has a UUID and a name for its identification.
9410The UUID is generated on creation and it can be used as a unique identifier.
9411The name is specified on creation and can be renamed.
9412Either UUID or name is used to access logical volume store in RPCs.
9413
9414A logical volume has a UUID and a name for its identification.
9415The UUID of the logical volume is generated on creation and it can be unique identifier.
9416The alias of the logical volume takes the format _lvs_name/lvol_name_ where:
9417
9418* _lvs_name_ is the name of the logical volume store.
9419* _lvol_name_ is specified on creation and can be renamed.
9420
9421### bdev_lvol_create_lvstore {#rpc_bdev_lvol_create_lvstore}
9422
9423Construct a logical volume store.
9424
9425#### Parameters
9426
9427Name                          | Optional | Type        | Description
9428----------------------------- | -------- | ----------- | -----------
9429bdev_name                     | Required | string      | Bdev on which to construct logical volume store
9430lvs_name                      | Required | string      | Name of the logical volume store to create
9431cluster_sz                    | Optional | number      | Cluster size of the logical volume store in bytes (Default: 4MiB)
9432clear_method                  | Optional | string      | Change clear method for data region. Available: none, unmap (default), write_zeroes
9433num_md_pages_per_cluster_ratio| Optional | number      | Reserved metadata pages per cluster (Default: 100)
9434
9435The num_md_pages_per_cluster_ratio defines the amount of metadata to
9436allocate when the logical volume store is created. The default value
9437is '100', which translates to 1 4KiB per cluster. For the default 4MiB
9438cluster size, this equates to about 0.1% of the underlying block
9439device allocated for metadata. Logical volume stores can be grown, if
9440the size of the underlying block device grows in the future, but only
9441if enough metadata pages were allocated to support the growth. So
9442num_md_pages_per_cluster_ratio should be set to a higher value if
9443wanting to support future growth. For example,
9444num_md_pages_per_cluster_ratio = 200 would support future 2x growth of
9445the logical volume store, and would result in 0.2% of the underlying
9446block device allocated for metadata (with a default 4MiB cluster
9447size).
9448
9449#### Response
9450
9451UUID of the created logical volume store is returned.
9452
9453#### Example
9454
9455Example request:
9456
9457~~~json
9458{
9459  "jsonrpc": "2.0",
9460  "id": 1,
9461  "method": "bdev_lvol_create_lvstore",
9462  "params": {
9463    "lvs_name": "LVS0",
9464    "bdev_name": "Malloc0"
9465    "clear_method": "write_zeroes"
9466  }
9467}
9468~~~
9469
9470Example response:
9471
9472~~~json
9473{
9474  "jsonrpc": "2.0",
9475  "id": 1,
9476  "result": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9477}
9478~~~
9479
9480### bdev_lvol_delete_lvstore {#rpc_bdev_lvol_delete_lvstore}
9481
9482Destroy a logical volume store.
9483
9484#### Parameters
9485
9486Name                    | Optional | Type        | Description
9487----------------------- | -------- | ----------- | -----------
9488uuid                    | Optional | string      | UUID of the logical volume store to destroy
9489lvs_name                | Optional | string      | Name of the logical volume store to destroy
9490
9491Either uuid or lvs_name must be specified, but not both.
9492
9493#### Example
9494
9495Example request:
9496
9497~~~json
9498{
9499  "jsonrpc": "2.0",
9500  "method": "bdev_lvol_delete_lvstore",
9501  "id": 1
9502  "params": {
9503    "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9504  }
9505}
9506~~~
9507
9508Example response:
9509
9510~~~json
9511{
9512  "jsonrpc": "2.0",
9513  "id": 1,
9514  "result": true
9515}
9516~~~
9517
9518### bdev_lvol_get_lvstores {#rpc_bdev_lvol_get_lvstores}
9519
9520Get a list of logical volume stores.
9521
9522#### Parameters
9523
9524Name                    | Optional | Type        | Description
9525----------------------- | -------- | ----------- | -----------
9526uuid                    | Optional | string      | UUID of the logical volume store to retrieve information about
9527lvs_name                | Optional | string      | Name of the logical volume store to retrieve information about
9528
9529Either uuid or lvs_name may be specified, but not both.
9530If both uuid and lvs_name are omitted, information about all logical volume stores is returned.
9531
9532#### Example
9533
9534Example request:
9535
9536~~~json
9537{
9538  "jsonrpc": "2.0",
9539  "method": "bdev_lvol_get_lvstores",
9540  "id": 1,
9541  "params": {
9542    "lvs_name": "LVS0"
9543  }
9544}
9545~~~
9546
9547Example response:
9548
9549~~~json
9550{
9551  "jsonrpc": "2.0",
9552  "id": 1,
9553  "result": [
9554    {
9555      "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5",
9556      "base_bdev": "Malloc0",
9557      "free_clusters": 31,
9558      "cluster_size": 4194304,
9559      "total_data_clusters": 31,
9560      "block_size": 4096,
9561      "name": "LVS0"
9562    }
9563  ]
9564}
9565~~~
9566
9567### bdev_lvol_rename_lvstore {#rpc_bdev_lvol_rename_lvstore}
9568
9569Rename a logical volume store.
9570
9571#### Parameters
9572
9573Name                    | Optional | Type        | Description
9574----------------------- | -------- | ----------- | -----------
9575old_name                | Required | string      | Existing logical volume store name
9576new_name                | Required | string      | New logical volume store name
9577
9578#### Example
9579
9580Example request:
9581
9582~~~json
9583{
9584  "jsonrpc": "2.0",
9585  "method": "bdev_lvol_rename_lvstore",
9586  "id": 1,
9587  "params": {
9588    "old_name": "LVS0",
9589    "new_name": "LVS2"
9590  }
9591}
9592~~~
9593
9594Example response:
9595
9596~~~json
9597{
9598  "jsonrpc": "2.0",
9599  "id": 1,
9600  "result": true
9601}
9602~~~
9603
9604### bdev_lvol_grow_lvstore {#rpc_bdev_lvol_grow_lvstore}
9605
9606Grow the logical volume store to fill the underlying bdev
9607
9608#### Parameters
9609
9610Name                    | Optional | Type        | Description
9611----------------------- | -------- | ----------- | -----------
9612uuid                    | Optional | string      | UUID of the logical volume store to grow
9613lvs_name                | Optional | string      | Name of the logical volume store to grow
9614
9615Either uuid or lvs_name must be specified, but not both.
9616
9617#### Example
9618
9619Example request:
9620
9621~~~json
9622{
9623  "jsonrpc": "2.0",
9624  "method": "bdev_lvol_grow_lvstore",
9625  "id": 1
9626  "params": {
9627    "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9628  }
9629}
9630~~~
9631
9632Example response:
9633
9634~~~json
9635{
9636  "jsonrpc": "2.0",
9637  "id": 1,
9638  "result": true
9639}
9640~~~
9641
9642### bdev_lvol_create {#rpc_bdev_lvol_create}
9643
9644Create a logical volume on a logical volume store.
9645
9646#### Parameters
9647
9648Name                    | Optional | Type        | Description
9649----------------------- | -------- | ----------- | -----------
9650lvol_name               | Required | string      | Name of logical volume to create
9651size                    | Optional | number      | Desired size of logical volume in bytes (Deprecated. Please use size_in_mib instead.)
9652size_in_mib             | Optional | number      | Desired size of logical volume in MiB
9653thin_provision          | Optional | boolean     | True to enable thin provisioning
9654uuid                    | Optional | string      | UUID of logical volume store to create logical volume on
9655lvs_name                | Optional | string      | Name of logical volume store to create logical volume on
9656clear_method            | Optional | string      | Change default data clusters clear method. Available: none, unmap, write_zeroes
9657
9658Size will be rounded up to a multiple of cluster size. Either uuid or lvs_name must be specified, but not both.
9659lvol_name will be used in the alias of the created logical volume.
9660
9661#### Response
9662
9663UUID of the created logical volume is returned.
9664
9665#### Example
9666
9667Example request:
9668
9669~~~json
9670{
9671  "jsonrpc": "2.0",
9672  "method": "bdev_lvol_create",
9673  "id": 1,
9674  "params": {
9675    "lvol_name": "LVOL0",
9676    "size_in_mib": 1,
9677    "lvs_name": "LVS0",
9678    "clear_method": "unmap",
9679    "thin_provision": true
9680  }
9681}
9682~~~
9683
9684Example response:
9685
9686~~~json
9687{
9688  "jsonrpc": "2.0",
9689  "id": 1,
9690  "result": "1b38702c-7f0c-411e-a962-92c6a5a8a602"
9691}
9692~~~
9693
9694### bdev_lvol_snapshot {#rpc_bdev_lvol_snapshot}
9695
9696Capture a snapshot of the current state of a logical volume.
9697
9698#### Parameters
9699
9700Name                    | Optional | Type        | Description
9701----------------------- | -------- | ----------- | -----------
9702lvol_name               | Required | string      | UUID or alias of the logical volume to create a snapshot from
9703snapshot_name           | Required | string      | Name for the newly created snapshot
9704
9705#### Response
9706
9707UUID of the created logical volume snapshot is returned.
9708
9709#### Example
9710
9711Example request:
9712
9713~~~json
9714{
9715  "jsonrpc": "2.0",
9716  "method": "bdev_lvol_snapshot",
9717  "id": 1,
9718  "params": {
9719    "lvol_name": "1b38702c-7f0c-411e-a962-92c6a5a8a602",
9720    "snapshot_name": "SNAP1"
9721  }
9722}
9723~~~
9724
9725Example response:
9726
9727~~~json
9728{
9729  "jsonrpc": "2.0",
9730  "id": 1,
9731  "result": "cc8d7fdf-7865-4d1f-9fc6-35da8e368670"
9732}
9733~~~
9734
9735### bdev_lvol_clone {#rpc_bdev_lvol_clone}
9736
9737Create a logical volume based on a snapshot.
9738
9739#### Parameters
9740
9741Name                    | Optional | Type        | Description
9742----------------------- | -------- | ----------- | -----------
9743snapshot_name           | Required | string      | UUID or alias of the snapshot to clone
9744clone_name              | Required | string      | Name for the logical volume to create
9745
9746#### Response
9747
9748UUID of the created logical volume clone is returned.
9749
9750#### Example
9751
9752Example request:
9753
9754~~~json
9755{
9756  "jsonrpc": "2.0"
9757  "method": "bdev_lvol_clone",
9758  "id": 1,
9759  "params": {
9760    "snapshot_name": "cc8d7fdf-7865-4d1f-9fc6-35da8e368670",
9761    "clone_name": "CLONE1"
9762  }
9763}
9764~~~
9765
9766Example response:
9767
9768~~~json
9769{
9770  "jsonrpc": "2.0",
9771  "id": 1,
9772  "result": "8d87fccc-c278-49f0-9d4c-6237951aca09"
9773}
9774~~~
9775
9776### bdev_lvol_clone_bdev {#rpc_bdev_lvol_clone_bdev}
9777
9778Create a logical volume based on an external snapshot bdev. The external snapshot bdev
9779is a bdev that will not be written to by any consumer and must not be an lvol in the
9780lvstore as the clone.
9781
9782Regardless of whether the bdev is specified by name or UUID, the bdev UUID will be stored
9783in the logical volume's metadata for use while the lvolstore is loading. For this reason,
9784it is important that the bdev chosen has a static UUID.
9785
9786#### Parameters
9787
9788Name                    | Optional | Type        | Description
9789----------------------- | -------- | ----------- | -----------
9790bdev                    | Required | string      | Name or UUID for bdev that acts as the external snapshot
9791lvs_name                | Required | string      | logical volume store name
9792clone_name              | Required | string      | Name for the logical volume to create
9793
9794#### Response
9795
9796UUID of the created logical volume clone is returned.
9797
9798#### Example
9799
9800Example request:
9801
9802~~~json
9803{
9804  "jsonrpc": "2.0",
9805  "method": "bdev_lvol_clone_bdev",
9806  "id": 1,
9807  "params": {
9808    "bdev_uuid": "e4b40d8b-f623-416d-8234-baf5a4c83cbd",
9809    "lvs_name": "lvs1",
9810    "clone_name": "clone2"
9811  }
9812}
9813~~~
9814
9815Example response:
9816
9817~~~json
9818{
9819  "jsonrpc": "2.0",
9820  "id": 1,
9821  "result": "336f662b-08e5-4006-8e06-e2023f7f9886"
9822}
9823~~~
9824
9825### bdev_lvol_rename {#rpc_bdev_lvol_rename}
9826
9827Rename a logical volume. New name will rename only the alias of the logical volume.
9828
9829#### Parameters
9830
9831Name                    | Optional | Type        | Description
9832----------------------- | -------- | ----------- | -----------
9833old_name                | Required | string      | UUID or alias of the existing logical volume
9834new_name                | Required | string      | New logical volume name
9835
9836#### Example
9837
9838Example request:
9839
9840~~~json
9841{
9842  "jsonrpc": "2.0",
9843  "method": "bdev_lvol_rename",
9844  "id": 1,
9845  "params": {
9846    "old_name": "067df606-6dbc-4143-a499-0d05855cb3b8",
9847    "new_name": "LVOL2"
9848  }
9849}
9850~~~
9851
9852Example response:
9853
9854~~~json
9855{
9856  "jsonrpc": "2.0",
9857  "id": 1,
9858  "result": true
9859}
9860~~~
9861
9862### bdev_lvol_resize {#rpc_bdev_lvol_resize}
9863
9864Resize a logical volume.
9865
9866#### Parameters
9867
9868Name                    | Optional | Type        | Description
9869----------------------- | -------- | ----------- | -----------
9870name                    | Required | string      | UUID or alias of the logical volume to resize
9871size                    | Optional | number      | Desired size of the logical volume in bytes (Deprecated. Please use size_in_mib instead.)
9872size_in_mib             | Optional | number      | Desired size of the logical volume in MiB
9873
9874#### Example
9875
9876Example request:
9877
9878~~~json
9879{
9880  "jsonrpc": "2.0",
9881  "method": "bdev_lvol_resize",
9882  "id": 1,
9883  "params": {
9884    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a",
9885    "size_in_mib": 2
9886  }
9887}
9888~~~
9889
9890Example response:
9891
9892~~~json
9893{
9894  "jsonrpc": "2.0",
9895  "id": 1,
9896  "result": true
9897}
9898~~~
9899
9900### bdev_lvol_set_read_only{#rpc_bdev_lvol_set_read_only}
9901
9902Mark logical volume as read only.
9903
9904#### Parameters
9905
9906Name                    | Optional | Type        | Description
9907----------------------- | -------- | ----------- | -----------
9908name                    | Required | string      | UUID or alias of the logical volume to set as read only
9909
9910#### Example
9911
9912Example request:
9913
9914~~~json
9915{
9916  "jsonrpc": "2.0",
9917  "method": "bdev_lvol_set_read_only",
9918  "id": 1,
9919  "params": {
9920    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a",
9921  }
9922}
9923~~~
9924
9925Example response:
9926
9927~~~json
9928{
9929  "jsonrpc": "2.0",
9930  "id": 1,
9931  "result": true
9932}
9933~~~
9934
9935### bdev_lvol_delete {#rpc_bdev_lvol_delete}
9936
9937Destroy a logical volume.
9938
9939#### Parameters
9940
9941Name                    | Optional | Type        | Description
9942----------------------- | -------- | ----------- | -----------
9943name                    | Required | string      | UUID or alias of the logical volume to destroy
9944
9945#### Example
9946
9947Example request:
9948
9949~~~json
9950{
9951  "jsonrpc": "2.0",
9952  "method": "bdev_lvol_delete",
9953  "id": 1,
9954  "params": {
9955    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a"
9956  }
9957}
9958~~~
9959
9960Example response:
9961
9962~~~json
9963{
9964  "jsonrpc": "2.0",
9965  "id": 1,
9966  "result": true
9967}
9968~~~
9969
9970### bdev_lvol_inflate {#rpc_bdev_lvol_inflate}
9971
9972Inflate a logical volume. All unallocated clusters are allocated and copied from the parent or zero filled
9973if not allocated in the parent. Then all dependencies on the parent are removed.
9974
9975### Parameters
9976
9977Name                    | Optional | Type        | Description
9978----------------------- | -------- | ----------- | -----------
9979name                    | Required | string      | UUID or alias of the logical volume to inflate
9980
9981#### Example
9982
9983Example request:
9984
9985~~~json
9986{
9987  "jsonrpc": "2.0",
9988  "method": "bdev_lvol_inflate",
9989  "id": 1,
9990  "params": {
9991    "name": "8d87fccc-c278-49f0-9d4c-6237951aca09"
9992  }
9993}
9994~~~
9995
9996Example response:
9997
9998~~~json
9999{
10000  "jsonrpc": "2.0",
10001  "id": 1,
10002  "result": true
10003}
10004~~~
10005
10006### bdev_lvol_decouple_parent {#rpc_bdev_lvol_decouple_parent}
10007
10008Decouple the parent of a logical volume. For unallocated clusters which is allocated in the parent, they are
10009allocated and copied from the parent, but for unallocated clusters which is thin provisioned in the parent,
10010they are kept thin provisioned. Then all dependencies on the parent are removed.
10011
10012#### Parameters
10013
10014Name                    | Optional | Type        | Description
10015----------------------- | -------- | ----------- | -----------
10016name                    | Required | string      | UUID or alias of the logical volume to decouple the parent of it
10017
10018#### Example
10019
10020Example request:
10021
10022~~~json
10023{
10024  "jsonrpc": "2.0",
10025  "method": "bdev_lvol_decouple_parent",
10026  "id": 1.
10027  "params": {
10028    "name": "8d87fccc-c278-49f0-9d4c-6237951aca09"
10029  }
10030}
10031~~~
10032
10033Example response:
10034
10035~~~json
10036{
10037  "jsonrpc": "2.0",
10038  "id": 1,
10039  "result": true
10040}
10041~~~
10042
10043### bdev_lvol_get_lvols {#rpc_bdev_lvol_get_lvols}
10044
10045Get a list of logical volumes. This list can be limited by lvol store and will display volumes even if
10046they are degraded. Degraded lvols do not have an associated bdev, thus this RPC call may return lvols
10047not returned by `bdev_get_bdevs`.
10048
10049#### Parameters
10050
10051Name                    | Optional | Type        | Description
10052----------------------- | -------- | ----------- | -----------
10053lvs_uuid                | Optional | string      | Only show volumes in the logical volume store with this UUID
10054lvs_name                | Optional | string      | Only show volumes in the logical volume store with this name
10055
10056Either lvs_uuid or lvs_name may be specified, but not both.
10057If both lvs_uuid and lvs_name are omitted, information about lvols in all logical volume stores is returned.
10058
10059#### Example
10060
10061Example request:
10062
10063~~~json
10064{
10065  "jsonrpc": "2.0",
10066  "method": "bdev_lvol_get_lvols",
10067  "id": 1,
10068  "params": {
10069    "lvs_name": "lvs_test"
10070  }
10071}
10072~~~
10073
10074Example response:
10075
10076~~~json
10077[
10078  {
10079    "alias": "lvs_test/lvol1",
10080    "uuid": "b335c368-851d-4099-81e0-018cc494fdf6",
10081    "name": "lvol1",
10082    "is_thin_provisioned": false,
10083    "is_snapshot": false,
10084    "is_clone": false,
10085    "is_esnap_clone": false,
10086    "is_degraded": false,
10087    "lvs": {
10088      "name": "lvs_test",
10089      "uuid": "a1c8d950-5715-4558-936d-ab9e6eca0794"
10090    }
10091  }
10092]
10093~~~
10094
10095## RAID
10096
10097### bdev_raid_get_bdevs {#rpc_bdev_raid_get_bdevs}
10098
10099This is used to list all the raid bdev details based on the input category requested. Category should be one
10100of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether they are online or
10101configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring' is
10102the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is
10103not registered with bdev as of now and it has encountered any error or user has requested to offline
10104the raid bdev.
10105
10106#### Parameters
10107
10108Name                    | Optional | Type        | Description
10109----------------------- | -------- | ----------- | -----------
10110category                | Required | string      | all or online or configuring or offline
10111
10112#### Example
10113
10114Example request:
10115
10116~~~json
10117{
10118  "jsonrpc": "2.0",
10119  "method": "bdev_raid_get_bdevs",
10120  "id": 1,
10121  "params": {
10122    "category": "all"
10123  }
10124}
10125~~~
10126
10127Example response:
10128
10129~~~json
10130{
10131  "jsonrpc": "2.0",
10132  "id": 1,
10133  "result": [
10134    {
10135      "name": "RaidBdev0",
10136      "strip_size_kb": 128,
10137      "state": "online",
10138      "raid_level": "raid0",
10139      "num_base_bdevs": 2,
10140      "num_base_bdevs_discovered": 2,
10141      "base_bdevs_list": [
10142        "malloc0",
10143        "malloc1"
10144      ]
10145    },
10146    {
10147      "name": "RaidBdev1",
10148      "strip_size_kb": 128,
10149      "state": "configuring",
10150      "raid_level": "raid0",
10151      "num_base_bdevs": 2,
10152      "num_base_bdevs_discovered": 1,
10153      "base_bdevs_list": [
10154        "malloc2",
10155        null
10156      ]
10157    }
10158  ]
10159}
10160~~~
10161
10162### bdev_raid_create {#rpc_bdev_raid_create}
10163
10164Constructs new RAID bdev.
10165
10166#### Parameters
10167
10168Name                    | Optional | Type        | Description
10169----------------------- | -------- | ----------- | -----------
10170name                    | Required | string      | RAID bdev name
10171strip_size_kb           | Required | number      | Strip size in KB
10172raid_level              | Required | string      | RAID level
10173base_bdevs              | Required | string      | Base bdevs name, whitespace separated list in quotes
10174
10175#### Example
10176
10177Example request:
10178
10179~~~json
10180{
10181  "jsonrpc": "2.0",
10182  "method": "bdev_raid_create",
10183  "id": 1,
10184  "params": {
10185    "name": "Raid0",
10186    "raid_level": "0",
10187    "base_bdevs": [
10188      "Malloc0",
10189      "Malloc1",
10190      "Malloc2",
10191      "Malloc3"
10192    ],
10193    "strip_size_kb": 4
10194  }
10195}
10196~~~
10197
10198Example response:
10199
10200~~~json
10201{
10202  "jsonrpc": "2.0",
10203  "id": 1,
10204  "result": true
10205}
10206~~~
10207
10208### bdev_raid_delete {#rpc_bdev_raid_delete}
10209
10210Removes RAID bdev.
10211
10212#### Parameters
10213
10214Name                    | Optional | Type        | Description
10215----------------------- | -------- | ----------- | -----------
10216name                    | Required | string      | RAID bdev name
10217
10218#### Example
10219
10220Example request:
10221
10222~~~json
10223{
10224  "jsonrpc": "2.0",
10225  "method": "bdev_raid_delete",
10226  "id": 1,
10227  "params": {
10228    "name": "Raid0"
10229  }
10230}
10231~~~
10232
10233Example response:
10234
10235~~~json
10236{
10237  "jsonrpc": "2.0",
10238  "id": 1,
10239  "result": true
10240}
10241~~~
10242
10243### bdev_raid_remove_base_bdev {#rpc_bdev_raid_remove_base_bdev}
10244
10245Remove base bdev from existing raid bdev.
10246
10247#### Parameters
10248
10249Name                    | Optional | Type        | Description
10250----------------------- | -------- | ----------- | -----------
10251name                    | Required | string      | Base bdev name in RAID
10252
10253#### Example
10254
10255Example request:
10256
10257~~~json
10258{
10259  "jsonrpc": "2.0",
10260  "method": "bdev_raid_remove_base_bdev",
10261  "id": 1,
10262  "params": {
10263    "name": "Raid0"
10264  }
10265}
10266~~~
10267
10268Example response:
10269
10270~~~json
10271{
10272  "jsonrpc": "2.0",
10273  "id": 1,
10274  "result": true
10275}
10276~~~
10277
10278## SPLIT
10279
10280### bdev_split_create {#rpc_bdev_split_create}
10281
10282This is used to split an underlying block device and create several smaller equal-sized vbdevs.
10283
10284#### Parameters
10285
10286Name                    | Optional | Type        | Description
10287----------------------- | -------- | ----------- | -----------
10288base_bdev               | Required | string      | base bdev name
10289split_count             | Required | number      | number of splits
10290split_size_mb           | Optional | number      | size in MB to restrict the size
10291
10292#### Example
10293
10294Example request:
10295
10296~~~json
10297{
10298  "jsonrpc": "2.0",
10299  "method": "bdev_split_create",
10300  "id": 1,
10301  "params": {
10302    "base_bdev": "Malloc0",
10303    "split_count": 4
10304  }
10305}
10306~~~
10307
10308Example response:
10309
10310~~~json
10311{
10312  "jsonrpc": "2.0",
10313  "id": 1,
10314  "result": [
10315    "Malloc0p0",
10316    "Malloc0p1",
10317    "Malloc0p2",
10318    "Malloc0p3"
10319  ]
10320}
10321~~~
10322
10323### bdev_split_delete {#rpc_bdev_split_delete}
10324
10325This is used to remove the split vbdevs.
10326
10327#### Parameters
10328
10329Name                    | Optional | Type        | Description
10330----------------------- | -------- | ----------- | -----------
10331base_bdev               | Required | string      | base bdev name
10332
10333#### Example
10334
10335Example request:
10336
10337~~~json
10338{
10339  "jsonrpc": "2.0",
10340  "method": "bdev_split_delete",
10341  "id": 1,
10342  "params": {
10343    "base_bdev": "Malloc0"
10344  }
10345}
10346~~~
10347
10348Example response:
10349
10350~~~json
10351{
10352  "jsonrpc": "2.0",
10353  "id": 1,
10354  "result": true
10355}
10356~~~
10357
10358## Uring
10359
10360### bdev_uring_create {#rpc_bdev_uring_create}
10361
10362Create a bdev with io_uring backend.
10363
10364#### Parameters
10365
10366Name                    | Optional | Type        | Description
10367----------------------- | -------- | ----------- | -----------
10368filename                | Required | string      | path to device or file (ex: /dev/nvme0n1)
10369name                    | Required | string      | name of bdev
10370block_size              | Optional | number      | block size of device (If omitted, get the block size from the file)
10371
10372#### Example
10373
10374Example request:
10375
10376~~~json
10377{
10378  "jsonrpc": "2.0",
10379  "method": "bdev_uring_create",
10380  "id": 1,
10381  "params": {
10382    "name": "bdev_u0",
10383    "filename": "/dev/nvme0n1",
10384    "block_size": 512
10385  }
10386}
10387~~~
10388
10389Example response:
10390
10391~~~json
10392{
10393  "jsonrpc": "2.0",
10394  "id": 1,
10395  "result": "bdev_u0"
10396}
10397~~~
10398
10399### bdev_uring_delete {#rpc_bdev_uring_delete}
10400
10401Remove a uring bdev.
10402
10403#### Parameters
10404
10405Name                    | Optional | Type        | Description
10406----------------------- | -------- | ----------- | -----------
10407name                    | Required | string      | name of uring bdev to delete
10408
10409#### Example
10410
10411Example request:
10412
10413~~~json
10414{
10415  "jsonrpc": "2.0",
10416  "method": "bdev_uring_delete",
10417  "id": 1,
10418  "params": {
10419    "name": "bdev_u0"
10420  }
10421}
10422~~~
10423
10424Example response:
10425
10426~~~json
10427{
10428  "jsonrpc": "2.0",
10429  "id": 1,
10430  "result": true
10431}
10432~~~
10433
10434## OPAL
10435
10436### bdev_nvme_opal_init {#rpc_bdev_nvme_opal_init}
10437
10438This is used to initialize OPAL of a given NVMe ctrlr, including taking ownership and activating.
10439
10440#### Parameters
10441
10442Name                    | Optional | Type        | Description
10443----------------------- | -------- | ----------- | -----------
10444nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
10445password                | Required | string      | admin password of OPAL
10446
10447#### Example
10448
10449Example request:
10450
10451~~~json
10452{
10453  "jsonrpc": "2.0",
10454  "method": "bdev_nvme_opal_init",
10455  "id": 1,
10456  "params": {
10457    "nvme_ctrlr_name": "nvme0",
10458    "password": "*****"
10459  }
10460}
10461~~~
10462
10463Example response:
10464
10465~~~json
10466{
10467  "jsonrpc": "2.0",
10468  "id": 1,
10469  "result": true
10470}
10471~~~
10472
10473### bdev_nvme_opal_revert {#rpc_bdev_nvme_opal_revert}
10474
10475This is used to revert OPAL to its factory settings. Erase all user configuration and data.
10476
10477#### Parameters
10478
10479Name                    | Optional | Type        | Description
10480----------------------- | -------- | ----------- | -----------
10481nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
10482password                | Required | string      | admin password of OPAL
10483
10484#### Example
10485
10486Example request:
10487
10488~~~json
10489{
10490  "jsonrpc": "2.0",
10491  "method": "bdev_nvme_opal_revert",
10492  "id": 1,
10493  "params": {
10494    "nvme_ctrlr_name": "nvme0",
10495    "password": "*****"
10496  }
10497}
10498~~~
10499
10500Example response:
10501
10502~~~json
10503{
10504  "jsonrpc": "2.0",
10505  "id": 1,
10506  "result": true
10507}
10508~~~
10509
10510### bdev_opal_create {#rpc_bdev_opal_create}
10511
10512This is used to create an OPAL virtual bdev.
10513
10514#### Parameters
10515
10516Name                    | Optional | Type        | Description
10517----------------------- | -------- | ----------- | -----------
10518nvme_ctrlr_name         | Required | string      | name of nvme ctrlr that supports OPAL
10519nsid                    | Required | number      | namespace ID
10520locking_range_id        | Required | number      | OPAL locking range ID
10521range_start             | Required | number      | locking range start LBA
10522range_length            | Required | number      | locking range length
10523password                | Required | string      | admin password of OPAL
10524
10525#### Response
10526
10527The response is the name of created OPAL virtual bdev.
10528
10529#### Example
10530
10531Example request:
10532
10533~~~json
10534{
10535  "jsonrpc": "2.0",
10536  "method": "bdev_opal_create",
10537  "id": 1,
10538  "params": {
10539    "nvme_ctrlr_name": "nvme0",
10540    "nsid": 1,
10541    "locking_range_id": 1,
10542    "range_start": 0,
10543    "range_length": 4096,
10544    "password": "*****"
10545  }
10546}
10547~~~
10548
10549Example response:
10550
10551~~~json
10552{
10553  "jsonrpc": "2.0",
10554  "id": 1,
10555  "result": "nvme0n1r1"
10556}
10557~~~
10558
10559### bdev_opal_get_info {#rpc_bdev_opal_get_info}
10560
10561This is used to get information of a given OPAL bdev.
10562
10563#### Parameters
10564
10565Name                    | Optional | Type        | Description
10566----------------------- | -------- | ----------- | -----------
10567bdev_name               | Required | string      | name of OPAL vbdev
10568password                | Required | string      | admin password
10569
10570#### Response
10571
10572The response is the locking info of OPAL virtual bdev.
10573
10574#### Example
10575
10576Example request:
10577
10578~~~json
10579{
10580  "jsonrpc": "2.0",
10581  "method": "bdev_opal_get_info",
10582  "id": 1,
10583  "params": {
10584    "bdev_name": "nvme0n1r1",
10585    "password": "*****"
10586  }
10587}
10588~~~
10589
10590Example response:
10591
10592~~~json
10593{
10594  "jsonrpc": "2.0",
10595  "id": 1,
10596  "result": {
10597      "name": "nvme0n1r1",
10598      "range_start": 0,
10599      "range_length": 4096,
10600      "read_lock_enabled": true,
10601      "write_lock_enabled": true,
10602      "read_locked": false,
10603      "write_locked": false
10604    }
10605}
10606~~~
10607
10608### bdev_opal_delete {#rpc_bdev_opal_delete}
10609
10610This is used to delete OPAL vbdev.
10611
10612#### Parameters
10613
10614Name                    | Optional | Type        | Description
10615----------------------- | -------- | ----------- | -----------
10616bdev_name               | Required | string      | name of OPAL vbdev
10617password                | Required | string      | admin password
10618
10619#### Example
10620
10621Example request:
10622
10623~~~json
10624{
10625  "jsonrpc": "2.0",
10626  "method": "bdev_opal_delete",
10627  "id": 1,
10628  "params": {
10629    "bdev_name": "nvme0n1r1",
10630    "password": "*****"
10631  }
10632}
10633~~~
10634
10635Example response:
10636
10637~~~json
10638{
10639  "jsonrpc": "2.0",
10640  "id": 1,
10641  "result": true
10642}
10643~~~
10644
10645### bdev_opal_new_user {#rpc_bdev_opal_new_user}
10646
10647This enables a new user to the specified opal bdev so that the user can lock/unlock the bdev.
10648Recalling this for the same opal bdev, only the newest user will have the privilege.
10649
10650#### Parameters
10651
10652Name                    | Optional | Type        | Description
10653----------------------- | -------- | ----------- | -----------
10654bdev_name               | Required | string      | name of OPAL vbdev
10655admin_password          | Required | string      | admin password
10656user_id                 | Required | number      | user ID
10657user_password           | Required | string      | user password
10658
10659#### Example
10660
10661Example request:
10662
10663~~~json
10664{
10665  "jsonrpc": "2.0",
10666  "method": "bdev_opal_new_user",
10667  "id": 1,
10668  "params": {
10669    "bdev_name": "nvme0n1r1",
10670    "admin_password": "*****",
10671    "user_id": "1",
10672    "user_password": "********"
10673  }
10674}
10675~~~
10676
10677Example response:
10678
10679~~~json
10680{
10681  "jsonrpc": "2.0",
10682  "id": 1,
10683  "result": true
10684}
10685~~~
10686
10687### bdev_opal_set_lock_state {#rpc_bdev_opal_set_lock_state}
10688
10689This is used to lock/unlock specific opal bdev providing user ID and password.
10690
10691#### Parameters
10692
10693Name                    | Optional | Type        | Description
10694----------------------- | -------- | ----------- | -----------
10695bdev_name               | Required | string      | name of OPAL vbdev
10696user_id                 | Required | number      | user ID
10697password                | Required | string      | user password
10698lock_state              | Required | string      | lock state
10699
10700#### Example
10701
10702Example request:
10703
10704~~~json
10705{
10706  "jsonrpc": "2.0",
10707  "method": "bdev_opal_set_lock_state",
10708  "id": 1,
10709  "params": {
10710    "bdev_name": "nvme0n1r1",
10711    "user_id": "1",
10712    "user_password": "********",
10713    "lock_state": "rwlock"
10714  }
10715}
10716~~~
10717
10718Example response:
10719
10720~~~json
10721{
10722  "jsonrpc": "2.0",
10723  "id": 1,
10724  "result": true
10725}
10726~~~
10727
10728## Notifications
10729
10730### notify_get_types {#rpc_notify_get_types}
10731
10732Return list of all supported notification types.
10733
10734#### Parameters
10735
10736None
10737
10738#### Response
10739
10740The response is an array of strings - supported RPC notification types.
10741
10742#### Example
10743
10744Example request:
10745
10746~~~json
10747{
10748  "jsonrpc": "2.0",
10749  "method": "notify_get_types",
10750  "id": 1
10751}
10752~~~
10753
10754Example response:
10755
10756~~~json
10757{
10758  "id": 1,
10759  "result": [
10760    "bdev_register",
10761    "bdev_unregister"
10762  ],
10763  "jsonrpc": "2.0"
10764}
10765~~~
10766
10767### notify_get_notifications {#notify_get_notifications}
10768
10769Request notifications. Returns array of notifications that happened since the specified id (or first that is available).
10770
10771Notice: Notifications are kept in circular buffer with limited size. Older notifications might be inaccessible
10772due to being overwritten by new ones.
10773
10774#### Parameters
10775
10776Name                    | Optional | Type        | Description
10777----------------------- | -------- | ----------- | -----------
10778id                      | Optional | number      | First Event ID to fetch (default: first available).
10779max                     | Optional | number      | Maximum number of event to return (default: no limit).
10780
10781#### Response
10782
10783Response is an array of event objects.
10784
10785Name                    | Optional | Type        | Description
10786----------------------- | -------- | ----------- | -----------
10787id                      | Optional | number      | Event ID.
10788type                    | Optional | number      | Type of the event.
10789ctx                     | Optional | string      | Event context.
10790
10791#### Example
10792
10793Example request:
10794
10795~~~json
10796{
10797  "id": 1,
10798  "jsonrpc": "2.0",
10799  "method": "notify_get_notifications",
10800  "params": {
10801    "id": 1,
10802    "max": 10
10803  }
10804}
10805
10806~~~
10807
10808Example response:
10809
10810~~~json
10811{
10812  "jsonrpc": "2.0",
10813  "id": 1,
10814  "result": [
10815    {
10816      "ctx": "Malloc0",
10817      "type": "bdev_register",
10818      "id": 1
10819    },
10820    {
10821      "ctx": "Malloc2",
10822      "type": "bdev_register",
10823      "id": 2
10824    }
10825  ]
10826}
10827~~~
10828
10829## Linux Userspace Block Device (UBLK) {#jsonrpc_components_ublk}
10830
10831SPDK supports exporting bdevs though Linux ublk. The motivation behind it is to back a Linux kernel block device
10832with an SPDK user space bdev.
10833
10834To export a device over ublk, first make sure the Linux kernel ublk driver is loaded by running 'modprobe ublk_drv'.
10835
10836### ublk_create_target {#rpc_ublk_create_target}
10837
10838Start to create ublk threads and initialize ublk target. It will return an error if user calls this RPC twice without
10839ublk_destroy_target in between. It will use current cpumask in SPDK when user does not specify cpumask option.
10840
10841#### Parameters
10842
10843Name                    | Optional | Type        | Description
10844----------------------- | -------- | ----------- | -----------
10845cpumask                 | Optional | string      | Cpumask for ublk target
10846
10847#### Response
10848
10849True if ublk target initialization is successful; False if failed.
10850
10851#### Example
10852
10853Example request:
10854
10855~~~json
10856{
10857  "params": {
10858    "cpumask": "0x2"
10859  },
10860  "jsonrpc": "2.0",
10861  "method": "ublk_create_target",
10862  "id": 1
10863}
10864~~~
10865
10866Example response:
10867
10868~~~json
10869{
10870  "jsonrpc": "2.0",
10871  "id": 1,
10872  "result": true
10873}
10874~~~
10875
10876### ublk_destroy_target {#rpc_ublk_destroy_target}
10877
10878Release all UBLK devices and destroy ublk target.
10879
10880#### Response
10881
10882True if ublk target destruction is successful; False if failed.
10883
10884#### Example
10885
10886Example request:
10887
10888~~~json
10889{
10890  "jsonrpc": "2.0",
10891  "method": "ublk_destroy_target",
10892  "id": 1
10893}
10894~~~
10895
10896Example response:
10897
10898~~~json
10899{
10900  "jsonrpc": "2.0",
10901  "id": 1,
10902  "result": true
10903}
10904~~~
10905
10906### ublk_start_disk {#rpc_ublk_start_disk}
10907
10908Start to export one SPDK bdev as a UBLK device
10909
10910#### Parameters
10911
10912Name                    | Optional | Type        | Description
10913----------------------- | -------- | ----------- | -----------
10914bdev_name               | Required | string      | Bdev name to export
10915ublk_id                 | Required | int         | Device id
10916queue_depth             | Optional | int         | Device queue depth
10917num_queues              | Optional | int         | Total number of device queues
10918
10919#### Response
10920
10921UBLK device ID
10922
10923#### Example
10924
10925Example request:
10926
10927~~~json
10928{
10929 "params": {
10930    "ublk_id": "1",
10931    "bdev_name": "Malloc1"
10932  },
10933  "jsonrpc": "2.0",
10934  "method": "ublk_start_disk",
10935  "id": 1
10936}
10937~~~
10938
10939Example response:
10940
10941~~~json
10942{
10943  "jsonrpc": "2.0",
10944  "id": 1,
10945  "result": 1
10946}
10947~~~
10948
10949### ublk_stop_disk {#rpc_ublk_stop_disk}
10950
10951Delete a UBLK device
10952
10953#### Parameters
10954
10955Name                    | Optional | Type        | Description
10956----------------------- | -------- | ----------- | -----------
10957ublk_id                 | Required | int         | Device id to delete
10958
10959#### Response
10960
10961True if UBLK device is deleted successfully; False if failed.
10962
10963#### Example
10964
10965Example request:
10966
10967~~~json
10968{
10969 "params": {
10970    "ublk_id": "1",
10971  },
10972  "jsonrpc": "2.0",
10973  "method": "ublk_stop_disk",
10974  "id": 1
10975}
10976~~~
10977
10978Example response:
10979
10980~~~json
10981{
10982  "jsonrpc": "2.0",
10983  "id": 1,
10984  "result": true
10985}
10986~~~
10987
10988### ublk_get_disks {#rpc_ublk_get_disks}
10989
10990Display full or specified ublk device list
10991
10992#### Parameters
10993
10994Name                    | Optional | Type        | Description
10995----------------------- | -------- | ----------- | -----------
10996ublk_id                 | Optional | int         | ublk device id to display
10997
10998#### Response
10999
11000Display ublk device list
11001
11002#### Example
11003
11004Example request:
11005
11006~~~json
11007{
11008  "jsonrpc": "2.0",
11009  "method": "ublk_get_disks",
11010  "id": 1
11011}
11012~~~
11013
11014Example response:
11015
11016~~~json
11017{
11018  "jsonrpc": "2.0",
11019  "id": 1,
11020  "result":  [
11021    {
11022      "ublk_device": "/dev/ublkb1",
11023      "id": 1,
11024      "queue_depth": 512,
11025      "num_queues": 1,
11026      "bdev_name": "Malloc1"
11027    }
11028  ]
11029}
11030~~~
11031
11032## Linux Network Block Device (NBD) {#jsonrpc_components_nbd}
11033
11034SPDK supports exporting bdevs through Linux nbd. These devices then appear as standard Linux kernel block devices
11035and can be accessed using standard utilities like fdisk.
11036
11037In order to export a device over nbd, first make sure the Linux kernel nbd driver is loaded by running 'modprobe nbd'.
11038
11039### nbd_start_disk {#rpc_nbd_start_disk}
11040
11041Start to export one SPDK bdev as NBD disk
11042
11043#### Parameters
11044
11045Name                    | Optional | Type        | Description
11046----------------------- | -------- | ----------- | -----------
11047bdev_name               | Required | string      | Bdev name to export
11048nbd_device              | Optional | string      | NBD device name to assign
11049
11050#### Response
11051
11052Path of exported NBD disk
11053
11054#### Example
11055
11056Example request:
11057
11058~~~json
11059{
11060 "params": {
11061    "nbd_device": "/dev/nbd1",
11062    "bdev_name": "Malloc1"
11063  },
11064  "jsonrpc": "2.0",
11065  "method": "nbd_start_disk",
11066  "id": 1
11067}
11068~~~
11069
11070Example response:
11071
11072~~~json
11073{
11074  "jsonrpc": "2.0",
11075  "id": 1,
11076  "result": "/dev/nbd1"
11077}
11078~~~
11079
11080### nbd_stop_disk {#rpc_nbd_stop_disk}
11081
11082Stop one NBD disk which is based on SPDK bdev.
11083
11084#### Parameters
11085
11086Name                    | Optional | Type        | Description
11087----------------------- | -------- | ----------- | -----------
11088nbd_device              | Required | string      | NBD device name to stop
11089
11090#### Example
11091
11092Example request:
11093
11094~~~json
11095{
11096 "params": {
11097    "nbd_device": "/dev/nbd1",
11098  },
11099  "jsonrpc": "2.0",
11100  "method": "nbd_stop_disk",
11101  "id": 1
11102}
11103~~~
11104
11105Example response:
11106
11107~~~json
11108{
11109  "jsonrpc": "2.0",
11110  "id": 1,
11111  "result": "true"
11112}
11113~~~
11114
11115### nbd_get_disks {#rpc_nbd_get_disks}
11116
11117Display all or specified NBD device list
11118
11119#### Parameters
11120
11121Name                    | Optional | Type        | Description
11122----------------------- | -------- | ----------- | -----------
11123nbd_device              | Optional | string      | NBD device name to display
11124
11125#### Response
11126
11127The response is an array of exported NBD devices and their corresponding SPDK bdev.
11128
11129#### Example
11130
11131Example request:
11132
11133~~~json
11134{
11135  "jsonrpc": "2.0",
11136  "method": "nbd_get_disks",
11137  "id": 1
11138}
11139~~~
11140
11141Example response:
11142
11143~~~json
11144{
11145  "jsonrpc": "2.0",
11146  "id": 1,
11147  "result":  [
11148    {
11149      "bdev_name": "Malloc0",
11150      "nbd_device": "/dev/nbd0"
11151    },
11152    {
11153      "bdev_name": "Malloc1",
11154      "nbd_device": "/dev/nbd1"
11155    }
11156  ]
11157}
11158~~~
11159
11160## Blobfs {#jsonrpc_components_blobfs}
11161
11162### blobfs_detect {#rpc_blobfs_detect}
11163
11164Detect whether a blobfs exists on bdev.
11165
11166#### Parameters
11167
11168Name                    | Optional | Type        | Description
11169----------------------- | -------- | ----------- | -----------
11170bdev_name               | Required | string      | Block device name to detect blobfs
11171
11172#### Response
11173
11174True if a blobfs exists on the bdev; False otherwise.
11175
11176#### Example
11177
11178Example request:
11179
11180~~~json
11181{
11182  "jsonrpc": "2.0",
11183  "id": 1,
11184  "method": "blobfs_detect",
11185  "params": {
11186    "bdev_name": "Malloc0"
11187  }
11188}
11189~~~
11190
11191Example response:
11192
11193~~~json
11194{
11195  "jsonrpc": "2.0",
11196  "id": 1,
11197  "result": "true"
11198}
11199~~~
11200
11201### blobfs_create {#rpc_blobfs_create}
11202
11203Build blobfs on bdev.
11204
11205#### Parameters
11206
11207Name                    | Optional | Type        | Description
11208----------------------- | -------- | ----------- | -----------
11209bdev_name               | Required | string      | Block device name to create blobfs
11210cluster_sz              | Optional | number      | Size of cluster in bytes. Must be multiple of 4KiB page size, default and minimal value is 1M.
11211
11212#### Example
11213
11214Example request:
11215
11216~~~json
11217{
11218  "jsonrpc": "2.0",
11219  "id": 1,
11220  "method": "blobfs_create",
11221  "params": {
11222    "bdev_name": "Malloc0",
11223    "cluster_sz": 1M
11224  }
11225}
11226~~~
11227
11228Example response:
11229
11230~~~json
11231{
11232  "jsonrpc": "2.0",
11233  "id": 1,
11234  "result": "true"
11235}
11236~~~
11237
11238### blobfs_mount {#rpc_blobfs_mount}
11239
11240Mount a blobfs on bdev to one host path through FUSE
11241
11242#### Parameters
11243
11244Name                    | Optional | Type        | Description
11245----------------------- | -------- | ----------- | -----------
11246bdev_name               | Required | string      | Block device name where the blobfs is
11247mountpoint              | Required | string      | Mountpoint path in host to mount blobfs
11248
11249#### Example
11250
11251Example request:
11252
11253~~~json
11254{
11255  "jsonrpc": "2.0",
11256  "id": 1,
11257  "method": ""blobfs_mount"",
11258  "params": {
11259    "bdev_name": "Malloc0",
11260    "mountpoint": "/mnt/"
11261  }
11262}
11263~~~
11264
11265Example response:
11266
11267~~~json
11268{
11269  "jsonrpc": "2.0",
11270  "id": 1,
11271  "result": "true"
11272}
11273~~~
11274
11275### blobfs_set_cache_size {#rpc_blobfs_set_cache_size}
11276
11277Set cache pool size for blobfs filesystems.  This RPC is only permitted when the cache pool is not already initialized.
11278
11279The cache pool is initialized when the first blobfs filesystem is initialized or loaded.  It is freed when the all
11280initialized or loaded filesystems are unloaded.
11281
11282#### Parameters
11283
11284Name                    | Optional | Type        | Description
11285----------------------- | -------- | ----------- | -----------
11286size_in_mb              | Required | number      | Cache size in megabytes
11287
11288#### Response
11289
11290True if cache size is set successfully; False if failed to set.
11291
11292#### Example
11293
11294Example request:
11295
11296~~~json
11297{
11298  "jsonrpc": "2.0",
11299  "id": 1,
11300  "method": "blobfs_set_cache_size",
11301  "params": {
11302    "size_in_mb": 512,
11303  }
11304}
11305~~~
11306
11307Example response:
11308
11309~~~json
11310{
11311  "jsonrpc": "2.0",
11312  "id": 1,
11313  "result": true
11314}
11315~~~
11316
11317## Socket layer {#jsonrpc_components_sock}
11318
11319### sock_impl_get_options {#rpc_sock_impl_get_options}
11320
11321Get parameters for the socket layer implementation.
11322
11323#### Parameters
11324
11325Name                    | Optional | Type        | Description
11326----------------------- | -------- | ----------- | -----------
11327impl_name               | Required | string      | Name of socket implementation, e.g. posix
11328
11329#### Response
11330
11331Response is an object with current socket layer options for requested implementation.
11332
11333#### Example
11334
11335Example request:
11336
11337~~~json
11338{
11339  "jsonrpc": "2.0",
11340  "method": "sock_impl_get_options",
11341  "id": 1,
11342  "params": {
11343    "impl_name": "posix"
11344  }
11345}
11346~~~
11347
11348Example response:
11349
11350~~~json
11351{
11352  "jsonrpc": "2.0",
11353  "id": 1,
11354  "result": {
11355    "recv_buf_size": 2097152,
11356    "send_buf_size": 2097152,
11357    "enable_recv_pipe": true,
11358    "enable_quickack": true,
11359    "enable_placement_id": 0,
11360    "enable_zerocopy_send_server": true,
11361    "enable_zerocopy_send_client": false,
11362    "zerocopy_threshold": 0,
11363    "tls_version": 13,
11364    "enable_ktls": false
11365  }
11366}
11367~~~
11368
11369### sock_impl_set_options {#rpc_sock_impl_set_options}
11370
11371Set parameters for the socket layer implementation.
11372
11373#### Parameters
11374
11375Name                        | Optional | Type        | Description
11376--------------------------- | -------- | ----------- | -----------
11377impl_name                   | Required | string      | Name of socket implementation, e.g. posix
11378recv_buf_size               | Optional | number      | Size of socket receive buffer in bytes
11379send_buf_size               | Optional | number      | Size of socket send buffer in bytes
11380enable_recv_pipe            | Optional | boolean     | Enable or disable receive pipe
11381enable_quick_ack            | Optional | boolean     | Enable or disable quick ACK
11382enable_placement_id         | Optional | number      | Enable or disable placement_id. 0:disable,1:incoming_napi,2:incoming_cpu
11383enable_zerocopy_send_server | Optional | boolean     | Enable or disable zero copy on send for server sockets
11384enable_zerocopy_send_client | Optional | boolean     | Enable or disable zero copy on send for client sockets
11385zerocopy_threshold          | Optional | number      | Set zerocopy_threshold in bytes. A consecutive sequence of requests' iovecs
11386--                          | --       | --          | that fall below this threshold may be sent without zerocopy flag set
11387tls_version                 | Optional | number      | TLS protocol version, e.g. 13 for v1.3 (only applies when impl_name == ssl)
11388enable_ktls                 | Optional | boolean     | Enable or disable Kernel TLS (only applies when impl_name == ssl)
11389
11390#### Response
11391
11392True if socket layer options were set successfully.
11393
11394#### Example
11395
11396Example request:
11397
11398~~~json
11399{
11400  "jsonrpc": "2.0",
11401  "method": "sock_impl_set_options",
11402  "id": 1,
11403  "params": {
11404    "impl_name": "posix",
11405    "recv_buf_size": 2097152,
11406    "send_buf_size": 2097152,
11407    "enable_recv_pipe": false,
11408    "enable_quick_ack": false,
11409    "enable_placement_id": 0,
11410    "enable_zerocopy_send_server": true,
11411    "enable_zerocopy_send_client": false,
11412    "zerocopy_threshold": 10240,
11413    "tls_version": 13,
11414    "enable_ktls": false
11415  }
11416}
11417~~~
11418
11419Example response:
11420
11421~~~json
11422{
11423  "jsonrpc": "2.0",
11424  "id": 1,
11425  "result": true
11426}
11427~~~
11428
11429### sock_set_default_impl {#rpc_sock_set_default_impl}
11430
11431Set the default sock implementation.
11432
11433#### Parameters
11434
11435Name                    | Optional | Type        | Description
11436----------------------- | -------- | ----------- | -----------
11437impl_name               | Required | string      | Name of socket implementation, e.g. posix
11438
11439#### Response
11440
11441True if the default socket layer configuration was set successfully.
11442
11443#### Example
11444
11445Example request:
11446
11447~~~json
11448{
11449  "jsonrpc": "2.0",
11450  "method": "sock_set_default_impl",
11451  "id": 1,
11452  "params": {
11453    "impl_name": "posix"
11454  }
11455}
11456~~~
11457
11458Example response:
11459
11460~~~json
11461{
11462  "jsonrpc": "2.0",
11463  "id": 1,
11464  "result": true
11465}
11466~~~
11467
11468## Miscellaneous RPC commands
11469
11470### bdev_nvme_send_cmd {#rpc_bdev_nvme_send_cmd}
11471
11472Send NVMe command directly to NVMe controller or namespace. Parameters and responses encoded by base64 urlsafe need further processing.
11473
11474Notice: bdev_nvme_send_cmd requires user to guarantee the correctness of NVMe command itself, and also optional parameters.
11475Illegal command contents or mismatching buffer size may result in unpredictable behavior.
11476
11477#### Parameters
11478
11479Name                    | Optional | Type        | Description
11480----------------------- | -------- | ----------- | -----------
11481name                    | Required | string      | Name of the operating NVMe controller
11482cmd_type                | Required | string      | Type of nvme cmd. Valid values are: admin, io
11483data_direction          | Required | string      | Direction of data transfer. Valid values are: c2h, h2c
11484cmdbuf                  | Required | string      | NVMe command encoded by base64 urlsafe
11485data                    | Optional | string      | Data transferring to controller from host, encoded by base64 urlsafe
11486metadata                | Optional | string      | Metadata transferring to controller from host, encoded by base64 urlsafe
11487data_len                | Optional | number      | Data length required to transfer from controller to host
11488metadata_len            | Optional | number      | Metadata length required to transfer from controller to host
11489timeout_ms              | Optional | number      | Command execution timeout value, in milliseconds
11490
11491#### Response
11492
11493Name                    | Type        | Description
11494----------------------- | ----------- | -----------
11495cpl                     | string      | NVMe completion queue entry, encoded by base64 urlsafe
11496data                    | string      | Data transferred from controller to host, encoded by base64 urlsafe
11497metadata                | string      | Metadata transferred from controller to host, encoded by base64 urlsafe
11498
11499#### Example
11500
11501Example request:
11502
11503~~~json
11504{
11505  "jsonrpc": "2.0",
11506  "method": "bdev_nvme_send_cmd",
11507  "id": 1,
11508  "params": {
11509    "name": "Nvme0",
11510    "cmd_type": "admin"
11511    "data_direction": "c2h",
11512    "cmdbuf": "BgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAsGUs9P5_AAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
11513    "data_len": 60,
11514  }
11515}
11516~~~
11517
11518Example response:
11519
11520~~~json
11521{
11522  "jsonrpc": "2.0",
11523  "id": 1,
11524  "result":  {
11525    "cpl": "AAAAAAAAAAARAAAAWrmwABAA==",
11526    "data": "sIjg6AAAAACwiODoAAAAALCI4OgAAAAAAAYAAREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
11527  }
11528
11529}
11530~~~
11531
11532### vmd_enable {#rpc_enable_vmd}
11533
11534Enable VMD enumeration.
11535
11536#### Parameters
11537
11538This method has no parameters.
11539
11540#### Response
11541
11542Completion status of enumeration is returned as a boolean.
11543
11544### Example
11545
11546Example request:
11547
11548~~~json
11549{
11550  "jsonrpc": "2.0",
11551  "method": "vmd_enable",
11552  "id": 1
11553}
11554~~~
11555
11556Example response:
11557
11558~~~json
11559{
11560  "jsonrpc": "2.0",
11561  "id": 1,
11562  "result": true
11563}
11564~~~
11565
11566### vmd_remove_device {#rpc_vmd_remove_device}
11567
11568Remove a device behind a VMD.
11569
11570### Parameters
11571
11572Name                    | Optional | Type        | Description
11573----------------------- | -------- | ----------- | -----------
11574addr                    | Required | string      | Address of the device to remove.
11575
11576### Example
11577
11578~~~json
11579{
11580  "jsonrpc": "2.0",
11581  "method": "vmd_remove_device",
11582  "params": {
11583    "addr": "5d0505:01:00.0"
11584  }
11585  "id": 1
11586}
11587~~~
11588
11589Example response:
11590
11591~~~json
11592{
11593  "jsonrpc": "2.0",
11594  "id": 1,
11595  "result": true
11596}
11597~~~
11598
11599### vmd_rescan {#rpc_vmd_rescan}
11600
11601Force a rescan of the devices behind VMD.
11602
11603### Parameters
11604
11605This method has no parameters.
11606
11607#### Response
11608
11609The response is the number of new devices found.
11610
11611### Example
11612
11613~~~json
11614{
11615  "jsonrpc": "2.0",
11616  "method": "vmd_rescan",
11617  "id": 1
11618}
11619~~~
11620
11621Example response:
11622
11623~~~json
11624{
11625  "jsonrpc": "2.0",
11626  "id": 1,
11627  "result": {
11628    "count": 1
11629  }
11630}
11631~~~
11632
11633### spdk_get_version {#rpc_spdk_get_version}
11634
11635Get the version info of the running SPDK application.
11636
11637#### Parameters
11638
11639This method has no parameters.
11640
11641#### Response
11642
11643The response is the version number including major version number, minor version number, patch level number and suffix string.
11644
11645#### Example
11646
11647Example request:
11648
11649~~~json
11650{
11651  "jsonrpc": "2.0",
11652  "id": 1,
11653  "method": "spdk_get_version"
11654}
11655~~~
11656
11657Example response:
11658
11659~~~json
11660{
11661  "jsonrpc": "2.0",
11662  "id": 1,
11663  "result":  {
11664    "version": "19.04-pre",
11665    "fields" : {
11666      "major": 19,
11667      "minor": 4,
11668      "patch": 0,
11669      "suffix": "-pre"
11670    }
11671  }
11672}
11673~~~
11674
11675### framework_get_pci_devices
11676
11677List PCIe devices attached to an SPDK application and the contents of their config space.
11678
11679#### Parameters
11680
11681This method has no parameters.
11682
11683#### Response
11684
11685The response is an array of attached PCIe devices.
11686
11687#### Example
11688
11689Example request:
11690
11691~~~json
11692{
11693  "jsonrpc": "2.0",
11694  "id": 1,
11695  "method": "framework_get_pci_devices"
11696}
11697~~~
11698
11699Example response:
11700Note that the config space buffer was trimmed.
11701
11702~~~json
11703{
11704  "jsonrpc": "2.0",
11705  "id": 1,
11706  "result": {
11707    [
11708      {
11709        "address": "0000:00:04.0",
11710        "config_space": "8680455807051000...0000000000000000"
11711      },
11712      {
11713        "address": "0000:00:03.0",
11714        "config_space": "8680455807051000...0000000000000000"
11715      }
11716    ]
11717  }
11718}
11719~~~
11720
11721### bdev_nvme_add_error_injection {#rpc_bdev_nvme_add_error_injection}
11722
11723Add a NVMe command error injection for a bdev nvme controller.
11724
11725#### Parameters
11726
11727Name                    | Optional | Type        | Description
11728----------------------- | -------- | ----------- | -----------
11729name                    | Required | string      | Name of the operating NVMe controller
11730cmd_type                | Required | string      | Type of NVMe command. Valid values are: admin, io
11731opc                     | Required | number      | Opcode for which the error injection is applied
11732do_not_submit           | Optional | boolean     | Set to true if request should not be submitted to the controller (default false)
11733timeout_in_us           | Optional | number      | Wait specified microseconds when do_not_submit is true
11734err_count               | Optional | number      | Number of matching NVMe commands to inject errors
11735sct                     | Optional | number      | Status code type (default 0)
11736sc                      | Optional | number      | Status code (default 0)
11737
11738#### Response
11739
11740true on success
11741
11742#### Example
11743
11744Example request:
11745
11746~~~json
11747{
11748  "jsonrpc": "2.0",
11749  "method": "bdev_nvme_add_error_injection",
11750  "id": 1,
11751  "params": {
11752    "name": "HotInNvme0",
11753    "opc": 2,
11754    "cmd_type": "io",
11755    "err_count": 1111111,
11756    "sct": 11,
11757    "sc": 33
11758  }
11759}
11760
11761~~~
11762
11763Example response:
11764
11765~~~json
11766{
11767  "jsonrpc": "2.0",
11768  "id": 1,
11769  "result": true
11770}
11771
11772~~~
11773
11774### bdev_nvme_remove_error_injection {#rpc_bdev_nvme_remove_error_injection}
11775
11776Remove a NVMe command error injection.
11777
11778#### Parameters
11779
11780Name                    | Optional | Type        | Description
11781----------------------- | -------- | ----------- | -----------
11782name                    | Required | string      | Name of the operating NVMe controller
11783cmd_type                | Required | string      | Type of NVMe command. Valid values are: admin, io
11784opc                     | Required | number      | Opcode for which the error injection is applied
11785
11786#### Response
11787
11788true on success
11789
11790#### Example
11791
11792Example request:
11793
11794~~~json
11795{
11796  "jsonrpc": "2.0",
11797  "method": "bdev_nvme_remove_error_injection",
11798  "id": 1,
11799  "params": {
11800    "name": "HotInNvme0",
11801    "opc": 2,
11802    "cmd_type": "io"
11803  }
11804}
11805
11806
11807~~~
11808
11809Example response:
11810
11811~~~json
11812{
11813  "jsonrpc": "2.0",
11814  "id": 1,
11815  "result": true
11816}
11817
11818~~~
11819
11820### bdev_daos_create {#rpc_bdev_daos_create}
11821
11822Construct @ref bdev_config_daos
11823
11824#### Parameters
11825
11826Name                    | Optional | Type        | Description
11827----------------------- | -------- | ----------- | -----------
11828name                    | Required | string      | Bdev name to use
11829pool                    | Required | string      | DAOS pool label or its uuid
11830cont                    | Required | string      | DAOS cont label or its uuid
11831block_size              | Required | number      | Block size in bytes -must be multiple of 512
11832num_blocks              | Required | number      | Number of blocks
11833uuid                    | Optional | string      | UUID of new bdev
11834oclass                  | Optional | string      | DAOS object class (default SX)
11835
11836To find more about various object classes please visit [DAOS documentation](https://github.com/daos-stack/daos/blob/master/src/object/README.md).
11837Please note, that DAOS bdev module uses the same CLI flag notation as `dmg` and `daos` commands,
11838for instance, `SX` or `EC_4P2G2` rather than in DAOS header file `OC_SX` or `OC_EC_4P2G2`.
11839
11840#### Result
11841
11842Name of newly created bdev.
11843
11844#### Example
11845
11846Example request:
11847
11848~~~json
11849{
11850  "params": {
11851    "block_size": 4096,
11852    "num_blocks": 16384,
11853    "name": "daosdev0",
11854    "pool": "test-pool",
11855    "cont": "test-cont",
11856    "oclass": "EC_4P2G2"
11857  },
11858  "jsonrpc": "2.0",
11859  "method": "bdev_daos_create",
11860  "id": 1
11861}
11862~~~
11863
11864Example response:
11865
11866~~~json
11867{
11868  "jsonrpc": "2.0",
11869  "id": 1,
11870  "result": "daosdev0"
11871}
11872~~~
11873
11874### bdev_daos_delete {#rpc_bdev_daos_delete}
11875
11876Delete @ref bdev_config_daos
11877
11878#### Parameters
11879
11880Name                    | Optional | Type        | Description
11881----------------------- | -------- | ----------- | -----------
11882name                    | Required | string      | Bdev name
11883
11884#### Example
11885
11886Example request:
11887
11888~~~json
11889{
11890  "params": {
11891    "name": "daosdev0"
11892  },
11893  "jsonrpc": "2.0",
11894  "method": "bdev_daos_delete",
11895  "id": 1
11896}
11897~~~
11898
11899Example response:
11900
11901~~~json
11902{
11903  "jsonrpc": "2.0",
11904  "id": 1,
11905  "result": true
11906}
11907~~~
11908
11909### bdev_daos_resize {#rpc_bdev_daos_resize}
11910
11911Resize @ref bdev_config_daos.
11912
11913#### Parameters
11914
11915Name                    | Optional | Type        | Description
11916----------------------- | -------- | ----------- | -----------
11917name                    | Required | string      | Bdev name
11918new_size                | Required | number      | Bdev new capacity in MiB
11919
11920#### Example
11921
11922Example request:
11923
11924~~~json
11925{
11926  "params": {
11927    "name": "daosdev0",
11928    "new_size": 8192
11929  },
11930  "jsonrpc": "2.0",
11931  "method": "bdev_daos_resize",
11932  "id": 1
11933}
11934~~~
11935
11936Example response:
11937
11938~~~json
11939{
11940  "jsonrpc": "2.0",
11941  "id": 1,
11942  "result": true
11943}
11944~~~
11945
11946### iobuf_set_options {#rpc_iobuf_set_options}
11947
11948Set iobuf buffer pool options.
11949
11950#### Parameters
11951
11952Name                    | Optional | Type        | Description
11953----------------------- | -------- | ----------- | -----------
11954small_pool_count        | Optional | number      | Number of small buffers in the global pool
11955large_pool_count        | Optional | number      | Number of large buffers in the global pool
11956small_bufsize           | Optional | number      | Size of a small buffer
11957large_bufsize           | Optional | number      | Size of a small buffer
11958
11959#### Example
11960
11961Example request:
11962
11963~~~json
11964{
11965  "jsonrpc": "2.0",
11966  "id": 1,
11967  "method": "iobuf_set_options",
11968  "params": {
11969    "small_pool_count": 16383,
11970    "large_pool_count": 2047
11971  }
11972}
11973~~~
11974
11975Example response:
11976
11977~~~json
11978{
11979  "jsonrpc": "2.0",
11980  "id": 1,
11981  "result": true
11982}
11983~~~
11984
11985### bdev_nvme_start_mdns_discovery {#rpc_bdev_nvme_start_mdns_discovery}
11986
11987Starts an mDNS based discovery service for the specified service type for the
11988auto-discovery of discovery controllers (NVMe TP-8009).
11989
11990The discovery service will listen for the mDNS discovery events from the
11991Avahi-daemon and will connect to the newly learnt discovery controllers.
11992Then the discovery service will automatically attach to any subsystem found in the
11993discovery log page from the discovery controllers learnt using mDNS.
11994When determining a controller name to use when attaching, it will use
11995the 'name' parameter as a prefix, followed by a unique integer assigned for each of the
11996discovery controllers learnt through mDNS, followed by a unique integer for that discovery
11997service. If the discovery service identifies a subsystem that has been previously
11998attached but is listed with a different path, it will use the same controller name
11999as the previous entry, and connect as a multipath.
12000
12001When the discovery service sees that a subsystem entry has been removed
12002from the log page, it will automatically detach from that controller as well.
12003
12004The 'name' is also used to later stop the discovery service.
12005
12006#### Parameters
12007
12008Name                       | Optional | Type        | Description
12009-------------------------- | -------- | ----------- | -----------
12010name                       | Required | string      | Prefix for NVMe discovery services found
12011svcname                    | Required | string      | Service to discover: e.g. _nvme-disc._tcp
12012hostnqn                    | Optional | string      | NVMe-oF hostnqn
12013
12014#### Example
12015
12016Example request:
12017
12018~~~json
12019{
12020  "jsonrpc": "2.0",
12021  "method": "bdev_nvme_start_mdns_discovery",
12022  "id": 1,
12023  "params": {
12024    "name": "cdc_auto",
12025    "svcname": "_nvme-disc._tcp",
12026    "hostnqn": "nqn.2021-12.io.spdk:host1",
12027  }
12028}
12029~~~
12030
12031Example response:
12032
12033~~~json
12034{
12035  "jsonrpc": "2.0",
12036  "id": 1,
12037  "result": true
12038}
12039~~~
12040
12041### bdev_nvme_stop_mdns_discovery {#rpc_bdev_nvme_stop_mdns_discovery}
12042
12043Stops a mDNS discovery service. This includes detaching any controllers that were
12044discovered via the service that is being stopped.
12045
12046#### Parameters
12047
12048Name                       | Optional | Type        | Description
12049-------------------------- | -------- | ----------- | -----------
12050name                       | Required | string      | Name of mDNS discovery instance to stop
12051
12052#### Example
12053
12054Example request:
12055
12056~~~json
12057{
12058  "jsonrpc": "2.0",
12059  "method": "bdev_nvme_stop_mdns_discovery",
12060  "id": 1,
12061  "params": {
12062    "name": "cdc_auto"
12063  }
12064}
12065~~~
12066
12067Example response:
12068
12069~~~json
12070{
12071  "jsonrpc": "2.0",
12072  "id": 1,
12073  "result": true
12074}
12075~~~
12076
12077### bdev_nvme_get_mdns_discovery_info {#rpc_bdev_nvme_get_mdns_discovery_info}
12078
12079Get the information about the mDNS discovery service instances.
12080
12081#### Example
12082
12083Example request:
12084~~~json
12085{
12086  "jsonrpc": "2.0",
12087  "method": "bdev_nvme_get_mdns_discovery_info",
12088  "id": 1
12089}
12090~~~
12091
12092Example response:
12093
12094~~~json
12095[
12096  {
12097    "name": "cdc_auto",
12098    "svcname": "_nvme-disc._tcp",
12099    "referrals": [
12100      {
12101        "name": "cdc_auto0",
12102        "trid": {
12103          "trtype": "TCP",
12104          "adrfam": "IPv4",
12105          "traddr": "66.1.2.21",
12106          "trsvcid": "8009",
12107          "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
12108        }
12109      },
12110      {
12111        "name": "cdc_auto1",
12112        "trid": {
12113          "trtype": "TCP",
12114          "adrfam": "IPv4",
12115          "traddr": "66.1.1.21",
12116          "trsvcid": "8009",
12117          "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
12118        }
12119      }
12120    ]
12121  }
12122]
12123~~~
12124