# NVMf Target Configuration File
#
# Please write all parameters using ASCII.
# The parameter must be quoted if it includes whitespace.
#
# Configuration syntax:
# Leading whitespace is ignored.
# Lines starting with '#' are comments.
# Lines ending with '\' are concatenated with the next line.
# Bracketed ([]) names define sections

[Global]
  # Tracepoint group mask for spdk trace buffers
  # Default: 0x0 (all tracepoint groups disabled)
  # Set to 0xFFFF to enable all tracepoint groups.
  #TpointGroupMask 0x0

  # PciBlacklist and PciWhitelist cannot be used at the same time
  #PciBlacklist 0000:01:00.0
  #PciBlacklist 0000:02:00.0
  #PciWhitelist 0000:03:00.0
  #PciWhitelist 0000:04:00.0

# Users may activate entries in this section to override default values for
# global parameters in the block device (bdev) subsystem.
[Bdev]
  # Number of spdk_bdev_io structures allocated in the global bdev subsystem pool.
  #BdevIoPoolSize 65536

  # Maximum number of spdk_bdev_io structures to cache per thread.
  #BdevIoCacheSize 256

# Users may change this section to create a different number or size of
#  malloc LUNs.
# This will generate 8 LUNs with a malloc-allocated backend.
# Each LUN will be size 64MB and these will be named
# Malloc0 through Malloc7.  Not all LUNs defined here are necessarily
#  used below.
[Malloc]
  NumberOfLuns 8
  LunSizeInMB 64

# Users must change this section to match the /dev/sdX devices to be
# exported as iSCSI LUNs. The devices are accessed using Linux AIO.
# The format is:
# AIO <file name> <bdev name>
# The file name is the backing device
# The bdev name can be referenced from elsewhere in the configuration file.
# Block size may be omitted to automatically detect the block size of a disk.
[AIO]
  AIO /dev/sdb AIO0
  AIO /dev/sdc AIO1
  AIO /tmp/myfile AIO2 4096

# PMDK libpmemblk-based block device
[Pmem]
  # Syntax:
  #   Blk <pmemblk pool file name> <bdev name>
  Blk /path/to/pmem-pool Pmem0

# Define NVMf protocol global options
[Nvmf]
  # Set how often the acceptor polls for incoming connections. The acceptor is also
  # responsible for polling existing connections that have gone idle. 0 means continuously
  # poll. Units in microseconds.
  AcceptorPollRate 10000

  # Set how the connection is scheduled among multiple threads, current supported string value are
  # "RoundRobin", "Host", "Transport".
  # RoundRobin: Schedule the connection with roundrobin manner.
  # Host: Schedule the connection according to host IP.
  # Transport: Schedule the connection according to the transport characteristics.
  #  For example, for  TCP transport, we can schedule the connection according to socket NAPI_ID info.
  #  The connection which has the same socket NAPI_ID info will be grouped in the same polling group.
  ConnectionScheduler RoundRobin

# One valid transport type must be set in each [Transport].
# The first is the case of RDMA transport and the second is the case of TCP transport.
[Transport]
  # Set RDMA transport type.
  Type RDMA

  # Set the maximum number of outstanding I/O per queue.
  #MaxQueueDepth 128

  # Set the maximum number of submission and completion queues per session.
  # Setting this to '8', for example, allows for 8 submission and 8 completion queues
  # per session.
  #MaxQueuesPerSession 4

  # Set the maximum in-capsule data size. Must be a multiple of 16.
  # 0 is a valid choice.
  #InCapsuleDataSize 4096

  # Set the maximum I/O size. Must be a multiple of 4096.
  #MaxIOSize 131072

  # Set the I/O unit size, and this value should not be larger than MaxIOSize
  #IOUnitSize 131072

  # Set the maximum number of IO for admin queue
  #MaxAQDepth 32

  # Set the number of pooled data buffers available to the transport
  # It is used to provide the read/write data buffers for the qpairs on this transport.
  #NumSharedBuffers 512

  # Set the number of shared buffers to be cached per poll group
  #BufCacheSize 32

  # Set the maximum number outstanding I/O per shared receive queue. Relevant only for RDMA transport
  #MaxSRQDepth 4096

[Transport]
  # Set TCP transport type.
  Type TCP

  # Set the maximum number of outstanding I/O per queue.
  #MaxQueueDepth 128

  # Set the maximum number of submission and completion queues per session.
  # Setting this to '8', for example, allows for 8 submission and 8 completion queues
  # per session.
  #MaxQueuesPerSession 4

  # Set the maximum in-capsule data size. Must be a multiple of 16.
  # 0 is a valid choice.
  #InCapsuleDataSize 4096

  # Set the maximum I/O size. Must be a multiple of 4096.
  #MaxIOSize 131072

  # Set the I/O unit size, and this value should not be larger than MaxIOSize
  #IOUnitSize 131072

  # Set the maximum number of IO for admin queue
  #MaxAQDepth 32

  # Set the number of pooled data buffers available to the transport
  # It is used to provide the read/write data buffers for the qpairs on this transport.
  #NumSharedBuffers 512

  # Set the number of shared buffers to be cached per poll group
  #BufCacheSize 32

  # Set whether to use the C2H Success optimization, only used for TCP transport.
  # C2HSuccess true

  # Set whether to use different priority for socket, only used for TCP transport.
  # SockPriority 0

# Define FC transport
#[Transport]
  # Set FC transport type.
  #Type FC

  # Set the maximum number of submission and completion queues per session.
  # Setting this to '8', for example, allows for 8 submission and 8 completion queues
  # per session.
  #MaxQueuesPerSession 5

  # Set the maximum number of outstanding I/O per queue.
  #MaxQueueDepth 128

  # Set the maximum I/O size. Must be a multiple of 4096.
  #MaxIOSize 65536

