# Copyright (c) 2021, Dell Inc. or its subsidiaries.  All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# See the LICENSE file for details.
#
# This file is part of NVMe STorage Appliance Services (nvme-stas).

# ==============================================================================
# STorage Appliance Connector Daemon (stacd) - configuration file
#
# In this file, options that are commented represent the default values used.
# Uncommented options override the default value.


[Global]
# tron:        Trace-ON. Enable additional debug info
#              Type:  boolean
#              Range: [false, true]
#tron=false

# hdr-digest:  Protocol Data Unit (PDU) Header Digest. NVMe/TCP facilitates an
#              optional PDU Header digest. Digests are calculated using the
#              CRC32C algorithm.
#              Type:  boolean
#              Range: [false, true]
#hdr-digest=false

# data-digest: Protocol Data Unit (PDU) Data Digest. NVMe/TCP facilitates an
#              optional PDU Data digest. Digests are calculated using the
#              CRC32C algorithm.
#              Type:  boolean
#              Range: [false, true]
#data-digest=false

# kato:        Keep Alive Timeout (KATO): This field specifies the timeout value
#              for the Keep Alive feature in seconds. The default value for this
#              field is 120 seconds (2 minutes).
#              Type:  Unsigned integer
#              Range: 0..N
#              Unit:  Seconds
#kato=120

# nr-io-queues:      Overrides the default number of I/O queues create by the
#                    driver.
#                    Type:  Unsigned integer
#                    Range: 1..N
#                    Default: Depends on kernel and other run time
#                    factors (e.g. number of CPUs).

# nr-write-queues:   Adds additional queues that will be used for write I/O.
#                    Type:  Unsigned integer
#                    Range: 1..N
#                    Default: Depends on kernel and other run time
#                    factors (e.g. number of CPUs).

# nr-poll-queues:    Adds additional queues that will be used for polling
#                    latency sensitive I/O.
#                    Type:  Unsigned integer
#                    Range: 1..N
#                    Default: Depends on kernel and other run time
#                    factors (e.g. number of CPUs).

# queue-size:        Overrides the default number of elements in the I/O queues
#                    created by the driver.
#                    Type:  Unsigned integer
#                    Range: 16..1024
#                    Default: 128
#queue-size=128

# reconnect-delay:   Overrides the default delay, in seconds, before reconnect
#                    is attempted after a connect loss.
#                    Type:  Unsigned integer
#                    Range: 1..N
#                    Unit:  Seconds
#                    Default: 10     (retry to connect every 10 seconds)
#reconnect-delay=10

# ctrl-loss-tmo:     Overrides the default controller loss timeout period in
#                    seconds.
#                    Type:  Unsigned integer
#                    Range: -1, 0..N  where -1 means retry forever
#                    Unit:  Seconds
#                    Default: 600    (retry to connect for up to 10 minutes)
#ctrl-loss-tmo=600

# disable-sqflow:    Disables SQ flow control to omit head doorbell update for
#                    submission queues when sending nvme completions.
#                    Type:  boolean
#                    Range: [false, true]
#                    Default: false
#disable-sqflow=false

# ignore-iface: This option controls whether connections with I/O Controllers
#               (IOC) will be forced on a specific interface or will rely on
#               the routing tables to determine the interface.
#
#               See the man pages for details: man stacd.conf
#
#               Type:    boolean
#               Range:   [false, true]
#               Default: true
#ignore-iface=false

# ip-family: With this you can specify whether stacd will support IPv4, IPv6,
#            or both when connecting to I/O Controllers (IOC).
#
#            See the man pages for details: man stacd.conf
#
#            Type:    String
#            Range:   [ipv4, ipv6, ipv4+ipv6]
#            Default: ipv4+ipv6
#ip-family=ipv4+ipv6


