[U-Boot] [PATCH v5 24/27] sandbox: eth: Add a bridge to a real network for sandbox

Simon Glass sjg at chromium.org
Wed Mar 4 19:35:49 CET 2015


Hi Joe,

On 3 March 2015 at 19:41, Joe Hershberger <joe.hershberger at ni.com> wrote:
> Implement a bridge between u-boot's network stack and Linux's raw packet
> API allowing the sandbox to send and receive packets using the host
> machine's network interface.
>
> This raw Ethernet API requires elevated privileges.  You can either run
> as root, or you can add the capability needed like so:
>
> sudo /sbin/setcap "CAP_NET_RAW+ep" u-boot
>
> Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>

Reviewed-by: Simon Glass <sjg at chromium.org>

Nits below.

>
> ---
>
> Changes in v5:
> -Added fallback for setting promiscuous mode
> -Added help to Kconfig
> -Added more details and examples in the README
> -Check for NULL when reading fdt for host interface
> -Check for malloc failure
> -Remove cast of pointer passed to free
> -Remove the empty sb_eth_raw_remove function
> -Return -errno in from send and recv
> -Return errno from recv
> -Set the socket to non-blocking
> -Use net_rx_packets instead of a stack buffer
>
> Changes in v4:
> -Add comments to priv struct definition
> -Added comments to README.sandbox
> -Clean up the interface to sandbox's eth-raw-os by passing priv to raw-os
> -Cleanup var definition order
> -Fixed the MAC address limitation (now all traffic uses MAC address from env)
> -Move os file to arch
> -Moved config to Kconfig
> -Use accessors for platdata and priv
>
> Changes in v3:
> -Made the os raw packet support for sandbox eth build and work.
>
> Changes in v2:
> -Added the raw packet proof-of-concept patch.
>
>  arch/sandbox/Kconfig                  |   3 +
>  arch/sandbox/cpu/Makefile             |  10 +++
>  arch/sandbox/cpu/eth-raw-os.c         | 140 ++++++++++++++++++++++++++++++++++
>  arch/sandbox/dts/sandbox.dts          |   6 ++
>  arch/sandbox/include/asm/eth-raw-os.h |  32 ++++++++
>  board/sandbox/README.sandbox          |  52 +++++++++++++
>  drivers/net/Kconfig                   |  10 +++
>  drivers/net/Makefile                  |   1 +
>  drivers/net/sandbox-raw.c             |  98 ++++++++++++++++++++++++
>  9 files changed, 352 insertions(+)
>  create mode 100644 arch/sandbox/cpu/eth-raw-os.c
>  create mode 100644 arch/sandbox/include/asm/eth-raw-os.h
>  create mode 100644 drivers/net/sandbox-raw.c
>


> diff --git a/board/sandbox/README.sandbox b/board/sandbox/README.sandbox
> index c1f5f7e..aedf05a 100644
> --- a/board/sandbox/README.sandbox
> +++ b/board/sandbox/README.sandbox
> @@ -190,6 +190,58 @@ Also sandbox uses generic board (CONFIG_SYS_GENERIC_BOARD) and supports
>  driver model (CONFIG_DM) and associated commands.
>
>
> +Linux RAW Networking Bridge
> +---------------------------
> +
> +The sandbox_eth_raw driver bridges traffic between the bottom of the network
> +stack and the RAW sockets API in Linux. This allows much of the u-boot network

s/u-boot/U-Boot/g

(there's one in the Kconfig also)

> +functionality to be tested in sandbox against real network traffic.
> +
> +For Ethernet network adapters, the bridge utilizes the RAW AF_PACKET API.  This
> +is needed to get access to the lowest level of the network stack in Linux. This
> +means that all of the Ethernet frame is included. This allows the u-boot network
> +stack to be fully used. In other words, nothing about the Linux network stack is
> +involved in forming the packets that end up on the wire. To receive the
> +responses to packets sent from U-Boot the network interface has to be set to
> +promiscuous mode so that the network card won't filter out packets not destined
> +for its configured (on Linux) MAC address.
> +
> +The RAW sockets Ethernet API requires elevated privileges in Linux. You can
> +either run as root, or you can add the capability needed like so:
> +
> +sudo /sbin/setcap "CAP_NET_RAW+ep" u-boot

I think the last param is the filename, is that right? Would be good
to clarify if this is a full path, etc.

> +
> +The default device tree for sandbox includes an entry for eth0 on the sandbox
> +host machine whose alias is "eth1". The following are a few examples of network
> +operations being tested on the eth0 interface.
> +
> +sudo u-boot -d u-boot.dtb

or sudo u-boot -D

> +
> +DHCP
> +....
> +
> +set autoload no
> +set ethact eth1
> +dhcp
> +
> +PING
> +....
> +
> +set autoload no
> +set ethact eth1
> +dhcp
> +ping $gatewayip
> +
> +TFTP
> +....
> +
> +set autoload no
> +set ethact eth1
> +dhcp
> +set serverip WWW.XXX.YYY.ZZZ
> +tftpboot u-boot.bin
> +
> +
>  SPI Emulation
>  -------------
>
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index e46e57b..601366f 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -29,4 +29,14 @@ config ETH_SANDBOX
>
>           This driver is particularly useful in the test/dm/eth.c tests
>
> +config ETH_SANDBOX_RAW
> +       depends on DM_ETH && SANDBOX
> +       default y
> +       bool "Sandbox: Bridge to Linux Raw Sockets"
> +       help
> +         This driver is a bridge from the bottom of the network stack
> +         in u-boot to the RAW AF_PACKET API in Linux. This allows real
> +         network traffic to be tested from within sandbox. See
> +         board/sandbox/README.sandbox for more details.
> +
>  endif # NETDEVICES

Regards,
Simon


More information about the U-Boot mailing list