vat2: docs

Add a bit of documentation for vat2 - mostly through examples.

Type: docs
Change-Id: I1a95047b2bd33522f562c9c1a6a7e9e639ab1a47
Signed-off-by: Bence Romsics <bence.romsics@gmail.com>
This commit is contained in:
Bence Romsics 2024-08-07 10:55:39 +02:00 committed by Dave Wallace
parent 3835a8fb11
commit c2fa5a8c57
2 changed files with 192 additions and 0 deletions

View File

@ -96,6 +96,7 @@ For more details click on the links below or press next.
interfacing/go/index
interfacing/rust/index
interfacing/libmemif/index
interfacing/vat2/index

View File

@ -0,0 +1,191 @@
.. _vat2:
====
VAT2
====
VAT2 is a CLI tool to exercise VPP's :ref:`binary API <vpp_binapi>`
via shared memory mainly for testing purposes.
History
-------
It evolved from ``vpp_api_test``, see its history in:
* `the original vat2 RFC <https://lists.fd.io/g/vpp-dev/message/18092>`_
* `vat2 discussion on the vpp-dev mailing list <https://lists.fd.io/g/vpp-dev/search?d=0&ev=0&p=Created,,vat2,20,2,0,0&ct=1>`_
* `vat2 code changes <https://gerrit.fd.io/r/q/project:vpp+message:vat2>`_
Installation
------------
When distributed in binary packages it is installed from the ``vpp`` package.
It is available since VPP `release v21.01 <https://docs.fd.io/vpp/24.10/aboutvpp/releasenotes/v21.01.html>`_.
Usage examples
--------------
Here are a few working examples to get you started.
If you started ``vpp`` with an api-segment prefix,
you must use the same prefix with ``vat2`` also:
.. code-block:: console
# vpp "api-segment { prefix vpp0 } unix { cli-listen /run/vpp/cli-vpp0.sock log /var/log/vpp/vpp0.log } api-trace { on } statseg { socket-name /run/vpp/statseg-vpp0.sock }"
# vat2 --prefix vpp0 show_version '{}'
But let's stick to not having a prefix.
The simplest call to print VPP's version.
``-d`` prints debug information:
.. code-block:: console
# kill $( pgrep vpp )
# vpp "unix { cli-listen /run/vpp/cli-vpp0.sock log /var/log/vpp/vpp0.log } api-trace { on } statseg { socket-name /run/vpp/statseg-vpp0.sock }"
# vat2 -d show_version '{}'
debug = 1, filename = (null), template = (null), shared memory prefix: (null)
Non-option argument show_version
Non-option argument {}
Plugin Path /usr/lib/x86_64-linux-gnu/vat2_plugins
Opening path: /usr/lib/x86_64-linux-gnu/vat2_plugins
Loaded 138 plugins
{
"_msgname": "show_version_reply",
"_crc": "c919bde1",
"retval": 0,
"program": "vpe",
"version": "24.06.0-2~gcd30ea1dd~b19",
"build_date": "2024-07-31T17:57:13",
"build_directory": "/w/workspace/vpp-merge-2406-ubuntu2204-x86_64"
}
Make ``vat2`` print the API messages it knows:
.. code-block:: console
# vat2 --dump-apis | sort
abf_itf_attach_add_del
abf_itf_attach_dump
abf_plugin_get_version
abf_policy_add_del
abf_policy_dump
acl_add_replace
acl_del
acl_dump
acl_interface_add_del
acl_interface_etype_whitelist_dump
[snip]
The equivalent of ``vppctl create host-interface``.
First create a Linux interface for the sake of this exercise:
.. code-block:: console
# ip link add dummy0 type dummy
# ip link set up dev dummy0
# ip link show dev dummy0
8545: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/ether be:38:84:29:27:0b brd ff:ff:ff:ff:ff:ff
``vat2`` can print a message format sample for each API message.
Save and edit it.
``vat2`` does not know which parameter is optional, it expects all parameters.
Use VPP's API documentation and source code and domain specific knowledge to
understand which parameter values and combinations are valid.
.. code-block:: console
# vat2 -t af_packet_create_v3 > af_packet_create_v3.json
# vi af_packet_create_v3.json
{
"_msgname": "af_packet_create_v3",
"_crc": "b3a809d4",
"mode": "AF_PACKET_API_MODE_ETHERNET",
"hw_addr": "be:38:84:29:27:0b",
"use_random_hw_addr": false,
"host_if_name": "dummy0",
"rx_frame_size": 2048,
"tx_frame_size": 2048,
"rx_frames_per_block": 32,
"tx_frames_per_block": 32,
"flags": "AF_PACKET_API_FLAG_VERSION_2",
"num_rx_queues": 1,
"num_tx_queues": 1
}
Create the host-interface:
.. code-block:: console
# vat2 af_packet_create_v3 "$( cat af_packet_create_v3.json )"
{
"_msgname": "af_packet_create_v3_reply",
"_crc": "5383d31f",
"retval": 0,
"sw_if_index": 1
}
Use VPP's source code to interpret error return values.
Dump a table of interface names and indexes:
.. code-block:: console
# vat2 sw_interface_dump '{"sw_if_index": -1, "name_filter_valid": 0, "name_filter": ""}' | jq -r '.[] | .sw_if_index, .interface_name' | paste - -
0 local0
1 host-dummy0
Set interface MTU:
.. code-block:: console
# vat2 sw_interface_set_mtu '{"sw_if_index": 1, "mtu": [1500, 1500, 1500, 1500]}'
{
"_msgname": "sw_interface_set_mtu_reply",
"_crc": "e8d4e804",
"retval": 0
}
Since ``vat2`` uses VPP's binary API, its calls can be traced:
.. code-block:: console
# vppctl -s /run/vpp/cli-vpp0.sock api trace dump | tail
sw_if_index: 4294967295
name_filter_valid: 0
name_filter:
vl_api_control_ping_t:
vl_api_sw_interface_set_mtu_t:
sw_if_index: 1
mtu: 1500
mtu: 1500
mtu: 1500
mtu: 1500
A few more examples compiled from
`the vpp-dev mailig list archives <https://lists.fd.io/g/vpp-dev>`_:
Add an ACL with a rule (see also
`mailing list topic "vat2 crashes when passing array in json body" <https://lists.fd.io/g/vpp-dev/topic/105688147#msg24323>`_
and
`this bugfix <https://gerrit.fd.io/r/c/vpp/+/40825>`_
):
.. code-block:: console
# vat2 acl_add_replace '{"acl_index": -1, "tag": "", "count": 1, "r": [{"is_permit": "ACL_ACTION_API_PERMIT", "src_prefix": "0.0.0.0/0", "dst_prefix": "0.0.0.0/0", "proto": "IP_API_PROTO_HOPOPT", "srcport_or_icmptype_first": 0, "srcport_or_icmptype_last": 0, "dstport_or_icmpcode_first": 0, "dstport_or_icmpcode_last": 0, "tcp_flags_mask": 0, "tcp_flags_value": 0, "ips_profile": 0, "log": 0, "policy_id": 0}]}'
{
"_msgname": "acl_add_replace_reply",
"_crc": "ac407b0c",
"acl_index": 0,
"retval": 0
}
Add a NAT mapping (see
`mailing list topic "vat2 nat44_add_del_static_mapping does not handle flags correctly" <https://lists.fd.io/g/vpp-dev/topic/107138143#msg24711>`_
about possibly invalid flags):
.. code-block:: console
# vat2 nat44_add_del_static_mapping '{"is_add": true, "flags": "NAT_IS_OUT2IN_ONLY", "local_ip_address": "10.0.0.10", "external_ip_address": "77.0.0.1", "external_sw_if_index": -1, "local_port": 0, "external_port": 0, "vrf_id": 0, "protocol": 0, "tag": ""}'