[PATCH v4 00/14] Introduce the lwIP network stack

Tim Harvey tharvey at gateworks.com
Thu Jun 20 19:10:10 CEST 2024


On Mon, Jun 17, 2024 at 8:33 AM Jerome Forissier
<jerome.forissier at linaro.org> wrote:
>
> This is a rework of a patch series by Maxim Uvarov: "net/lwip: add lwip
> library for the network stack" [1]. The goal is to introduce the lwIP TCP/IP
> stack [2] [3] as an alternative to the current implementation in net/,
> selectable with Kconfig, and ultimately keep only lwIP if possible. Some
> reasons for doing so are:
> - Make the support of HTTPS in the wget command easier. Javier T. (CC'd)
> has some additional lwIP and Mbed TLS patches to do so. With that it
> becomes possible to fetch and launch a distro installer such as Debian
> etc. using a secure, authenticated connection directly from the U-Boot
> shell. Several use cases:
>   * Authentication: prevent MITM attack (third party replacing the
> binary with a different one)
>   * Confidentiality: prevent third parties from grabbing a copy of the
> image as it is being downloaded
>   * Allow connection to servers that do not support plain HTTP anymore
> (this is becoming more and more common on the Internet these days)
> - Possibly benefit from additional features implemented in lwIP
> - Less code to maintain in U-Boot
>
> Prior to applying this series, the lwIP stack needs to be added as a
> Git subtree with the following command:
>
>  $  git subtree add --squash --prefix lib/lwip/lwip https://git.savannah.gnu.org/git/lwip.git STABLE-2_2_0_RELEASE
>
> The first patch renames some enums in order to avoid a conflict when a
> later patch enables the lwIP library.
>
> The second patch introduces a new Kconfig symbol: NET_LWIP, which selects
> the lwIP implementation instead of the current one (NET). Contrary to the
> approach chosen by Maxim in [1], NET_LWIP and NET cannot be enabled
> simultaneously. The rationale is we want to start from a clean state and
> not pull potentially duplicated functionality from both stacks. Note
> however that a few files are still built in net/, they are the ones
> related to ethernet device management and the ethernet bootflow.
>
> The third patch splits the net.h header into net-legacy.h, net-common.h,
> net-lwip.h, leaving net.h as a simple wrapper.
>
> The fourth patch introduces the Makefile to build lwIP when NET_LWIP is
> enabled.
>
> The subsequent patches implement various network-oriented commands and
> features: dhcp, dns, ping, tftpboot, wget.
>
> A number of features are currently incompatible with NET_LWIP: SANDBOX,
> DFU_TFTP, FASTBOOT, SPL_NET. All make assumptions on how the network
> stack is implemented and/or pull sybols that are not trivially exported
> from lwIP. Some interface rework may be needed.
>
> Due to the above and in order to provide some level of testing, a new QEMU
> configuration is introduced (qemu_arm64_lwip_defconfig) which is the same
> as qemu_arm64_defconfig but with NET_LWIP and CMD_*_LWIP enabled.
> Tests are added to test/py/tests/test_net.py for that configuration.
>

Hi Jermone,

I've given this a spin on an imx8mm-venice-gw73xx-0x via
imx8mm_venice_defconfig and I can't get DHCP to work (didn't work in
v3 either):

$ diff defconfig configs/imx8mm_venice_defconfig
68,69c68,71
< CONFIG_CMD_DNS_LWIP=y
< CONFIG_CMD_WGET_LWIP=y
---
> CONFIG_CMD_DHCP6=y
> CONFIG_CMD_TFTPPUT=y
> CONFIG_SYS_DISABLE_AUTOLOAD=y
> CONFIG_CMD_WGET=y
88,90c90,94
< CONFIG_NET_LWIP=y
< CONFIG_LWIP_DEBUG=y
< CONFIG_LWIP_ASSERT=y
---
> CONFIG_NET_RANDOM_ETHADDR=y
> CONFIG_IP_DEFRAG=y
> CONFIG_TFTP_BLOCKSIZE=4096
> CONFIG_PROT_TCP_SACK=y
> CONFIG_IPV6=y

