.. _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_sim 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_sim 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_sim 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 :zephyr:code-sample:`sockets-echo-server` and :zephyr:code-sample:`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 -- \ -DEXTRA_CONF_FILE=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_sim board, type this: .. code-block:: console west build -d build/server -b native_sim -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 -- \ -DEXTRA_CONF_FILE=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_sim board, type this: .. code-block:: console west build -d build/client -b native_sim -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.