aboutsummaryrefslogtreecommitdiffstats
path: root/docs/interfacing
diff options
context:
space:
mode:
authorBence Romsics <bence.romsics@gmail.com>2024-08-07 10:55:39 +0200
committerDave Wallace <dwallacelf@gmail.com>2024-11-27 02:52:26 +0000
commitc2fa5a8c57b3a6de105dcbe46b35007220e94308 (patch)
treec481717d95e5c4c2fc65dd7b08c582899cabc535 /docs/interfacing
parent3835a8fb111a60cebb681109319c6705883524bd (diff)
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>
Diffstat (limited to 'docs/interfacing')
-rw-r--r--docs/interfacing/vat2/index.rst191
1 files changed, 191 insertions, 0 deletions
diff --git a/docs/interfacing/vat2/index.rst b/docs/interfacing/vat2/index.rst
new file mode 100644
index 00000000000..854a114e8be
--- /dev/null
+++ b/docs/interfacing/vat2/index.rst
@@ -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": ""}'