Target:
u-boot=> net list
eth0 : ethernet at 30be0000 00:d0:12:b5:f8:41 active
u-boot=> dhcp || echo fail
eth0: ethernet at 30be0000 00:d0:12:b5:f8:41 active
netif_set_ipaddr: netif address being changed
netif: added interface 0 addr 192.168.1.1 netmask 0.0.0.0 gw 0.0.0.0
etharp_request: sending ARP request.
etharp_raw: sending raw ARP packet.
ethernet_output: sending packet 000000007df00bf0
dhcp_start(netif=000000007df2af40) 0dhcp_start(): mallocing new DHCP client
dhcp_start(): allocated dhcp
dhcp_start(): starting DHCP configuration
dhcp_discover()
transaction id xid(42021)
dhcp_discover: making request
dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, LWIP_IANA_PORT_DHCP_SERVER)
ip4_output_if: 0IP header:
+-------------------------------+
| 4 | 5 |  0x00 |       336     | (v, hl, tos, len)
+-------------------------------+
|        0      |000|       0   | (id, flags, offset)
+-------------------------------+
|  255  |   17  |    0xba9d     | (ttl, proto, chksum)
+-------------------------------+
|    0  |    0  |    0  |    0  | (src)
+-------------------------------+
|  255  |  255  |  255  |  255  | (dest)
+-------------------------------+
ip4_output_if: call netif->output()
ethernet_output: sending packet 000000007df2c010
dhcp_discover: deleting()
dhcp_discover: SELECTING
dhcp_discover(): set request timeout 2000 msecs
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:28:28:5d:bb:16:9f, type:8899
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:00:27:0e:0d:74:ba, type:806
etharp_update_arp_entry: 172.24.20.24 - 00:27:0e:0d:74:ba
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:98:90:96:ac:d7:63, type:806
etharp_update_arp_entry: 172.24.20.3 - 98:90:96:ac:d7:63
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:84:2b:2b:4e:5a:9a, type:806
etharp_update_arp_entry: 172.24.0.1 - 84:2b:2b:4e:5a:9a
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:cc:96:e5:1e:a0:7b, type:800
ip_input: iphdr->dest 0xffff1fac netif->ip_addr 0x101a8c0 (0x0, 0x0, 0xffff1fac)
ip4_input: UDP packet to DHCP client port 138
ip4_input: packet not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:d4:be:d9:9f:5a:b4, type:800
ip_input: iphdr->dest 0xffffffff netif->ip_addr 0x101a8c0 (0x0, 0x0, 0xffffffff)
ip4_input: packet accepted on interface 0ip4_input:
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        68     | (v, hl, tos, len)
+-------------------------------+
|    19472      |000|       0   | (id, flags, offset)
+-------------------------------+
|  128  |   17  |    0x2e51     | (ttl, proto, chksum)
+-------------------------------+
|  172  |   24  |   20  |   48  | (src)
+-------------------------------+
|  255  |  255  |  255  |  255  | (dest)
+-------------------------------+
ip4_input: p->len 68 p->tot_len 68
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:00:0b:ab:2e:fa:51, type:806
etharp_update_arp_entry: 172.24.24.181 - 00:0b:ab:2e:fa:51
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:98:90:96:ac:d7:63, type:806
etharp_update_arp_entry: 172.24.20.3 - 98:90:96:ac:d7:63
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
ethernet_input: dest:ff:ff:ff:ff:ff:ff, src:84:2b:2b:4e:5a:9a, type:806
etharp_update_arp_entry: 172.24.0.1 - 84:2b:2b:4e:5a:9a
etharp_find_entry: found empty entry 0
etharp_find_entry: no empty entry found and not allowed to recycle
etharp_input: incoming ARP request
etharp_input: ARP request was not for us.
fail

Even using ping before DHCP fails:
u-boot=> setenv ipaddr 192.168.1.1; ping 192.168.1.146 || echo fail
Using ethernet at 30be0000 device
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ip4_route: No route to 192.168.1.146
ping failed; host 192.168.1.146 is not alive
fail

Best Regards,

Tim


More information about the U-Boot mailing list