From 7858d6e9e2e3aa118638676a202e600fc9668986 Mon Sep 17 00:00:00 2001 From: Nathan Skrzypczak Date: Mon, 29 Jul 2019 13:51:31 +0200 Subject: [PATCH] docs: Add more quic plugin documentation Type: docs Change-Id: I0209769f73a46ddad7c2625ad0f774ee2eef43dd Signed-off-by: Nathan Skrzypczak --- docs/_images/quic_plugin_datastructures.png | Bin 0 -> 46525 bytes docs/_images/quic_plugin_echo_flow.png | Bin 0 -> 43106 bytes docs/gettingstarted/developers/index.rst | 1 + docs/gettingstarted/developers/quic_plugin.rst | 1 + src/plugins/quic/quic_doc.md | 38 -------- src/plugins/quic/quic_plugin.rst | 127 +++++++++++++++++++++++++ 6 files changed, 129 insertions(+), 38 deletions(-) create mode 100644 docs/_images/quic_plugin_datastructures.png create mode 100644 docs/_images/quic_plugin_echo_flow.png create mode 120000 docs/gettingstarted/developers/quic_plugin.rst delete mode 100644 src/plugins/quic/quic_doc.md create mode 100644 src/plugins/quic/quic_plugin.rst diff --git a/docs/_images/quic_plugin_datastructures.png b/docs/_images/quic_plugin_datastructures.png new file mode 100644 index 0000000000000000000000000000000000000000..00bd3ff642e40a305aa401651e7ef06a5b8f0a46 GIT binary patch literal 46525 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

*-P8q|2SeA*Vl6+f81)>YPM&#>?44$7>1I^EK$c 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

