.. _startup:

=======================================
VPP Configuration File - 'startup.conf'
=======================================


After a successful installation, VPP installs a startup config file named
*startup.conf* in the */etc/vpp/* directory. This file can be tailored to
make VPP run as desired, but contains default values for typical installations.

Below are more details about this file and the parameters and values it contains.

Introduction
------------

The VPP network stack comes with several configuration options that can be
provided either on the command line when VPP is started, or in a configuration
file. Specific applications built on the stack have been known to require a dozen
arguments, depending on requirements.

Command-line Arguments
----------------------

Parameters are grouped by a section name. When providing more than one
parameter to a section, all parameters for that section must be wrapped in
curly braces. For example, to start VPP with configuration data via the
command line with the section name *'unix'*:

.. code-block:: console

    $ sudo /usr/bin/vpp unix { interactive cli-listen 127.0.0.1:5002 }

The command line can be presented as a single string or as several; anything
given on the command line is concatenated with spaces into a single string
before parsing. VPP applications must be able to locate their own executable
images. The simplest way to ensure this will work is to invoke a VPP
application by giving its absolute path. For example:
*'/usr/bin/vpp <options>'*  At startup, VPP applications parse through their
own ELF-sections [primarily] to make lists of init, configuration, and exit
handlers.

When developing with VPP, in gdb it's often sufficient to start an application
like this:

.. code-block:: console

    (gdb) run unix interactive

Configuration File
------------------

It is also possible to supply the configuration parameters in a startup
configuration. The path of the file is provided to the VPP application on its
command line. The format of the configuration file is a simple text file with
the same content as the command line, but with the benefit of being able to use
newlines to make the content easier to read. For example:

.. code-block:: console

    $ cat /etc/vpp/startup.conf
    unix {
      nodaemon
      log /var/log/vpp/vpp.log
      full-coredump
      cli-listen localhost:5002
    }
    
    api-trace {
      on
    }
    
    dpdk {
      dev 0000:03:00.0
    }

VPP is then instructed to load this file with the -c option. For example:

.. code-block:: console

    $ sudo /usr/bin/vpp -c /etc/vpp/startup.conf

When the VPP service is started, VPP is started with this option via another
installed file, vpp.service (Ubuntu: /lib/systemd/system/vpp.service and
CentOS: /usr/lib/systemd/system/vpp.service). See *'ExecStart'* below:

.. code-block:: console

    $ cat /lib/systemd/system/vpp.service
    [Unit]
    Description=vector packet processing engine
    After=network.target
    
    [Service]
    Type=simple
    ExecStartPre=-/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api
    ExecStartPre=-/sbin/modprobe uio_pci_generic
    ExecStart=/usr/bin/vpp -c /etc/vpp/startup.conf
    ExecStopPost=/bin/rm -f /dev/shm/db /dev/shm/global_vm /dev/shm/vpe-api
    Restart=always
    
    [Install]
    WantedBy=multi-user.target


Configuration Parameters
------------------------

Below is the list of section names and their associated parameters. This is not
an exhaustive list of parameters available. The command-line argument parsers
can be found in the source code by searching for instances of the
**VLIB_CONFIG_FUNCTION** and **VLIB_EARLY_CONFIG_FUNCTION** macro.

For example, the invocation *'VLIB_CONFIG_FUNCTION (foo_config, "foo")'* will
cause the function *'foo_config'* to receive all parameters given in a
parameter block named "foo": "foo { arg1 arg2 arg3 ... }". 


List of Basic Parameters:
-------------------------

| unix_ 
| dpdk_ 
| cpu_  

List of Advanced Parameters:
----------------------------

| acl-plugin_ 
| api-queue_
| api-segment_
| api-trace_
| buffers_
| cj_
| dns_
| heapsize_
| ip_
| ip6_
| l2learn_
| l2tp_
| logging_
| mactime_
| map_
| mc_
| nat_
| oam_
| plugins_
| plugin_path_
| punt_
| session_
| socketsvr_
| stats_
| statseg_
| tapcli_
| tcp_
| tls_
| tuntap_
| vhost-user_
| vlib_

.. _unix:

"unix" Parameters
_________________

Configure VPP startup and behavior type attributes, as well and any OS based
attributes.

 * **interactive**
     Attach CLI to stdin/out and provide a debugging command line interface.
     Implies nodaemon.
     
     **Example:** interactive
     
 * **nodaemon**
     Do not fork / background the vpp process. Typical when invoking VPP
     applications from a process monitor. Set by default in the default
     *'startup.conf'* file.
     
     **Example:** nodaemon
     
 * **log <filename>**
     Logs the startup configuration and all subsequent CLI commands in filename.
     Very useful in situations where folks don't remember or can't be bothered
     to include CLI commands in bug reports. The default *'startup.conf'* file
     is to write to *'/var/log/vpp/vpp.log'*.
     
     In VPP 18.04, the default log file location was moved from '/tmp/vpp.log'
     to '/var/log/vpp/vpp.log' . The VPP code is indifferent to the file location.
     However, if SELinux is enabled, then the new location is required for the file
     to be properly labeled. Check your local *'startup.conf'* file for the log file
     location on your system.
     
     **Example:** log /var/log/vpp/vpp-debug.log
     
 * **exec|startup-config <filename>**
     Read startup operational configuration from filename. The contents of the file
     will be performed as though entered at the CLI. The two keywords are aliases
     for the same function; if both are specified, only the last will have an effect.
     The file contains CLI commands, for example:

     | $ cat /usr/share/vpp/scripts/interface-up.txt
     | set interface state TenGigabitEthernet1/0/0 up
     | set interface state TenGigabitEthernet1/0/1 up
     
     **Example:** startup-config /usr/share/vpp/scripts/interface-up.txt
     
 * **gid number|name>**
     Sets the effective group ID to the input group ID or group name of the calling
     process.
     
     **Example:** gid vpp
     
 * **full-coredump**
     Ask the Linux kernel to dump all memory-mapped address regions, instead of
     just text+data+bss.
     
     **Example:** full-coredump
     
 * **coredump-size unlimited|<n>G|<n>M|<n>K|<n>**
     Set the maximum size of the coredump file. The input value can be set in
     GB, MB, KB or bytes, or set to *'unlimited'*.
     
     **Example:** coredump-size unlimited
     
 * **cli-listen <ipaddress:port>|<socket-path>**
     Bind the CLI to listen at address localhost on TCP port 5002. This will
     accept an ipaddress:port pair or a filesystem path; in the latter case a
     local Unix socket is opened instead. The default *'startup.conf'* file
     is to open the socket *'/run/vpp/cli.sock'*.
     
     **Example:** cli-listen localhost:5002
     **Example:** cli-listen /run/vpp/cli.sock
     
 * **cli-line-mode**
     Disable character-by-character I/O on stdin. Useful when combined with,
     for example, emacs M-x gud-gdb.
     
     **Example:** cli-line-mode
     
 * **cli-prompt <string>**
     Configure the CLI prompt to be string.
     
     **Example:** cli-prompt vpp-2
     
 * **cli-history-limit <n>**
     Limit commmand history to <n> lines. A value of 0 disables command history.
     Default value: 50
     
     **Example:** cli-history-limit 100
     
 * **cli-no-banner**
     Disable the login banner on stdin and Telnet connections.
     
     **Example:** cli-no-banner
     
 * **cli-no-pager**
     Disable the output pager.
     
     **Example:** cli-no-pager
     
 * **cli-pager-buffer-limit <n>**
     Limit pager buffer to <n> lines of output. A value of 0 disables the
     pager. Default value: 100000
     
     **Example:** cli-pager-buffer-limit 5000
     
 * **runtime-dir <dir>**
     Set the runtime directory, which is the default location for certain
     files, like socket files. Default is based on User ID used to start VPP.
     Typically it is *'root'*, which defaults to *'/run/vpp/'*. Otherwise,
     defaults to *'/run/user/<uid>/vpp/'*.
     
     **Example:** runtime-dir /tmp/vpp
     
 * **poll-sleep-usec <n>**
     Add a fixed-sleep between main loop poll. Default is 0, which is not to
     sleep.
     
     **Example:** poll-sleep-usec 100
     
 * **pidfile <filename>**
     Writes the pid of the main thread in the given filename.
     
     **Example:** pidfile /run/vpp/vpp1.pid

.. _dpdk:

"dpdk" Parameters
_________________

Command line DPDK configuration controls a number of parameters, including
device whitelisting, the number of CPUs available for launching
dpdk-eal-controlled threads, the number of I/O buffers, and the process
affinity mask. In addition, the DPDK configuration function attempts to support
all of the DPDK EAL configuration parameters.

All of the DPDK EAL options should be available.
See ../src/plugins/dpdk/device/dpdk_priv.h, look at the set of
"foreach_eal_XXX" macros.

Popular options include:
 * **dev <pci-dev>**
     White-list [as in, attempt to drive] a specific PCI device. PCI-dev is a
     string of the form "DDDD:BB:SS.F" where:
     
        | DDDD = Domain
        | BB = Bus Number
        | SS = Slot number
        | F = Function
     
     This is the same format used in the linux sysfs tree (i.e.
     /sys/bus/pci/devices) for PCI device directory names.
     
     **Example:** dev 0000:02:00.0
     
 * **dev <pci-dev> { .. }**
     When whitelisting specific interfaces by specifying PCI address,
     additional custom parameters can also be specified. Valid options include:

      * **num-rx-queues <n>**
          Number of receive queues. Also enables RSS. Default value is 1.
      * **num-tx-queues <n>**
          Number of transmit queues. Default is equal to number of worker
          threads or 1 if no workers treads.
      * **num-rx-desc <n>**
          Number of descriptors in receive ring. Increasing or reducing number
          can impact performance. Default is 1024.
      * **num-rt-desc <n>**
          Number of descriptors in transmit ring. Increasing or reducing number
          can impact performance. Default is 1024.
      * **workers**
          TBD
      * **vlan-strip-offload on|off**:
          VLAN strip offload mode for interface. VLAN stripping is off by default
          for all NICs except VICs, using ENIC driver, which has VLAN stripping on
          by default.
      * **hqos**
          Enable the Hierarchical Quaity-of-Service (HQoS) scheduler, default is
          disabled. This enables HQoS on specific output interface.
      * **hqos { .. }**
          HQoS can also have its own set of custom parameters. Setting a custom
          parameter also enables HQoS.

          * **hqos-thread <n>**
              HQoS thread used by this interface. To setup a pool of threads that
              are shared by all HQoS interfaces, set via the*'cpu'* section using
              either *'corelist-hqos-threads'* or *'coremask-hqos-threads'*.

      * **rss**
          TBD
     
     **Example:**
     
                 | dev 0000:02:00.1 {
                 |    num-rx-queues 2 
                 |    num-tx-queues 2
                 | }

 * **vdev <eal-command>**
     Provide a DPDK EAL command to specify bonded Ethernet interfaces, operating
     modes and PCI addresses of slave links. Only XOR balanced (mode 2) mode is
     supported.
     
     **Example:**

                 | vdev eth_bond0,mode=2,slave=0000:0f:00.0,slave=0000:11:00.0,xmit_policy=l34
                 | vdev eth_bond1,mode=2,slave=0000:10:00.0,slave=0000:12:00.0,xmit_policy=l34

 * **num-mbufs <n>**
     Increase number of buffers allocated. May be needed in scenarios with
     large number of interfaces and worker threads, or a lot of physical
     interfaces with multiple RSS queues. Value is per CPU socket. Default is
     16384.
     
     **Example:** num-mbufs 128000

 * **no-pci**
     When VPP is started, if an interface is not owned by the linux kernel
     (interface is administratively down), VPP will attempt to manage the
     interface. *'no-pci'* indicates that VPP should not walk the PCI table
     looking for interfaces.
     
     **Example:** no-pci

 * **no-hugetlb**
     Don't use huge TLB pages. Potentially useful for running simulator images.
     
     **Example:** no-hugetlb

 * **kni <n>**
     Number of KNI interfaces. Refer to the DPDK documentation.
     
     **Example:** kni 2

 * **uio-driver uio_pci_generic|igb_uio|vfio-pci|auto**
     Change UIO driver used by VPP. Default is *'auto'*.
     
     **Example:** uio-driver igb_uio

 * **socket-mem <n>**
     Change hugepages allocation per-socket, needed only if there is need for
     larger number of mbufs. Default is 64 hugepages on each detected CPU
     socket.
     
     **Example:** socket-mem 2048,2048

**Other options include:**

 * **enable-tcp-udp-checksum**
     Enables UDP/TCP RX checksum offload.
     
     **Example:** enable-tcp-udp-checksum

 * **no-multi-seg**
     Disable mutli-segment buffers, improves performance but disables Jumbo MTU
     support.
     
     **Example:** no-multi-seg

 * **no-tx-checksum-offload**
     Disables UDP/TCP TX checksum offload. Typically needed for use faster
     vector PMDs (together with no-multi-seg).
     
     **Example:** no-tx-checksum-offload

 * **decimal-interface-names**
     Format DPDK device names with decimal, as opposed to hexadecimal. 
     
     **Example:** decimal-interface-names

 * **log-level  emergency|alert|critical|error|warning|notice|info|debug**
     Set the log level for DPDK logs. Default is *'notice'*.
     
     **Example:** log-level error

 * **dev default { .. }**
     Change default settings for all intefaces. This sections supports the
     same set of custom parameters described in *'dev <pci-dev> { .. }*'.
     
     **Example:**

                 | dev default {
                 |    num-rx-queues 3
                 |    num-tx-queues 3
                 | }

.. _cpu:

"cpu" Parameters
________________

Command-line CPU configuration controls the creation of named thread types, and
the cpu affinity thereof. In the VPP there is one main thread and optionally
the user can create worker(s). The main thread and worker thread(s) can be
pinned to CPU core(s) automatically or manually.

**Automatic Pinning:**

 * **workers <n>**
     Create <n> worker threads.
     
     **Example:** workers 4

 * **io <n>**
     Create <n> i/o threads.
     
     **Example:** io 2
 
 * **main-thread-io**
     Handle i/o devices from thread 0, hand off traffic to worker threads.
     Requires "workers <n>".
     
     **Example:** main-thread-io
 
 * **skip-cores <n>**
     Sets number of CPU core(s) to be skipped (1 ... N-1). Skipped CPU core(s)
     are not used for pinning main thread and working thread(s). The main thread
     is automatically pinned to the first available CPU core and worker(s) are
     pinned to next free CPU core(s) after core assigned to main threadLeave
     the low nn bits of the process affinity mask clear.
     
     **Example:** skip-cores 4

**Manual Pinning:**

 * **main-core <n>**
     Assign main thread to a specific core.
     
     **Example:** main-core 1
     
 * **coremask-workers <hex-mask>**
     Place worker threads according to the bitmap hex-mask.
     
     **Example:** coremask-workers 0x0000000000C0000C
     
 * **corelist-workers <list>**
     Same as coremask-workers but accepts a list of cores instead of a bitmap.
     
     **Example:** corelist-workers 2-3,18-19
     
 * **coremask-io <hex-mask>**
     Place I/O threads according to the bitmap hex-mask.
     
     **Example:** coremask-io 0x0000000003000030
     
 * **corelist-io <list>**
     Same as coremask-io but accepts a list of cores instead of a bitmap.
     
     **Example:** corelist-io 4-5,20-21
     
 * **coremask-hqos-threads <hex-mask>**
     Place HQoS threads according to the bitmap hex-mask. A HQoS thread can
     run multiple HQoS objects each associated with different output interfaces.
     
     **Example:** coremask-hqos-threads 0x000000000C0000C0

 * **corelist-hqos-threads <list>**
     Same as coremask-hqos-threads but accepts a list of cores instead of a
     bitmap.
     
     **Example:** corelist-hqos-threads 6-7,22-23

**Other:**

 * **use-pthreads**
     TBD
     
     **Example:** use-pthreads

 * **thread-prefix <prefix>**
     Set a prefix to be prepended to each thread name. The thread name already
     contains an underscore. If not provided, the default is *'vpp'*.
     Currently, prefix used on threads: *'vpp_main'*, *'vpp_stats'*
     
     **Example:** thread-prefix vpp1

 * **scheduler-policy rr|fifo|batch|idle|other**
     TBD
     
     **Example:** scheduler-policy fifo

 * **scheduler-priority <n>**
     Set the scheduler priority. Only valid if the *'scheduler-policy'* is set
     to *'fifo'* or *'rr'*. The valid ranges for the scheduler priority depends
     on the *'scheduler-policy'* and the current kernel version running. The
     range is typically 1 to 99, but see the linux man pages for *'sched'* for
     more details. If this value is not set, the current linux kernel default
     is left in place.
     
     **Example:** scheduler-priority 50

 * **<thread-name> <count>**
     Set the number of threads for a given thread (by name). Some threads, like
     *'stats'*, have a fixed number of threads and cannot be changed. List of
     possible threads include (but not limited too): hqos-threads, workers
     
     **Example:** hqos-threads 2

.. note::

    The "main" thread always occupies the lowest core-id specified in the
    DPDK [process-level] coremask.

Here's a full-bore manual placement example:

.. code-block:: console

   /usr/bin/vpp  unix interactive tuntap disable cpu { main-thread-io coremask-workers 18 coremask-stats 4 } dpdk { coremask 1e }
   
   # taskset -a -p <vpe-pid>
   pid 16251's current affinity mask: 2        # main thread
   pid 16288's current affinity mask: ffffff   # DPDK interrupt thread (not bound to a core)
   pid 16289's current affinity mask: 4        # stats thread
   pid 16290's current affinity mask: 8        # worker thread 0
   pid 16291's current affinity mask: 10       # worker thread 1


.. _acl-plugin:

"acl-plugin" Parameters
_______________________

These parameters change the configuration of the ACL (access control list) plugin,
such as how the ACL bi-hash tables are initialized.

They should only be set by those that are familiar with the interworkings of VPP
and the ACL Plugin.

The first three parameters, *connection hash buckets*, *connection hash memory*,
and *connection count max*, set the **connection table per-interface parameters**
for modifying how the two bounded-index extensible hash tables for
IPv6 (40\*8 bit key and 8\*8 bit value pairs) and IPv4
(16\*8 bit key and 8\*8 bit value pairs) **ACL plugin FA interface sessions**
are initialized.

 * **connection hash buckets <n>**
     Sets the number of hash buckets (rounded up to a power of 2) in each
     of the two bi-hash tables. Defaults to 64\*1024 (65536) hash buckets.
     
     **Example:** connection hash buckets 65536
     
 * **connection hash memory <n>**
     Sets the allocated memory size (in bytes) for each of the two bi-hash tables.
     Defaults to 1073741824 bytes.
     
     **Example:** connection hash memory 1073741824
     
 * **connection count max <n>**
     Sets the maximum number of pool elements when allocating each per-worker
     pool of sessions for both bi-hash tables. Defaults to 500000 elements in each pool.
     
     **Example:** connection count max 500000
     
 * **main heap size <n>G|<n>M|<n>K|<n>**
     Sets the size of the main memory heap that holds all the ACL module related
     allocations (other than hash.) Default size is 0, but during
     ACL heap initialization is equal to
     *per_worker_size_with_slack * tm->n_vlib_mains + bihash_size + main_slack*.
     Note that these variables are partially based on the
     **connection table per-interface parameters** mentioned above.
     
     **Example:** main heap size 3G

The next three parameters, *hash lookup heap size*, *hash lookup hash buckets*,
and *hash lookup hash memory*, modify the initialization of the bi-hash lookup
table used by the ACL plugin. This table is initialized when attempting to apply
an ACL to the existing vector of ACLs looked up during packet processing
(but it is found that the table does not exist / has not been initialized yet.)
     
 * **hash lookup heap size  <n>G|<n>M|<n>K|<n>**
     Sets the size of the memory heap that holds all the miscellaneous allocations
     related to hash-based lookups. Default size is 67108864 bytes.
     
     **Example:** hash lookup heap size 70M
     
 * **hash lookup hash buckets <n>**
     Sets the number of hash buckets (rounded up to a power of 2) in the bi-hash
     lookup table. Defaults to 65536 hash buckets.
     
     **Example:** hash lookup hash buckets 65536
     
 * **hash lookup hash memory <n>**
     Sets the allocated memory size (in bytes) for the bi-hash lookup table.
     Defaults to 67108864 bytes.
     
     **Example:** hash lookup hash memory 67108864
     
 * **use tuple merge <n>**
     Sets a boolean value indicating whether or not to use TupleMerge
     for hash ACL's. Defaults to 1 (true), meaning the default implementation
     of hashing ACL's **does use** TupleMerge.
     
     **Example:** use tuple merge 1
     
 * **tuple merge split threshold <n>**
     Sets the maximum amount of rules (ACE's) that can collide in a bi-hash
     lookup table before the table is split into two new tables. Splitting ensures
     less rule collisions by hashing colliding rules based on their common tuple
     (usually their maximum common tuple.) Splitting occurs when the
     *length of the colliding rules vector* is greater than this threshold amount.
     Defaults to a maximum of 39 rule collisions per table.
     
     **Example:** tuple merge split threshold 30
     
 * **reclassify sessions <n>**
     Sets a boolean value indicating whether or not to take the epoch of the session
     into account when dealing with re-applying ACL's or changing already applied ACL's.
     Defaults to 0 (false), meaning the default implementation **does NOT** take the
     epoch of the session into account.
     
     **Example:** reclassify sessions 1

.. _api-queue:

"api-queue" Parameters
______________________

The following parameters should only be set by those that are familiar with the
interworkings of VPP.

 * **length  <n>**
     Sets the api queue length. Minimum valid queue length is 1024, which is
     also the default.
     
     **Example:** length 2048

.. _api-segment:

"api-segment" Parameters
________________________

These values control various aspects of the binary API interface to VPP.

 * **prefix <path>**
     Sets the prefix prepended to the name used for shared memory (SHM)
     segments. The default is empty, meaning shared memory segments are created
     directly in the SHM directory *'/dev/shm'*. It is worth noting that on
     many systems *'/dev/shm'* is a symbolic link to somewhere else in the file
     system; Ubuntu links it to *'/run/shm'*.
     
     **Example:** prefix /run/shm

 * **uid <number|name>**
     Sets the user ID or name that should be used to set the ownership of the
     shared memory segments. Defaults to the same user that VPP is started
     with, probably root.

     **Example:** uid root

 * **gid <number|name>**
     Sets the group ID or name that should be used to set the ownership of the
     shared memory segments. Defaults to the same group that VPP is started
     with, probably root.
     
     **Example:** gid vpp

The following parameters should only be set by those that are familiar with the
interworkings of VPP.

 * **baseva <x>**
     Set the base address for SVM global region. If not set, on AArch64, the
     code will try to determine the base address. All other default to
     0x30000000.
     
     **Example:** baseva 0x20000000

 * **global-size <n>G|<n>M|<n>**
     Set the global memory size, memory shared across all router instances,
     packet buffers, etc. If not set, defaults to 64M. The input value can be
     set in GB, MB or bytes.
     
     **Example:** global-size 2G

 * **global-pvt-heap-size <n>M|size <n>**
     Set the size of the global VM private mheap. If not set, defaults to 128k.
     The input value can be set in MB or bytes.
     
     **Example:** global-pvt-heap-size size 262144

 * **api-pvt-heap-size <n>M|size <n>**
     Set the size of the api private mheap. If not set, defaults to 128k.
     The input value can be set in MB or bytes.
     
     **Example:** api-pvt-heap-size 1M

 * **api-size <n>M|<n>G|<n>**
     Set the size of the API region. If not set, defaults to 16M. The input
     value can be set in GB, MB or bytes.
     
     **Example:** api-size 64M

.. _api-trace:

"api-trace" Parameters
______________________

The ability to trace, dump, and replay control-plane API traces makes all the
difference in the world when trying to understand what the control-plane has
tried to ask the forwarding-plane to do.

 * **on|enable**
     Enable API trace capture from the beginning of time, and arrange for a
     post-mortem dump of the API trace if the application terminates abnormally.
     By default, the (circular) trace buffer will be configured to capture
     256K traces. The default *'startup.conf'* file has trace enabled by default,
     and unless there is a very strong reason, it should remain enabled.
     
     **Example:** on

 * **nitems <n>**
     Configure the circular trace buffer to contain the last <n> entries. By
     default, the trace buffer captures the last 256K API messages received.
     
     **Example:** nitems 524288

 * **save-api-table <filename>**
     Dumps the API message table to /tmp/<filename>.
     
     **Example:** save-api-table apiTrace-07-04.txt

Typically, one simply enables the API message trace scheme:

     api-trace { on }

.. _buffers:

"buffers" Parameters
____________________

Command line Buffer configuration controls buffer management.

 * **memory-size-in-mb <n>**
     Configure the memory size used for buffers. If not set, VPP defaults
     to 32MB.
     
     **Example:** memory-size-in-mb 64


.. _cj:

"cj" Parameters
_______________

The circular journal (CJ) thread-safe circular log buffer scheme is
occasionally useful when chasing bugs. Calls to it should not be checked in.
See .../vlib/vlib/unix/cj.c. The circular journal is disables by default.
When enabled, the number of records must be provided, there is no default
value.

 * **records <n>**
     Configure the number of circular journal records in the circular buffer.
     The number of records should be a power of 2.
     
     **Example:** records 131072

 * **on**
     Turns on logging at the earliest possible moment.
     
     **Example:** on

.. _dns:

"dns" Parameters
________________

 * **max-cache-size <n>**
     Set the maximum number of active elements allowed in the pool of
     dns cache entries. When resolving an expired entry or adding a new
     static entry and the max number of active entries is reached,
     a random, non-static entry is deleted. Defaults to 65535 entries.
     
     **Example:** max-cache-size 65535
     
 * **max-ttl <n>**
     Currently not implemented. Defaults to 86400 seconds (24 hours.)
     
     **Example:** max-ttl 86400

.. _heapsize:

"heapsize" Parameters
_____________________

Heapsize configuration controls the size of the main heap. The heap size is
configured very early in the boot sequence, before loading plug-ins or doing
much of anything else.

 * **heapsize <n>M|<n>G**
     Specifies the size of the heap in MB or GB. The default is 1GB. Setting the
     main heap size to 4GB or more requires recompilation of the entire system
     with CLIB_VEC64 > 0. See .../clib/clib/vec_bootstrap.h.
     
     **Example:** heapsize 2G

.. _ip:

"ip" Parameters
_______________

IPv4 heap configuration. he heap size is configured very early in the boot
sequence, before loading plug-ins or doing much of anything else.

 * **heap-size <n>G|<n>M|<n>K|<n>**
     Set the IPv4 mtrie heap size, which is the amount of memory dedicated to
     the destination IP lookup table. The input value can be set in GB, MB, KB
     or bytes. The default value is 32MB.
     
     **Example:** heap-size 64M

.. _ip6:

"ip6" Parameters
________________

IPv6 heap configuration. he heap size is configured very early in the boot
sequence, before loading plug-ins or doing much of anything else.


 * **heap-size <n>G|<n>M|<n>K|<n>**
     Set the IPv6 forwarding table heap size. The input value can be set in GB,
     MB, KB or bytes. The default value is 32MB.
     
     **Example:** heap-size 64M
     
 * **hash-buckets <n>**
     Set the number of IPv6 forwarding table hash buckets. The default value is
     64K (65536).
     
     **Example:** hash-buckets 131072

.. _l2learn:

"l2learn" Parameters
____________________

Configure Layer 2 MAC Address learning parameters.

 * **limit <n>**
     Configures the number of L2 (MAC) addresses in the L2 FIB at any one time,
     which limits the size of the L2 FIB to <n> concurrent entries.  Defaults to
     4M entries (4194304).
     
     **Example:** limit 8388608

.. _l2tp:

"l2tp" Parameters
_________________

IPv6 Layer 2 Tunnelling Protocol Version 3 (IPv6-L2TPv3) configuration controls
the method used to locate a specific IPv6-L2TPv3 tunnel. The following settings
are mutually exclusive:

 * **lookup-v6-src**
     Lookup tunnel by IPv6 source address.
     
     **Example:** lookup-v6-src
     
 * **lookup-v6-dst**
     Lookup tunnel by IPv6 destination address.
     
     **Example:** lookup-v6-dst
     
 * **lookup-session-id**
     Lookup tunnel by L2TPv3 session identifier.
     
     **Example:** lookup-session-id

.. _logging:

"logging" Parameters
____________________

 * **size <n>**
     TBD
     
     **Example:** TBD
     
 * **unthrottle-time <n>**
     TBD
     
     **Example:** TBD
     
 * **default-log-level emerg|alertcrit|err|warn|notice|info|debug|disabled**
     TBD
     
     **Example:** TBD
     
 * **default-syslog-log-level emerg|alertcrit|err|warn|notice|info|debug|disabled**
     TBD
     
     **Example:** TBD

.. _mactime:

"mactime" Parameters
____________________

 * **lookup-table-buckets <n>**
     Sets the number of hash buckets in the mactime bi-hash lookup table.
     Defaults to 128 buckets.
     
     **Example:** lookup-table-buckets 128
     
 * **lookup-table-memory <n>G|<n>M|<n>K|<n>**
     Sets the allocated memory size (in bytes) for the mactime bi-hash lookup table.
     The input value can be set in GB, MB, KB or bytes. The default value is 262144
     (256 << 10) bytes or roughly 256KB.
     
     **Example:** lookup-table-memory 300K
     
 * **timezone_offset <n>**
     Sets the timezone offset from UTC. Defaults to an offset of -5 hours
     from UTC (US EST / EDT.)
     
     **Example:** timezone_offset -5

.. _map:

"map" Parameters
________________

 * **customer edge**
     Sets a boolean true to indicate that the MAP node is a Customer Edge (CE)
     router. The boolean defaults to false, meaning the MAP node is not treated
     as a CE router.
     
     **Example:** customer edge

.. _mc:

"mc" Parameters
_______________

MC Test Process.

 * **interface <name>**
     TBD
     
     **Example:** TBD
     
 * **n-bytes <n>**
     TBD
     
     **Example:** TBD
     
 * **max-n-bytes <n>**
     TBD
     
     **Example:** TBD
     
 * **min-n-bytes <n>**
     TBD
     
     **Example:** TBD
     
 * **seed <n>**
     TBD
     
     **Example:** TBD
     
 * **window <n>**
     TBD
     
     **Example:** TBD
     
 * **verbose**
     TBD
     
     **Example:** verbose
     
 * **no-validate**
     TBD
     
     **Example:** no-validate
     
 * **min-delay <n.n>**
     TBD
     
     **Example:** TBD
     
 * **max-delay <n.n>**
     TBD
     
     **Example:** TBD
     
 * **no-delay**
     TBD
     
     **Example:** no-delay
     
 * **n-packets <n.n>**
     TBD
     
     **Example:** TBD

.. _nat:


"nat" Parameters
________________

These parameters change the configuration of the NAT (Network address translation)
plugin, such as how the NAT & NAT64 bi-hash tables are initialized, if the NAT is
endpoint dependent, or if the NAT is deterministic.

For each NAT per thread data, the following 4 parameters change how certain
bi-hash tables are initialized.

 * **translation hash buckets <n>**
     Sets the number of hash buckets in each of the two in/out NAT bi-hash lookup
     tables. Defaults to 1024 buckets.

     If the NAT is indicated to be endpoint dependent, which can be set with the
     :ref:`endpoint-dependent parameter <endpointLabel>`, then this parameter sets
     the number of hash buckets in each of the two endpoint dependent sessions
     NAT bi-hash lookup tables.
     
     **Example:** translation hash buckets 1024
     
 * **translation hash memory <n>**
     Sets the allocated memory size (in bytes) for each of the two in/out NAT
     bi-hash tables. Defaults to 134217728 (128 << 20) bytes, which is roughly 128 MB.

     If the NAT is indicated to be endpoint dependent, which can be set with the
     :ref:`endpoint-dependent parameter <endpointLabel>`, then this parameter sets the
     allocated memory size for each of the two endpoint dependent sessions NAT bi-hash
     lookup tables.
     
     **Example:** translation hash memory 134217728
     
 * **user hash buckets <n>**
     Sets the number of hash buckets in the user bi-hash lookup table
     (src address lookup for a user.) Defaults to 128 buckets.
     
     **Example:** user hash buckets 128
     
 * **user hash memory <n>**
     Sets the allocated memory size (in bytes) for the user bi-hash lookup table
     (src address lookup for a user.) Defaults to 67108864 (64 << 20) bytes,
     which is roughly 64 MB.
     
     **Example:** user hash memory 67108864
     
 * **max translations per user <n>**
     Sets the maximum amount of dynamic and/or static NAT sessions each user can have.
     Defaults to 100. When this limit is reached, the least recently used translation
     is recycled.
     
     **Example:** max translations per user 50
     
 * **outside VRF id <n>**
     TBD
     
     **Example:** TBD
     
 * **outside ip6 VRF id <n>**
     TBD
     
     **Example:** TBD
     
 * **inside VRF id <n>**
     TBD
     
     **Example:** TBD
     
 * **inside VRF id <n>**
     TBD
     
     **Example:** TBD
     
 * **static mapping only**
     TBD
     
     **Example:** static mapping only
     
 * **connection tracking**
     TBD
     
     **Example:** connection tracking
     
 * **deterministic**
     Sets a boolean value to 1 indicating that the NAT is deterministic. Defaults to 0,
     meaning the NAT is not deterministic.
     
     **Example:** deterministic
     
 * **nat64 bib hash buckets <n>**
     Sets the number of hash buckets in each of the two in/out NAT64 BIB bi-hash
     tables. Defaults to 1024 buckets.
     
     **Example:** nat64 bib hash buckets 1024
     
 * **nat64 bib hash memory <n>**
     Sets the allocated memory size (in bytes) for each of the two in/out NAT64
     BIB bi-hash tables. Defaults to 134217728 (128 << 20) bytes,
     which is roughly 128 MB.
     
     **Example:** nat64 bib hash memory 134217728
     
 * **nat64 st hash buckets <n>**
     Sets the number of hash buckets in each of the two in/out NAT64 session table
     bi-hash tables. Defaults to 2048 buckets.
     
     **Example:** nat64 st hash buckets 2048
     
 * **nat64 st hash memory <n>**
     Sets the allocated memory size (in bytes) for each of the two in/out NAT64 session
     table bi-hash tables. Defaults to 268435456 (256 << 20) bytes, which is roughly
     256 MB.
     
     **Example:** nat64 st hash memory 268435456
     
 * **out2in dpo**
     TBD
     
     **Example:** out2in dpo
     
 * **dslite ce**
     TBD
     
     **Example:** dslite ce
     
.. _endpointLabel:

 * **endpoint-dependent**
     Sets a boolean value to 1, indicating that the NAT is endpoint dependent.
     Defaults to 0, meaning the NAT is not endpoint dependent.
     
     **Example:** endpoint-dependent

.. _oam:

"oam" Parameters
________________

OAM configuration controls the (ip4-icmp) interval, and number of misses
allowed before reporting an oam target down to any registered listener.

 * **interval <n.n>**
     Interval, floating-point seconds, between sending OAM IPv4 ICMP messages.
     Default is 2.04 seconds.
     
     **Example:** interval 3.5
     
 * **misses-allowed <n>**
     Number of misses before declaring an OAM target down. Default is 3 misses.
     
     **Example:** misses-allowed 5

.. _plugins:

"plugins" Parameters
____________________

A plugin can be disabled by default. It may still be in an experimental phase
or only be needed in special circumstances. If this is the case, the plugin can
be explicitely enabled in *'startup.conf'*. Also, a plugin that is enabled by
default can be explicitely disabled in *'startup.conf'*.

Another useful use of this section is to disable all the plugins, then enable
only the plugins that are desired.

 * **path <path>**
     Adjust the plugin path depending on where the VPP plugins are installed.
     
     **Example:** path /home/bms/vpp/build-root/install-vpp-native/vpp/lib64/vpp_plugins
     
 * **name-filter <filter-name>**
     TBD
     
     **Example:** TBD
     
 * **vat-path <path>**
     TBD
     
     **Example:** TBD
     
 * **vat-name-filter <filter-name>**
     TBD
     
     **Example:** TBD
     
 * **plugin <plugin.so> { .. }**
     Configure parameters for a given plugin. Valid parameters are as follows: 

      * **enable**
          Enable the given plugin.
      * **disable**
          Disable the given plugin.
      * **skip-version-check**
          In the plugin registration, if *'.version_required'* is set, the
          plugin will not be loaded if there is version mismatch between
          plugin and VPP. This can be bypassed by setting "skip-version-check"
          for specific plugin.
     
     **Example:** plugin ila_plugin.so { enable skip-version-check }
     
 * **plugin default { .. }**
     Set the default behavior for all plugins. Valid parameters are as follows:
     
       * **disable**
          Disable all plugins.
     
     **Example:**
               | plugin default { disable }
               | plugin dpdk_plugin.so { enable }
               | plugin acl_plugin.so { enable }

.. _plugin_path:

"plugin_path" Parameters
________________________

Alternate syntax to choose plugin path. Plugin_path configuration controls the
set of directories searched for vlib plugins. Supply a colon-separated list of
(absolute) directory names: plugin_path dir1:dir2:...:dirN

    **Example:** plugin_path /home/bms/vpp/build-root/install-vpp-native/vpp/lib64/vpp_plugins

.. _punt:

"punt" Parameters
_________________

Configuration parameters for the local TCP/IP stack punt infrastructure.

 * **socket <path>**
     The filesystem pathname of a bound UNIX domain socket to be used with punt.
     
     **Example:** TBD

.. _session:

"session" Parameters
____________________

 * **event-queue-length <n>**
     TBD
     
     **Example:** TBD
     
 * **preallocated-sessions <n>**
     TBD
     
     **Example:** TBD
     
 * **v4-session-table-buckets <n>**
     TBD
     
     **Example:** TBD
     
 * **v4-halfopen-table-buckets <n>**
     TBD
     
     **Example:** TBD
     
 * **v6-session-table-buckets <n>**
     TBD
     
     **Example:** TBD
     
 * **v6-halfopen-table-buckets <n>**
     TBD
     
     **Example:** TBD
     
 * **v4-session-table-memory <n>G|<n>M|<n>K|<n>**
     TBD
     The input value can be set in GB, MB, KB or bytes.
     
     **Example:** TBD
     
 * **v4-halfopen-table-memory <n>G|<n>M|<n>K|<n>**
     TBD
     The input value can be set in GB, MB, KB or bytes.
     
     **Example:** TBD
     
 * **v6-session-table-memory <n>G|<n>M|<n>K|<n>**
     TBD
     The input value can be set in GB, MB, KB or bytes.
     
     **Example:** TBD
     
 * **v6-halfopen-table-memory <n>G|<n>M|<n>K|<n>**
     TBD
     The input value can be set in GB, MB, KB or bytes.
     
     **Example:** TBD
     
 * **local-endpoints-table-memory <n>G|<n>M|<n>K|<n>**
     TBD
     The input value can be set in GB, MB, KB or bytes.
     
     **Example:** TBD
     
 * **local-endpoints-table-buckets <n>**
     TBD
     
     **Example:** TBD
     
 * **evt_qs_memfd_seg**
     TBD
     
     **Example:** evt_qs_memfd_seg

.. _socketsvr:

"socketsvr" Parameters
______________________

Create a socket server for API server (.../vlibmemory/socksvr_vlib.c.).
If not set, API server doesn't run.

 * **socket-name <filename>**
     Configure API socket filename.
     
     **Example:** socket-name /run/vpp/vpp-api.sock
     
 * **default**
     Use the default API socket (/run/vpp-api.sock).
     
     **Example:** default

.. _stats:

"stats" Parameters
__________________

Create a socket server for *'stats'* poller. If not set, 'stats'* poller
doesn't run.

 * **socket-name <filename>**
     Configure *'stats'* socket filename.
     
     **Example:** socket-name /run/vpp/stats.sock
     
 * **default**
     Use the default *'stats'* socket (/run/vpp/stats.sock).
     
     **Example:** default

.. _statseg:

"statseg" Parameters
____________________

 * **size <n>G|<n>M|<n>K|<n>**
     Sets the size of the memory mapped stats segment object *stat_segment*.
     The input value can be set in GB, MB, KB or bytes. Defaults to 33554432
     (32 << 20) bytes or roughly 32 MB.
     
     **Example:** size 32M
     
.. _tapcli:     

"tapcli" Parameters
___________________

Configuration parameters for TAPCLI (dynamic tap interface hookup.)

 * **mtu <n>**
     Sets interface MTU (maximum transmission unit) size in bytes. This size
     is also related to the number of MTU buffers. Defaults to 1500 bytes.
     
     **Example:** mtu 1500
     
 * **disable**
     Disables TAPCLI. Default is that TAPCLI is enabled.
     
     **Example:** disable

.. _tcp:

"tcp" Parameters
________________

Configuration parameters for TCP host stack utilities. The following
preallocation parameters are related to the initialization of fixed-size,
preallocation pools.

 * **preallocated-connections <n>**
     Sets the number of preallocated TCP connections. Defaults to 0.
     The preallocated connections per thread is related to this value,
     equal to (preallocated_connections / (num_threads - 1)).
     
     **Example:** preallocated-connections 5
     
 * **preallocated-half-open-connections <n>**
     Sets the number of preallocated TCP half-open connections. Defaults to 0.
     
     **Example:** preallocated-half-open-connections 5
     
 * **buffer-fail-fraction <n.n>**
     Sets the TCP buffer fail fraction (a float) used for fault-injection
     when debugging TCP buffer allocation. Its use is found in *tcp_debug.h*.
     Defaults to 0.0.
     
     **Example:** buffer-fail-fraction 0.0

.. _tls:

"tls" Parameters
________________

Configures TLS parameters, such as enabling the use of test certificates.
These parameters affect the tlsmbedtls and tlsopenssl plugins.

 * **use-test-cert-in-ca**
     Sets a boolean value to 1 to indicate during the initialization of a
     TLS CA chain to attempt to parse and add test certificates to the chain.
     Defaults to 0, meaning test certificates are not used.
     
     **Example:** use-test-cert-in-ca
     
 * **ca-cert-path <filename>**
     Sets the filename path of the location of TLS CA certificates, used when
     initializing and loading TLS CA certificates during the initialization
     of a TLS CA chain. If not set, the default filename path is
     */etc/ssl/certs/ca-certificates.crt*.
     
     **Example:** ca-cert-path /etc/ssl/certs/ca-certificates.crt