# ==============================================================================
[I/O controller connection management]
# This section contains parameters to manage I/O controller connections.
# For example, parameters are provided to control disconnect policy. In other
# words, whether stacd will disconnect from IOCs on DLPE removal and which
# connections will be affected.
#
# Also, what should stacd do when a DLPE NCC bit (Not Connected to CDC) is
# asserted. Should stacd stop trying to connect to an I/O controller after a
# certain number of unsuccessful attempts.
#
# See the man pages for details: man stacd.conf

# disconnect-scope: Determines which connections, if any, will be the target of
#                   a potential disconnect on DLPE removal.
#
#                   Type:    String
#                   Range:   [only-stas-connections | all-connections-matching-disconnect-trtypes | no-disconnect]
#                   Default: only-stas-connections
#disconnect-scope=only-stas-connections

# disconnect-trtypes: Specify which connections should be audited based on the
#                     transport type. This parameter only applies when
#                     "disconnect-scope = all-connections-matching-disconnect-trtypes".
#
#                     Type:    String
#                     Range:   [tcp, rdma, fc, tcp+rdma, tcp+fc, rdma+fc, tcp+rdma+fc]
#                     Default: tcp
#disconnect-trtypes=tcp

# connect-attempts-on-ncc: The NCC bit (Not Connected to CDC) returned in a
#                          DLPE indicates whether a connection is currently
#                          established between the CDC and the subsystem listed
#                          in the DLPE.
#
#                          When the NCC bit is asserted, it may mean that the
#                          subsystem is offline or that fabrics connectivity is
#                          momentarily lost. If the host is also unable to
#                          connect to the subsystem, then there is no point in
#                          continuing to try to connect. In fact, the CDC will
#                          monitor the situation an inform the host (AEN) when
#                          connectivity is restored.
#
#                          This field is used to tell stacd how to behave when
#                          the NCC bit is asserted. How many times should it try
#                          to connect before give-up, or whether to keep trying
#                          indefinitely.
#
#                          Type:    Integer
#                          Range:   [0, 2..N], 0 means "Never stop trying". A
#                                   non-0 value indicates the number of attempts
#                                   before giving up. This value should never be
#                                   set to 1. A value of 1 will automatically be
#                                   increased to 2. That's because a single
#                                   failure may be normal and a minimum of 2
#                                   attempts is required to conclude that a
#                                   connection is not possible.
#                          Default: 0
#connect-attempts-on-ncc=0