{hv_CaNws2&)RmuceqrYGY8m4bm_5@JNSw*dN=$ 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 BD<=Q| literal 0 HcmV?d00001 diff --git a/docs/gettingstarted/developers/index.rst b/docs/gettingstarted/developers/index.rst index fe265786e24..2d27da99ba8 100644 --- a/docs/gettingstarted/developers/index.rst +++ b/docs/gettingstarted/developers/index.rst @@ -39,3 +39,4 @@ The Developers section covers the following areas: fib20/index.rst buildwireshark punt + quic_plugin diff --git a/docs/gettingstarted/developers/quic_plugin.rst b/docs/gettingstarted/developers/quic_plugin.rst new file mode 120000 index 00000000000..ffe53429571 --- /dev/null +++ b/docs/gettingstarted/developers/quic_plugin.rst @@ -0,0 +1 @@ +../../../src/plugins/quic/quic_plugin.rst \ No newline at end of file diff --git a/src/plugins/quic/quic_doc.md b/src/plugins/quic/quic_doc.md deleted file mode 100644 index 6ffd00c5ce7..00000000000 --- a/src/plugins/quic/quic_doc.md +++ /dev/null @@ -1,38 +0,0 @@ -# QUIC implementation {#quic_doc} - -The quic plugin provides an IETF QUIC protocol implementation. It is based on -the [quicly](https://github.com/h2o/quicly) library. - -This plugin adds the QUIC protocol to VPP's Host Stack. As a result QUIC is -usable both in internal VPP applications and in external apps. - - -## Maturity level -Under development: it should mostly work, but has not been thoroughly tested and -should not be used in production. - - -## Features - - only bidirectional streams are supported currently. - - -## Getting started - -QUIC constructs are exposed as follows: - -- QUIC connections and streams are both regular host stack sessions. -- QUIC connections can be created and destroyed with regular `connect` and - `close` calls with `TRANSPORT_PROTO_QUIC`. -- Streams can be opened in a connection by calling `connect`again and passing - the ID of the connection to which the new stream should belong. -- Streams can be closed with a regular `close`call. -- Streams opened by peers can be accepted from the sessions corresponding to - QUIC connections. -- Data can ba exchanged by using the regular `send` and `recv` calls on the - stream sessions. - -Example code can be found in: -`src/vnet/session-apps/echo_client.c`: Test client using the internal API -`src/vnet/session-apps/echoo_server.c`: Test server using the internal API -`src/tests/vnet/session/quic_echo.c`: Client and server, using the external API - diff --git a/src/plugins/quic/quic_plugin.rst b/src/plugins/quic/quic_plugin.rst new file mode 100644 index 00000000000..3160eb442f8 --- /dev/null +++ b/src/plugins/quic/quic_plugin.rst @@ -0,0 +1,127 @@ +.. _quic_plugin: +.. _quicly: https://github.com/h2o/quicly + +.. toctree:: + +QUIC HostStack +============== + +The quic plugin provides an `IETF QUIC protocol `_ implementation. It is based on +the quicly_ library. + +This plugin adds the QUIC protocol to VPP's Host Stack. As a result QUIC is +usable both in internal VPP applications and in external apps. + +**Maturity** + +- This plugin is under current development: it should mostly work, but has not been thoroughly tested and should not be used in production. +- Only bidirectional streams are supported currently. + +Getting started +--------------- + +* A common sample setup is with two vpp instances interconnected #twovppinstances +* Ensure your vpp configuration file contains ``session { evt_qs_memfd_seg }`` +* Then run ``session enable`` in the debug cli (vppctl) + +This plugin can be tested in the following cases. + +Internal client +^^^^^^^^^^^^^^^ + +This application is a simple command to be run on the debug cli to test connectivity & throughput on QUIC over the debug cli (vppctl). It does not reflect reality and is mostly used for internal tests. + +* Run ``test echo server uri quic://1.1.1.1/1234`` on your first instance +* Then ``test echo client uri quic://20.20.1.1/1`` on the second one + +Source for the internal client lives in ``src/plugins/hs_apps/echo_client.c`` + +External client +^^^^^^^^^^^^^^^ + +This setup reflects the use case of an app developper using vpp to create a quic client / server. The application is an external binary that connects to VPP via its binary API. + +After having setup two interconnected vpps, you can attach the quic_echo binary to each of them. + +* The binary can be found in ``./build-root/build-vpp[_debug]-native/vpp/bin/quic_echo`` +* To run the client & server use ``quic_echo socket-name /vpp.sock client|server uri quic://1.1.1.1/1234`` +* Several options are available to customize the amount of data sent, number of threads, logging and timinig. + +The behavior of this app when run with ``nclient 2/4`` is two first establish 2 connections with the given peer, and once everything has been openend start opening 4 quic streams, and transmit data. Flow is as follows. + +.. image:: /_images/quic_plugin_echo_flow.png + +This allows timinig of either the whole setup & teardown or specific phases in assessing the protocol's performance + +Source for the internal client lives in ``src/plugins/hs_apps/sapi/quic_echo.c`` + +VCL client +^^^^^^^^^^ + +The hoststack exposes a simplified API call the VCL (blocking posix like calls), this API is used by a sample client & server implementation that supports QUIC, TCP and UDP. + +* The binaries can be found in ``./build-root/build-vpp[_debug]-native/vpp/bin/`` +* Create the VCL conf files ``echo "vcl { api-socket-name /vpp.sock }" | tee /tmp/vcl.conf]`` +* For the server ``VCL_CONFIG=/tmp/vcl.conf ; vcl_test_server -p QUIC 1234"`` +* For the client ``VCL_CONFIG=/tmp/vcl.conf ; vcl_test_client -p QUIC 1.1.1.1 1234"`` + +Source for the internal client lives in ``src/plugins/hs_apps/vcl/vcl_test_client.c`` + +A basic usage is the following client side + +.. code-block:: C + + #include + int fd = vppcom_session_create (VPPCOM_PROTO_QUIC); + vppcom_session_tls_add_cert (/* args */); + vppcom_session_tls_add_key (/* args */); + vppcom_session_connect (fd, "quic://1.1.1.1/1234"); /* create a quic connection */ + int sfd = vppcom_session_create (VPPCOM_PROTO_QUIC); + vppcom_session_stream_connect (sfd, fd); /* open a quic stream on the connection*/ + vppcom_session_write (sfd, buf, n); + +Server side + +.. code-block:: C + + #include + int lfd = vppcom_session_create (VPPCOM_PROTO_QUIC); + vppcom_session_tls_add_cert (/* args */); + vppcom_session_tls_add_key (/* args */); + vppcom_session_bind (fd, "quic://1.1.1.1/1234"); + vppcom_session_listen (fd); + int fd = vppcom_session_accept (lfd); /* accept quic connection*/ + vppcom_session_is_connectable_listener (fd); /* is true */ + int sfd = vppcom_session_accept (fd); /* accept quic stream */ + vppcom_session_is_connectable_listener (sfd); /* is false */ + vppcom_session_read (sfd, buf, n); + + +Internal Mechanics +------------------ + +QUIC constructs are exposed as follows: + +- QUIC connections and streams are both regular host stack session, exposed via the API with their 64bits handle. +- QUIC connections can be created and destroyed with regular ``connect`` and ``close`` calls with ``TRANSPORT_PROTO_QUIC``. +- Streams can be opened in a connection by calling ``connect`` again and passing the handle of the connection to which the new stream should belong. +- Streams can be closed with a regular ``close`` call. +- Streams opened by peers can be accepted from the sessions corresponding to QUIC connections. +- Data can ba exchanged by using the regular ``send`` and ``recv`` calls on the stream sessions. + +Data structures +^^^^^^^^^^^^^^^ + +Quic relies on the hoststack constructs, namely applications, sessions, transport_connections, and app_listeners. When listening on a port with the quic protocol, an external application : + +* Attaches to vpp and register an ``application`` +* It creates an ``app_listener`` and a ``quic_listen_session``. +* The ``quic_listen_session`` relies on a ``transport_connection`` (``lctx``) to access the underlying ``udp_listen_session`` that will receive packets. +* Upon connection request, we create the same data structure (``quic_session``, ``qctx``, ``udp_session``) and pass a handle to the ``quic_session`` in the accept callback to acknowledge the creation of a quic connection. All further UDP datagrams for the peers at each end of the connection will be exchanged through the ``udp_session`` +* Upon receiving a Stream opening request, we create the ``stream_session`` and its transport ``sctx`` and pass the handle to the ``stream_session`` back to the app. Here we don't have any UDP datastructures, as all datagrams are bound to the connection. + + +Thoses structures are linked as follows : + +.. image:: /_images/quic_plugin_datastructures.png + -- 2.16.6