.. _tuntap:

"tuntap" Parameters
___________________

The "tuntap" driver configures a point-to-point interface between the vpp
engine and the local Linux kernel stack. This allows e.g. users to ssh to the
host | VM | container via vpp "revenue" interfaces. It's marginally useful, and
is currently disabled by default. To [dynamically] create TAP interfaces - the
preferred scheme - see the "tap_connect" binary API. The Linux network stack
"vnet" interface needs to manually configure, and VLAN and other settings if
desired.

 * **enable|disable**
     Enable or disable the tun/tap driver. 
     
     **Example:** enable
     
 * **ethernet|ether**
     Create a tap device (ethernet MAC) instead of a tun device (point-to-point
     tunnel). The two keywords are aliases for the same function.
     
     **Example:** ethernet
     
 * **have-normal-interface|have-normal**
     Treat the host Linux stack as a routing peer instead of programming VPP
     interface L3 addresses onto the tun/tap devices. The two keywords are
     aliases for the same function.
     
     **Example:** have-normal-interface
     
 * **name <name>**
     Assign name to the tun/tap device.
     
     **Example:** name vpp1

Here's a typical multiple parameter invocation:

     | tuntap { ethernet have-normal-interface name vpp1 }

.. _vhost-user:

"vhost-user" Parameters
_______________________