[Nvme]
  # NVMe Device Whitelist
  # Users may specify which NVMe devices to claim by their transport id.
  # See spdk_nvme_transport_id_parse() in spdk/nvme.h for the correct format.
  # The second argument is the assigned name, which can be referenced from
  # other sections in the configuration file. For NVMe devices, a namespace
  # is automatically appended to each name in the format <YourName>nY, where
  # Y is the NSID (starts at 1).
  TransportID "trtype:PCIe traddr:0000:00:00.0" Nvme0
  TransportID "trtype:PCIe traddr:0000:01:00.0" Nvme1
  TransportID "trtype:PCIe traddr:0000:02:00.0" Nvme2
  TransportID "trtype:PCIe traddr:0000:03:00.0" Nvme3
  TransportID "trtype:RDMA adrfam:IPv4 traddr:192.168.100.8 trsvcid:4420 hostaddr:192.168.100.9 subnqn:nqn.2016-06.io.spdk:cnode1" Nvme4
  TransportID "trtype:TCP adrfam:IPv4 traddr:192.168.100.3 trsvcid:4420 hostaddr:192.168.100.4 subnqn:nqn.2016-06.io.spdk:cnode2" Nvme5

  # The number of attempts per I/O when an I/O fails. Do not include
  # this key to get the default behavior.
  RetryCount 4
  # Timeout for each command, in microseconds. If 0, don't track timeouts.
  TimeoutUsec 0
  # Action to take on command time out. Only valid when Timeout is greater
  # than 0. This may be 'Reset' to reset the controller, 'Abort' to abort
  # the command, or 'None' to just print a message but do nothing.
  # Admin command timeouts will always result in a reset.
  ActionOnTimeout None
  # Set how often the admin queue is polled for asynchronous events.
  # Units in microseconds.
  AdminPollRate 100000
  # Set how often I/O queues are polled from completions.
  # Units in microseconds.
  IOPollRate 0

  # Disable handling of hotplug (runtime insert and remove) events,
  # users can set to Yes if want to enable it.
  # Default: No
  HotplugEnable No

  # Enable/disable delayed NVMe command submission.
  # Default: True.
  DelayCmdSubmit True

# The Split virtual block device slices block devices into multiple smaller bdevs.
[Split]
  # Syntax:
  #   Split <bdev> <count> [<size_in_megabytes>]

  # Split Malloc2 into two equally-sized portions, Malloc2p0 and Malloc2p1
  Split Malloc2 2

  # Split Malloc3 into eight 1-megabyte portions, Malloc3p0 ... Malloc3p7,
  # leaving the rest of the device inaccessible
  Split Malloc3 8 1

# The RAID virtual block device based on pre-configured block device.
[RAID1]
  # Unique name of this RAID device.
  Name Raid0
  # RAID level, only raid level 0 is supported.
  RaidLevel 0
  # Strip size in KB.
  StripSize 64
  # Number of pre-configured bdevs.
  NumDevices 2
  # Pre-configured bdevs name with Nvme.
  Devices Nvme2n1 Nvme3n1
  # Pre-configured bdevs name with Malloc.
  #Devices Malloc0 Malloc1
  # Pre-configured bdevs name with AIO.
  #Devices AIO0 AIO1

# Define an NVMf Subsystem.
# - NQN is required and must be unique.
# - Between 1 and 255 Listen directives are allowed. This defines
#   the addresses on which new connections may be accepted. The format
#   is Listen <type> <address> where type can be RDMA, TCP or FC.
# - Between 0 and 255 Host directives are allowed. This defines the
#   NQNs of allowed hosts. If no Host directive is specified, all hosts
#   are allowed to connect.
# - Between 0 and 255 Namespace directives are allowed. These define the
#   namespaces accessible from this subsystem.
#   The user must specify MaxNamespaces to allow for adding namespaces
#   during active connection. By default it is 0
#   The user must specify a bdev name for each namespace, and may optionally
#   specify a namespace ID. If nsid is omitted, the namespace will be
#   assigned the next available NSID. The NSID must be unique within the
#   subsystem. An optional namespace UUID may also be specified.
#   Syntax:
#     Namespace <bdev_name> [<nsid> [<uuid>]]

# Namespaces backed by physical NVMe devices
[Subsystem1]
  NQN nqn.2016-06.io.spdk:cnode1
  Listen TCP 15.15.15.2:4420
  AllowAnyHost No
  Host nqn.2016-06.io.spdk:init
  SN SPDK00000000000001
  MN SPDK_Controller1
  MaxNamespaces 20
  Namespace Nvme0n1 1
  Namespace Nvme1n1 2
  Namespace Raid0

# Multiple subsystems are allowed.
# Namespaces backed by non-NVMe devices
[Subsystem2]
  NQN nqn.2016-06.io.spdk:cnode2
  Listen RDMA 192.168.2.21:4420
  AllowAnyHost No
  Host nqn.2016-06.io.spdk:init
  SN SPDK00000000000002
  MN SPDK_Controller2
  Namespace Malloc0
  Namespace Malloc1
  Namespace AIO0
  Namespace AIO1

# Subsystem with FC listen address directive
# - Listen option allows subsystem access on specific FC ports identified
#   by WWNN-WWPN. Each subsystem allows 0 - 255 listen directives.
#   If no listen directive is provided, subsystem can be accessed on all
#   avialable FC links permitted by FC zoning rules.
#
# [Subsystem3]
  #NQN nqn.2016-06.io.spdk:cnode3
  #Listen FC "nn-0x20000090fac7ca5c:pn-0x10000090fac7ca5c"
  #AllowAnyHost Yes
  #SN SPDK00000000000003
  #Namespace Malloc4
