193 lines
6.4 KiB
ReStructuredText
193 lines
6.4 KiB
ReStructuredText
.. _networking_with_multiple_instances:
|
|
|
|
Networking with multiple Zephyr instances
|
|
#########################################
|
|
|
|
.. contents::
|
|
:local:
|
|
:depth: 2
|
|
|
|
This page describes how to set up a virtual network between multiple
|
|
Zephyr instances. The Zephyr instances could be running inside QEMU
|
|
or could be native_posix board processes. The Linux host can be used
|
|
to route network traffic between these systems.
|
|
|
|
Prerequisites
|
|
*************
|
|
|
|
On the Linux Host, fetch the Zephyr ``net-tools`` project, which is located
|
|
in a separate Git repository:
|
|
|
|
.. code-block:: console
|
|
|
|
git clone https://github.com/zephyrproject-rtos/net-tools
|
|
|
|
Basic Setup
|
|
***********
|
|
|
|
For the steps below, you will need five terminal windows:
|
|
|
|
* Terminal #1 and #2 are terminal windows with net-tools being the current
|
|
directory (``cd net-tools``)
|
|
* Terminal #3, where you setup bridging in Linux host
|
|
* Terminal #4 and #5 are your usual Zephyr development terminal,
|
|
with the Zephyr environment initialized.
|
|
|
|
As there are multiple ways to setup the Zephyr network, the example below uses
|
|
``qemu_x86`` board with ``e1000`` Ethernet controller and native_posix board
|
|
to simplify the setup instructions. You can use other QEMU boards and drivers
|
|
if needed, see :ref:`networking_with_eth_qemu` for details. You can also use
|
|
two or more native_posix board Zephyr instances and connect them together.
|
|
|
|
|
|
Step 1 - Create configuration files
|
|
===================================
|
|
|
|
Before starting QEMU with network connectivity, a network interfaces for each
|
|
Zephyr instance should be created in the host system. The default setup for
|
|
creating network interface cannot be used here as that is for connecting one
|
|
Zephyr instance to Linux host.
|
|
|
|
For Zephyr instance #1, create file called ``zephyr1.conf`` to ``net-tools``
|
|
project, or to some other suitable directory.
|
|
|
|
.. code-block:: console
|
|
|
|
# Configuration file for setting IP addresses for a network interface.
|
|
INTERFACE="$1"
|
|
HWADDR="00:00:5e:00:53:11"
|
|
IPV6_ADDR_1="2001:db8:100::2"
|
|
IPV6_ROUTE_1="2001:db8:100::/64"
|
|
IPV4_ADDR_1="198.51.100.2/24"
|
|
IPV4_ROUTE_1="198.51.100.0/24"
|
|
ip link set dev $INTERFACE up
|
|
ip link set dev $INTERFACE address $HWADDR
|
|
ip -6 address add $IPV6_ADDR_1 dev $INTERFACE nodad
|
|
ip -6 route add $IPV6_ROUTE_1 dev $INTERFACE
|
|
ip address add $IPV4_ADDR_1 dev $INTERFACE
|
|
ip route add $IPV4_ROUTE_1 dev $INTERFACE > /dev/null 2>&1
|
|
|
|
For Zephyr instance #2, create file called ``zephyr2.conf`` to ``net-tools``
|
|
project, or to some other suitable directory.
|
|
|
|
.. code-block:: console
|
|
|
|
# Configuration file for setting IP addresses for a network interface.
|
|
INTERFACE="$1"
|
|
HWADDR="00:00:5e:00:53:22"
|
|
IPV6_ADDR_1="2001:db8:200::2"
|
|
IPV6_ROUTE_1="2001:db8:200::/64"
|
|
IPV4_ADDR_1="203.0.113.2/24"
|
|
IPV4_ROUTE_1="203.0.113.0/24"
|
|
ip link set dev $INTERFACE up
|
|
ip link set dev $INTERFACE address $HWADDR
|
|
ip -6 address add $IPV6_ADDR_1 dev $INTERFACE nodad
|
|
ip -6 route add $IPV6_ROUTE_1 dev $INTERFACE
|
|
ip address add $IPV4_ADDR_1 dev $INTERFACE
|
|
ip route add $IPV4_ROUTE_1 dev $INTERFACE > /dev/null 2>&1
|
|
|
|
|
|
Step 2 - Create Ethernet interfaces
|
|
===================================
|
|
|
|
The following ``net-setup.sh`` commands should be typed in net-tools
|
|
directory (``cd net-tools``).
|
|
|
|
In terminal #1, type:
|
|
|
|
.. code-block:: console
|
|
|
|
./net-setup.sh -c zephyr1.conf -i zeth.1
|
|
|
|
In terminal #2, type:
|
|
|
|
.. code-block:: console
|
|
|
|
./net-setup.sh -c zephyr2.conf -i zeth.2
|
|
|
|
|
|
Step 3 - Setup network bridging
|
|
===============================
|
|
|
|
In terminal #3, type:
|
|
|
|
.. code-block:: console
|
|
|
|
sudo brctl addbr zeth-br
|
|
sudo brctl addif zeth-br zeth.1
|
|
sudo brctl addif zeth-br zeth.2
|
|
sudo ifconfig zeth-br up
|
|
|
|
|
|
Step 4 - Start Zephyr instances
|
|
===============================
|
|
|
|
In this example we start :ref:`sockets-echo-server-sample` and
|
|
:ref:`sockets-echo-client-sample` applications. You can use other applications
|
|
too as needed.
|
|
|
|
In terminal #4, if you are using QEMU, type this:
|
|
|
|
.. code-block:: console
|
|
|
|
west build -d build/server -b qemu_x86 -t run \
|
|
samples/net/sockets/echo_server -- \
|
|
-DOVERLAY_CONFIG=overlay-e1000.conf \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"198.51.100.1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"203.0.113.1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:100::1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:200::1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_GW=\"203.0.113.1\" \
|
|
-DCONFIG_ETH_QEMU_IFACE_NAME=\"zeth.1\" \
|
|
-DCONFIG_ETH_QEMU_EXTRA_ARGS=\"mac=00:00:5e:00:53:01\"
|
|
|
|
or if you want to use native_posix board, type this:
|
|
|
|
.. code-block:: console
|
|
|
|
west build -d build/server -b native_posix -t run \
|
|
samples/net/sockets/echo_server -- \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"198.51.100.1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"203.0.113.1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:100::1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:200::1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_GW=\"203.0.113.1\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_DRV_NAME=\"zeth.1\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_MAC_ADDR=\"00:00:5e:00:53:01\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_RANDOM_MAC=n
|
|
|
|
|
|
In terminal #5, if you are using QEMU, type this:
|
|
|
|
.. code-block:: console
|
|
|
|
west build -d build/client -b qemu_x86 -t run \
|
|
samples/net/sockets/echo_client -- \
|
|
-DOVERLAY_CONFIG=overlay-e1000.conf \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"203.0.113.1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"198.51.100.1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:200::1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:100::1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_GW=\"198.51.100.1\" \
|
|
-DCONFIG_ETH_QEMU_IFACE_NAME=\"zeth.2\" \
|
|
-DCONFIG_ETH_QEMU_EXTRA_ARGS=\"mac=00:00:5e:00:53:02\"
|
|
|
|
or if you want to use native_posix board, type this:
|
|
|
|
.. code-block:: console
|
|
|
|
west build -d build/client -b native_posix -t run \
|
|
samples/net/sockets/echo_client -- \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"203.0.113.1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"198.51.100.1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:200::1\" \
|
|
-DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:100::1\" \
|
|
-DCONFIG_NET_CONFIG_MY_IPV4_GW=\"198.51.100.1\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_DRV_NAME=\"zeth.2\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_MAC_ADDR=\"00:00:5e:00:53:02\" \
|
|
-DCONFIG_ETH_NATIVE_POSIX_RANDOM_MAC=n
|
|
|
|
|
|
Also if you have firewall enabled in your host, you need to allow traffic
|
|
between ``zeth.1``, ``zeth.2`` and ``zeth-br`` interfaces.
|