Vhost-user configuration parameters control the vhost-user driver.

 * **coalesce-frames <n>**
     Subject to deadline-timer expiration - see next item - attempt to transmit
     at least <n> packet frames. Default is 32 frames.
     
     **Example:** coalesce-frames 64
     
 * **coalesce-time <seconds>**
     Hold packets no longer than (floating-point) seconds before transmitting
     them. Default is 0.001 seconds
     
     **Example:** coalesce-time 0.002
     
 * **dont-dump-memory**
     vhost-user shared-memory segments can add up to a large amount of memory, so
     it's handy to avoid adding them to corefiles when using a significant number
     of such interfaces.
     
     **Example:** dont-dump-memory

.. _vlib:

"vlib" Parameters
_________________

These parameters configure VLIB, such as allowing you to choose whether to
enable memory traceback or a post-mortem elog dump.

 * **memory-trace**
     Enables memory trace (mheap traceback.) Defaults to 0, meaning memory
     trace is disabled.
     
     **Example:** memory-trace
     
 * **elog-events <n>**
     Sets the number of elements/events (the size) of the event ring
     (a circular buffer of events.) This number rounds to a power of 2.
     Defaults to 131072 (128 << 10) elements.
     
     **Example:** elog-events 4096
     
 * **elog-post-mortem-dump**
     Enables the attempt of a post-mortem elog dump to
     */tmp/elog_post_mortem.<PID_OF_CALLING_PROCESS>* if os_panic or
     os_exit is called.
     
     **Example:** elog-post-mortem-dump
 
