.. _cli_getting_started:

Getting Started with the debug CLI
==================================

The VPP network stack comes equipped with a set of commands that are useful
for debugging.

The easiest way to access the CLI (with proper permissions) is to use the
vppctl command:

.. code-block:: console

    sudo vppctl <cli-command>


The CLI parser matches static keyword strings, eventually invoking an action
function. Unambiguous partial keyword matching always occurs. The action
functions consume input until satisfied or until they fail. This model makes
for easy coding, but does not guarantee useful "help" output. It's up to the
CLI command writer to add useful help strings.

You can find the source code of CLI commands by searching for instances of the
``VLIB_CLI_COMMAND`` macro in the code source files.

Please help maintain and improve this document to make and keep these commands
clear and useful!

.. _debug_telnet_cli:

Debug and Telnet CLI
--------------------

The debug CLI is enabled with the unix interactive parameter or startup
configuration option. This causes VPP to start without daemonizing and
presents a command line interface on the terminal where it is run.

The Telnet CLI is enabled with the ``cli-listen localhost:5002`` option which
will cause VPP to listen for TCP connections on the localhost address port
``5002``. A Telnet client can then connect to this port (for example, ``telnet
localhost 5002``) and will receive a command line prompt.

This configuration will enable both mechanisms:

.. code-block:: console

    unix {
      interactive
      cli-listen localhost:5002
    }


The debug CLI can operate in line mode, which may be useful when running
inside an IDE like Emacs. This is enabled with the option
``unix cli-line-mode``. Several other options exist that alter how this
CLI works, see the @ref syscfg section for details.

The CLI starts with a banner graphic (which can be disabled) and a prompt. The
prompt will typically read ``vpp`` for a release version of VPP and ``DBGvpp#``
for a development version with debugging enabled, for example:

.. code-block:: console

        _______    _        _   _____  ___
     __/ __/ _ \  (_)__    | | / / _ \/ _ \
     _/ _// // / / / _ \   | |/ / ___/ ___/
     /_/ /____(_)_/\___/   |___/_/  /_/

    vpp#



versus:

.. code-block:: console

        _______    _        _   _____  ___
     __/ __/ _ \  (_)__    | | / / _ \/ _ \
     _/ _// // / / / _ \   | |/ / ___/ ___/
     /_/ /____(_)_/\___/   |___/_/  /_/

    DBGvpp#


This prompt can be configured with the ``unix cli-prompt`` setting and the
banner is disabled with ``unix cli-no-banner``.

.. _cli_features:

CLI features
------------

The CLI has several editing features that make it easy to use.

- Cursor keys ``left/right`` will move the cursor within a command line;
  typing will insert at the cursor; erase will erase at the cursor.

- ``Ctrl-left/right`` will search for the start of the next word to
  the left or right.
- ``Home/end`` will jump the cursor to the start and end of the line.
- Cursor keys up/down and ``^P/^N`` iterate through the command history
  buffer. Lines from the history buffer may be edited. New commands
  are added to the end of the buffer when executed; though
  duplicates of the previous command are not added.
- ``^U`` erases the line contents from the left of the cursor to the
  start.
- ``^K`` erases the contents from the cursor to the end.
- ``^S/^R`` will search the command history forwards or in reverse for
  a command; start typing for matches to auto complete.
- ``^L`` will clear the screen (if supported by the terminal) and repaint
  the prompt and any current line. The cursor position is also
  retained.
- The CLI can be closed with the quit command. Alternatively, ``^D`` on
  an empty input line will also close the session. Closing the debug
  session will also shutdown VPP.

Output that exceeds the length of a terminal page will be buffered, up to a
limit.

- ``Space`` or ``page-down`` displays the next page.
- ``Enter`` or ``down-arrow`` displays the next line.
- ``Page-up`` goes back a page.
- ``Up-arrow`` goes up a line.
- ``Home/end`` jump to the start/end of the buffered output.
- The key ``q`` quits the pager. ``Space`` and ``enter`` will also quit the
  pager if the end of the buffer has been reached.