Move the common VLAN setup code to samples/net/common directory so that other network samples can utilize that too. Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
344 lines
9.4 KiB
ReStructuredText
344 lines
9.4 KiB
ReStructuredText
.. zephyr:code-sample:: sockets-echo-client
|
|
:name: Echo client (advanced)
|
|
:relevant-api: bsd_sockets tls_credentials
|
|
|
|
Implement a client that sends IP packets, waits for data to be sent back, and verifies it.
|
|
|
|
Overview
|
|
********
|
|
|
|
The echo-client sample application for Zephyr implements a UDP/TCP client
|
|
that will send IPv4 or IPv6 packets, wait for the data to be sent back,
|
|
and then verify it matches the data that was sent.
|
|
|
|
The source code for this sample application can be found at:
|
|
:zephyr_file:`samples/net/sockets/echo_client`.
|
|
|
|
Requirements
|
|
************
|
|
|
|
- :ref:`networking_with_host`
|
|
|
|
Building and Running
|
|
********************
|
|
|
|
There are multiple ways to use this application. One of the most common
|
|
usage scenario is to run echo-client application inside QEMU. This is
|
|
described in :ref:`networking_with_qemu`.
|
|
|
|
There are configuration files for different boards and setups in the
|
|
echo-client directory:
|
|
|
|
- :file:`prj.conf`
|
|
Generic config file, normally you should use this.
|
|
|
|
- :file:`overlay-ot.conf`
|
|
This overlay config enables support for OpenThread.
|
|
|
|
- :file:`overlay-802154.conf`
|
|
This overlay config enables support for native IEEE 802.15.4 connectivity.
|
|
Note, that by default IEEE 802.15.4 L2 uses unacknowledged communication. To
|
|
improve connection reliability, acknowledgments can be enabled with shell
|
|
command: ``ieee802154 ack set``.
|
|
|
|
- :file:`overlay-qemu_802154.conf`
|
|
This overlay config enables support for two QEMU's when simulating
|
|
IEEE 802.15.4 network that are connected together.
|
|
|
|
- :file:`overlay-tls.conf`
|
|
This overlay config enables support for TLS.
|
|
|
|
- :file:`overlay-vlan.conf`
|
|
This overlay config enables support for Virtual LAN.
|
|
See :ref:`networking_samples_common` for details.
|
|
|
|
Build echo-client sample application like this:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:board: <board to use>
|
|
:conf: <config file to use>
|
|
:goals: build
|
|
:compact:
|
|
|
|
Example building for the nrf52840dk/nrf52840 with OpenThread support:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:host-os: unix
|
|
:board: nrf52840dk/nrf52840
|
|
:conf: "prj.conf overlay-ot.conf"
|
|
:goals: run
|
|
:compact:
|
|
|
|
Example building for the IEEE 802.15.4 RF2XX transceiver:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:host-os: unix
|
|
:board: [samr21_xpro | sam4s_xplained | sam_v71_xult/samv71q21]
|
|
:gen-args: -DEXTRA_CONF_FILE=overlay-802154.conf
|
|
:goals: build flash
|
|
:compact:
|
|
|
|
In a terminal window you can check if communication is happen:
|
|
|
|
.. code-block:: console
|
|
|
|
$ minicom -D /dev/ttyACM1
|
|
|
|
|
|
|
|
Enabling TLS support
|
|
====================
|
|
|
|
Enable TLS support in the sample by building the project with the
|
|
``overlay-tls.conf`` overlay file enabled, for example, using these commands:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:board: qemu_x86
|
|
:conf: "prj.conf overlay-tls.conf"
|
|
:goals: build
|
|
:compact:
|
|
|
|
An alternative way is to specify ``-DEXTRA_CONF_FILE=overlay-tls.conf`` when
|
|
running ``west build`` or ``cmake``.
|
|
|
|
The certificate and private key used by the sample can be found in the sample's
|
|
``src`` directory. The default certificates used by Socket Echo Client and
|
|
:zephyr:code-sample:`sockets-echo-server` enable establishing a secure connection
|
|
between the samples.
|
|
|
|
SOCKS5 proxy support
|
|
====================
|
|
|
|
It is also possible to connect to the echo-server through a SOCKS5 proxy.
|
|
To enable it, use ``-DEXTRA_CONF_FILE=overlay-socks5.conf`` when running ``west
|
|
build`` or ``cmake``.
|
|
|
|
By default, to make the testing easier, the proxy is expected to run on the
|
|
same host as the echo-server in Linux host.
|
|
|
|
To start a proxy server, for example a builtin SOCKS server support in ssh
|
|
can be used (-D option). Use the following command to run it on your host
|
|
with the default port:
|
|
|
|
For IPv4 proxy server:
|
|
|
|
.. code-block:: console
|
|
|
|
$ ssh -N -D 0.0.0.0:1080 localhost
|
|
|
|
For IPv6 proxy server:
|
|
|
|
.. code-block:: console
|
|
|
|
$ ssh -N -D [::]:1080 localhost
|
|
|
|
Run both commands if you are testing IPv4 and IPv6.
|
|
|
|
To connect to a proxy server that is not running under the same IP as the
|
|
echo-server or uses a different port number, modify the following values
|
|
in echo_client/src/tcp.c.
|
|
|
|
.. code-block:: c
|
|
|
|
#define SOCKS5_PROXY_V4_ADDR IPV4_ADDR
|
|
#define SOCKS5_PROXY_V6_ADDR IPV6_ADDR
|
|
#define SOCKS5_PROXY_PORT 1080
|
|
|
|
Running echo-server in Linux Host
|
|
=================================
|
|
|
|
There is one useful testing scenario that can be used with Linux host.
|
|
Here echo-client is run in QEMU and echo-server is run in Linux host.
|
|
|
|
To use QEMU for testing, follow the :ref:`networking_with_qemu` guide.
|
|
|
|
In a terminal window:
|
|
|
|
.. code-block:: console
|
|
|
|
$ sudo ./echo-server -i tap0
|
|
|
|
Run echo-client application in QEMU:
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:host-os: unix
|
|
:board: qemu_x86
|
|
:conf: "prj.conf overlay-linux.conf"
|
|
:goals: run
|
|
:compact:
|
|
|
|
Note that echo-server must be running in the Linux host terminal window
|
|
before you start the echo-client application in QEMU.
|
|
Exit QEMU by pressing :kbd:`CTRL+A` :kbd:`x`.
|
|
|
|
You can verify TLS communication with a Linux host as well. See
|
|
https://github.com/zephyrproject-rtos/net-tools documentation for information
|
|
on how to test TLS with Linux host samples.
|
|
|
|
See the :zephyr:code-sample:`sockets-echo-server` documentation for an alternate
|
|
way of running, with the echo-client on the Linux host and the echo-server
|
|
in QEMU.
|
|
|
|
OpenThread RCP+Zephyr HOST (SPINEL connection via UART)
|
|
=======================================================
|
|
|
|
Prerequisites:
|
|
--------------
|
|
|
|
- Build ``echo-server`` for HOST PC (x86_64)
|
|
(https://github.com/zephyrproject-rtos/net-tools) SHA1:1c4fdba
|
|
|
|
.. code-block:: console
|
|
|
|
$ make echo-server
|
|
|
|
- Program nRF RCP from Nordic nrf SDK (v2.7.0):
|
|
|
|
.. code-block:: console
|
|
|
|
(v2.7.0) ~/ncs$ west build -p always -b nrf21540dk/nrf52840 -S logging nrf/samples/openthread/coprocessor
|
|
|
|
|
|
- Build mimxrt1020_evk HOST (Zephyr):
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/net/sockets/echo_client
|
|
:board: mimxrt1020_evk
|
|
:conf: "prj.conf overlay-ot-rcp-host-uart.conf"
|
|
:goals: build
|
|
:compact:
|
|
|
|
And flash
|
|
|
|
.. code-block:: console
|
|
|
|
$ west flash -r pyocd -i 0226000047784e4500439004d9170013e56100009796990
|
|
|
|
|
|
- Connect the nRF RCP with IMXRT1020 (HOST) via UART
|
|
|
|
.. code-block:: c
|
|
|
|
/*
|
|
* imxrt1020_evk -> HOST
|
|
* nRF21540-DK -> RCP (nrf/samples/openthread/coprocessor)
|
|
* LPUART2 used for communication:
|
|
* nRF21540 (P6) P0.08 RXD -> IMXRT1020-EVK (J17) D1 (GPIO B1 08) (TXD)
|
|
* nRF21540 (P6) P0.07 CTS -> IMXRT1020-EVK (J19) D8 (GPIO B1 07) (RTS)
|
|
* nRF21540 (P6) P0.06 TXD -> IMXRT1020-EVK (J17) D0 (GPIO B1 09) (RXD)
|
|
* nRF21540 (P6) P0.05 RTS -> IMXRT1020-EVK (J17) D7 (GPIO B1 06) (CTS)
|
|
*/
|
|
|
|
|
|
- Install the OTBR (OpenThread Border Router) docker container on your HOST PC (x86_64)
|
|
Follow steps from https://docs.nordicsemi.com/bundle/ncs-2.5.1/page/nrf/protocols/thread/tools.html#running_otbr_using_docker
|
|
|
|
**Most notable ones:**
|
|
|
|
1. Create ``otbr0`` network bridge to have access to OT network from HOST
|
|
Linux PC
|
|
|
|
.. code-block:: console
|
|
|
|
sudo docker network create --ipv6 --subnet fd11:db8:1::/64 -o com.docker.network.bridge.name=otbr0 otbr
|
|
|
|
|
|
2. Pull docker container for OTBR:
|
|
|
|
.. code-block:: console
|
|
|
|
docker pull nrfconnect/otbr:84c6aff
|
|
|
|
|
|
3. Start the docker image:
|
|
|
|
.. code-block:: console
|
|
|
|
sudo modprobe ip6table_filter
|
|
sudo docker run -it --rm --privileged --name otbr --network otbr -p 8080:80 --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" --volume /dev/ttyACM5:/dev/radio nrfconnect/otbr:84c6aff --radio-url spinel+hdlc+uart:///dev/radio?uart-baudrate=1000000
|
|
|
|
|
|
4. Add proper routing (``fd11:22::/64`` are the IPv6 addresses - On-Mesh - which allow accessing the OT devices) on HOST PC (x86_64)
|
|
|
|
.. code-block:: console
|
|
|
|
sudo ip -6 route add fd11:22::/64 dev otbr0 via fd11:db8:1::2
|
|
|
|
|
|
And the output for on-OT address:
|
|
|
|
.. code-block:: console
|
|
|
|
ip route get fd11:22:0:0:5188:1678:d0c0:6893
|
|
fd11:22::5188:1678:d0c0:6893 from :: via fd11:db8:1::2 dev otbr0 src fd11:db8:1::1 metric 1024 pref medium
|
|
|
|
|
|
5. Start the console to the docker image:
|
|
|
|
.. code-block:: console
|
|
|
|
sudo docker exec -it otbr /bin/bash
|
|
|
|
|
|
Test with e.g.
|
|
|
|
.. code-block:: console
|
|
|
|
ot-ctl router table
|
|
ot-ctl ipaddr
|
|
|
|
|
|
|
|
Configure OTBR
|
|
--------------
|
|
|
|
On the HOST PC's webbrowser: http://localhost:8080/
|
|
|
|
Go to ``Form`` and leave default values - e.g:
|
|
|
|
* Network Key: ``00112233445566778899aabbccddeeff``
|
|
* On-Mesh Prefix: ``fd11:22::``
|
|
* Channel: ``15``
|
|
|
|
|
|
to "FORM" the OT network.
|
|
|
|
*Note:*
|
|
The "On-Mesh Prefix" shall match the one setup in ``otbr0`` routing.
|
|
|
|
|
|
Configure RCP (nRF21540-DK) + OT HOST (mimxrt1020)
|
|
--------------------------------------------------
|
|
|
|
.. code-block:: console
|
|
|
|
ot factoryreset
|
|
ot dataset networkkey 00112233445566778899aabbccddeeff
|
|
ot ifconfig up
|
|
|
|
|
|
In the HOST PC www webpage interface please:
|
|
Commission -> Joiner PSKd* set to ``J01NME`` -> START COMMISSION
|
|
|
|
.. code-block:: console
|
|
|
|
ot joiner start J01NME
|
|
ot thread start
|
|
|
|
|
|
The ``ot ipaddr`` shall show IPv6 address starting from ``fd11:22:0:0:``.
|
|
This one can be accessed from HOST's PC network (via e.g.
|
|
``ping -6 fd11:22:0:0:e8bf:266b:63ca:eff4``).
|
|
|
|
Start ``echo-server`` on HOST PC (x86-64)
|
|
-----------------------------------------
|
|
|
|
.. code-block:: console
|
|
|
|
./echo-server -i otbr0
|