# ==============================================================================
[Controllers]
# controller: I/O Controllers (IOC) are specified with this keyword.
#
#             Syntax:
#               controller = transport=<trtype>;traddr=<traddr>;trsvcid=<trsvcid>;host-traddr=<traddr>;host-iface=<iface>,nqn=<subnqn>
#
#             transport=<trtype>    [MANDATORY]
#               This field specifies the network fabric being used for a NVMe-over-
#               Fabrics network. Current string values include:
#
#               Value   Definition
#               ------- -----------------------------------------------------------
#               rdma    The network fabric is an rdma network (RoCE, iWARP, Infiniband, basic rdma, etc)
#               fc      The network fabric is a Fibre Channel network.
#               tcp     The network fabric is a TCP/IP network.
#               loop    Connect to a NVMe over Fabrics target on the local host
#
#             traddr=<traddr>       [MANDATORY]
#               This field specifies the network address of the Controller. For
#               transports using IP addressing (e.g. rdma) this should be an IP-
#               based address (ex. IPv4, IPv6). It could also be a resolvable host
#               name (e.g. localhost).
#
#             nqn=<subnqn>          [MANDATORY]
#               This field specifies the Subsystem's NVMe Qualified Name.
#
#             trsvcid=<trsvcid>     [OPTIONAL]
#               This field specifies the transport service id. For transports using
#               IP addressing (e.g. rdma) this field is the port number.
#
#               Depending on the transport type, this field will default to either
#               8009 or 4420 as follows.
#
#               UDP port 4420 and TCP port 4420 have been assigned by IANA
#               for use by NVMe over Fabrics. NVMe/RoCEv2 controllers use UDP port
#               4420 by default. NVMe/iWARP controllers use TCP port 4420 by
#               default.
#
#               TCP port 4420 has been assigned for use by NVMe over Fabrics and TCP
#               port 8009 has been assigned by IANA for use by NVMe over Fabrics
#               discovery. TCP port 8009 is the default TCP port for NVMe/TCP
#               discovery controllers. There is no default TCP port for NVMe/TCP I/O
#               controllers, the Transport Service Identifier (TRSVCID) field in the
#               Discovery Log Entry indicates the TCP port to use.
#
#               The TCP ports that may be used for NVMe/TCP I/O controllers include
#               TCP port 4420, and the Dynamic and/or Private TCP ports (i.e., ports
#               in the TCP port number range from 49152 to 65535). NVMe/TCP I/O
#               controllers should not use TCP port 8009. TCP port 4420 shall not be
#               used for both NVMe/iWARP and NVMe/TCP at the same IP address on the
#               same network.
#
#             host-traddr=<traddr>  [OPTIONAL]
#               This field specifies the network address used on the host to connect
#               to the Controller. For TCP, this sets the source address on the
#               socket.
#
#             host-iface=<iface>    [OPTIONAL]
#               This field specifies the network interface used on the host to
#               connect to the Controller (e.g. IP eth1, enp2s0, enx78e7d1ea46da).
#               This forces the connection to be made on a specific interface
#               instead of letting the system decide.
#
#             dhchap-ctrl-secret    [OPTIONAL]
#               NVMe In-band authentication controller secret (i.e. key) for
#               bi-directional authentication; needs to be in ASCII format as
#               specified in NVMe 2.0 section 8.13.5.8 'Secret representation'.
#               Bi-directional authentication will be attempted when present.
#
#             hdr-digest            [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             data-digest           [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             nr-io-queues          [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             nr-write-queues       [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             nr-poll-queues        [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             queue-size            [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             kato                  [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             reconnect-delay       [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             ctrl-loss-tmo         [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             disable-sqflow        [OPTIONAL]
#               See definition in [Global] section. This is used to override
#               the value specified in the [Global] section.
#
#             Multiple DCs may be specified on separate lines like this (this is
#             just an example and does not represent default values):
#
#             controller = transport=tcp;traddr=localhost;nqn=nqn.1988-11.com.dell:PowerSANxxx:01:20210225100113-454f73093ceb4847a7bdfc6e34ae8e28
#             controller = transport=tcp;traddr=2001:db8::370:7334;host-iface=enp0s8;nqn=nqn.starship-enterprise
#             controller = transport=fc;traddr=nn-0x204600a098cbcac6:pn-0x204700a098cbcac6;nqn=nqn.romulan-empire
#                 ...
#             Type: String
#
#             Default: There is no default controller. STAC will not try to
#                      connect to a default I/O Controller.
#controller=


# exclude: Excluded controllers. This keyword allows configuring I/O
#          controllers that should not be connected to (whatever the
#          reason may be).
#
#          The syntax is the same as for "controller=", except that the key
#          host-traddr does not apply. Multiple "exclude=" keywords may
#          appear in the config file to define the exclusion list.
#
#          Note 1: A minimal match approach is used to eliminate unwanted
#          controllers. That is, you do not need to specify all the
#          parameters to identify a controller. Just specifying the
#          host-iface, for example, can be used to exclude all controllers
#          on an interface.
#
#          Note 2: "exclude=" takes precedence over "controller=". A
#          controller specified by the "controller=" keyword, can be
#          eliminated by the "exclude=" keyword.
#
#          Syntax: Same as "controller=" above.
#          Type:   String
#
#          Example:
#           exclude = transport=tcp;traddr=fe80::2c6e:dee7:857:26bb # Eliminate a specific address
#           exclude = host-iface=enp0s8                             # Eliminate everything on this interface
#exclude=