zephyr/samples/net/eth_native_posix
Jukka Rissanen b4e36133c2 drivers: eth: native_posix: Exec program after creating zeth
Allow user to configure a program that is executed after the
network interface is created and IP address is setup.
This can be used e.g., to start wireshark to capture
the network traffic of the interface.

Signed-off-by: Jukka Rissanen <jukka.rissanen@linux.intel.com>
2018-08-06 14:20:51 +03:00
..
src samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00
CMakeLists.txt samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00
net_setup_host samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00
net_setup_host.conf samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00
net_start_wireshark.sh drivers: eth: native_posix: Exec program after creating zeth 2018-08-06 14:20:51 +03:00
prj.conf samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00
README.rst doc: fix doc misspellings in doc, boards, samples 2018-04-05 19:17:01 -04:00
sample.yaml samples: net: eth_native_posix: Sample for native networking 2018-03-18 20:47:36 -04:00

.. _eth-native-posix-sample:

Native Posix Ethernet
#####################

Overview
********

The eth_native_posix sample application for Zephyr creates a **zeth** network
interface to the host system. One can communicate with Zephyr via this network
interface.

The source code for this sample application can be found at:
:file:`samples/net/eth_native_posix`.

Building And Running
********************

To build the eth_native_posix sample application, follow the steps
below.

.. zephyr-app-commands::
   :zephyr-app: samples/net/eth_native_posix
   :host-os: unix
   :board: native_posix
   :conf: <config file to use>
   :goals: build
   :compact:

Normally one needs extra privileges to create and configure the TAP device in
the host system. Use sudo to execute the Zephyr process with admin privileges,
like this:

.. code-block:: console

    sudo --preserve-env=ZEPHYR_BASE make run

If the ``sudo --preserve-env=ZEPHYR_BASE`` gives an error,
just use ``sudo --preserve-env`` instead:

If you want to connect two Zephyr instances together, you can do it like this:

Create two Zephyr config files prj1.conf and prj2.conf. You can use
:file:`samples/net/eth_native_posix/prj.conf` as a base.

Set prj1.conf IP address configuration like this:

.. code-block:: console

    CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8:100::1"
    CONFIG_NET_APP_PEER_IPV6_ADDR="2001:db8:100::2"
    CONFIG_NET_APP_MY_IPV4_ADDR="198.51.100.1"
    CONFIG_NET_APP_PEER_IPV4_ADDR="198.51.100.2"
    CONFIG_NET_APP_MY_IPV4_GW="203.0.113.1"
    CONFIG_ETH_NATIVE_POSIX_RANDOM_MAC=n
    CONFIG_ETH_NATIVE_POSIX_MAC_ADDR="00:00:5e:00:53:64"
    CONFIG_ETH_NATIVE_POSIX_SETUP_SCRIPT="echo"
    CONFIG_ETH_NATIVE_POSIX_DRV_NAME="zeth.1"

Set prj2.conf IP address configuration like this:

.. code-block:: console

    CONFIG_NET_APP_MY_IPV6_ADDR="2001:db8:200::1"
    CONFIG_NET_APP_PEER_IPV6_ADDR="2001:db8:200::2"
    CONFIG_NET_APP_MY_IPV4_ADDR="203.0.113.1"
    CONFIG_NET_APP_PEER_IPV4_ADDR="203.0.113.2"
    CONFIG_NET_APP_MY_IPV4_GW="198.51.100.1"
    CONFIG_ETH_NATIVE_POSIX_RANDOM_MAC=n
    CONFIG_ETH_NATIVE_POSIX_MAC_ADDR="00:00:5e:00:53:c8"
    CONFIG_ETH_NATIVE_POSIX_SETUP_SCRIPT="echo"
    CONFIG_ETH_NATIVE_POSIX_DRV_NAME="zeth.2"

Then compile and run two Zephyr instances
(if ``sudo --preserve-env=ZEPHYR_BASE`` gives an error,
just use ``sudo --preserve-env`` instead):

.. code-block:: console

    mkdir -p build1/native_posix
    cmake -DCONF_FILE=prj1.conf -DBOARD=native_posix -Bbuild1/native_posix -H.
    make -s -C build1/native_posix
    sudo --preserve-env=ZEPHYR_BASE make -s -C build1/native_posix run

.. code-block:: console

    mkdir -p build2/native_posix
    cmake -DCONF_FILE=prj2.conf -DBOARD=native_posix -Bbuild2/native_posix -H.
    make -s -C build2/native_posix
    sudo --preserve-env=ZEPHYR_BASE make -s -C build2/native_posix run

Bridge the two Zephyr instances together:

.. 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

After this, you are able to ping device 1 from device 2 in net-shell:

.. code-block:: console

    # In device 1
    net ping 2001:db8:200::1
    net ping 203.0.113.1

.. code-block:: console

    # In device 2
    net ping 2001:db8:100::1
    net ping 198.51.100.1

Note that in this setup you cannot access these two Zephyr devices from
your host. If you want to do that, then you could create a new network
interface with proper IP addresses and add that interface to the Zephyr
bridge.