Hi Simon, On 6/21/24 16:57, Simon Glass wrote: > Hi Jerome, > > On Mon, 17 Jun 2024 at 09:33, Jerome Forissier > <jerome.foriss...@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. >> >> Changes in v4: >> >> - Fixed the DHCP algorithm which was missing a sys_timeout() call in >> the "fine timer" callback. This should close the issue that Tom R. >> reported with his Raspberry Pi 3 (it does fix it on mine). >> - The DHCP exchange timeout is increased from 2 to 10 seconds >> - The DHCP exchange can be interrupted with Ctrl-C. >> - "net: introduce alternative implementation as net-lwip/": rework >> dependencies. A few symbols have 'depends on !NET_LWIP' and in addition >> 'NET_LWIP depends on !SANDBOX'. Sandbox, DSA and fastboot are >> unsupported, because they are deeply welded to the current stack. >> - All network commands (dns, ping, tftp and wget): >> * Get rid of global variables (Ilias A.) >> * Use printf() rather than log_info() >> - "net-lwip: add ping command": use packet count instead of >> timeout, fix code style (Ilias A.) >> - Add "net: split cmd/net.c into cmd/net.c and cmd/net-common.c" >> extracted from the wget patch (Ilias A.). >> - Add "net: split include/net.h into net{,-common,-legacy,-lwip}.h" >> (Ilias A.) >> - Add "flash: prefix error codes with FL_" which is required to >> avoid name clashes when splitting net.h >> - Reworked the initialization of the lwIP stack. One and only >> one network interface (struct netif) is added for the duration >> of the command that uses that interface. That's commit "net-lwip: >> add DHCP support and dhcp commmand". >> - Drop "test: dm: dsa, eth: disable tests when CONFIG_NET_LWIP=y", >> not needed now that NET_LWIP depend on !SANDBOX. >> - qemu_arm64_lwip_defconfig now enables CMD_DNS and CMD_WGET (so >> that all the supported network commands are available). >> >> Changes in v3: >> >> - Make NET_LWIP a Kconfig choice in patch "net: introduce alternative >> implementation as net-lwip/" (Tom R.) >> - Drop the patch introducing lwIP as a Git subtree and document the git >> command in the cover letter instead (Tom R.) >> - "net-lwip: add TFTP support and tftpboot command": use the same >> "Bytes transferred =" message as in the legacy implementation (Tom R., >> Maxim U.) >> - Drop "test/py: net: add _lwip variants of dhcp, ping and tftpboot >> tests" which is not needed anymore. >> - Add missing kfree() calls in cmd/net-common.c and fix the parsing of >> decimal address in net-lwip/wget.c (patch "net-lwip: add wget command") >> (Maxim U.) >> - "net-lwip: add ping command": drop the ICMP payload (Ilias A.). Set >> the sequence number to zero when entering ping_loop(). >> >> Changes in v2: >> >> ** Address comments from Ilias A. >> >> - "net-lwip: add wget command" >> Implement the wget_with_dns() function to do most of the wget work and >> call it from do_wget(). This allows to simplify patch "net-lwip: add >> support for EFI_HTTP_BOOT". >> >> - "net-lwip: import net command from cmd/net.c" >> Move a few functions from cmd/net.c to a new file cmd/net-common.c >> rather than duplicating then in cmd/net-lwip.c. >> >> - "net-lwip: add support for EFI_HTTP_BOOT" >> Since wget_with_dns() is now implemented in "net-lwip: add wget command", >> just enable the wget command when the lwIP stack is enabled and >> EFI_HTTP_BOOT is requested. >> >> ** Address comments from Tom R. >> >> - "net-lwip: add DHCP support and dhcp commmand", >> "net-lwip: add TFTP support and tftpboot command", >> "net-lwip: add ping command", >> "net-lwip: add dns command", >> "net-lwip: add wget command" >> Do not introduce new CMD_XXX_LWIP symbols and use existing CMD_XXX >> instead. >> >> - "configs: add qemu_arm64_lwip_defconfig" >> Use #include <configs/qemu_arm64_defconfig>. >> >> - "net-lwip: import lwIP library under lib/lwip" >> Patch removed and replaced by the introduction of a Git subtree: >> "Squashed 'lib/lwip/lwip/' content from commit 0a0452b2c3". >> >> Note that I have not yet addressed your comments on "test: dm: dsa, >> eth: disable tests when CONFIG_NET_LWIP=y"). I need some more time >> for that and I think running CI on this v2 will help better understand >> what is needed for v3. >> >> ** Miscellaneous improvements >> >> - "net: introduce alternative implementation as net-lwip/": >> >> * Make DFU_OVER_TFTP not DFU_TFTP incompatible with NET_LWIP. It seems >> quite natural to supplement "depends on NET" with "&& !NET_LWIP". >> * Make PROT_*_LWIP not visible by removing the Kconfig prompt. >> >> [1] >> https://lore.kernel.org/all/20231127125726.3735-1-maxim.uva...@linaro.org/ >> [2] https://www.nongnu.org/lwip/ >> [3] https://en.wikipedia.org/wiki/LwIP >> >> CC: Javier Tia <javier....@linaro.org> >> >> Jerome Forissier (14): >> flash: prefix error codes with FL_ >> net: introduce alternative implementation as net-lwip/ >> net: split include/net.h into net{,-common,-legacy,-lwip}.h >> net-lwip: build lwIP >> net-lwip: add DHCP support and dhcp commmand >> net-lwip: add TFTP support and tftpboot command >> net-lwip: add ping command >> net-lwip: add dns command >> net: split cmd/net.c into cmd/net.c and cmd/net-common.c >> net-lwip: add wget command >> cmd: bdinfo: enable -e when CONFIG_CMD_NET_LWIP=y >> configs: add qemu_arm64_lwip_defconfig >> MAINTAINERS: net-lwip: add myself as a maintainer >> CI: add qemu_arm64_lwip to the test matrix >> >> .azure-pipelines.yml | 7 + >> Kconfig | 41 ++ >> MAINTAINERS | 11 + >> Makefile | 12 +- >> board/cobra5272/flash.c | 26 +- >> board/freescale/m5253demo/flash.c | 6 +- >> boot/Kconfig | 5 +- >> cmd/Kconfig | 44 ++ >> cmd/Makefile | 7 + >> cmd/bdinfo.c | 5 +- >> cmd/net-common.c | 109 ++++ >> cmd/net-lwip.c | 45 ++ >> cmd/net.c | 115 ---- >> common/Kconfig | 2 +- >> common/board_r.c | 4 +- >> common/flash.c | 44 +- >> common/spl/Kconfig | 1 + >> configs/qemu_arm64_lwip_defconfig | 4 + >> drivers/dfu/Kconfig | 1 + >> drivers/fastboot/Kconfig | 1 + >> drivers/mtd/cfi_flash.c | 36 +- >> drivers/net/Kconfig | 3 +- >> drivers/net/phy/Kconfig | 2 +- >> drivers/usb/gadget/Kconfig | 2 +- >> include/flash.h | 20 +- >> include/net-common.h | 408 +++++++++++++ >> include/net-legacy.h | 649 ++++++++++++++++++++ >> include/net-lwip.h | 36 ++ >> include/net.h | 944 +----------------------------- >> lib/Makefile | 2 + >> lib/lwip/Makefile | 55 ++ >> lib/lwip/u-boot/arch/cc.h | 43 ++ >> lib/lwip/u-boot/arch/sys_arch.h | 0 >> lib/lwip/u-boot/limits.h | 0 >> lib/lwip/u-boot/lwipopts.h | 197 +++++++ >> net-lwip/Kconfig | 37 ++ >> net-lwip/Makefile | 18 + >> net-lwip/dhcp.c | 108 ++++ >> net-lwip/dns.c | 117 ++++ >> net-lwip/eth_internal.h | 35 ++ >> net-lwip/net-lwip.c | 270 +++++++++ >> net-lwip/ping.c | 174 ++++++ >> net-lwip/tftp.c | 226 +++++++ >> net-lwip/wget.c | 269 +++++++++ >> net/Kconfig | 14 - >> 45 files changed, 3008 insertions(+), 1147 deletions(-) >> create mode 100644 cmd/net-common.c >> create mode 100644 cmd/net-lwip.c >> create mode 100644 configs/qemu_arm64_lwip_defconfig >> create mode 100644 include/net-common.h >> create mode 100644 include/net-legacy.h >> create mode 100644 include/net-lwip.h >> create mode 100644 lib/lwip/Makefile >> create mode 100644 lib/lwip/u-boot/arch/cc.h >> create mode 100644 lib/lwip/u-boot/arch/sys_arch.h >> create mode 100644 lib/lwip/u-boot/limits.h >> create mode 100644 lib/lwip/u-boot/lwipopts.h >> create mode 100644 net-lwip/Kconfig >> create mode 100644 net-lwip/Makefile >> create mode 100644 net-lwip/dhcp.c >> create mode 100644 net-lwip/dns.c >> create mode 100644 net-lwip/eth_internal.h >> create mode 100644 net-lwip/net-lwip.c >> create mode 100644 net-lwip/ping.c >> create mode 100644 net-lwip/tftp.c >> create mode 100644 net-lwip/wget.c > > Would it be possible to put net-lwip in net/lwip? We should try to > keep the directory structure clean / minimal.
Sure. -- Jerome > Regards, > Simon